这个还有很多方法来规避这个问题的.小版我提供点我的想法.
1. BRAM的clk 和你别的逻辑的CLK分开.如果你正常运行在1K.如果你有需要读16个BRAM数据,就可以用DCM生成一个16K的BRAM数据.那么对于你正常工作的CLK来说,等于同步.不过clk有器件支持上限.
2.用以下方法写自定义RAM的话,小版我自认为占用资源很少,你可以拿去试试看,不过我就写了4个只读.其它功能,你可以根据你自己实际功能加入.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity bram_test1 is
port(
clk : in std_logic;
ram1_ad : in std_logic_vector(5 downto 0);
ram2_ad : in std_logic_vector(5 downto 0);
ram3_ad : in std_logic_vector(5 downto 0);
ram4_ad : in std_logic_vector(5 downto 0);
ram1_out : out std_logic_vector(7 downto 0);
ram2_out : out std_logic_vector(7 downto 0);
ram3_out : out std_logic_vector(7 downto 0);
ram4_out : out std_logic_vector(7 downto 0)
);
end bram_test1;
architecture Behavioral of bram_test1 is
type ram_30 is array(5 downto 0) of std_logic_vector(7 downto 0);
signal ram1 : ram_30;
signal ram2 : ram_30;
signal ram3 : ram_30;
signal ram4 : ram_30;
signal ram1_n : integer range 0 to 31;
signal ram2_n : integer range 0 to 31;
signal ram3_n : integer range 0 to 31;
signal ram4_n : integer range 0 to 31;
begin
read_ram : process(clk) is
begin
If clk='1' and clk'event then
ram1_n<=conv_INTEGER (ram1_ad);
ram2_n<=conv_INTEGER (ram2_ad);
ram3_n<=conv_INTEGER (ram3_ad);
ram4_n<=conv_INTEGER (ram4_ad);
ram1_out<=ram1(ram1_n);
ram2_out<=ram2(ram2_n);
ram3_out<=ram3(ram3_n);
ram4_out<=ram1(ram4_n);
end if;
end process read_ram;
end Behavioral;
|