我创建了一个实体,其中 quartus 成功识别了 RAM,并为它实例化了一个 RAM 宏功能。如果我可以从文件初始化那个 RAM,那就太好了。我找到了制作此类文件(.mif 文件)的教程。现在我已经创建了那个文件,我不知道如何让 quartus 初始化那个模块。任何帮助表示赞赏。
这是我的 RAM 实体:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity RAM is
port (
clk: in std_logic;
we: in std_logic;
data_in: in std_logic_vector (7 downto 0);
read_addr: in integer range 0 to 65535;
write_addr: in integer range 0 to 65535;
data_out: out std_logic_vector (7 downto 0)
);
end entity RAM;
architecture RAM_arch of RAM is
type memory is array (65535 downto 0) of std_logic_vector (7 downto 0);
signal content: memory;
begin
process(clk)
begin
if (RISING_EDGE(clk)) then
if (we = '1') then
content(write_addr) <= data_in;
end if;
data_out <= content(read_addr);
end if;
end process;
end architecture;
最佳答案
可能最好的初始化内存的方法是......在内存变量上放置一个初始化子句。可能有特定于 Quartus 的加载 .MIF 文件的方法,但这可能更简单,肯定更便携(例如对于 Xilinx),并且更灵活,因为您可以定义文件格式,而不必生成 .mif文件。
给定以下代码:
type memory is array (65535 downto 0) of std_logic_vector (7 downto 0);
signal content: memory;
你可以简单地写
type memory is array (65535 downto 0) of std_logic_vector (7 downto 0);
signal content: memory := init_my_RAM(filename => "ram_contents.txt");
现在 Quartus 有可能但不太可能不支持这种方式的初始化, 所以我们可以通过编写一个忽略实际文件内容的简单 init_my_ram 函数来测试它:
function init_my_ram (filename : string) return memory is
variable f : file;
variable m : memory;
begin
file_open(f, filename, read_mode);
for i in memory'range loop
m(i) := X"55";
end loop;
file_close(f);
return m;
end init_my_ram;
因为函数调用是一个初始化器,并且在设计合成时在细化时调用,所以这都是可合成的。
如果编译成功并且 Quartus 生成了一个充满 X"55"的内存,那么你就可以在 init_my_ram 函数中解析任何你想要的文件格式了。 (二进制文件更难,阅读器代码在工具之间可能不那么可移植,但并非不可能)。
.MIF 方法有一个潜在优势:您可以只更新存储器内容,而无需另一个综合/布局和布线周期。
关于memory - Quartus 初始化 RAM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19751148/