0

我有一个用于 Altera FPGA 目标的内存模块,我已将其推断为 Altera 的 ALTSYNCRAM 块之一。内存是 1024x16,我有一个用属性指定的内存初始化文件。综合时,综合报告表明它生成了我想要的 RAM 块类型,并指出初始化文件是我指定的文件。当尝试使用 Altera 的 ModelSim 版本进行仿真时,数据信号开始时完全未初始化,我不知道为什么。我查看了论坛等,有人提到 ModelSim 可能不支持我正在使用的“.mif”格式,但会支持“.hex”,所以我将初始化文件更改为“.hex”。我还读到相对文件路径可能是一个问题,

关于为什么没有初始化内存以及如何使其初始化的任何想法?

包含推断内存的大量修剪模型:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library work;
--use work.types.all;
entity CPU is
--...
end entity CPU;
architecture rtl of CPU is
--these types are actually included in a package
subtype reg is std_logic_vector(15 downto 0);
type mem is array (0 to 1023) of reg;

--...
    --memory read port
    signal MR : reg;
    signal MRA : std_logic_vector(9 downto 0); --flops
    --memory write port
    signal MW : reg; --flops
    signal MWA : std_logic_vector(9 downto 0); --flops
    signal MWE : std_logic; --flop

    signal data : mem;
    attribute ram_init_file : string;
    attribute ram_init_file of data : signal is "RAM_init.hex";
    attribute ramstyle : string;
    attribute ramstyle of data : signal is "no_rw_check";
begin
--...
     --memory spec
     MR <= data(to_integer(unsigned(MRA(9 downto 0))));
    memory_process : process(clk)
    begin
        if (clk'event and clk = '1') then
                if(MWE = '1') then
                    data(to_integer(unsigned(MWA(9 downto 0)))) <= MW;
                end if;
        end if;
    end process;
end architecture rtl; --CPU

Modelsim 在编译 CPU.vhd 时没有显示任何警告或错误,也没有任何加载初始化文件的指示。

这是我使用 Altera 软件或内存初始化文件的第一个设计,如果问题是非常基本的问题,或者我从根本不正确的角度处理这个问题,我不会感到惊讶。我通常会在包中使用常量定义内存,但这是针对一个类的,它要求我有一个内存初始化文件(它也需要 .mif 格式,但这只是模拟和综合之间的 3 个字符变化文件)。

4

3 回答 3

0

能否在 FPGA 上初始化 RAM 取决于合成器和您使用的特定 FPGA。一些 FPGA 系列支持这一点,而另一些则不支持。我知道这不是您想听到的答案,但您需要查看 Altera 的文档。

于 2014-04-21T09:03:26.613 回答
0

看起来 Modelsim 可能有一个“mem load”命令,您可以在仿真开始时使用它来初始化内存。看看这个线程的结尾:

初始化 altsyncram

于 2014-04-21T17:24:09.387 回答
0

Modelsim 不关注综合属性。这是特定于供应商的约定。您可以在模拟中将它们与任何其他用户定义的属性一起引用,但它不知道某些属性会调用各种第三方合成器中的特殊行为。

如果要初始化 RAM 以进行模拟,则需要执行以下操作之一:

  1. 编写一个读取内存文件内容的函数,并在信号初始化期间调用它data

  2. 将内存内容转换为在单独包中定义的 VHDL 常量,并将该常量分配给data信号作为初始化程序。这可以通过脚本自动化。

  3. 使用 Verilog 系统任务$readmemh(需要具有混合语言许可证的 Modelsim)

对于选项 1,函数应采用以下形式:

impure function read_mem(fname : string) return mem is
  variable data : mem;
begin
  -- ** Perform read with textio **
  ...
  return data;
end function;

signal data : mem := read_mem(data'ram_init_file);

关于 RAM 初始化的 Quartus 文档很少,只演示了从 VHDL 进程中分配的初始化数据,而不是从文件中读取。关于 RAM/ROM 推理的赛灵思文档(p258) 提供了使用通用 VHDL 执行此操作的示例。相同的技术可用于仿真针对 Altera 的设计。XST 支持将文件 I/O 用于综合,但 Quartus 可能会因此而窒息。如果是这种情况,您将不得不使用配置在面向综合的 RAM 模型和专门用于使用该函数初始化的仿真的模型之间进行交换。

Xilinx 示例仅显示如何使用 ASCII 二进制文件读取文件。我有一个通用 ROM 组件,它可以读取十六进制和二进制文件,您可以根据需要将其调整到 RAM 中。

于 2014-04-21T15:25:02.757 回答