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

VHDL описание двухпортовой памяти

Явно детская ошибка, но не могу понять в чем именно.

Т.к. требуется параметризация, описал память на VHDL. Симулирую провожу в ActiveHDL 12. Не проходит запись в память. Никак не могу понять почему.

Набросал на коленке testbench, но и в нем ясности не прибавилось. Подскажите пожалуйста, что не так в описании.

image.thumb.png.4b7b422586577e6cdb06d52c87d9760d.png

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

Spoiler

library ieee;
use ieee.std_logic_1164.all;

package ramNxM_2P_pkg is

    component ramNxM_2P is
        generic(ADDR_WIDHT    : positive    := 4;
                DATA_WIDHT    : positive    := 2;
                MEMTYPE        : string    := "block_ram");
        port(clk_a    : in std_logic;
            en_a    : in std_logic;
            we_a    : in std_logic;
            addr_a    : in std_logic_vector(ADDR_WIDHT-1 downto 0);
            din_a    : in std_logic_vector(DATA_WIDHT-1 downto 0);
            dout_a    : out std_logic_vector(DATA_WIDHT-1 downto 0);
            --
            clk_b    : in std_logic;
            en_b    : in std_logic;
            we_b    : in std_logic;
            addr_b    : in std_logic_vector(ADDR_WIDHT-1 downto 0);
            din_b    : in std_logic_vector(DATA_WIDHT-1 downto 0);
            dout_b    : out std_logic_vector(DATA_WIDHT-1 downto 0));
    end component ramNxM_2P;

end package;

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity ramNxM_2P is
    generic(ADDR_WIDHT    : positive    := 4;
            DATA_WIDHT    : positive    := 2;
            MEMTYPE        : string    := "block_ram");
    port(clk_a    : in std_logic;
        en_a    : in std_logic;
        we_a    : in std_logic;
        addr_a    : in std_logic_vector(ADDR_WIDHT-1 downto 0);
        din_a    : in std_logic_vector(DATA_WIDHT-1 downto 0);
        dout_a    : out std_logic_vector(DATA_WIDHT-1 downto 0);
        --
        clk_b    : in std_logic;
        en_b    : in std_logic;
        we_b    : in std_logic;
        addr_b    : in std_logic_vector(ADDR_WIDHT-1 downto 0);
        din_b    : in std_logic_vector(DATA_WIDHT-1 downto 0);
        dout_b    : out std_logic_vector(DATA_WIDHT-1 downto 0));
end ramNxM_2P;

architecture ramNxM_2P_body of ramNxM_2P is

    type ram_type is array (0 to (2**ADDR_WIDHT)-1) of std_logic_vector(DATA_WIDHT-1 downto 0);
    signal RAM    : ram_type    := (others => (others => '0'));

    attribute syn_ramstyle : string;
    attribute syn_ramstyle of RAM : signal is MEMTYPE;

begin

    port_a    : process(clk_a)
    begin
        if rising_edge(clk_a) then
            if en_a = '1' then
                dout_a    <= RAM(to_integer(unsigned(addr_a)));
                if we_a = '1' then
                    RAM(to_integer(unsigned(addr_a)))    <= din_a;
                end if;
            end if;
        end if;
    end process;

    port_b    : process(clk_b)
    begin
        if rising_edge(clk_b) then
            if en_b = '1' then
                dout_b    <= RAM(to_integer(unsigned(addr_b)));
                if we_b = '1' then
                    RAM(to_integer(unsigned(addr_b)))    <= din_b;
                end if;
            end if;
        end if;
    end process;

end ramNxM_2P_body;

 

ramNxM_2P.vhd ramNxM_2P_TB.vhd

Похоже, это нужно было в соседнюю ветку публиковать... 😞

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


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

38 минут назад, Vadim_nsk сказал:

Не проходит запись в память. Никак не могу понять почему.

we_a что за сигнал?

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


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

write enable

Встречал еще описание не синхронного чтения памяти. Но мне нужно чтобы эта память потом синтезировалась на базе стандартной блочной, а там вроде синхронное чтение.

На приведенной временной диаграмме уже участок чтения. Запись была раньше.

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


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

Тот-же xilinx рекомендует объявить RAM к shared variable.

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

 Сейчас у вас невалидная конструкция. У одного сигнала два драйвера.

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


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

23 minutes ago, Flip-fl0p said:

Тот-же xilinx рекомендует объявить RAM к shared variable.

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

 Сейчас у вас невалидная конструкция. У одного сигнала два драйвера.

Я не могу описать в одном процессе, т.к. тогда рабочим клоком будет один, а нужно два. Ведь это же двухпортовая память.

11 minutes ago, andrew_b said:

В Vivado есть шаблоны описания разных типов памяти.

 

А где это можно посмотреть в VIVADO?

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


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

Just now, Vadim_nsk said:

Я не могу описать в одном процессе, т.к. тогда рабочим клоком будет один, а нужно два. Ведь это же двухпортовая память.

Тогда shared variable.

Just now, Vadim_nsk said:

А где это можно посмотреть в VIVADO?

Меню Tools -> Language Templates.

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


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

14 minutes ago, andrew_b said:

Тогда shared variable.

Меню Tools -> Language Templates.

А слона то я и не заметил. Действительно, все украдено до нас. Я подобную фишку знал только в ActiveHDL, но там очень мало шаблонов. Спасибо

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


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

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

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

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

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

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

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

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

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

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