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

ISE7.1 или Synplify & Dual Port BlockRAM

Может ли синтезировать 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 не получалось. Или как-то по другому описать нужно, чтобы синтезатор понял, что я от него хочу? А то приходится цеплять библиотечный элемент, что не всегда удобно.

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


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

Я думаю это в принципе невозможно, т.к. у одного сигнала(ram) 2 драйвера.

Пользуйтись примитивами :(

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


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

Может ли синтезировать 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 не получалось. Или как-то по другому описать нужно, чтобы синтезатор понял, что я от него хочу? А то приходится цеплять библиотечный элемент, что не всегда удобно.

хмм может быть в одном процессе это попробывать описать

и исе взять посвежее

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


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

Я на верилоге делал так:

 

1. Работал из-под Актив-ХДЛ 6.3 сп2, всё запускал в batch-mode.

2. Синтезил Синплифём 81.

3. Имплементил исой 7.1 сп2.

4. В Implementation Option/Advanced Map ставил галку Map Slice Logic into Unused Block RAMs.

 

Всё что можно, в том числе и двухклочное, залезало в блок-рам.

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


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

хмм может быть в одном процессе это попробывать описать

и исе взять посвежее

 

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

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


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

хмм может быть в одном процессе это попробывать описать

и исе взять посвежее

 

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

Хммм да не увидел что клоки разные :)

а вот странно, а в каком девайсе из ФПГА есть память с двумя портами записи ?

в lib.pdf что то я не нашел ? :)

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


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

а вот странно, а в каком девайсе из ФПГА есть память с двумя портами записи ?

в lib.pdf что то я не нашел ? :)

Двухпортовая память Block SelectRAM+ RAMB4_S#_S# появилась в Virtex и с тех пор никуда не исчезала.

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


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

а вот странно, а в каком девайсе из ФПГА есть память с двумя портами записи ?

в lib.pdf что то я не нашел ? :)

Двухпортовая память Block SelectRAM+ RAMB4_S#_S# появилась в Virtex и с тех пор никуда не исчезала.

Виноват нашел,

автору вот из 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.

там же пример кода

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


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

Вот мой кусок кода для 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;

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


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

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

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

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

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

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

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

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

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

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