BSV 0 30 мая, 2005 Опубликовано 30 мая, 2005 · Жалоба Может ли синтезировать ISE7.1 или Synplify двухпортовую блочную память, если синхросигналы на портах разные. Описание простое: mem : array 0 to xxx of STD_LOGIC_VECTOR(x downto 0); A: process (CLKA) begin if (CLKA'event and CLKA = '1') then if (WEA = '1') then mem(conv_integer(ADDRA)) <= DIA; end if; DOA <= mem(conv_integer(ADDRA)); end if; end process; B: process (CLKB) begin if (CLKB'event and CLKB = '1') then if (WEB = '1') then mem(conv_integer(ADDRB)) <= DIB; end if; DOB <= mem(conv_integer(ADDRB)); end if; end process; Прочие сигналы управления, кроме WE, для простоты не рассматриваем. В ISE6.1 не получалось. Или как-то по другому описать нужно, чтобы синтезатор понял, что я от него хочу? А то приходится цеплять библиотечный элемент, что не всегда удобно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ilya79 0 31 мая, 2005 Опубликовано 31 мая, 2005 · Жалоба Я думаю это в принципе невозможно, т.к. у одного сигнала(ram) 2 драйвера. Пользуйтись примитивами :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 31 мая, 2005 Опубликовано 31 мая, 2005 · Жалоба Может ли синтезировать ISE7.1 или Synplify двухпортовую блочную память, если синхросигналы на портах разные. Описание простое: mem : array 0 to xxx of STD_LOGIC_VECTOR(x downto 0); A: process (CLKA) begin if (CLKA'event and CLKA = '1') then if (WEA = '1') then mem(conv_integer(ADDRA)) <= DIA; end if; DOA <= mem(conv_integer(ADDRA)); end if; end process; B: process (CLKB) begin if (CLKB'event and CLKB = '1') then if (WEB = '1') then mem(conv_integer(ADDRB)) <= DIB; end if; DOB <= mem(conv_integer(ADDRB)); end if; end process; Прочие сигналы управления, кроме WE, для простоты не рассматриваем. В ISE6.1 не получалось. Или как-то по другому описать нужно, чтобы синтезатор понял, что я от него хочу? А то приходится цеплять библиотечный элемент, что не всегда удобно. <{POST_SNAPBACK}> хмм может быть в одном процессе это попробывать описать и исе взять посвежее Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
druzhin 6 31 мая, 2005 Опубликовано 31 мая, 2005 · Жалоба Я на верилоге делал так: 1. Работал из-под Актив-ХДЛ 6.3 сп2, всё запускал в batch-mode. 2. Синтезил Синплифём 81. 3. Имплементил исой 7.1 сп2. 4. В Implementation Option/Advanced Map ставил галку Map Slice Logic into Unused Block RAMs. Всё что можно, в том числе и двухклочное, залезало в блок-рам. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BSV 0 31 мая, 2005 Опубликовано 31 мая, 2005 · Жалоба хмм может быть в одном процессе это попробывать описать и исе взять посвежее <{POST_SNAPBACK}> Интересно, как это Вы собираетесь в одном процессе два тактовых сигнала окучить? А по поводу другого/посвежее софта я и спрашиваю! Может у кого завалялся кусочек VHDL-кода для синтезирования описанной двухпортовой памяти? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 1 июня, 2005 Опубликовано 1 июня, 2005 · Жалоба хмм может быть в одном процессе это попробывать описать и исе взять посвежее <{POST_SNAPBACK}> Интересно, как это Вы собираетесь в одном процессе два тактовых сигнала окучить? А по поводу другого/посвежее софта я и спрашиваю! Может у кого завалялся кусочек VHDL-кода для синтезирования описанной двухпортовой памяти? <{POST_SNAPBACK}> Хммм да не увидел что клоки разные :) а вот странно, а в каком девайсе из ФПГА есть память с двумя портами записи ? в lib.pdf что то я не нашел ? :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 1 июня, 2005 Опубликовано 1 июня, 2005 · Жалоба а вот странно, а в каком девайсе из ФПГА есть память с двумя портами записи ? в lib.pdf что то я не нашел ? :) Двухпортовая память Block SelectRAM+ RAMB4_S#_S# появилась в Virtex и с тех пор никуда не исчезала. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 1 июня, 2005 Опубликовано 1 июня, 2005 · Жалоба а вот странно, а в каком девайсе из ФПГА есть память с двумя портами записи ? в lib.pdf что то я не нашел ? :) Двухпортовая память Block SelectRAM+ RAMB4_S#_S# появилась в Virtex и с тех пор никуда не исчезала. <{POST_SNAPBACK}> Виноват нашел, автору вот из xst.pdf Starting with release 7.1i, XST supports dual-port block RAMs with two write ports. Please note that this feature supports for VHDL only. The notion of dual-write ports implies not only distinct data ports, but also possibly distinct write clocks and write enables. Note that distinct write clocks also means distinct read clocks since the dual-port block RAM offers two clocks, one shared by the primary read and write port, the other shared by the secondary read and write port. там же пример кода Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
papasha 0 1 июня, 2005 Опубликовано 1 июня, 2005 · Жалоба Вот мой кусок кода для Synplify и Xilinx. В синтезе не отказано. Кратко: буфер между шиной ISA и нутрянной частотой. Вообще в helpe на Synplify есть описание правил описания блочной двухпортовой памяти. ------------------------------------------------------------------------------------ library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.std_logic_unsigned.all; entity Buffer_PRD is port( gsr : in std_logic; clk : in std_logic; F1228 : in std_logic; CtTakt : in STD_LOGIC; RAM_PRD : in STD_LOGIC; MPAdress : in STD_LOGIC_VECTOR(8 downto 0); MPDAT_In : in STD_LOGIC_VECTOR(7 downto 0); MPWR_En : in STD_LOGIC; MPWR : in STD_LOGIC; CtPD : in std_logic_vector(8 downto 0); CtEnable : out std_logic; Byte : out STD_LOGIC_VECTOR(7 downto 0) ); end Buffer_PRD; library synplify; use synplify.attributes.all; architecture Buffer_PRD of Buffer_PRD is type RAM_512x8 is array (511 downto 0) of std_logic_vector(7 downto 0); signal BufferPRD : RAM_512x8 := (others=>(others=>'0')); signal TmpRdAdr : std_logic_vector(8 downto 0); attribute syn_ramstyle of BufferPRD : signal is "no_rw_check"; signal ByteRAM, a_Byte : STD_LOGIC_VECTOR(7 downto 0); signal a_CtEnable : std_logic; begin RAM:process(gsr, clk, MPWR) begin if gsr='1'then else if rising_edge(MPWR)then if MPWR_En='1' then if RAM_PRD='1'then BufferPRD(conv_integer(MPAdress)) <= MPDAT_In; end if; end if; end if; if rising_edge(clk)then TmpRdAdr <= CtPD; end if; end if; end process; ByteRAM <= BufferPRD(conv_integer(TmpRdAdr)); Ct_En:process(gsr, clk) begin if gsr='1'then a_CtEnable <= '1'; else if rising_edge(clk)then if F1228='1'then if CtTakt='1'then if a_Byte=x"FE" or a_Byte=x"FC" then a_CtEnable <= '0'; else a_CtEnable <= '1'; end if; end if; end if; end if; end if; end process; CtEnable <= a_CtEnable; ByteOut:process(gsr, clk) begin if gsr='1'then a_Byte <= (others=>'0'); else if rising_edge(clk)then if F1228='1'then if a_CtEnable='0' then a_Byte <= (others=>'0'); elsif a_CtEnable ='1' then a_Byte <= ByteRAM; end if; end if; end if; end if; end process; Byte <= a_Byte; end Buffer_PRD; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться