mixa7109 0 23 января, 2021 Опубликовано 23 января, 2021 · Жалоба Всем привет! Следующая проблема, я пытаюсь инициализировать память с помощью атрибутов: type memory is array (511 downto 0) of std_logic_vector (15 downto 0); signal ram_data: memory; attribute ram_init_file : string; attribute ram_init_file of ram_data : signal is "mem.mif"; Он синтезирует память со следующими параметрами: Info (12133): Instantiated megafunction "altsyncram:ram_data_rtl_0" with the following parameter: Info (12134): Parameter "OPERATION_MODE" = "ROM" Info (12134): Parameter "WIDTH_A" = "16" Info (12134): Parameter "WIDTHAD_A" = "9" Info (12134): Parameter "NUMWORDS_A" = "512" Info (12134): Parameter "OUTDATA_REG_A" = "UNREGISTERED" Info (12134): Parameter "ADDRESS_ACLR_A" = "NONE" Info (12134): Parameter "OUTDATA_ACLR_A" = "NONE" Info (12134): Parameter "INDATA_ACLR_A" = "NONE" Info (12134): Parameter "WRCONTROL_ACLR_A" = "NONE" Info (12134): Parameter "INIT_FILE" = "mem.mif" И все было было бы хорошо, но в ModelSim вижу следующее: Если задать память через мегафункции и там прописать файл инициализации, то все хорошо, но мне надо научиться через атрибуты. В чем проблемы? Вот все библиотеки: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; use ieee.math_real.all; LIBRARY altera_mf; USE altera_mf.altera_mf_components.all; library altera; use altera.altera_syn_attributes.all; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 23 января, 2021 Опубликовано 23 января, 2021 · Жалоба Приветствую! Скорее всего путь файла ведет "на деревню к дедушке". Если путь к файлу не прописан или он относительный то Modelsim ищет такие файлы начиная с текущей рабочей папки сима. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mixa7109 0 23 января, 2021 Опубликовано 23 января, 2021 · Жалоба 3 минуты назад, RobFPGA сказал: Приветствую! Скорее всего путь файла ведет "на деревню к дедушке". Если путь к файлу не прописан или он относительный то Modelsim ищет такие файлы начиная с текущей рабочей папки сима. Удачи! Rob. Спасибо за ответ! Я указал путь к файлу в настройках quartus. Как мне прописать путь для modelsin? Я его запускаю прям через оболочку quartus Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 23 января, 2021 Опубликовано 23 января, 2021 · Жалоба Приветствую! Just now, mixa7109 said: Спасибо за ответ! Я указал путь к файлу в настройках quartus. Как мне прописать путь для modelsin? Я его запускаю прям через оболочку quartus Увы не скажу - я не пользуюсь запуском сима напрямую из Qu. Если вы задаете путь в RTL коде то : либо указывайте полный абсолютный путь либо относительный к рабочей папке запуска сима либо копируйте эти фалы в рабочую папку запуска сима Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mixa7109 0 24 января, 2021 Опубликовано 24 января, 2021 · Жалоба 21 минуту назад, RobFPGA сказал: Приветствую! Увы не скажу - я не пользуюсь запуском сима напрямую из Qu. Если вы задаете путь в RTL коде то : либо указывайте полный абсолютный путь либо относительный к рабочей папке запуска сима либо копируйте эти фалы в рабочую папку запуска сима Удачи! Rob. А где можно посмотреть информацию по альтернативному запуску modelsim? Если есть время, то может опишите как запустить его подоугому? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 24 января, 2021 Опубликовано 24 января, 2021 · Жалоба 5 часов назад, mixa7109 сказал: А где можно посмотреть информацию по альтернативному запуску modelsim? Если есть время, то может опишите как запустить его подоугому? Альтернативный путь -- это как раз запуск его изо всяких сред. Нормальный путь -- это запуск непосредственно из ОС. Абослютный путь к файлу -- это тупик. При переносе проекта на другую машину с другой структурой каталогов всё внезапно перестаёт работать. Относительный путь должен быть одинаковым и для симулятора, и для синтезатора. Поэтому тут нужна соответствующая структура проекта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mixa7109 0 24 января, 2021 Опубликовано 24 января, 2021 · Жалоба 5 часов назад, andrew_b сказал: Альтернативный путь -- это как раз запуск его изо всяких сред. Нормальный путь -- это запуск непосредственно из ОС. Абослютный путь к файлу -- это тупик. При переносе проекта на другую машину с другой структурой каталогов всё внезапно перестаёт работать. Относительный путь должен быть одинаковым и для симулятора, и для синтезатора. Поэтому тут нужна соответствующая структура проекта. Хорошо, а как прописать то путь к файлу для симулятора? Если я буду запускать по нормальному Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 24 января, 2021 Опубликовано 24 января, 2021 · Жалоба 2 часа назад, mixa7109 сказал: Хорошо, а как прописать то путь к файлу для симулятора? "path/to/mem.mif" Но я упустил один важный момент: атрибуты предназначены для синтеза. Симулятор их игнорирует. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mixa7109 0 24 января, 2021 Опубликовано 24 января, 2021 · Жалоба 3 часа назад, andrew_b сказал: "path/to/mem.mif" Но я упустил один важный момент: атрибуты предназначены для синтеза. Симулятор их игнорирует. Вау. А как тогда быть? Я прошерстил уже кучу сайтов и не могу найти ответ.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 24 января, 2021 Опубликовано 24 января, 2021 · Жалоба 35 минут назад, mixa7109 сказал: Вау. А как тогда быть? Я прошерстил уже кучу сайтов и не могу найти ответ.... Пишите функцию, котора читает файл, и инициализируйте ею сигнал. type memory is array (511 downto 0) of std_logic_vector (15 downto 0); function read_mif_file (file_name : string) return memory is begin <function body> end; signal ram_data: memory := read_mif_file ("path/to/mem.mif"); Реализацию функции можете подсмотреть в модели мегафункции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mixa7109 0 25 января, 2021 Опубликовано 25 января, 2021 (изменено) · Жалоба Вообщем, я решил. Все работает. Всем спасибо! Может кому-то спасу пару часов жизни..... Важно, работает только для фала формата .hex DATAWIDTH - задается в generic. library work; use work.Const_type.all; type memory is array (L - 1 downto 0) of std_logic_vector (DATAWIDTH - 1 downto 0); impure function init_mem_hex(FileName : in string) return memory is file data_init : TEXT; variable buf : line; variable mem_data : memory := (others => (others => '0')); variable datain : string(integer(DATAWIDTH / 4) downto 1); begin FILE_OPEN(data_init, FileName, READ_MODE); for i in 0 to L - 1 loop READLINE(data_init, buf); if (buf(buf'LOW) = ':') then shrink_line(buf, 9); READ(L=>buf, VALUE=>datain); mem_data(i) := CONV_STD_LOGIC_VECTOR(HEX_STR_TO_INT(datain), DATAWIDTH); end if; end loop; return mem_data; FILE_CLOSE(data_init); end function; -- signal ram_data : memory := init_mem_hex("./mem_init.hex"); ----------------------------------------------------------- А это файл пакета функций. ibrary ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; use std.textio.all; package Const_type is type my_signal_one is array(integer range<>) of std_logic; type my_vector_one is array(integer range<>) of std_logic_vector; type my_vector_sec is array(integer range<>, integer range<>) of std_logic_vector; procedure SHRINK_LINE (str_line : inout line; pos : in integer); function HEX_STR_TO_INT (str : in string) return integer; end package; package body Const_type is function HEX_STR_TO_INT (str : in string) return integer is variable len : integer := str'length; variable ivalue : integer := 0; variable digit : integer := 0; begin for i in len downto 1 loop case str(i) is when '0' => digit := 0; when '1' => digit := 1; when '2' => digit := 2; when '3' => digit := 3; when '4' => digit := 4; when '5' => digit := 5; when '6' => digit := 6; when '7' => digit := 7; when '8' => digit := 8; when '9' => digit := 9; when 'A' => digit := 10; when 'a' => digit := 10; when 'B' => digit := 11; when 'b' => digit := 11; when 'C' => digit := 12; when 'c' => digit := 12; when 'D' => digit := 13; when 'd' => digit := 13; when 'E' => digit := 14; when 'e' => digit := 14; when 'F' => digit := 15; when 'f' => digit := 15; when others => ASSERT FALSE REPORT "Illegal hex character "& str(i) & "! " SEVERITY ERROR; end case; ivalue := ivalue * 16 + digit; end loop; return ivalue; end HEX_STR_TO_INT; procedure SHRINK_LINE (str_line : inout line; pos : in integer) is subtype nstring is string(1 to pos); variable str : nstring; begin if (pos >= 1) then read(str_line, str); end if; end; end package body; Изменено 25 января, 2021 пользователем mixa7109 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться