我创建了一个实体,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;发布于 2013-11-03 11:14:58
正如此文档中所指定的,这是从文件中插入内存的正确方法:
signal content: memory;
attribute ram_init_file : string;
attribute ram_init_file of content:
signal is "init.mif";发布于 2013-11-03 09:57:23
初始化内存的最好方法可能是..。在内存变量上添加一个初始化子句。可能有特定于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方法有一个潜在的优点:您可以只更新内存内容,而不需要另一个合成/位置和路由周期。
发布于 2016-05-08 14:35:48
一种简化公羊面积的简单方法如下:(quartus 15.1测试)
(* ram_init_file = "Bm437_IBM_VGA8.mif" *) reg [7:0] Bm437_IBM_VGA8[4096];向你问好乔希。
https://stackoverflow.com/questions/19751148
复制相似问题