Перейти к содержанию
    

Введение :) - переписываю проект в квартусе, сдалнный в виде совокупности комбинационных схем и билиотечных блоков, в проект на языке 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 - это именно память?

Изменено пользователем badwm

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подключите в VHDL-описании те же блоки LPM_RAM_DQ как обычные компоненты.

 

Нет, так нельзя по заданию. Всё должно быть описано независимо от библиотечных функций ALTERA. Хотя , новый проект изначально будет зашиваться в FLEX10K, в дальнейшем предполагается перевод его на ASIC.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Надо правильно описать функционирование памяти.

 

http://www.altera.com/support/examples/vhdl/vhdl.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если посмотреть на рекомендованное описание памяти в примерах пакета MAX+, оно опирается на вашу мегафункцию. В handbook Quartus есть раздел синтезабельных оптсаний. Но все они ложатся на память кристаллов, имеющих на борту dual-port память. 10К кажется не из их числа (на моем диске уже нет ее описания). Если нет handbook, можно скачать с сайта Альтеры файл qts_qii51007? c сайта xilinx xst.pdf (там поведенческое описание рассматривается начиная со Спартана).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Слазил я по ссылке vetal'а, скачал примерчик описания памяти. Запустил его - компилятор, действительно, как и говрил sazh, выругался на dual-port и представил описанную паямть оптять же в виде логических элементов. Сменил тогда семейство на Cyclone II - всё отлично, воспринимается, как память. В моем проекте описание памяти, сходное с примером, однако, даже на циклоне всё воспринимается, как логические элементы. Сейчас меняю описание, может получится чего...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

О, счастье!:) У меня получилось. Дело было в списке чувствительности процесса, отвечающего за работу блока памяти. В скачанном примере память синхронная и в списке чувствительности был только clk. В моем случае, память асинхронная, поэтому изначально я засунул в список чувствительности все сигналы, влияющие на работу блока памяти. Такую реализацию компилятор и представлял в виде логических элементов. А когда я оставил в списке чувсвительности один лишь сигнал, отвечающий за if верхнего уровня, всё стало ОК и блок теперь видится, как память. Всем спасибо за помощь! :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

О, счастье!:) У меня получилось. Дело было в списке чувствительности процесса, отвечающего за работу блока памяти. В скачанном примере память синхронная и в списке чувствительности был только clk. В моем случае, память асинхронная, поэтому изначально я засунул в список чувствительности все сигналы, влияющие на работу блока памяти. Такую реализацию компилятор и представлял в виде логических элементов. А когда я оставил в списке чувсвительности один лишь сигнал, отвечающий за if верхнего уровня, всё стало ОК и блок теперь видится, как память. Всем спасибо за помощь! :)

 

хмм можно подробнее ? откуда у кулона взялась блочная асинхронная память?

приведите пример кода ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что касается циклона, опять таки надо учитывать физическую структуру памяти.

В описаниях есть понятия

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. У меня не получилось. Приведите пожалуйста Ваше описание.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну, наверно, приводить весь код блока смысла нет - там порядка 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;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сейчас посмотрел внимательнее на выложенный код и сам засомневался - а будет ли вход в процесс, при изменении сигнала NT, ведь его нет в списке чувствительности?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот ещё один вариант придумал, вроде по логике должно работать правильно. Разнес по разным процессам запись и чтение памяти:

 

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:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ндя что то неверится мне что квартус вот это собирает.

Вы описываете даже не асинхронную память, а память на клоковый вход которой подан сигналы CSN, NT.

+ у вас во втором коде логическая ошибка.

симплифай ваш 1ый пример собирает на защелках.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ндя что то неверится мне что квартус вот это собирает.

+ у вас во втором коде логическая ошибка.

симплифай ваш 1ый пример собирает на защелках.

 

Первый и второй код квартус компилирует в элементы памяти. Пробовал на Cyclone II и Stratix II. Что-то я не вижу во втором коде логической ошибки :unsure: .

 

Вы описываете даже не асинхронную память, а память на клоковый вход которой подан сигналы CSN, NT

 

Ну а если и допустить, что NT и воспринимается, как clk, - разве 2ой код всё равно будет некорректен? Можно ещё добавить, чтоб синхронизация была по восходящему фронту для NT='1' и по низходящему - для NT='0'.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если не ошибаюсь, речь начиналась с древнейшего семейства 10K.

Я сомневаюсь, что Вы в нее что то уложили. Более того, если хотите расширить аудиторию обсуждения, наверно Вас не затруднит выложить полный синтезируемый модуль. Я не знаю VHDL,

Да и нет желания его изучать. Я хочу увидеть MAP просмотрщике память на семействе 10K.

К чему лишние слова.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...