【问题标题】:Using Non-zero indexed Memory in Quartus (Verilog)在 Quartus (Verilog) 中使用非零索引内存
【发布时间】:2014-07-29 06:47:39
【问题描述】:

我正在为基本的 16 位教育 CPU 编写内存系统,但我的模块的 Quartus Synthesis 遇到了问题。具体来说,我已将地址空间分解为几个不同的部分,其中一个(即 ROM)没有正确合成。 (注意:我正在为 DE2-115 Altera 板综合,QuartusII 12.1,SystermVerilog 代码)

所以,为了使内存映射的 VRAM(一种双端口内存模块,在 CPU 写入颜色时允许 VGA 输出)更有用,我在地址空间中包含了一个小 ROM,其中包含代码(组装函数),允许您将字符写入内存,即 print_char 函数。这个 ROM 位于特定地址的内存中,所以为了简化 SV,我这样实现了 ROM(以及所有内存模块):

module printROM
  (input  rd_cond_code_t      re_L,
   input  wr_cond_code_t      we_L,
   input  logic [15:0]        memAddr,
   input  logic               clock,
   input  logic               reset_L,
   inout  wire [15:0]         memBus,
   output mem_status_t        memStatus);

   reg [15:0]                 rom[`VROM_ADDR_LO:`VROM_ADDR_HI];
   reg [15:0]                 dataOut;

   /* The ROM */
   always @(posedge clock) begin
      if (re_L == MEM_RD) begin
         dataOut <= rom[memAddr];
      end
   end

   /* Load the rom data */
   initial $readmemh("printROM.hex", rom);

   /* Drive the line */
   tridrive #(.WIDTH(16)) romOut(.data(dataOut),
                                 .bus(memBus),
                                 .en_L(re_L));
/* Manage asserting completion of a read or a write */
   always_ff @(posedge clock, negedge reset_L) begin
      if (~reset_L) begin
         memStatus <= MEM_NOT_DONE;
      end
      else begin
         if ((we_L == MEM_WR) | (re_L == MEM_RD)) begin
            memStatus <= MEM_DONE;
         end
         else begin
            memStatus <= MEM_NOT_DONE;
         end
      end
   end

endmodule // printROM

其中VROM_ADDR_LO和VROM_ADDR_HI是定义这个ROM地址的两个宏,分别是'hEB00和'hEFFF。因此,当 CPU 读取/写入该范围内的地址时,该模块能够正确索引到 rom 内存。这种技术在 VCS 仿真中运行良好。

然而,当我去合成这个模块时,Quartus 正确地暗示了一个 ROM,但在初始化它时出现了问题。我收到此错误:

Error (113012): Address at line 11 exceeds the specified depth (1280) in the Memory Initialization File "psx18240.ram0_printROM_38938673.hdl.mif"

看起来 Quartus 正在将我提供的 .hex 文件转换为 ROM 代码(即 printROM.hex)并使用生成的 .mif 文件的 CPU 可见地址(即从 'hEB00 开始),即使 rom 的大小显然太小了。 Quartus 不支持这种语法还是我做错了什么?

【问题讨论】:

    标签: memory verilog system-verilog synthesis quartus


    【解决方案1】:

    Quartus 似乎不喜欢你正在做的事情。如果您只想要一个包含 1280 个条目的 rom,那么您应该从 0:1279 创建一个,并使用该范围对其进行寻址(无论如何,这都是您的逻辑必须合成的内容),这可能会更好。

       reg [15:0]           rom[0:`VROM_ADDR_HI-`VROM_ADDR_LO];
    
       assign romAddr = (memAddr - `VROM_ADDR_LO);
       always @(posedge clock) begin
          if (re_L == MEM_RD) begin
             dataOut <= rom[romAddr];
          end
       end
    

    【讨论】:

    • 谢谢;这也是我的解决方案。我只是想知道是否有一些我没有考虑的东西,因为我喜欢我写它的风格。我猜只是另一个 SystemVerilog Quartus 的一小部分还没有完全实现.....
    【解决方案2】:

    在 quartus 的 Mega Wizard 插件管理器中使用 ROM Megafunctions。它是一个基于 GUI 的 ipcore 生成器。在那里,您可以对所有选项进行参数化,甚至包括 hex 文件。但是你必须遵循 Intel hex 文件格式。这也可以在 file->new 中找到。

    对于基于 hdl 的实例化 http://quartushelp.altera.com/12.1/mergedProjects/hdl/mega/mega_file_lpm_rom.htm

    用户指南。 https://www.google.co.in/url?sa=t&source=web&rct=j&ei=nVAGVKvSDcu9ugTMooCQDQ&url=http://www.altera.com/literature/ug/ug_ram_rom.pdf&cd=1&ved=0CBsQFjAA&usg=AFQjCNE2ZXM1gIsMZ5BvkKTHanX1E7vamg

    【讨论】:

    • 不幸的是,Megablocks 不允许您像我要求的那样指定和地址范围(即,我希望 'hEB00 映射到内存的第 0 个元素,'hEB01 映射到第 1 个,等等)。此外,就我的目的而言,它们通常比我上面的 Verilog 更令人困惑且更难模拟,后者综合使用相同的资源(推断 ROM:altera.com/literature/hb/qts/qts_qii51007.pdf)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多