Memory 四次初始化RAM

Memory 四次初始化RAM,memory,vhdl,ram,Memory,Vhdl,Ram,我制作了一个实体,quartus在其中成功识别RAM,并为其实例化了一个RAM megafunction。如果我能从一个文件中初始化RAM,那就太好了。我找到了制作此类文件(.mif文件)的教程。现在我已经创建了那个文件,我不知道如何让quartus初始化那个模块。感谢您的帮助 这是我的RAM实体: library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity RAM is port (

我制作了一个实体,quartus在其中成功识别RAM,并为其实例化了一个RAM megafunction。如果我能从一个文件中初始化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;
ieee库;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
实体RAM是
港口(
clk:标准逻辑中;
我们:在标准逻辑中;
数据输入:标准逻辑向量(7到0);
读取地址:在0到65535的整数范围内;
写入地址:在0到65535的整数范围内;
数据输出:输出标准逻辑向量(7到0)
);
终端实体RAM;
RAM的体系结构是
类型存储器是std_逻辑_向量(7到0)的数组(65535到0);
信号内容:存储器;
开始
过程(clk)
开始
如果(上升沿(clk)),则
如果(we='1'),那么

content(write_addr)初始化内存的最佳方法可能是。。。在内存变量上放置一个初始化子句。可能有特定于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方法有一个潜在优势:您可以只更新内存内容,而不需要另一个合成/放置和路由循环。

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

signal content: memory;
attribute ram_init_file : string;
attribute ram_init_file of content:
signal is "init.mif";

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

致以最良好的祝愿,
Johi.

如果您使用向导生成了一个RAM模块,但忘记向其中添加内存初始化文件,则可以稍后通过执行以下操作添加一个:


工具>MegaWizard插件管理器>编辑现有自定义megafunction变体>{选择您的文件}>下一步>Mem Init>是,将此文件用于内存内容数据>浏览

最简单的初始化方法是使用任何简单的编辑器(如记事本)编写.mif。下面的.mif列表适用于作为多路复用器的ROM解码器。6位地址64位数据。mif可以包含任何大小为8、16、32、64位等的十六进制或二进制数据字。一直在工作。该文件必须与project位于同一目录中

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;

我使用readline和read函数来读取文件,但失败了。我试图初始化std_逻辑_向量,我只能从文件中读取整数。我希望能够读取至少32位二进制编码的数字。据我所知,我只能用你的方式来读取整数。但我确实希望使用.mif文件。根据Quartus自己的说法,这似乎是Quartus首选的.mif初始化方式。还有一个类似的注释样式初始化。
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;