memory - Quartus 初始化 RAM

标签 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;

最佳答案

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

关于memory - Quartus 初始化 RAM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19751148/

相关文章:

vhdl - 将敏感列表与流程声明相关联的必要性是什么?你能在没有敏感列表的情况下声明一个时钟进程吗?

android - 为什么 HAXM 配置内存太低 "969 MB"?它与需要 1 GB RAM 的 AVD API 级别 23 不兼容

php - 测量最大 PHP 内存使用量

c++ - Linux 中的内存

arrays - VHDL 初始化 std_logic_vector 的通用数组

matlab - Julia 进程使用的内存

r - 如何估计随机森林算法的内存使用量?

c++ - 如何从类列表中释放内存

java - 是否-XX :+UseSerialGC use main thread for GC

vhdl - 如何在 VHDL 的端口声明中使用从通用参数计算得出的常量?