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

Quartus-VHDL-Memory

Всем здрасте !

Есть пример описания памяти на 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, а не дополнительные внешние регистры.

Заранее спасибо за ответы.

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


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

43 минуты назад, OLD_SHURiK сказал:

Вопрос на засыпку - 

Как заставить Quartus ...

Какое семейство ПЛИС используете?

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


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

Сгенерируйте визардом IP памяти и не парьтесь. Нет смысла описывать языком платформозависимые вещи.

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


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

7 hours ago, OLD_SHURiK said:

Как заставить Quartus, что бы он генерировал память с выходным синхронным регистром.

Конкретнее, что бы Quartus использовал выходной регистр RAM, а не дополнительные внешние регистры.

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

2. Quartus - new file - template - VHDL - RAM ROM посмотреть рекомендуемый стиль описания

 

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


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

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 блоками значительно быстрее

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


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

Приветствую!

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.

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


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

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
    );

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


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

Теймплейт, для памяти с выходным регистром найдите и вставьте. До кучи настройки проекта проверьте и убедитесь что в целевой плис это регистр есть. Может под флекс работаете, там в памяти такого нет

И доку и внимательно прочитайте что пишет квартус, почему он не упаковывает регистр в память. 

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


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

Приветствую!

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.     

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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