FC2カウンター FPGAの部屋 Spartan-6のMCBの動作2(コマンドポートとWriteポート)
FC2ブログ

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

FPGAの部屋

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

Spartan-6のMCBの動作2(コマンドポートとWriteポート)

MCBでユーザーデータをWriteする場合について勉強する。

MCBのユーザーデータをWrite/Readするには、コマンドを入れる必要がある。コマンドのexsample_top.vのmemc3_wrapperのポート接続を下に示す。

.p0_cmd_clk (c3_clk0),
.p0_cmd_en (c3_p0_cmd_en),
.p0_cmd_instr (c3_p0_cmd_instr),
.p0_cmd_bl (c3_p0_cmd_bl),
.p0_cmd_byte_addr (c3_p0_cmd_byte_addr),
.p0_cmd_empty (c3_p0_cmd_empty),
.p0_cmd_full (c3_p0_cmd_full),


信号名の最初のP0はPort0を表す(と思う)。
p0_cmd_enはコマンドのイネーブルで1でコマンドが有効となる。
p0_cmd_instrは3ビット幅で000がWrite、001がRead、010がオートプリチャージ付きのWrite、011がオートプリチャージ付きのRead、1XXがRefreshを実行する。
p0_cmd_blは6ビット幅のバースト長で、ユーザーのデータビット幅でのWrite/Readするデータの個数を表す。設定された数字+1のデータを転送する。例えば、000011を設定すると4個の128ビット幅のデータをRead/Writeする。4 X 16Bytes = 64Bytes。
p0_cmd_byte_addrは30ビット幅のDDR3 SDRAMメモリのアドレスで、128ビット幅のデータバスの場合は、下の4ビットが必ず0000となる。
p0_cmd_emptyとp0_cmd_fullは、コマンドのFIFOのemptyとfullだ。
コマンドのFIFOの深度は4だそうだ。4個のコマンドをFIFOに積むことができる。

Writeコマンドを発行する場合は、十分な量のデータをWriteデータのFIFOに積んでからWriteのコマンドを入れろと書いてある。実際にこのトラフィック・ジェネレータのサンプルではWriteデータをすべてFIFOに積んでからWriteコマンドを入れている。
Readコマンドを発行する場合は、Readデータを格納するFIFOに十分な空きがあることを確認してからReadコマンドを発行しろと書いてある。この辺は一般的な注意だろう。要はunderflow, overflowしないようにデータを出し入れすれば良いと思うが、タイミングによってはunderflow, overflowが起こる可能性があるので、上に示したように安全策をとれば安全だと思う。(当たり前!!!)

コマンドのタイミングチャートを示す前に、Writeのデータポートについて説明する。Writeのデータポートのexsample_top.vのmemc3_wrapperのポート接続を下に示す。

.p0_wr_clk (c3_clk0),
.p0_wr_en (c3_p0_wr_en),
.p0_wr_mask (c3_p0_wr_mask),
.p0_wr_data (c3_p0_wr_data),
.p0_wr_full (c3_p0_wr_full),
.p0_wr_empty (c3_p0_wr_empty),
.p0_wr_count (c3_p0_wr_count),
.p0_wr_underrun (c3_p0_wr_underrun),
.p0_wr_error (c3_p0_wr_error),


p0_wr_enが1の時にp0_wr_mask、p0_wr_dataがWriteデータのFIFOに積まれる。WriteデータのFIFOは64深度のFIFOとなっていて、p0_wr_countも7ビット長のデータカウンタになっている。
p0_wr_maskはマスクビットで1の時にWriteデータがマスクされる。データ長が128ビットなので、マスクビット長は16ビットとなる。
p0_wr_dataは言わずと知れた128ビット(このコンフィギュレーションでは)のWriteデータ。
p0_wr_underrunは、WriteデータのFIFOのデータが十分になくてunderflowしたことを示す。
p0_wr_errorはunderrunなどで、FIFOのポインタが不正になってしまった時だろうか?

トラフィック・ジェネレータサンプルでのMCBへのWriteデータのFIFOへの最初のWriteを示す。
MIG_OP_2_100429.png

カーソルの位置で、p0_wr_enが1になり、その時のp0_wr_dataとp0_wr_maskをWriteデータのFIFOに書き込み始めている。それにとなってp0_wr_emptyが0になり、p0_wr_countのカウントが増えている。
このようにデータをWriteデータのFIFOにWriteしてから、Writeコマンドを入れている。次にWriteコマンドのシミュレーション波形を示す。
MIG_OP_3_100429.png

p0_cmd_enが1になった時が、コマンドをコマンドのFIFOに書き込む時となっている。p0_cmd_instrは、000なのでWriteコマンドとなる。p0_cmd_blは 3F なので、64個のデータを書き込む。Writeコマンドを発行する前に、64深度のWriteデータのFIFOはFULLになっていて、すべてのWriteデータの準備ができている。p0_cmd_byte_addrは 00000400 だ。

このユーザー回路からのWriteに対応するDDR3 SDRAMへのWrite波形を下に示す。最初のWriteコマンドのアドレスは0200だった。16ビットアドレスなのでp0_cmd_byte_addr のアドレスは1ビット右にシフトされている。データを見ると最初にWriteデータのFIFOに書いたデータが出力されているのが分かる。(あたり前田の○ラッカー(これが分かる人はほとんどいないだろう。。。古すぎ。。。))
SP605_MIG_ISIm_9_100426.png

最後に、p0_cmd_en が1になってから、Writeコマンドを発行するまでの時間は、約46nsec だった。
MIG_OP_7_100430.png
  1. 2010年04月29日 07:49 |
  2. Virtex-6, Spartan-6
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/1448-cf0bc4eb
この記事にトラックバックする(FC2ブログユーザー)