При описании памяти как массива производится чтение и запись по разным адресам, при этом чтение производится ассинхронно, а запись синхронно. При объявлении массива указываю атрибут: 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?
|