我创建了一个实体,其中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;
答案 0 :(得分:2)
将ram区域初始化的一种简单方法如下: (quartus 15.1测试)
(* ram_init_file = "Bm437_IBM_VGA8.mif" *) reg [7:0] Bm437_IBM_VGA8[4096];
祝你好运, Johi。
答案 1 :(得分:2)
最简单的初始化方法是使用任何简单的编辑器(如记事本)编写.mif。下面的.mif列表适用于ROM解码器作为多路复用器。 6位地址64位数据。 .mif可以以十六进制或二进制形式包含任何大小为8,16,32,64位等的数据字。一直有效。该文件必须与项目位于同一目录。
WIDTH=64;
DEPTH=128;
ADDRESS_RADIX=HEX;
DATA_RADIX=HEX;
CONTENT BEGIN
000 : 0000000000000001;-- 0
001 : 0000000000000002;-- 1
002 : 0000000000000004;-- 2
003 : 0000000000000008;-- 3
004 : 0000000000000010;-- 4
005 : 0000000000000020;-- 5
006 : 0000000000000040;-- 6
007 : 0000000000000080;-- 7
008 : 0000000000000100;-- 8
009 : 0000000000000200;-- 9
00A : 0000000000000400;-- 10
00B : 0000000000000800;-- 11
00C : 0000000000001000;-- 12
00D : 0000000000002000;-- 13
00E : 0000000000004000;-- 14
00F : 0000000000008000;-- 15
010 : 0000000000010000;-- 16
011 : 0000000000020000;-- 17
012 : 0000000000040000;-- 18
013 : 0000000000080000;-- 19
014 : 0000000000100000;-- 20
015 : 0000000000200000;-- 21
016 : 0000000000400000;-- 22
017 : 0000000000800000;-- 23
018 : 0000000001000000;-- 24
019 : 0000000002000000;-- 25
01A : 0000000004000000;-- 26
01B : 0000000008000000;-- 27
01C : 0000000010000000;-- 28
01D : 0000000020000000;-- 29
01E : 0000000040000000;-- 30
01F : 0000000080000000;-- 31
020 : 0000000100000000;-- 32
021 : 0000000200000000;-- 33
022 : 0000000400000000;-- 34
023 : 0000000800000000;-- 35
024 : 0000001000000000;-- 36
025 : 0000002000000000;-- 37
026 : 0000004000000000;-- 38
027 : 0000008000000000;-- 39
028 : 0000010000000000;-- 40
029 : 0000020000000000;-- 41
02A : 0000040000000000;-- 42
02B : 0000080000000000;-- 43
02C : 0000100000000000;-- 44
02D : 0000200000000000;-- 45
02E : 0000400000000000;-- 46
02F : 0000800000000000;-- 47
030 : 0001000000000000;-- 48
031 : 0002000000000000;-- 49
032 : 0004000000000000;-- 50
033 : 0008000000000000;-- 51
034 : 0010000000000000;-- 52
035 : 0020000000000000;-- 53
036 : 0040000000000000;-- 54
037 : 0080000000000000;-- 55
038 : 0100000000000000;-- 56
039 : 0200000000000000;-- 57
03A : 0400000000000000;-- 58
03B : 0800000000000000;-- 59
03C : 1000000000000000;-- 60
03D : 2000000000000000;-- 61
03E : 4000000000000000;-- 62
03F : 8000000000000000;-- 63
[40..7F] : 0000000000000000;
END;
答案 2 :(得分:1)
初始化内存的最佳方法可能是......在内存变量上放置一个初始化子句。可能有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方法有一个潜在的优势:您可以只更新内存内容,而无需另外的合成/布局和路由周期。
答案 3 :(得分:1)
如果您使用向导生成了一个RAM模块但忘记向其添加内存初始化文件,则可以稍后通过执行以下操作添加一个:
Tools > MegaWizard Plug-In Manager > Edit an existing custom megafunction variation > {Select your file} > Next > Mem Init > Yes, use this file for the memory content data > Browse
答案 4 :(得分:0)
如此document中所述,这是从文件中启动内存的正确方法:
signal content: memory;
attribute ram_init_file : string;
attribute ram_init_file of content:
signal is "init.mif";