реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Не синтезируется ROM, Как настроить синтез для Quartus
ig_f
сообщение Mar 22 2018, 07:44
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 47
Регистрация: 18-11-11
Пользователь №: 68 381



Всем доброго времени суток!
Столкнулся с проблемой при синтезе ROM, инициализированного из текстового файла. Для инициализации использовал пару функций которые работают с textio и std_logic_textio и вычитывают нужные строки из mif-файла.
После синтеза Quartus выбрасывает всю внутреннюю логику и притягивает выходы к нулям. Пробовал сперва играться с настройками синтеза касательно ROM, потом и RAM, но результата не добился.
При инициализации памяти массивом прямо из кода модуль синтезируется правильно, на настройки синтеза реагирует (вставляет блоки или логику по настройкам). Кривые функции чтения из файла скажите вы... но они отлично работают в Modelsim, и даже автоматически распознаются как логика или как блочная память в зависимости от размера ROM.
Уверен что многие здесь инициализировали память из файлов. В общем буду признателен за любую помощь в задании настроек синтеза, поиске косяков в инициализации памяти или указании на иные причуды квартуса.
Код тестового модуля прикрепляю.

З.Ы. Quartus 17.0 Standard.
CODE
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;
Go to the top of the page
 
+Quote Post
alexadmin
сообщение Mar 22 2018, 07:57
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 570
Регистрация: 17-11-05
Из: СПб, Россия
Пользователь №: 10 965



Я бы запустил сборку одного этого модуля, чтобы ничто больше не мешало, и внимательно читал все предупреждения (да и информационные сообщения тоже).
Go to the top of the page
 
+Quote Post
ig_f
сообщение Mar 22 2018, 08:15
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 47
Регистрация: 18-11-11
Пользователь №: 68 381



Цитата(alexadmin @ Mar 22 2018, 10:57) *
Я бы запустил сборку одного этого модуля, чтобы ничто больше не мешало, и внимательно читал все предупреждения (да и информационные сообщения тоже).


Так и делаю, этот модуль задаю как топ файл.
В месседж информации ноль
CODE
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


Сообщение отредактировал ig_f - Mar 22 2018, 08:16
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Mar 22 2018, 08:27
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 935
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Попробуйте указать mif через атрибут
http://quartushelp.altera.com/15.0/mergedP...ir_ram_init.htm
Go to the top of the page
 
+Quote Post
ig_f
сообщение Mar 22 2018, 08:43
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 47
Регистрация: 18-11-11
Пользователь №: 68 381



Цитата(andrew_b @ Mar 22 2018, 11:27) *
Попробуйте указать mif через атрибут
http://quartushelp.altera.com/15.0/mergedP...ir_ram_init.htm

Такой вариант проверялся изначально, он работает, но не подходит идеологически: мне нужно проинициализировать память в нескольких однотипных модулях создаваемых через generate, при предложенном подходе придется создавать кучу mif c различными именами + при моделировании в modelsim память остается непроинициализированной. Поэтому решено было парсить mif и инициализировать внутри архитектуры.
Ещё из недостатков: хочется, чтобы при малой глубине ROM (например меньше 16) она выполнялась на LUTах; ram_init_file жестко цепляет блочную память.

Сообщение отредактировал ig_f - Mar 22 2018, 08:47
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th July 2018 - 08:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.00865 секунд с 7
ELECTRONIX ©2004-2016