Vadim_nsk 0 4 часа назад Опубликовано 4 часа назад · Жалоба Явно детская ошибка, но не могу понять в чем именно. Т.к. требуется параметризация, описал память на VHDL. Симулирую провожу в ActiveHDL 12. Не проходит запись в память. Никак не могу понять почему. Набросал на коленке testbench, но и в нем ясности не прибавилось. Подскажите пожалуйста, что не так в описании. Кому удобно скачать файлы и посмотреть у себя, прикладываю. Для других описание памяти привожу тут: 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 Похоже, это нужно было в соседнюю ветку публиковать... 😞 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zversky 18 4 часа назад Опубликовано 4 часа назад · Жалоба 38 минут назад, Vadim_nsk сказал: Не проходит запись в память. Никак не могу понять почему. we_a что за сигнал? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vadim_nsk 0 3 часа назад Опубликовано 3 часа назад · Жалоба write enable Встречал еще описание не синхронного чтения памяти. Но мне нужно чтобы эта память потом синтезировалась на базе стандартной блочной, а там вроде синхронное чтение. На приведенной временной диаграмме уже участок чтения. Запись была раньше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 3 часа назад Опубликовано 3 часа назад · Жалоба Тот-же xilinx рекомендует объявить RAM к shared variable. Ну или в одном процессе все написать. Сейчас у вас невалидная конструкция. У одного сигнала два драйвера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 15 3 часа назад Опубликовано 3 часа назад · Жалоба В Vivado есть шаблоны описания разных типов памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vadim_nsk 0 2 часа назад Опубликовано 2 часа назад · Жалоба 23 minutes ago, Flip-fl0p said: Тот-же xilinx рекомендует объявить RAM к shared variable. Ну или в одном процессе все написать. Сейчас у вас невалидная конструкция. У одного сигнала два драйвера. Я не могу описать в одном процессе, т.к. тогда рабочим клоком будет один, а нужно два. Ведь это же двухпортовая память. 11 minutes ago, andrew_b said: В Vivado есть шаблоны описания разных типов памяти. А где это можно посмотреть в VIVADO? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 15 2 часа назад Опубликовано 2 часа назад · Жалоба Just now, Vadim_nsk said: Я не могу описать в одном процессе, т.к. тогда рабочим клоком будет один, а нужно два. Ведь это же двухпортовая память. Тогда shared variable. Just now, Vadim_nsk said: А где это можно посмотреть в VIVADO? Меню Tools -> Language Templates. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vadim_nsk 0 2 часа назад Опубликовано 2 часа назад · Жалоба 14 minutes ago, andrew_b said: Тогда shared variable. Меню Tools -> Language Templates. А слона то я и не заметил. Действительно, все украдено до нас. Я подобную фишку знал только в ActiveHDL, но там очень мало шаблонов. Спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться