3

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

5 回答 5

3

初始化内存的最佳方法可能是......在内存变量上放置一个初始化子句。可能有特定于 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 方法有一个潜在优势:您可以只更新存储器内容,而无需另一个综合/布局和布线周期。

于 2013-11-03T09:57:23.820 回答
2

初始化 ram 区域的一种简单方法如下:(quartus 15.1 测试)

(* ram_init_file = "Bm437_IBM_VGA8.mif" *) reg [7:0] Bm437_IBM_VGA8[4096];

最好的问候,乔希。

于 2016-05-08T14:35:48.717 回答
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;
于 2020-06-05T14:52:06.443 回答
1

如本文档中所述,这是从文件初始化内存的正确方法:

signal content: memory;
attribute ram_init_file : string;
attribute ram_init_file of content:
signal is "init.mif";
于 2013-11-03T11:14:58.960 回答
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

于 2017-03-13T14:04:11.593 回答