Quartus初始化RAM

时间:2013-11-03 08:32:54

标签: memory vhdl ram

我创建了一个实体,其中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;

5 个答案:

答案 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";