0

基本的な 16 ビットの教育用 CPU 用のメモリ システムを作成していますが、モジュールの Quartus 合成で問題が発生しています。具体的には、アドレス空間をいくつかの異なる部分に分割しましたが、そのうちの 1 つ (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 のアドレスを定義する 2 つのマクロ、つまり「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 は、私が ROM コード (つまり、printROM.hex) として指定した .hex ファイルを変換し、生成された .mif ファイルに CPU 可視アドレス (つまり、'hEB00 で始まる) を使用しているように見えますが、ROM のサイズが明らかに大きすぎます。小さな。Quartus はこの構文をサポートしていませんか、それとも間違っていますか?

4

2 に答える 2

1

Quartus はあなたがしていることを気に入らないようです。おそらく、1280 エントリの rom だけが必要な場合は、0:1279 から 1 つを作成し、その範囲を使用してアドレス指定する必要があります (これは、とにかくロジックが合成する必要があるものです)。

   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
于 2014-07-29T06:58:29.813 に答える
0

Quartus のメガ ウィザード プラグイン マネージャーで 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

于 2014-09-02T23:23:46.793 に答える