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

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

Мне один человек утверждает, что при работе с блочной памятью в 7 серией xilinx (в частности Zynq),

нужно работать следующим образом при чтении

выставил адрес - пропустил такт - прочитал данные с памяти. Получается чтение за 2 такта.

Иначе можно прочитать предыдущие данные.

При работе с альтерой я не замечал такой "особенности" работы с памятью.

Читал данные следующим образом:

выставил адрес, на следующем такте прочитал данные из памяти

Пример описаниия памяти я привел ниже

 

--пример описания памяти
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use IEEE.NUMERIC_STD.ALL;

entity bram_tdp is
generic (
    DATA    : integer := 32;
    ADDR    : integer := 8
);
port (
    -- Port A
    a_clk   : in  std_logic;
    a_wr    : in  std_logic;
    a_addr  : in  std_logic_vector(ADDR-1 downto 0);
    a_din   : in  std_logic_vector(DATA-1 downto 0);
    a_dout  : out std_logic_vector(DATA-1 downto 0);

    -- Port B
    b_clk   : in  std_logic;
    b_wr    : in  std_logic;
    b_addr  : in  std_logic_vector(ADDR-1 downto 0);
    b_din   : in  std_logic_vector(DATA-1 downto 0);
    b_dout  : out std_logic_vector(DATA-1 downto 0)
);
end bram_tdp;

architecture rtl of bram_tdp is
    -- Shared memory
    type mem_type is array ( (2**ADDR)-1 downto 0 ) of std_logic_vector(DATA-1 downto 0);
    
   -- FUNCTION initialize_ram  return mem_type is variable result : mem_type;
   -- BEGIN
        -- FOR i IN ((2**ADDR)-1) DOWNTO 0 LOOP
            -- result(i) := std_logic_vector( to_unsigned(natural(i), natural'(DATA)));
        -- END LOOP;
   -- RETURN result;
   -- END initialize_ram;
    
    shared variable mem : mem_type; -- := initialize_ram; --mem_type

    begin

-- Port A
process(a_clk)
begin
    if(a_clk'event and a_clk='1') then
        if(a_wr='1') then
            mem(conv_integer(a_addr)) := a_din;
        end if;
        a_dout <= mem(conv_integer(a_addr));
    end if;
end process;

-- Port B
process(b_clk)
begin
    if(b_clk'event and b_clk='1') then
        if(b_wr='1') then
            mem(conv_integer(b_addr)) := b_din;
        end if;
        b_dout <= mem(conv_integer(b_addr));
    end if;
end process;

end rtl;

 

Прошу подтвердить/опровергнуть данное утверждение и/или поделиться опытом...

Спасибо

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


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

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

 

Мне один человек утверждает, что при работе с блочной памятью в 7 серией xilinx (в частности Zynq),

...

А мне одна бабка говорила что полезно читать соответствующие доки (ug437) для снятия сомнений.

 

Блочная память в Xilinx и в 7 семействе в частности может иметь 1 или 2 такта latency на чтение в зависимости от того как Вы ее скофигурировали.

Соответственно и читать надо на нужном такте.

 

Удачи! Rob.

 

 

 

 

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


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

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

 

 

А мне одна бабка говорила что полезно читать соответствующие доки (ug437) для снятия сомнений.

 

Блочная память в Xilinx и в 7 семействе в частности может иметь 1 или 2 такта latency на чтение в зависимости от того как Вы ее скофигурировали.

Соответственно и читать надо на нужном такте.

 

Удачи! Rob.

Да, вы правы этот документ ug437 давно не читал (virtexll)...

Читал

7 Series FPGAs Memory Resources

User Guide UG473 (v1.12) September 27, 2016

 

Пример описания я привел, чтение там за один такт(латентность равна1).

Человек ссылается на большой практический опыт...

Мой опыт не совпадает с опытом человека,.

Из-за этого спор и возник

просто мне интересно опыт других.

 

 

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


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

Пример описания я привел, чтение там за один такт(латентность равна1).

Человек ссылается на большой практический опыт...

Мой опыт не совпадает с опытом человека,.

Из-за этого спор и возник

просто мне интересно опыт других.

А проверка в банальном симуляторе не поможет уважаемым специалистам установить истину?

Как уже говорили - возможны оба варианта. При задержке в 2 такта задействуются (если синтезатор не затупил) регистры внутри примитива памяти и

существенно улучшается времянка по выходу порта данных (см. например ds181 p22.).

 

 

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


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

А проверка в банальном симуляторе не поможет уважаемым специалистам установить истину?

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

Соответствено в их проектах есть vhdl/verilog для синтеза и С/С++ для процессора.

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


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

Так у Альтеры тоже два такта на чтение. По фронту 1 выставил адрес, по фронту 2 адрес защелкивается в обязательном входном регистре блока памяти, по фронту 3 можно забирать данные с выхода. А можно включить регистр выходных данных и тогда будет еще 1 такт задержки.

 

Хотя в тех семействах с которыми я работаю используется только M9K память. В MLAB, кажется, можно отключать регистр по входу адреса и тогда действительно чтение будет в 1 такт.

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

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


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

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

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

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

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

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

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

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

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

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