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

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

FPGAの部屋

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

XUPV5-LX110T Development SystemでMIGを試す4(Virtex-5のMIGの動作)

XUPV5-LX110T Development SystemでMIGを試す3(ISimでシミュレーション)”の続き。
前回、DDR2 SDRAMのテストベンチにdefineして、ISimでのシミュレーションがうまくいった。今回は、Virtex-5のユーザー回路とのインターフェースについて探ってみたい。

XUPV5-LX110Tの使用しているDDR2 SDRAMだが、SO-DIMMを使用している。Micron社製でMT4HTF3264HY-256MB(PDF)だ。DDR2 SDRAMチップはMT47H32M16(PDF)が使われているようだ。このDDR2 SDRAMチップは16ビット幅なので、Rowアドレス13ビット、Columnアドレス10ビット、Bankアドレス2ビットの計25ビットのアドレスを持っている。
Memory Interface Solutions UserGuideの380ページのTable 9-8: DDR2 SDRAM Controller User Interface Signalsのapp_af_adr[30:0]に説明があるが、Virtex-5のMIGのユーザー回路から与えるアドレスの割り当ては、Bank + Row + Column addressとなっている。至極まっとうな割り当てだと思うが、マルチバンク対応のコントローラをCPUで使用する場合には、データの局所性という観点からRow + Bank + Column の方が良いかもしれない。add_af_addrは31ビット幅あるが、今回のアドレス幅は25ビットである。

Memory Interface Solutions UserGuideの372ページのFigure 9-7: DDR2 Memory Controller Block Diagram を下に引用する。
ML509_MIG_6_110519.png

DDR2 SDRAMコントローラの入出力信号はSystem Clocks and Reset, User Application, Memory Deviceの信号に分けられる。そのうちのUser Applicationの信号について見ていこう。

Virtex-5用MIGで生成されたDDR2 SDRAMコントローラのユーザー・インターフェース信号について下に記す。()内はそれぞれDDR2 SDRAMコントローラに対しての入力、出力を表す。

app_af_cmd[2:0]:(入力) 3ビットのコマンド。000がWriteコマンド、001がReadコマンド。それ以外は不正値。
app_af_addr[30:0]:(入力) 31ビットのアドレス。今回は25ビット幅、26ビット目はChip Select。アドレスの割当はBank + Row + Column address。
app_af_wren:(入力) User Address FIFOへのWrite enable。これが1の時は、app_af_cmdとapp_af_addrが有効。
aff_wdf_data[2*DQ_WIDTH-1:0]:(入力) User Input Data。DDR2 SDRAMのデータ幅の2倍のデータ幅がある。クロックの立ち上がりのデータが下位、クロックの立ち下がりのデータが上位。128ビット幅。
app_wdf_mask_data[2*DM_WIDTH–1:0]:(入力) User Data Mask。DDR2 SDRAMのマスク幅の2倍の幅がある。 クロックの立ち上がりのマスクが下位、クロックの立ち下がりのマスクが上位。16ビット幅。
app_wdf_wren:(入力) User Write FIFOのWrite enable。これが1の時は、aff_wdf_dataとapp_wdf_mask_dataが有効。
app_af_afull:(出力) Address FIFOのAlmost Full。残り12以下の時に1になる。
app_wdf_afull:(出力) User Write FIFOのAlmost Full。残り12以下の時に1になる。
rd_data_valid:(出力) rd_data_fifo_outのデータが有効であることを示す。
rd_data_fifo_out[2*DQ_WIDTH–1:0]:(出力) メモリからReadしたデータ。128ビット幅。
phy_init_done:(出力) DDR2 SDRAMコントローラの初期化とキャリブレーションが終了した。
clk0_tb:(出力) ユーザー回路へのclk0出力


Write, Read両方とも、前のトランザクションとRow + Bankアドレスが違っていたら自動的にプリチャージして、Activateコマンドを発行してくれるようだ。

・Write
Memory Interface Solutions UserGuideの384ページのFigure 9-12: DDR2 SDRAM Write Burst for Four Bursts (BL = 4)を下に引用する。
ML509_MIG_7_110519.png

Address FIFOは1024深度、User Write FIFOは512深度あるようだ。
Writeはアドレス(app_af_addr) とコマンド(app_af_cmd)を決めて、app_af_wrenを1にしてAddress FIFOに書きこむと同時に、app_wdf_wrenを1にして、D1,D0をデータ(app_wdf_data)、M1,M0をマスク(app_mask_data) に書きこむ。次のクロックでは、app_af_wrenは0に戻して、データのみを書き込む。これで4バーストモードの1つのWriteができるようになる。コマンドはWrirte(000)。

実際にシミュレーションでデータをWirteしている部分を下に示す。
ML509_MIG_9_110519.png

データをUser Write FIFOに書き始めてから、実際にDDR2 SDRAMのWriteアクセスが実行されるまでに116.25ns/3.75ns = 31クロックかかっている。4バーストWrite8個分のトランザクションが始まって、DDR2 SDRAMにWriteし終わる間のクロックは約71クロック。なお、最初の4バーストWrite4個分のバーストできたが、後の4バーストWrite4個分のバーストと2つに分けられている。これは、Rowアドレスが異なるからである。

・Read
Memory Interface Solutions UserGuideの386ページのFigure 9-14: DDR2 SDRAM Read Burst (BL = 4) for Four Bursts を下に引用する。
ML509_MIG_8_110519.png

Readの場合は、app_af_wrenを1にして、アドレス(app_af_addr) とコマンド(app_af_cmd)を決めてAddress FIFOに必要な分だけ書きこむ。DDR2 SDRAMコントローラがDDR2 SDRAMからReadしたデータは、rd_data_fifo_outにrd_data_validが1の時に出力される。

実際にシミュレーションでReadしている例を下に示す。
ML509_MIG_10_110519.png

これは、ユーザー回路からReadコマンドが発行されてから、実際にDDR2 SDRAMにReadコマンドが発行されるまでは、255.1ns / 3.75ns ≒ 68クロックである。これは、Writeの実行を待っているために遅くなってしまった。FIFOの深度が大きいと最大のレイテンシが大きくなるので注意が必要だと思う。
ユーザー回路からReadコマンドが発行されてから、最後のReadデータが到着するまでのクロック数は85クロックだった。

あまりFIFOに入れすぎると、後で入れたコマンド処理のレイテンシが増大してしまうかもしれないので、もし、それが懸念される用途に使用する場合は注意が必要だと思う。
  1. 2011年05月19日 17:37 |
  2. MIG
  3. | トラックバック:0
  4. | コメント:0

FPGAの部屋が199万アクセス達成

FPGAの部屋もいつの間にか199万アクセス達成しました。自分で何気なく見たら、199万アクセスピッタリだったので、貼っておきます。
FPGAs_Room_199_110518.png

皆さん、見ていただいてありがとうございます。今後とも宜しくお願いいたします。
  1. 2011年05月19日 05:48 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2