FC2カウンター FPGAの部屋 2011年01月29日
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

キャラクタ・ディスプレイ・コントローラをNSLで書こう1(メモリの生成テスト)

キャラクタ・ディスプレイ・コントローラをNSLで書きなおしてみようと思っている。キャラクタ・ディスプレイ・コントローラに関しては、”キャラクタ・ディスプレイ・コントローラの詳しい説明”と”キャラクタ・ディスプレイ・コントローラのまとめ”参照。使用したISEはISE12.4 。

最初にキャラクタ・ジェネレータROMやフレーム・バッファRAMをどうやって書こうか?を考えた。NSLでは、チュートリアルの”8.メモリ”にメモリの生成と初期化方法が書いてある。でも、こう書いた場合にBlockRAMを使ってくれるかどうか?という不安がある。それではということで、実際にやってみた。チュートリアルに載っていたサンプルを少し加工させていただいて下に引用する。

declare memtest {
   input in[8], adr[8] ;
   output f[8] ;

   func_in write ;
   func_in read ;
}
module memtest {
   mem m[256][8] ;

   function write m[adr] := in ;
   function read  f = m[adr] ;
}


これをNSL CoreでVerilogに落とす(Optimizeオプションをチェックしてある)。落としたVerilogファイルを下に示す。

/*
 Produced by NSL Core(version=20110119), IP ARCH, Inc. Sat Jan 29 05:42:47 2011
 Licensed to :LIMITED EVALUATION USER:
*/

module memtest ( p_reset , m_clock , in , adr , f , write , read );
  input p_reset, m_clock;
  input [7:0] in;
  input [7:0] adr;
  output [7:0] f;
  input write;
  input read;
  reg [7:0] m [0:255];

   assign  f = m[adr];
always @(posedge m_clock)
  begin
   if (write )
     m[adr] <= in;
end
endmodule
/*
 Produced by NSL Core(version=20110119), IP ARCH, Inc. Sat Jan 29 05:42:48 2011
 Licensed to :LIMITED EVALUATION USER:
*/


多分これだと、BlockRAMには割り当てられないで、SLICEMに割り当てられると思う。実際にSpartan-3A Starter Kit 用にインプリメントしてFPGA Editorで見てみた。やはりSLICEMが割り当てられている。
CDCont_NSL_1_110129.png

選択されたSLICEMをダブルクリックして中身を見てみると、やはりRAMとして使用されていた。
CDCont_NSL_2_110129.png

やはり、assign f = m[adr]; が always @(posedge m_clock) の中にはっていないとBlockRAMにアサインされない。
この場合は、やはり、Verilogのプリミティブ記述をInterface文で付けたほうが良さそうだ。

ということで一度諦めたんですが、もしかして、Readにregを設定して、それにメモリのデータを一度コピーして出力すればどうだろう?ということで、やってみました。それにフレーム・バッファRAMを想定すると、デュアルポートRAMになっているので、NSLファイルを書きなおしてみた。そのNSLソースを下に示す。

// BlockRAM
declare memtest {
   input in[8], adr_w[8], adr_r[8] ;
   output f[8] ;

   func_in write(adr_w) ;
   func_in read(adr_r) ;
}
module memtest {
   mem m[256][8] ;
   reg ReadData[8];

   func write{
    m[adr_w] := in ;
   }
   func read{
    ReadData := m[adr_r] ;
    f = ReadData;
   }    
}


これをNSL CoreでVerilogに落とす(Optimizeオプションをチェックしてある)。落としたVerilogファイルを下に示す。

/*
 Produced by NSL Core(version=20110119), IP ARCH, Inc. Sat Jan 29 19:12:22 2011
 Licensed to :LIMITED EVALUATION USER:
*/

module memtest ( p_reset , m_clock , in , adr_w , adr_r , f , write , read );
  input p_reset, m_clock;
  input [7:0] in;
  input [7:0] adr_w;
  input [7:0] adr_r;
  output [7:0] f;
  input write;
  input read;
  reg [7:0] m [0:255];
  reg [7:0] ReadData;

   assign  f = ReadData;
always @(posedge m_clock)
  begin
   if (write )
     m[adr_w] <= in;
end
always @(posedge m_clock)
  begin
if ((read)) 
      ReadData <= m[adr_r];
end
endmodule
/*
 Produced by NSL Core(version=20110119), IP ARCH, Inc. Sat Jan 29 19:12:22 2011
 Licensed to :LIMITED EVALUATION USER:
*/


インプリメントして、FPGA Editorで見てみた。BlockRAMが使用されていた。
CDCont_NSL_3_110129.png

これで、大丈夫かな?と思う。キャラクタ・ジェネレータROMも生成してみよう。

(2011/01/30:追加)
分散RAMのデュアルポートRAMのNSL記述について追加しておく。

// 分散RAM
declare memtest {
   input in[8], adr_w[8], adr_r[8] ;
   output f[8] ;

   func_in write(adr_w) ;
   func_in read(adr_r) ;
}
module memtest {
   mem m[256][8] ;

   func write{
    m[adr_w] := in ;
   }
   func read{
    f = m[adr_r] ;
    }    
}


これをNSL CoreでVerilogに落とす(Optimizeオプションをチェックしてある)。落としたVerilogファイルを下に示す。

/*
 Produced by NSL Core(version=20110119), IP ARCH, Inc. Sun Jan 30 04:40:30 2011
 Licensed to :LIMITED EVALUATION USER:
*/

module memtest ( p_reset , m_clock , in , adr_w , adr_r , f , write , read );
  input p_reset, m_clock;
  input [7:0] in;
  input [7:0] adr_w;
  input [7:0] adr_r;
  output [7:0] f;
  input write;
  input read;
  reg [7:0] m [0:255];

   assign  f = m[adr_r];
always @(posedge m_clock)
  begin
   if (write )
     m[adr_w] <= in;
end
endmodule
/*
 Produced by NSL Core(version=20110119), IP ARCH, Inc. Sun Jan 30 04:40:30 2011
 Licensed to :LIMITED EVALUATION USER:
*/


  1. 2011年01月29日 19:24 |
  2. NSL
  3. | トラックバック:0
  4. | コメント:0