При описании памяти как массива производится чтение и запись по разным адресам, при этом чтение производится ассинхронно, а запись синхронно.
При объявлении массива указываю атрибут:
attribute syn_ramstyle : string;
attribute syn_ramstyle of data_array_1 : signal is "block_ram";--"no_rw_check";
При этом Synplify Pro 8.4 в отчете выдает следующее сообщение:
Could not implement Block RAM. Is the read address registered using the same clock as the RAM?
Код примерно следующий:
entity name is
clock : in std_logic;
din : in signed( 15 downto 0 );
write : in std_logic;
dout : out signed( 15 downto 0 );
...
end name;
architecture name_body of name is
subtype data_type is signed( 15 downto 0 );
type data_array_type is array( 0 to 7 ) of data_type;
signal data_array_1 : data_array_type := ( others => to_signed( 0, data_type'length ) );
signal data_array_2 : data_array_type := ...;
attribute syn_ramstyle : string;
attribute syn_ramstyle of data_array_1 : signal is "block_ram";--"no_rw_check";
attribute syn_ramstyle of data_array_2 : signal is "block_ram";--"no_rw_check";
signal rd1_addr, wr1_addr : unsigned( 2 downto 0 ) := to_unsigned( 0, 4 );
signal rd2_addr, wr2_addr : unsigned( 2 downto 0 ) := to_unsigned( 0, 4 );
signal A, C : data_type := to_signed( 0, data_type'length );
body
A <= data_array_1( to_integer( rd1_addr ) );
C <= data_array_2( to_integer( rd2_addr ) );
process( reset, clock )
begin
if reset = '1' then
A <= to_signed( 0, data_type'length );
C <= to_signed( 0, data_type'length );
rd1_addr <= ...;
wr1_addr <= ...;
rd2_addr <= ...;
wr2_addr <= ...;
...
elsif rising_edge( clock ) then
dout <= A * C;
if write = '1' then
data_array_1( to_integer( wr1_addr ) ) <= din;
end if;
rd1_addr <= rd1_addr + 1;
wr1_addr <= wr1_addr + 1;
rd2_addr <= rd2_addr + 1;
end if;
end process;
end name_body;
Как нужно описывать RAM в виде массива, чтобы Synplify сделал из него BlockRAM?