BSV 0 23 августа, 2006 Опубликовано 23 августа, 2006 (изменено) · Жалоба Пытался делать такую штуку в 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 получаем то, что нужно. Правда, это может оказаться слишком медленно. Изменено 23 августа, 2006 пользователем BSV Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serg_Fry 0 24 августа, 2006 Опубликовано 24 августа, 2006 · Жалоба разрядность портов: 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, но хочется все же самому закодить Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BSV 0 24 августа, 2006 Опубликовано 24 августа, 2006 · Жалоба А синтезатор-то что говорит? В Вашей реализации я вижу ошибку - чтение должно быть обязательно! по фронту клока, а вот адреса чтения как раз и не нужно делать регистровыми. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BSV 0 24 августа, 2006 Опубликовано 24 августа, 2006 · Жалоба Попробовал - таки да, не хавает, говорит, что вместо памяти триггеров навставляет. Ну и шут с ним. Для вас есть вариант - объединить 4 синтезированных блока xxx_S8_S8 способом, который я описал выше, хотя, вам же по 8-разрядному порту не надо читать - так что это и не нужно. С двумя блоками фокус не пройдет - выравнивание поедет (PORTB(x) /= PORTA(x*4+3) & PORTA(x*4+2) & PORTA(x*4+1) & PORTA(x*4)). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serg_Fry 0 24 августа, 2006 Опубликовано 24 августа, 2006 · Жалоба насчет ошибки я не согласен, если посмотрите в примерах там сделано аналогично. Да и раньше я делал такую память(только с одинаковой разрядностью) и все благополучно паковалось в 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 (брать противофазный клок), а с ними тоже напряг. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BSV 0 24 августа, 2006 Опубликовано 24 августа, 2006 (изменено) · Жалоба Зачем Вам противофазный клок? Если нужен отрицательный фронт - просто заводите на тактовый вход not CLK и все - а синтезатор, маппер или что там еще пусть разбирается (инверторы на тактовом входе имеются в любом блоке, в том числе и в BLOCKRAM). Изменено 24 августа, 2006 пользователем BSV Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться