OLD_SHURiK 0 20 августа, 2020 Опубликовано 20 августа, 2020 · Жалоба Всем здрасте ! Есть пример описания памяти на VHDL. Синхронная, один слок, двухпортовая. Spoiler library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; entity ram_single_clock_dual_port_new is generic ( address_width : integer := 13; data_width : integer := 32 ); port ( clock : in std_logic := '0'; data_write : in std_logic_vector (data_width - 1 downto 0) := (others => '0'); write_address : in std_logic_vector(address_width - 1 downto 0) := (others => '0'); write_enable : in std_logic := '0'; read_address : in std_logic_vector(address_width - 1 downto 0) := (others => '0'); data_read : out std_logic_vector (data_width - 1 downto 0) := (others => '0') ); end ram_single_clock_dual_port_new; architecture telesh of ram_single_clock_dual_port_new is type mem_dp_type is array(0 to (2**address_width - 1)) of std_logic_vector(data_width - 1 downto 0); --signal mem_dp : mem_dp_type := (others => (others => '0')); signal mem_dp : mem_dp_type; signal data_tmp : std_logic_vector(data_width - 1 downto 0) := (others => '0'); begin data_read <= data_tmp ; process (clock, write_enable) begin if rising_edge(clock) then if (write_enable = '1') then mem_dp(conv_integer(unsigned(write_address))) <= data_write; end if; data_tmp <= mem_dp(conv_integer(unsigned(read_address))); end if; end process; end telesh; Вопрос на засыпку - Как заставить Quartus, что бы он генерировал память с выходным синхронным регистром. Конкретнее, что бы Quartus использовал выходной регистр RAM, а не дополнительные внешние регистры. Заранее спасибо за ответы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
StewartLittle 41 20 августа, 2020 Опубликовано 20 августа, 2020 · Жалоба 43 минуты назад, OLD_SHURiK сказал: Вопрос на засыпку - Как заставить Quartus ... Какое семейство ПЛИС используете? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 20 августа, 2020 Опубликовано 20 августа, 2020 · Жалоба Сгенерируйте визардом IP памяти и не парьтесь. Нет смысла описывать языком платформозависимые вещи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 21 августа, 2020 Опубликовано 21 августа, 2020 · Жалоба 7 hours ago, OLD_SHURiK said: Как заставить Quartus, что бы он генерировал память с выходным синхронным регистром. Конкретнее, что бы Quartus использовал выходной регистр RAM, а не дополнительные внешние регистры. 1. прочитать документацию на встроенную память, что бы понять какое количество тактов требуется для чтения в разных конфигурациях памяти. 2. Quartus - new file - template - VHDL - RAM ROM посмотреть рекомендуемый стиль описания Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
OLD_SHURiK 0 21 августа, 2020 Опубликовано 21 августа, 2020 · Жалоба 10 hours ago, des00 said: 1. прочитать документацию на встроенную память, что бы понять какое количество тактов требуется для чтения в разных конфигурациях памяти. 2. Quartus - new file - template - VHDL - RAM ROM посмотреть рекомендуемый стиль описания 2. это и есть рекомендуемый стиль описания. 3. мне не надо ВНЕШНИЕ регистры. Во встроенной памяти есть свои буфера. 16 hours ago, StewartLittle said: Какое семейство ПЛИС используете? Cyclone например. 16 hours ago, Flip-fl0p said: Сгенерируйте визардом IP памяти и не парьтесь. Нет смысла описывать языком платформозависимые вещи. так и делаю пока. думал как бы это без IP обойтись. так как если много блоков памяти, и если использовать IP , то очень долго моделируется ! с VHDL блоками значительно быстрее Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 21 августа, 2020 Опубликовано 21 августа, 2020 · Жалоба Приветствую! 18 hours ago, OLD_SHURiK said: Как заставить Quartus, что бы он генерировал память с выходным синхронным регистром. Для начала как и советовали почитать доки на требуемый тип FPGA и посмотреть как там физически устроенна память. Например для блоков M20K если вы хотите иметь регистр на выходе как минимум надо описать память с 2 тактами latency на чтение - то есть внести "data_read <= data_tmp;" под клок. Ну а потом надеется что при синтезе и FIT Qu соизволит упаковать регистр data_read во внутрь. Вариант с IP в этом плане более прост и надежен, а чтобы не страдать пере-генерацией IP при смене размерности памяти (и может быть ускорить сим) то выгоднее оформить модуль памяти враппером, а внутри него уже инстацировать ip корку altsyncram и свой RTL для сима и выбирать нужный вариант через параметр. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
OLD_SHURiK 0 21 августа, 2020 Опубликовано 21 августа, 2020 · Жалоба 1 hour ago, RobFPGA said: Приветствую! Для начала как и советовали почитать доки на требуемый тип FPGA и посмотреть как там физически устроенна память. Например для блоков M20K если вы хотите иметь регистр на выходе как минимум надо описать память с 2 тактами latency на чтение - то есть внести "data_read <= data_tmp;" под клок. Ну а потом надеется что при синтезе и FIT Qu соизволит упаковать регистр data_read во внутрь. Вариант с IP в этом плане более прост и надежен, а чтобы не страдать пере-генерацией IP при смене размерности памяти (и может быть ускорить сим) то выгоднее оформить модуль памяти враппером, а внутри него уже инстацировать ip корку altsyncram и свой RTL для сима и выбирать нужный вариант через параметр. Удачи! Rob. 1. описывал предложенным способом - генерирует ОТДЕЛЬНЫЙ регистр, не использует внутренние ресурсы блока памяти. 2. время симуляции зависит от количества блоков IP , а нет от размера блока IP. (проект содержит много мелких блоков памяти) 3. для размерности используется generic ( address_width : integer := N; data_width : integer := M ); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 21 августа, 2020 Опубликовано 21 августа, 2020 · Жалоба Теймплейт, для памяти с выходным регистром найдите и вставьте. До кучи настройки проекта проверьте и убедитесь что в целевой плис это регистр есть. Может под флекс работаете, там в памяти такого нет И доку и внимательно прочитайте что пишет квартус, почему он не упаковывает регистр в память. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 21 августа, 2020 Опубликовано 21 августа, 2020 · Жалоба Приветствую! 4 minutes ago, OLD_SHURiK said: 1. описывал предложенным способом - генерирует ОТДЕЛЬНЫЙ регистр, не использует внутренние ресурсы блока памяти. Это уж зависит не только от синтезатора столько от FIT. Если FIT думает что выгоднее вытянуть регистр из памяти (по времянке) то он это сделает. Так как по коду для него память и регистр разные сущности. При использовании IP FIT видит неделимый примитив и не своевольничает. 13 minutes ago, OLD_SHURiK said: 2. время симуляции зависит от количества блоков IP , а нет от размера блока IP. (проект содержит много мелких блоков памяти) Это и понятно что чем крупнее дизайн тем медленнее симуляция. Но сим модель той же altsyncram это фактически тот же RTL, не думаю что должно быть медленнее в разы по сравнению с вашим RTL. 16 minutes ago, OLD_SHURiK said: 3. для размерности используется ... ну так и параметризируйте этим инстанс altsyncram во враппере. А через generate (или другим способом) выбирайте какую реализацию использовать (IP или RTL). дополнительный плюс такого подхода - относительно легкая миграция между архитектурами. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться