badwm 0 10 июня, 2006 Опубликовано 10 июня, 2006 (изменено) · Жалоба Введение :) - переписываю проект в квартусе, сдалнный в виде совокупности комбинационных схем и билиотечных блоков, в проект на языке VHDL. В исходном проекте имеется 2 блока памяти - LPM_RAM_DQ - 128 слов по 32 бита каждое. Я попытался описать память таким образом: type matrix128_32 IS array (127 downto 0) of std_logic_vector(31 downto 0); signal ram1 : matrix128_32; signal ram2 : matrix128_32; Собственно проблема - при попытки компиляции, на 26% квартус выдает ошибку, что превышено количество доступных логических элементов (14123, при 2880 возможных) и компиляция не завершается. Судя по всему мои 2 памяти он перевел в логические элементы, а не в элементы памяти (их на заданной микросхеме FLEX10K можно исплозовать 20480 - так что места хватило бы). Подскажите, как заставить квартус думать, что ram1 и ram2 - это именно память? Изменено 10 июня, 2006 пользователем badwm Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maksya 0 10 июня, 2006 Опубликовано 10 июня, 2006 · Жалоба Подключите в VHDL-описании те же блоки LPM_RAM_DQ как обычные компоненты. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
badwm 0 10 июня, 2006 Опубликовано 10 июня, 2006 · Жалоба Подключите в VHDL-описании те же блоки LPM_RAM_DQ как обычные компоненты. Нет, так нельзя по заданию. Всё должно быть описано независимо от библиотечных функций ALTERA. Хотя , новый проект изначально будет зашиваться в FLEX10K, в дальнейшем предполагается перевод его на ASIC. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vetal 0 10 июня, 2006 Опубликовано 10 июня, 2006 · Жалоба Надо правильно описать функционирование памяти. http://www.altera.com/support/examples/vhdl/vhdl.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 7 10 июня, 2006 Опубликовано 10 июня, 2006 · Жалоба Если посмотреть на рекомендованное описание памяти в примерах пакета MAX+, оно опирается на вашу мегафункцию. В handbook Quartus есть раздел синтезабельных оптсаний. Но все они ложатся на память кристаллов, имеющих на борту dual-port память. 10К кажется не из их числа (на моем диске уже нет ее описания). Если нет handbook, можно скачать с сайта Альтеры файл qts_qii51007? c сайта xilinx xst.pdf (там поведенческое описание рассматривается начиная со Спартана). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
badwm 0 10 июня, 2006 Опубликовано 10 июня, 2006 · Жалоба Слазил я по ссылке vetal'а, скачал примерчик описания памяти. Запустил его - компилятор, действительно, как и говрил sazh, выругался на dual-port и представил описанную паямть оптять же в виде логических элементов. Сменил тогда семейство на Cyclone II - всё отлично, воспринимается, как память. В моем проекте описание памяти, сходное с примером, однако, даже на циклоне всё воспринимается, как логические элементы. Сейчас меняю описание, может получится чего... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
badwm 0 10 июня, 2006 Опубликовано 10 июня, 2006 · Жалоба О, счастье!:) У меня получилось. Дело было в списке чувствительности процесса, отвечающего за работу блока памяти. В скачанном примере память синхронная и в списке чувствительности был только clk. В моем случае, память асинхронная, поэтому изначально я засунул в список чувствительности все сигналы, влияющие на работу блока памяти. Такую реализацию компилятор и представлял в виде логических элементов. А когда я оставил в списке чувсвительности один лишь сигнал, отвечающий за if верхнего уровня, всё стало ОК и блок теперь видится, как память. Всем спасибо за помощь! :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 11 июня, 2006 Опубликовано 11 июня, 2006 · Жалоба О, счастье!:) У меня получилось. Дело было в списке чувствительности процесса, отвечающего за работу блока памяти. В скачанном примере память синхронная и в списке чувствительности был только clk. В моем случае, память асинхронная, поэтому изначально я засунул в список чувствительности все сигналы, влияющие на работу блока памяти. Такую реализацию компилятор и представлял в виде логических элементов. А когда я оставил в списке чувсвительности один лишь сигнал, отвечающий за if верхнего уровня, всё стало ОК и блок теперь видится, как память. Всем спасибо за помощь! :) хмм можно подробнее ? откуда у кулона взялась блочная асинхронная память? приведите пример кода ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 7 11 июня, 2006 Опубликовано 11 июня, 2006 · Жалоба Что касается циклона, опять таки надо учитывать физическую структуру памяти. В описаниях есть понятия VHDL Single-Clock Synchronous RAM with No Read-Through-Write Behavior Verilog HDL Single-Clock Synchronous RAM with Read-Through- Write Behavior Что касается общего подхода, есть ограничения Inferring RAM Functions from HDL Code To infer RAM functions, synthesis tools detect sets of registers and logic that can be replaced with the altsyncram or lpm_ram_dp megafunctions, depending on the targeted device family. Меня дестыительно очень интересует, как Вам удалось на поведенческом уровне уложиться в lpm_ram_dq. У меня не получилось. Приведите пожалуйста Ваше описание. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
badwm 0 11 июня, 2006 Опубликовано 11 июня, 2006 · Жалоба Ну, наверно, приводить весь код блока смысла нет - там порядка 300 строк. Вот главные фрагменты, где используется память: ... type matrix128_32 IS array (0 to 127) of std_logic_vector(31 downto 0); signal ram1 : matrix128_32; signal ram2 : matrix128_32; ----- signal D : std_logic_vector(31 downto 0); signal RD_AA : std_logic_vector(6 downto 0); signal RD_AB : std_logic_vector(6 downto 0); ... ram_12_pr: process(CSN) -- OE always=VCC for this realisation begin if CSN='0' then -- chip select# if NT='1' then -- writing ram1(to_integer(unsigned(RD_AA)))<=D; -- RD_AA=adress, D=data ram2(to_integer(unsigned(RD_AB)))<=D; -- RD_AB=adress, D=data QA<=QA; QB<=QB; else -- reading QA<=ram1(to_integer(unsigned(RD_AA))); QB<=ram2(to_integer(unsigned(RD_AB))); end if; end if; end process; ------------- QA_out<=QA; QB_out<=QB; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
badwm 0 11 июня, 2006 Опубликовано 11 июня, 2006 · Жалоба Сейчас посмотрел внимательнее на выложенный код и сам засомневался - а будет ли вход в процесс, при изменении сигнала NT, ведь его нет в списке чувствительности? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
badwm 0 11 июня, 2006 Опубликовано 11 июня, 2006 · Жалоба Вот ещё один вариант придумал, вроде по логике должно работать правильно. Разнес по разным процессам запись и чтение памяти: ram_12_write: process(NT) -- OE always=VCC for this realisation begin if NT='1' then --writing if CSN='0' then --chip select# ram1(to_integer(unsigned(RD_AA)))<=D; -- RD_AA=adress, D=data ram2(to_integer(unsigned(RD_AB)))<=D; -- RD_AB=adress, D=data QA<=QA; QB<=QB; end if; end if; end process; ------------ ram_12_read: PROCESS(NT) BEGIN if NT='0' then --reading if CSN='0' then QA<=ram1(to_integer(unsigned(RD_AA))); QB<=ram2(to_integer(unsigned(RD_AB))); end if; end if; END PROCESS; PS: чё-то я не пойму, как тут писать сообщения, чтоб сохранялись отступы в строках, а то так код неудобно читать, когда вё по одной линии :unsure: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 11 июня, 2006 Опубликовано 11 июня, 2006 · Жалоба ндя что то неверится мне что квартус вот это собирает. Вы описываете даже не асинхронную память, а память на клоковый вход которой подан сигналы CSN, NT. + у вас во втором коде логическая ошибка. симплифай ваш 1ый пример собирает на защелках. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
badwm 0 11 июня, 2006 Опубликовано 11 июня, 2006 · Жалоба ндя что то неверится мне что квартус вот это собирает. + у вас во втором коде логическая ошибка. симплифай ваш 1ый пример собирает на защелках. Первый и второй код квартус компилирует в элементы памяти. Пробовал на Cyclone II и Stratix II. Что-то я не вижу во втором коде логической ошибки :unsure: . Вы описываете даже не асинхронную память, а память на клоковый вход которой подан сигналы CSN, NT Ну а если и допустить, что NT и воспринимается, как clk, - разве 2ой код всё равно будет некорректен? Можно ещё добавить, чтоб синхронизация была по восходящему фронту для NT='1' и по низходящему - для NT='0'. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 7 11 июня, 2006 Опубликовано 11 июня, 2006 · Жалоба Если не ошибаюсь, речь начиналась с древнейшего семейства 10K. Я сомневаюсь, что Вы в нее что то уложили. Более того, если хотите расширить аудиторию обсуждения, наверно Вас не затруднит выложить полный синтезируемый модуль. Я не знаю VHDL, Да и нет желания его изучать. Я хочу увидеть MAP просмотрщике память на семействе 10K. К чему лишние слова. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться