ig_f 0 22 марта, 2018 Опубликовано 22 марта, 2018 · Жалоба Всем доброго времени суток! Столкнулся с проблемой при синтезе ROM, инициализированного из текстового файла. Для инициализации использовал пару функций которые работают с textio и std_logic_textio и вычитывают нужные строки из mif-файла. После синтеза Quartus выбрасывает всю внутреннюю логику и притягивает выходы к нулям. Пробовал сперва играться с настройками синтеза касательно ROM, потом и RAM, но результата не добился. При инициализации памяти массивом прямо из кода модуль синтезируется правильно, на настройки синтеза реагирует (вставляет блоки или логику по настройкам). Кривые функции чтения из файла скажите вы... но они отлично работают в Modelsim, и даже автоматически распознаются как логика или как блочная память в зависимости от размера ROM. Уверен что многие здесь инициализировали память из файлов. В общем буду признателен за любую помощь в задании настроек синтеза, поиске косяков в инициализации памяти или указании на иные причуды квартуса. Код тестового модуля прикрепляю. З.Ы. Quartus 17.0 Standard. library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; --use work.fir_gen_pkg.all; use ieee.std_logic_textio.hread; use std.textio.all; entity tst_rom is generic ( COEF_WIDTH : integer := 16; C_OFFSET : integer := 16; C_NUMBER : integer := 16; FILENAME : string := "TEST_FILE.mif" ); port ( clk : in std_logic; data : out std_logic_vector(COEF_WIDTH - 1 downto 0); addr : in natural range 0 to C_NUMBER - 1 ); end entity; architecture beh of tst_rom is type memory_t is array (0 to C_NUMBER - 1) of std_logic_vector(COEF_WIDTH - 1 downto 0); impure function read_mif_line( FILENAME : in string; C_OFFSET : in integer; COEF_WIDTH : in integer ) return std_logic_vector is file mif: text is FILENAME; constant CONTENTBEGIN : string := "CONTENT BEGIN"; -- variables variable mifLine : line; variable mifMess : string(1 to 80); variable addr : integer; variable char : character; variable data : std_logic_vector(COEF_WIDTH - 1 downto 0); begin for i in 0 to 2047 loop readline(mif, mifLine); read(mifLine, mifMess(1 to mifLine'length)); exit when (mifMess(1 to 13) = CONTENTBEGIN); end loop; for i in 0 to C_OFFSET - 1 loop readline(mif, mifLine); end loop; readline(mif, mifLine); read(mifLine, addr); assert addr = C_OFFSET report "Line address value does'n match input offset." severity Warning; for i in 0 to 79 loop read(mifLine, char); exit when (char = ':'); end loop; hread(mifLine, data); file_close(mif); return data; end read_mif_line; impure function mem_init return memory_t is variable tmp : memory_t;-- := (others => (others => '0')); begin for i in 0 to C_NUMBER - 1 loop tmp(i) := read_mif_line(FILENAME, C_OFFSET + i, COEF_WIDTH); end loop; return tmp; end mem_init; constant rom : memory_t := mem_init; --constant rom : memory_t := (0 => x"F020", -- 1 => x"001F", -- 2 => x"E01E", -- 3 => x"001D", -- 4 => x"DD1C", -- 5 => x"001B", -- 6 => x"001A", -- 7 => x"1019", -- 8 => x"FF18", -- 9 => x"0017", -- 10 => x"5016", -- 11 => x"0015", -- 12 => x"2314", -- 13 => x"0013", -- 14 => x"5A12", -- 15 => x"0011"); begin process(clk) begin if rising_edge(clk) then data <= rom(addr); end if; end process; end beh; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexadmin 0 22 марта, 2018 Опубликовано 22 марта, 2018 · Жалоба Я бы запустил сборку одного этого модуля, чтобы ничто больше не мешало, и внимательно читал все предупреждения (да и информационные сообщения тоже). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ig_f 0 22 марта, 2018 Опубликовано 22 марта, 2018 (изменено) · Жалоба Я бы запустил сборку одного этого модуля, чтобы ничто больше не мешало, и внимательно читал все предупреждения (да и информационные сообщения тоже). Так и делаю, этот модуль задаю как топ файл. В месседж информации ноль Info (12127): Elaborating entity "tst_rom" for the top level hierarchy Warning (13024): Output pins are stuck at VCC or GND Warning (13410): Pin "data[0]" is stuck at GND Warning (13410): Pin "data[1]" is stuck at GND Warning (13410): Pin "data[2]" is stuck at GND Warning (13410): Pin "data[3]" is stuck at GND Warning (13410): Pin "data[4]" is stuck at GND Warning (13410): Pin "data[5]" is stuck at GND Warning (13410): Pin "data[6]" is stuck at GND Warning (13410): Pin "data[7]" is stuck at GND Warning (13410): Pin "data[8]" is stuck at GND Warning (13410): Pin "data[9]" is stuck at GND Warning (13410): Pin "data[10]" is stuck at GND Warning (13410): Pin "data[11]" is stuck at GND Warning (13410): Pin "data[12]" is stuck at GND Warning (13410): Pin "data[13]" is stuck at GND Warning (13410): Pin "data[14]" is stuck at GND Warning (13410): Pin "data[15]" is stuck at GND Info (16010): Generating hard_block partition "hard_block:auto_generated_inst" Info (16011): Adding 0 node(s), including 0 DDIO, 0 PLL, 0 transceiver and 0 LCELL Warning (21074): Design contains 5 input pin(s) that do not drive logic Warning (15610): No output dependent on input pin "clk" Warning (15610): No output dependent on input pin "addr[0]" Warning (15610): No output dependent on input pin "addr[1]" Warning (15610): No output dependent on input pin "addr[2]" Warning (15610): No output dependent on input pin "addr[3]" Info (21057): Implemented 21 device resources after synthesis - the final resource count might be different Info (21058): Implemented 5 input pins Info (21059): Implemented 16 output pins Info: Quartus Prime Analysis & Synthesis was successful. 0 errors, 23 warnings Изменено 22 марта, 2018 пользователем ig_f Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 22 марта, 2018 Опубликовано 22 марта, 2018 · Жалоба Попробуйте указать mif через атрибут http://quartushelp.altera.com/15.0/mergedP...ir_ram_init.htm Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ig_f 0 22 марта, 2018 Опубликовано 22 марта, 2018 (изменено) · Жалоба Попробуйте указать mif через атрибут http://quartushelp.altera.com/15.0/mergedP...ir_ram_init.htm Такой вариант проверялся изначально, он работает, но не подходит идеологически: мне нужно проинициализировать память в нескольких однотипных модулях создаваемых через generate, при предложенном подходе придется создавать кучу mif c различными именами + при моделировании в modelsim память остается непроинициализированной. Поэтому решено было парсить mif и инициализировать внутри архитектуры. Ещё из недостатков: хочется, чтобы при малой глубине ROM (например меньше 16) она выполнялась на LUTах; ram_init_file жестко цепляет блочную память. Изменено 22 марта, 2018 пользователем ig_f Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться