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

Пытался делать такую штуку в ISE 4.2. Были проблемы с синтезом (надо было писать и читать по обоим портам). Судя по тому, что приводится в Language templates, ситуация мало изменилась, хотя попробовать и не мешает:

 

process (<clockA>)
begin
   if (<clockA>'event and <clockA> = '1') then
      if (<enableA> = '1') then
         if (<write_enableA> = '1') then
            <ram_name>(conv_integer(<addressA>)) <= <input_dataA>;
         end if;
         <ram_outputA> <= <ram_name>(conv_integer(<addressA>));
      end if;
   end if;
end process;

process (<clockB>)
begin
   if (<clockB>'event and <clockB> = '1') then
      if (<enableB> = '1') then
         <ram_outputB> <= <ram_name>(conv_integer(<addressB>));
      end if;
   end if;
end process;

 

Единственный выход в данном случае - использовать библиотечные элементы.

 

По поводу разной разрядности на портах - попробуйте все это описать на поведенческом уровне следующим образом - массив (который память) используйте с минимальной используемой разрядностью, а при описании чтения и записи по другому порту используйте несколько индексов массива. Например так:

  
<ram_outputB> <= <ram_name>(conv_integer(<addressB>*2 + 1)) & <ram_name>(conv_integer(<addressB>*2));

Это в случае, если разрядность различается в 2 раза. Посмотрите, что Вам синтезатор на это скажет. Если схавает - ваша взяла, если нет - ничего не попишешь.

 

Кстати, тут возможна и другая проблема - в библиотечных элементах может не найтись памяти с нужной комбинацией разрядности портов и/или размером (например мне в Спартане 2е понадобилась память объемом 4КБайт и разрядностью 8 и 32). Тут может оказаться удобным объединение выходов нескольких BRAM при помощи OR или XOR и использовании входов сброса выходных регистров BRAM. Понятно как - на те BRAM, что не используем подаем сигнал сброса, после OR или XOR получаем то, что нужно. Правда, это может оказаться слишком медленно.

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

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


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

разрядность портов:

A (запись) = 8

B(чтение) = 32

глубина от 1024 байт и выше

 

ваш вариант (и смежные с ним) я уже пробовал

примерно так:

-------------- A side -------------------------
my_RAM_A_side:process(clkA)
begin
if clkA'event and clkA = '1' then
---
if WEA='1' then ram_block(conv_integer(AddrA))<=DIA;end if;
---
end if; -- clk
end process my_RAM_A_side;
-----------------------------------------------
-------------- B side -------------------------
my_RAM_B_side:process(clkB)
begin
if clkB'event and clkB = '1' then
---
--read_addr<=4*AddrB;--conv_integer(AddrB);
read_addr0<=4*AddrB;
read_addr1<=4*AddrB+1;
read_addr2<=4*AddrB+2;
read_addr3<=4*AddrB+3;
---
end if; -- clk
end process my_RAM_B_side;
----
----
--DOB <= ram_block(read_addr)&ram_block(read_addr+1)&ram_block(read_addr+2)&ram_block(read_addr+3);
DOB( 7 downto  0)<= ram_block(read_addr0);
DOB(15 downto  8)<= ram_block(read_addr1);
DOB(23 downto 16)<= ram_block(read_addr2);
DOB(31 downto 24)<= ram_block(read_addr3);
-----------------------------------------------

но увы не получается

я могу использовать 2 закаскадированых RAMB4_S4_S16, но хочется все же самому закодить

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


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

А синтезатор-то что говорит? В Вашей реализации я вижу ошибку - чтение должно быть обязательно! по фронту клока, а вот адреса чтения как раз и не нужно делать регистровыми.

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


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

Попробовал - таки да, не хавает, говорит, что вместо памяти триггеров навставляет. Ну и шут с ним.

Для вас есть вариант - объединить 4 синтезированных блока xxx_S8_S8 способом, который я описал выше, хотя, вам же по 8-разрядному порту не надо читать - так что это и не нужно. С двумя блоками фокус не пройдет - выравнивание поедет (PORTB(x) /= PORTA(x*4+3) & PORTA(x*4+2) & PORTA(x*4+1) & PORTA(x*4)).

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


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

насчет ошибки я не согласен, если посмотрите в примерах там сделано аналогично.

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

Для вас есть вариант - объединить 4 синтезированных блока xxx_S8_S8 способом, который я описал выше, хотя, вам же по 8-разрядному порту не надо читать - так что это и не нужно. С двумя блоками фокус не пройдет - выравнивание поедет (PORTB(x) /= PORTA(x*4+3) & PORTA(x*4+2) & PORTA(x*4+1) & PORTA(x*4)).

я уже сделал, как говорил выше: каскадировал 2 блока RAMB4_S4_S16 и как раз получается 8/32

и глубина 1024. Соответственно 1-й RAMB4_S4_S16 - на вход младшая тетрада на 2-й - старшая

и выход разобран соответствующим образом.

Все работает и в BRAM упаковалось. Однако камень предкновения во фронтах.

Если не получится с положительными сделать, придется тратить GBUF с CLKDLL (брать противофазный клок), а с ними тоже напряг.

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


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

Зачем Вам противофазный клок? Если нужен отрицательный фронт - просто заводите на тактовый вход not CLK и все - а синтезатор, маппер или что там еще пусть разбирается (инверторы на тактовом входе имеются в любом блоке, в том числе и в BLOCKRAM).

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

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


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

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

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

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

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

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

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

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

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

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