我制作了一个实体,其中 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 方法有一个潜在的优势:您可以仅更新存储器内容,而不需要另一个综合/布局和布线周期。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)