FC2カウンター FPGAの部屋 2010年04月

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

FPGAの部屋

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

Spartan-6のMCBの動作3(Readポート)

Spartan-6のMCBの動作2(コマンドポートとWriteポート)”で、MCBのコマンドポートとWriteポートの構成と操作方法を見てきたが、今度はReadポートの構成と操作方法を見ていくことにする。

Readポートのexsample_top.vのmemc3_wrapperのポート接続を下に示す。

.p0_rd_clk (c3_clk0),
.p0_rd_en (c3_p0_rd_en),
.p0_rd_data (c3_p0_rd_data),
.p0_rd_full (c3_p0_rd_full),
.p0_rd_empty (c3_p0_rd_empty),
.p0_rd_count (c3_p0_rd_count),
.p0_rd_overflow (c3_p0_rd_overflow),
.p0_rd_error (c3_p0_rd_error),


p0_rd_emptyが0の時に有効なReadデータがp0_rd_dataに出ているので、ユーザー回路がp0_rd_en が1にして、p0_rd_dataを読み込む。p0_rd_dataは現在の構成では128ビット幅。
p0_rd_countは7ビット幅のReadデータカウントで64まで。
p0_rd_overflow はReadデータ用のFIFOにReadデータの十分な格納領域がないなどで、Readデータが無くなってしまったときに1になる。
p0_rd_error は、Read用のポインタがおかしくなったときに1になる。

現在のシミュレーション波形でDDR3 SDRAMのRead部分を下に示す。
MIG_OP_4_100430.png

上の図では図中に3つのReadコマンドが見える。最初のコマンドは、”Spartan-6のMCBの動作2(コマンドポートとWriteポート)”で見たWriteコマンドの番地をReadしている。mcb3_dram_dq にそのデータが見える。
これがMCBで読み込まれて、ユーザー側にどのように出てくるかを、シミュレーション波形で見てみよう。
MIG_OP_5_100430.png

p0_rd_empty が1から0になった時に、Readデータが用意されている。すでにp0_rd_data[127:0] に"00000400000004000000040000000400"が出力されている。po_rd_clk に同期して、ユーザー回路がp0_rd_en が1になり、次のpo_rd_clk に同期して次のp0_rd_data[127:0] が出力される。

最後にReadのレイテンシを測定した。Readコマンドが発行されてから、p0_rd_emptyが0になるまでの時間は下のシミュレーション結果から、約46nsec だった。
MIG_OP_6_100430.png
  1. 2010年04月30日 21:57 |
  2. Virtex-6, Spartan-6
  3. | トラックバック:0
  4. | コメント:0

4つ引き出しがある桧の収納家具作り1

前回、”ランバーコアに桧を貼りつけました”でランバーコアに桧を貼りつけて、4つ引き出しがある桧の収納家具の棚を作った。大分、間があいてしまったが、その間に、奥さんのベッドを作ったり、親の風呂場の立派なスノコ(これは2X4でコースレッドはサビないようにステンレス製を使った)を作ったりしていた。道具が揃っているし、何かと大工仕事を頼まれれるのだ。(便利に使われている)

さて、本来の家具作りの収納家具にとりかかることにした。前回、ランバーコアに桧を貼りつけた板を棚板の大きさに丸のこで切断した。これで横方向はぴったり303mmだが、長さ方向はまだ切っていない。家具作りには0.5mm程度の精度が必要となるのだ。下の写真は4枚分の棚板を重ねたところだ。
syuunoukagu_1_100429.jpg

木が反っていたのか?貼り付けたランバーコアと桧の縁があっていなかったで、ヤスリがけをした。最初は120番でかけて、240番で仕上げ。大体仕上がった。
今度は、桧の側板と天板の加工。トリマーにストレートビットをセットして、裏に4mmのベニアを貼るために5mmの溝を掘る。下の写真はトリマーをかけているまね。
syuunoukagu_2_100429.jpg

このように溝を掘るのだが、下の写真は溝の彫り方を間違っている。天板は上載せなので、側板は全部溝を掘る必要がある。天板を全部溝を掘ってしまったので、失敗してしまった。土曜日に手直しをしよう。
syuunoukagu_3_100429.jpg

桧を加工していると、とても良い匂いで気持ちが良い。端切れは、お風呂に入れて香を楽しんだ。かんなくずを布袋に入れてクッションにしても香がとても良い。
  1. 2010年04月29日 19:48 |
  2. 木工
  3. | トラックバック:0
  4. | コメント:0

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

Spartan-6のMCBの動作1(スタートアップ処理)

UG388(v2.1)(Spartan-6 FPGA Memory Controller User Guide)を元にMCBの動作を勉強していくことにする。

43ページのMCB Operation のStartup Sequence から、見て行く。
まず、UG388(v2.1)(Spartan-6 FPGA Memory Controller User Guide)の44ページの”Figure 4-1: MCB Startup Sequence”を下に引用する。
MIG_OP_1_100428.png

これによると最初にFPGAのコンフィギュレーションをして、PLLがロックしてから、Phase 1の入力終端のキャリブレーションを行うことになっているが、これは、”SP605用のMCBをMIGで生成する”の13で無効にしているのでやらないようだ。
SP605_MIG_13_100421.png

上の図で、Un-calibrated Input Terminationをチェックしている。

次はMode Registersをロードしている。これは、”SP605のMCBの動作を確認する1(ISimでシミュレーション)”で確認した。

その次は、Phase 2 のDQSのセンタリング・キャリブレーションを行うようだ。これは、ユーザーズ・ガイドによると、Readのキャプチャ・ウインドウ用のキャリブレーションで、Read時にDQSはReadデータと一緒にDDR3 SDRAMから出てくるのだが、Readデータの真ん中にDQSのエッジがくるようにキャリブレーションを行う。(ユーザーズ・ガイドの46ページのPhase 2: DQS Centeringを参照のこと)

その後、通常動作モードに移行する。通常動作モードにいるときに、電圧変動や温度のでDQに対するDQSの遅延を保証するためにContinuous DQS Tuning を行うようだ。(ユーザーズ・ガイドの46ページのPhase 3: Continuous DQS Tuningを参照のこと)
Continuous DQS Tuning を行うかどうかは、どうやら、ユーザーズ・ガイド25ページのコントローラーの属性のC_MC_CALIBRATION_MODE で決定されるらしい。シミュレータでC_MC_CALIBRATION_MODEはC_MC_CALIBRATION_MODE[87:0] となっていて、値が入っているが、どこで定義されていて、どのような意味かは特定していない。
  1. 2010年04月28日 04:55 |
  2. Virtex-6, Spartan-6
  3. | トラックバック:0
  4. | コメント:0

SP605のMCBの動作を確認する2(ISimでシミュレーション)

SP605のMCBの動作を確認する1(ISimでシミュレーション)”で初期化部分のパラメータを確認したが、今度はWrite, Read部分のパラメータを確認する。

ZQ CALIBRATION LONGコマンドからBank ACTIVATEコマンドまでは、約3.8usecだった。
SP605_MIG_ISIm_8_100425.png

Bank ACTIVATEコマンドの次の2つ目のWRITEコマンドが実行するまでのDDR3 SDRAMモデルが出力した表示を下に示す。

sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 9622501.0 ps INFO: Activate bank 0 row 0000
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 9637501.0 ps INFO: Write bank 0 col 200, auto precharge 0
sim_tb_top.\MEM_INST3.u_mem_c3 .main: at time 9645001.0 ps INFO: Sync On Die Termination Rtt_NOM = 60 Ohm
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 9647501.0 ps INFO: Write bank 0 col 208, auto precharge 0
sim_tb_top.\MEM_INST3.u_mem_c3 .data_task: at time 9651251.0 ps INFO: WRITE @ DQS= bank = 0 row = 0000 col = 00000200 data = 0400
sim_tb_top.\MEM_INST3.u_mem_c3 .data_task: at time 9652501.0 ps INFO: WRITE @ DQS= bank = 0 row = 0000 col = 00000201 data = 0000
sim_tb_top.\MEM_INST3.u_mem_c3 .data_task: at time 9653751.0 ps INFO: WRITE @ DQS= bank = 0 row = 0000 col = 00000202 data = 0400
sim_tb_top.\MEM_INST3.u_mem_c3 .data_task: at time 9655001.0 ps INFO: WRITE @ DQS= bank = 0 row = 0000 col = 00000203 data = 0000
sim_tb_top.\MEM_INST3.u_mem_c3 .data_task: at time 9656251.0 ps INFO: WRITE @ DQS= bank = 0 row = 0000 col = 00000204 data = 0400
sim_tb_top.\MEM_INST3.u_mem_c3 .data_task: at time 9657501.0 ps INFO: WRITE @ DQS= bank = 0 row = 0000 col = 00000205 data = 0000
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 9657501.0 ps INFO: Write bank 0 col 210, auto precharge 0
sim_tb_top.\MEM_INST3.u_mem_c3 .data_task: at time 9658751.0 ps INFO: WRITE @ DQS= bank = 0 row = 0000 col = 00000206 data = 0400
sim_tb_top.\MEM_INST3.u_mem_c3 .data_task: at time 9660001.0 ps INFO: WRITE @ DQS= bank = 0 row = 0000 col = 00000207 data = 0000
sim_tb_top.\MEM_INST3.u_mem_c3 .data_task: at time 9661251.0 ps INFO: WRITE @ DQS= bank = 0 row = 0000 col = 00000208 data = 0410
sim_tb_top.\MEM_INST3.u_mem_c3 .data_task: at time 9662501.0 ps INFO: WRITE @ DQS= bank = 0 row = 0000 col = 00000209 data = 0000
sim_tb_top.\MEM_INST3.u_mem_c3 .data_task: at time 9663751.0 ps INFO: WRITE @ DQS= bank = 0 row = 0000 col = 0000020a data = 0410
sim_tb_top.\MEM_INST3.u_mem_c3 .data_task: at time 9665001.0 ps INFO: WRITE @ DQS= bank = 0 row = 0000 col = 0000020b data = 0000
sim_tb_top.\MEM_INST3.u_mem_c3 .data_task: at time 9666251.0 ps INFO: WRITE @ DQS= bank = 0 row = 0000 col = 0000020c data = 0410
sim_tb_top.\MEM_INST3.u_mem_c3 .data_task: at time 9667501.0 ps INFO: WRITE @ DQS= bank = 0 row = 0000 col = 0000020d data = 0000


上の図でmcb3_dram_odt がWriteの時に1になって、ODTが入っている(9645001.0 ps INFO: Sync On Die Termination Rtt_NOM = 60 Ohm)。
SP605のMCBの動作を確認する1(ISimでシミュレーション)”でWrite Latency = 5に設定したはずだが、シミュレーション波形で見てもWrite Latency = 5だった。(当たり前) 12.62nsec / 2.5nsec ≒ 5(カーソルでクロックが違っているので値が少し違っている)
SP605_MIG_ISIm_9_100426.png

Readの場合を見てみよう。CAS Latency = 6 と設定されていた。下のタイミングチャートを見ると15nsec = 2.5nsec =6 となっている。
SP605_MIG_ISIm_10_100426.png

下に、READコマンド2つ分のDDR3 SDRAMモデルが出力した表示を下に示す。

sim_tb_top.\MEM_INST3.u_mem_c3 .main: at time 13102501.0 ps INFO: Sync On Die Termination Rtt_NOM = 0 Ohm
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 13105001.0 ps INFO: Read bank 0 col 200, auto precharge 0
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 13115001.0 ps INFO: Read bank 0 col 208, auto precharge 0
sim_tb_top.\MEM_INST3.u_mem_c3 .data_task: at time 13118751.0 ps INFO: READ @ DQS= bank = 0 row = 0000 col = 00000200 data = 0400
sim_tb_top.\MEM_INST3.u_mem_c3 .data_task: at time 13120001.0 ps INFO: READ @ DQS= bank = 0 row = 0000 col = 00000201 data = 0000
sim_tb_top.\MEM_INST3.u_mem_c3 .data_task: at time 13121251.0 ps INFO: READ @ DQS= bank = 0 row = 0000 col = 00000202 data = 0400
sim_tb_top.\MEM_INST3.u_mem_c3 .data_task: at time 13122501.0 ps INFO: READ @ DQS= bank = 0 row = 0000 col = 00000203 data = 0000
sim_tb_top.\MEM_INST3.u_mem_c3 .data_task: at time 13123751.0 ps INFO: READ @ DQS= bank = 0 row = 0000 col = 00000204 data = 0400
sim_tb_top.\MEM_INST3.u_mem_c3 .data_task: at time 13125001.0 ps INFO: READ @ DQS= bank = 0 row = 0000 col = 00000205 data = 0000
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 13125001.0 ps INFO: Read bank 0 col 210, auto precharge 0
sim_tb_top.\MEM_INST3.u_mem_c3 .data_task: at time 13126251.0 ps INFO: READ @ DQS= bank = 0 row = 0000 col = 00000206 data = 0400
sim_tb_top.\MEM_INST3.u_mem_c3 .data_task: at time 13127501.0 ps INFO: READ @ DQS= bank = 0 row = 0000 col = 00000207 data = 0000
sim_tb_top.\MEM_INST3.u_mem_c3 .data_task: at time 13128751.0 ps INFO: READ @ DQS= bank = 0 row = 0000 col = 00000208 data = 0410
sim_tb_top.\MEM_INST3.u_mem_c3 .data_task: at time 13130001.0 ps INFO: READ @ DQS= bank = 0 row = 0000 col = 00000209 data = 0000
sim_tb_top.\MEM_INST3.u_mem_c3 .data_task: at time 13131251.0 ps INFO: READ @ DQS= bank = 0 row = 0000 col = 0000020a data = 0410
sim_tb_top.\MEM_INST3.u_mem_c3 .data_task: at time 13132501.0 ps INFO: READ @ DQS= bank = 0 row = 0000 col = 0000020b data = 0000
sim_tb_top.\MEM_INST3.u_mem_c3 .data_task: at time 13133751.0 ps INFO: READ @ DQS= bank = 0 row = 0000 col = 0000020c data = 0410
sim_tb_top.\MEM_INST3.u_mem_c3 .data_task: at time 13135001.0 ps INFO: READ @ DQS= bank = 0 row = 0000 col = 0000020d data = 0000


1つ目のReadコマンドが入ってからデータが出る前に、2つ目のReadコマンドが出力されている。その後に1つ目のデータが出力されている。

これでMCBがDDR3 SDRAMをコントロールする動作は大体わかったので、MCBのユーザー側のインターフェースを見て行こうと思う。
  1. 2010年04月26日 05:51 |
  2. Virtex-6, Spartan-6
  3. | トラックバック:0
  4. | コメント:0

SP605のMCBの動作を確認する1(ISimでシミュレーション)

SP605のMCBをISimでシミュレーションする1”の続き。続きなんだけど、MCBのシミュレーション時の動作を見るので、タイトルと記事のカテゴリーを変えた。

さて、このシミュレーションでは2回、DDR3 SDRAMのリセットがかかっているが、2度目のリセット後を見てみよう。Micron社のDDR3 SDRAMモデルは色々なメッセージを出してくれるので便利だ。そのうちの初期化部分のメッセージを下に示す。なお、Micron社のDDR3 SDRAMデータシートを参照のこと。

sim_tb_top.\MEM_INST3.u_mem_c3 .reset at time 5471251.0 ps WARNING: 200 us is required before RST_N goes inactive.
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task at time 5622501.0 ps WARNING: 500 us is required after RST_N goes inactive before CKE goes active.
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 5755001.0 ps INFO: Load Mode 2
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 5755001.0 ps INFO: Load Mode 2 CAS Write Latency = 5
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 5755001.0 ps INFO: Load Mode 2 Auto Self Refresh = Enabled
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 5755001.0 ps WARNING: Load Mode 2 Auto Self Refresh is not modeled
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 5755001.0 ps INFO: Load Mode 2 Self Refresh Temperature = Normal
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 5755001.0 ps INFO: Load Mode 2 Dynamic ODT = Disabled
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 5765001.0 ps INFO: Load Mode 3
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 5765001.0 ps INFO: Load Mode 3 MultiPurpose Register Select = Pre-defined pattern
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 5765001.0 ps INFO: Load Mode 3 MultiPurpose Register Enable = Disabled
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 5775001.0 ps INFO: Load Mode 1
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 5775001.0 ps INFO: Load Mode 1 DLL Enable = Enabled
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 5775001.0 ps INFO: Load Mode 1 Output Drive Strength = 40 Ohm
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 5775001.0 ps INFO: Load Mode 1 ODT Rtt = 60 Ohm
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 5775001.0 ps INFO: Load Mode 1 Additive Latency = 0
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 5775001.0 ps INFO: Load Mode 1 Write Levelization = Disabled
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 5775001.0 ps INFO: Load Mode 1 TDQS Enable = Disabled
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 5775001.0 ps INFO: Load Mode 1 Qoff = Enabled
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 5785001.0 ps INFO: Load Mode 0
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 5785001.0 ps INFO: Load Mode 0 Burst Length = 8
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 5785001.0 ps INFO: Load Mode 0 Burst Order = Sequential
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 5785001.0 ps INFO: Load Mode 0 CAS Latency = 6
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 5785001.0 ps INFO: Load Mode 0 DLL Reset = Reset DLL
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 5785001.0 ps INFO: Load Mode 0 Write Recovery = 6
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 5785001.0 ps INFO: Load Mode 0 Power Down Mode = DLL off
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 5817501.0 ps INFO: ZQ long = 1
sim_tb_top.\MEM_INST3.u_mem_c3 .cmd_task: at time 5817501.0 ps INFO: Initialization Sequence is complete


”sim_tb_top.\MEM_INST3.u_mem_c3 .reset at time 5471251.0 ps WARNING: 200 us is required before RST_N goes inactive.”は、RST_NのLOWの時間が規格で必要とされる200usecよりも小さいと言っている。これは、シミュレーションの時のみ、見やすいように縮めているためかもしれない。シミュレーションでの測定値は、117.5nsec。
SP605_MIG_ISIm_6_100425.png

次に”WARNING: 500 us is required after RST_N goes inactive before CKE goes active.”はRST_Nが1になった跡で、CKEが1にするに500nsec必要だが、それを満たしていないと言ってる。シミュレーションでの測定値は、150nsec。
その後、132.5nsec後から、4つのMODE REGISTER SETコマンドと1つのZQ CALIBRATION LONGコマンドを発行している。
SP605_MIG_ISIm_7_100425.png

最初がMode Register 2(MR2), MR3, MR1(DLL Enable), MR0(DLL RESET) の順番でMRが書き込まれる。MRの番号はBank Addressの値で決まる。

SP605のMCBをISimでシミュレーションする1”の下に図に設定された内容を上のメッセージで確認することができる。”Output Drive Strength = 40 Ohm、ODT Rtt = 60 Ohm、Auto Self Refresh = Enabled、Self Refresh Temperature = Normal、Dynamic ODT = Disabled”。
SP605_MIG_10_100421.png

シミュレーションでは、特に遅延を合わせるためのトレーニング・シーケンスをしているような様子は見えない?これで大丈夫なのだろうか?もしかして、シミュレーションのときだけはトレーニング・シーケンスなしになるのだろうか?
  1. 2010年04月25日 07:35 |
  2. Virtex-6, Spartan-6
  3. | トラックバック:0
  4. | コメント:0

エレキジャック・フォーラムin Akihabaraに行ってきました

エレキジャック・フォーラムin Akihabaraに行ってきました。
とても素敵な講義を無料で聞けて、皆さんにお会いできて、本当に楽しかったです。
いえながさん、そんそんさん、ぱおさん、すすたわりさん、Simさん、hazeziさん、windyさん、poleさん、お話しできて楽しかったです。どなたか忘れていたらごめんなさい。ご挨拶しかできなかった方、ゆっくりお話されていただいた方、楽しかったです。また、MTM05ででも、お会いいたしましょう。
講義も楽しかったです。撮影できますPさんのアプトプットが大事という一言が胸にぐさっときました。私のアウトプットは第1にはブログでしょうか?さらに、日頃の成果?を先生と一緒に、6月の画像センシングシンポジウムで展示する予定です。と言っても手配線のボードが上についてる画像ボードですが。。。(1日だけの予定です。まだ何日かわかりません)画像圧縮のためのマックスプラス代数上におけるウェーブレット変換の初期段階のデモの展示です。ブログで培ったCMOSカメラ回路をベースにしています。
超電磁Pさんの講義はとにかく面白くためになりました。長船さんの講義は3Dの講義はとてもためになって、参考書が欲しくなりました。長船さんが今日の講義をまとめた本を書いたとしたら絶対買います!!!
FMステレオ・チューナの製作の林さん、第3ナイキスト領域を使うなんて!フーリエ変換を昔々大学で勉強したときには思いもしなかった。第1ナイキスト空間しか使ったことがなかった。考えてみれば、折り返されるので分離できれば使えるのか。。。第2ナイキスト空間は折り返されて、周波数分布が逆になっていないのだろうか?やはり、数学は大事だということを実感したな~。いまはこんなのがあるんだ。。。(ナイキスト以上の周波数を出力できる高速D-A変換ICをマキシム社が発売

展示は、株式会社アールティのマイコンの使い方が学べるロボット教材チョロ丸が面白かったです。このページの右上のものです。上のマイコンボードだけ、FPGA+CPU基板に取り替えて、CMOSカメラを載せて画像認識して歩かせてみたいな?とか思ちゃいました。
今日は息子の誕生会だったので、長船さんの講義が終わったら即効で帰ってきました。

最後に、関係ないですが、人が並んでいたGundam cafeの写真です。
Gundam_Cafe_100424.jpg
  1. 2010年04月24日 20:46 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:2

SP605のMCBをISimでシミュレーションする1

SP605用のMCBをMIGで生成する”で生成したMIGモジュールをISimでシミュレーションしてみた。

sp605_mig_design\mig_33\example_design\sim\functionalフォルダに移動すると、isiim.batがある。これを実行するわけだ。isim.batの中身はfuseコマンドとそのfuseコマンドで生成されたシミュレーション実行ファイルのmig_33.exe だ。mig_33.exeをGUIモードで起動することでISimが立ち上がる。fuseコマンドは、-prjで指定されたファイルに書かれた記述で、 vhpcomp または vlogcomp が自動的に呼び出されてコンパイルされるそうだ。(ISim ユーザーズ・ガイド参照)
さて、コマンドプロンプトからisim.bat を起動しよう。
SP605_MIG_ISIm_1_100423.png

起動すると、Verilogファイルのコンパイルが実行され、最後に出来上がったmig_33.exeが実行される。
SP605_MIG_ISIm_2_100423.png

ISimのGUIが起動する。
SP605_MIG_ISIm_3_100423.png

Instance and Processペインからトップのsim_tb_topを選択して、Objectsペインの全部の信号名を右の波形が表示されるペインのNameにドラック・アンド・ドロップする。そして右クリックメニューからRadixをHexadecimalに変更する。
SP605_MIG_ISIm_4_100423.png

下のConsoleペインでrun 15us とタイプして15usec シミュレーションを行った。結果が下の図だ。
SP605_MIG_ISIm_5_100423.png

シミュレーションをすることができた。mcb3_dram_reset_n が2回アサートされて、リセットが2度かかっているのがわかる。これはどうしてだろう?DDR3 SDRAMからこうなったのかな?(以前に”DDR3 SDRAMの新機能のまとめ”で勉強したとおりにDDR3 SDRAMはリセットすることができるようになった)
クロック周期はc3_sys_clk_p の周期が2.5nsec、周波数は400MHzでDDR3-800 のようだ。

いろいろ見ていると興味深い。今日はエレキジャック・フォーラムに行ってくるので、詳しい解析は、その後にしよう。DDR3 SDRAMのマニュアルも参照する必要がある。
  1. 2010年04月24日 05:36 |
  2. Spartan-6 FPGA SP605 評価キット
  3. | トラックバック:0
  4. | コメント:0

エレキジャック・フォーラムin Akihabara

今週の土曜に、エレキジャック・フォーラムin Akihabaraに行ってきます。
主に、「プロの技」トーク・ショーを聞く予定です。見かけたらお声がけください。
非常に楽しみなんですが、当日は息子の誕生日でして、夜は誕生会なので、早めに帰るかもしれません。
  1. 2010年04月22日 05:42 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:2

SP605用のMCBをMIGで生成する

SP605のMCB(Memory Controller Block) をMIG(Memory Interface Generator) で生成してみようと思う。
Xilinx社のSP605用のMIGの資料、XTP060を元に、ISE11.5のCORE GeneratorでMCBのデザインを生成してみる。

1. 最初に、CORE Generatorを起動し、FileメニューからNew Projectを選択して新規プロジェクトを作成する。(やり方はXTP060、9ページ参照)
SP605_MIG_1_100421.png

2. sp605_mig_designというフォルダを新規作成して、その中にsp605_mig_design.cgpプロジェクトを作成する。
SP605_MIG_2_100421.png

3. Project Optionsダイアログで、Spartan-6, xc6slx45t, fgg484, -3 を選択する。まだ設定があるので、OKボタンをクリックしてはだめだ(1回やってしまった)。
SP605_MIG_3_100421.png

4. 左のペインからGeneration を選択する。Design EntryをVerilogに変更し、設定はこれで終了なので、OKボタンをクリックする。
SP605_MIG_4_100421.png

5. 左のIP Catalogから、MIGを選択して、右のペインのCustomizeをクリックする。
SP605_MIG_5_100421.png

6. MIGが起動する。Next->ボタンをクリックする。
SP605_MIG_6_100421.png

7. Create Design とComponent Name を確認して、Next->ボタンをクリックする。
SP605_MIG_7_100421.png

8. Bank3にDDR3 SDRAMを選択して、Next->ボタンをクリックする。
SP605_MIG_8_100421.png

9. Frequency は2500psec, 400MHzのままで、Memory PartはMT41J64M16XX-187E を選択する。
SP605_MIG_9_100421.png

10. Memory Option for C3はデフォルトのままで、Next->ボタンをクリックする。ODTやリフレッシュなどの設定があった。
SP605_MIG_10_100421.png

11. Configuration Selection は、One 128-bit bi-direction port に設定する。Memory Address Mapping SelectionはROW,BANK,COLUMNのデフォルトのまま。ちなみにこのほうがバンクを有効に使用することができるとおもう。
SP605_MIG_11_100421.png

12. Arbitration for C3 はデフォルトのまま。
SP605_MIG_12_100421.png

13. Un-calibrated Input Terminationをチェックして、DQ/DQSを50 Ohmsに設定する。Debug Signals for Memory Conteroller をEnableに設定する。XTP060の資料よりもsystem Clockが追加されていた。これはDDR3 SDRAMは当然Differentialなのでそのままとする。
SP605_MIG_13_100421.png

14. Summary が表示される。Next->ボタンをクリックする。
SP605_MIG_14_100421.png

15. Micron社のシミュレーションモデルのLicense Agreementが表示される。Acceptのラジをボタンをクリックし、Next->ボタンをクリックする。
SP605_MIG_15_100421.png

16. PCB Information が表示される。Next->ボタンをクリックする。
SP605_MIG_16_100421.png

17. Design Notes が表示される。Generateボタンをクリックして、DDR3 SDRAMコントローラコアを生成する。(やっと)
SP605_MIG_17_100421.png

18. Readme mig33 ダイアログが出て、Closeボタンをクリックすると終了する。
SP605_MIG_18_100421.png

19. CORE Generator に戻ってみると、Project IPのペインにmig_33というMIGのIPが出来上がっている。
SP605_MIG_19_100421.png

これでDDR3 SDRAMコントローラの生成は終了したが、長かった。。。
sp605_mig_designフォルダの下には、いろいろなファイルが生成されている。mig_33フォルダの下にexample_designとuser_designフォルダが生成された。example_designフォルダはtraffic_generatorサンプルデザインが生成されている。user_designフォルダは空のユーザーのデザインを接続するDDR3 SDRAMコントローラのデザインが生成された。どこに書いてあったか忘れてしまったが、どれかのマニュアルに書いてあった。
SP605_MIG_20_100421.png

どちらのデザインのsimフォルダにもddr3_model_c3.vのマイクロン社のDDR3 SDRAMのモデルが生成されていて、シミュレーションが出来そうだ。次回はISimでシミュレーションしてみようと思う。
  1. 2010年04月21日 05:42 |
  2. Spartan-6 FPGA SP605 評価キット
  3. | トラックバック:0
  4. | コメント:0

Spartan-6のMemory Contoller Block(MCB)の勉強1

Spartan-6 FPGA メモリ コントローラ ユーザー ガイド (英語版)”で、Memory Contoller Block(MCB)の勉強をすることにした。

まずは仕様を下に示す。”Spartan-6 FPGA メモリ コントローラ ユーザー ガイド (英語版)”より引用。

1. DDR, DDR2, DDR3, and LPDDR (Mobile DDR)サポート
2. 800Mbps(400MHz DDR)までサポート
3. パッケージに最大4つのMCBが入っている。それぞれのMCBコアは以下の特徴がある。
 ・4、8、16ビット長の1つのメモリを制御する。
 ・メモリのサイズとしては4Gbitまで。
 ・最大12.8Gbit/secの性能。(800MHz X 16bit = 12,800Mbit/sec = 12.8Gbit/sec)
4. MCBはユーザーロジックからマルチポートのメモリ・コントローラとして使うことができる。
 ・1ポートから6ポートまで設定できる。
 ・データポートを32、64、128ビットのバス幅に設定できる。
 ・2つの両方向ポートと4つの片方向ポートがある。
5. 8個までのバンクを同時に開くことが出来る。(これは凄い、私の作ったコントローラは1つのバンクしか開かない、でもプリチャージは自分で管理するのかな?)
6. ハードマクロでコントローラ、PHYが内蔵されている。
7. それぞれのMCBで使用するピン配置は決定されている。(これも性能を取ったらそうなるだろう?)
8. メモリデバイスのパラメータは設定可能。
 ・ドライバのドライブ強度
 ・On-Die Termination(ODT)
 ・CAS Latency
 ・Self refresh
 ・リフレッシュ間隔
 ・Write recovery time
9. Readの時のDQSとDQの自動遅延キャリブレーション
10. FPGAon-chip input terminationのオプションの自動キャリブレーション
11. COER Generator とEDKでサポート
 ・MIGでサポート
 ・EDKからはマルチポートのメモリ・コントローラ(MPMC)IPとしてサポート


下に、”Spartan-6 FPGA メモリ コントローラ ユーザー ガイド (英語版)”の11ページの Figure 1-1: Spartan-6 FPGA Memory Controller Block (IP Wrapper View) を引用する。
MCB_1_100420.png

上の図を見るとわかるように、6つのコマンドFIFOと6つの両方向または片方向のデータポートがある。アービタやコントローラ、データパス、PHY、キャリブレーションロジックなどがある。

DDRの最大データレートは400Mbits/sec、DDR2とDDR3は800Mbits/sec、LPDDRは400Mbis/sec。

メモリ・コントローラのアトリビュートとポートはVHDLのコンポーネントを見るとよくわかる。unisim_VCOMP.vhdのMCBのコンポーネント宣言を下に引用する。

component MCB
  generic (
     ARB_NUM_TIME_SLOTS : integer := 12;
     ARB_TIME_SLOT_0 : bit_vector := "111111111111111111";
     ARB_TIME_SLOT_1 : bit_vector := "111111111111111111";
     ARB_TIME_SLOT_10 : bit_vector := "111111111111111111";
     ARB_TIME_SLOT_11 : bit_vector := "111111111111111111";
     ARB_TIME_SLOT_2 : bit_vector := "111111111111111111";
     ARB_TIME_SLOT_3 : bit_vector := "111111111111111111";
     ARB_TIME_SLOT_4 : bit_vector := "111111111111111111";
     ARB_TIME_SLOT_5 : bit_vector := "111111111111111111";
     ARB_TIME_SLOT_6 : bit_vector := "111111111111111111";
     ARB_TIME_SLOT_7 : bit_vector := "111111111111111111";
     ARB_TIME_SLOT_8 : bit_vector := "111111111111111111";
     ARB_TIME_SLOT_9 : bit_vector := "111111111111111111";
     CAL_BA : bit_vector := X"0";
     CAL_BYPASS : string := "YES";
     CAL_CA : bit_vector := X"000";
     CAL_CALIBRATION_MODE : string := "NOCALIBRATION";
     CAL_CLK_DIV : integer := 1;
     CAL_DELAY : string := "QUARTER";
     CAL_RA : bit_vector := X"0000";
     MEM_ADDR_ORDER : string := "BANK_ROW_COLUMN";
     MEM_BA_SIZE : integer := 3;
     MEM_BURST_LEN : integer := 8;
     MEM_CAS_LATENCY : integer := 4;
     MEM_CA_SIZE : integer := 11;
     MEM_DDR1_2_ODS : string := "FULL";
     MEM_DDR2_3_HIGH_TEMP_SR : string := "NORMAL";
     MEM_DDR2_3_PA_SR : string := "FULL";
     MEM_DDR2_ADD_LATENCY : integer := 0;
     MEM_DDR2_DIFF_DQS_EN : string := "YES";
     MEM_DDR2_RTT : string := "50OHMS";
     MEM_DDR2_WRT_RECOVERY : integer := 4;
     MEM_DDR3_ADD_LATENCY : string := "OFF";
     MEM_DDR3_AUTO_SR : string := "ENABLED";
     MEM_DDR3_CAS_LATENCY : integer := 7;
     MEM_DDR3_CAS_WR_LATENCY : integer := 5;
     MEM_DDR3_DYN_WRT_ODT : string := "OFF";
     MEM_DDR3_ODS : string := "DIV7";
     MEM_DDR3_RTT : string := "DIV2";
     MEM_DDR3_WRT_RECOVERY : integer := 7;
     MEM_MDDR_ODS : string := "FULL";
     MEM_MOBILE_PA_SR : string := "FULL";
     MEM_MOBILE_TC_SR : integer := 0;
     MEM_RAS_VAL : integer := 0;
     MEM_RA_SIZE : integer := 13;
     MEM_RCD_VAL : integer := 1;
     MEM_REFI_VAL : integer := 0;
     MEM_RFC_VAL : integer := 0;
     MEM_RP_VAL : integer := 0;
     MEM_RTP_VAL : integer := 0;
     MEM_TYPE : string := "DDR3";
     MEM_WIDTH : integer := 4;
     MEM_WR_VAL : integer := 0;
     MEM_WTR_VAL : integer := 3;
     PORT_CONFIG : string := "B32_B32_B32_B32"
  );
  port (
     ADDR : out std_logic_vector(14 downto 0);
     BA : out std_logic_vector(2 downto 0);
     CAS : out std_ulogic;
     CKE : out std_ulogic;
     DQIOWEN0 : out std_ulogic;
     DQON : out std_logic_vector(15 downto 0);
     DQOP : out std_logic_vector(15 downto 0);
     DQSIOWEN90N : out std_ulogic;
     DQSIOWEN90P : out std_ulogic;
     IOIDRPADD : out std_ulogic;
     IOIDRPADDR : out std_logic_vector(4 downto 0);
     IOIDRPBROADCAST : out std_ulogic;
     IOIDRPCLK : out std_ulogic;
     IOIDRPCS : out std_ulogic;
     IOIDRPSDO : out std_ulogic;
     IOIDRPTRAIN : out std_ulogic;
     IOIDRPUPDATE : out std_ulogic;
     LDMN : out std_ulogic;
     LDMP : out std_ulogic;
     ODT : out std_ulogic;
     P0CMDEMPTY : out std_ulogic;
     P0CMDFULL : out std_ulogic;
     P0RDCOUNT : out std_logic_vector(6 downto 0);
     P0RDDATA : out std_logic_vector(31 downto 0);
     P0RDEMPTY : out std_ulogic;
     P0RDERROR : out std_ulogic;
     P0RDFULL : out std_ulogic;
     P0RDOVERFLOW : out std_ulogic;
     P0WRCOUNT : out std_logic_vector(6 downto 0);
     P0WREMPTY : out std_ulogic;
     P0WRERROR : out std_ulogic;
     P0WRFULL : out std_ulogic;
     P0WRUNDERRUN : out std_ulogic;
     P1CMDEMPTY : out std_ulogic;
     P1CMDFULL : out std_ulogic;
     P1RDCOUNT : out std_logic_vector(6 downto 0);
     P1RDDATA : out std_logic_vector(31 downto 0);
     P1RDEMPTY : out std_ulogic;
     P1RDERROR : out std_ulogic;
     P1RDFULL : out std_ulogic;
     P1RDOVERFLOW : out std_ulogic;
     P1WRCOUNT : out std_logic_vector(6 downto 0);
     P1WREMPTY : out std_ulogic;
     P1WRERROR : out std_ulogic;
     P1WRFULL : out std_ulogic;
     P1WRUNDERRUN : out std_ulogic;
     P2CMDEMPTY : out std_ulogic;
     P2CMDFULL : out std_ulogic;
     P2COUNT : out std_logic_vector(6 downto 0);
     P2EMPTY : out std_ulogic;
     P2ERROR : out std_ulogic;
     P2FULL : out std_ulogic;
     P2RDDATA : out std_logic_vector(31 downto 0);
     P2RDOVERFLOW : out std_ulogic;
     P2WRUNDERRUN : out std_ulogic;
     P3CMDEMPTY : out std_ulogic;
     P3CMDFULL : out std_ulogic;
     P3COUNT : out std_logic_vector(6 downto 0);
     P3EMPTY : out std_ulogic;
     P3ERROR : out std_ulogic;
     P3FULL : out std_ulogic;
     P3RDDATA : out std_logic_vector(31 downto 0);
     P3RDOVERFLOW : out std_ulogic;
     P3WRUNDERRUN : out std_ulogic;
     P4CMDEMPTY : out std_ulogic;
     P4CMDFULL : out std_ulogic;
     P4COUNT : out std_logic_vector(6 downto 0);
     P4EMPTY : out std_ulogic;
     P4ERROR : out std_ulogic;
     P4FULL : out std_ulogic;
     P4RDDATA : out std_logic_vector(31 downto 0);
     P4RDOVERFLOW : out std_ulogic;
     P4WRUNDERRUN : out std_ulogic;
     P5CMDEMPTY : out std_ulogic;
     P5CMDFULL : out std_ulogic;
     P5COUNT : out std_logic_vector(6 downto 0);
     P5EMPTY : out std_ulogic;
     P5ERROR : out std_ulogic;
     P5FULL : out std_ulogic;
     P5RDDATA : out std_logic_vector(31 downto 0);
     P5RDOVERFLOW : out std_ulogic;
     P5WRUNDERRUN : out std_ulogic;
     RAS : out std_ulogic;
     RST : out std_ulogic;
     SELFREFRESHMODE : out std_ulogic;
     STATUS : out std_logic_vector(31 downto 0);
     UDMN : out std_ulogic;
     UDMP : out std_ulogic;
     UOCALSTART : out std_ulogic;
     UOCMDREADYIN : out std_ulogic;
     UODATA : out std_logic_vector(7 downto 0);
     UODATAVALID : out std_ulogic;
     UODONECAL : out std_ulogic;
     UOREFRSHFLAG : out std_ulogic;
     UOSDO : out std_ulogic;
     WE : out std_ulogic;
     DQI : in std_logic_vector(15 downto 0);
     DQSIOIN : in std_ulogic;
     DQSIOIP : in std_ulogic;
     IOIDRPSDI : in std_ulogic;
     P0ARBEN : in std_ulogic;
     P0CMDBA : in std_logic_vector(2 downto 0);
     P0CMDBL : in std_logic_vector(5 downto 0);
     P0CMDCA : in std_logic_vector(11 downto 0);
     P0CMDCLK : in std_ulogic;
     P0CMDEN : in std_ulogic;
     P0CMDINSTR : in std_logic_vector(2 downto 0);
     P0CMDRA : in std_logic_vector(14 downto 0);
     P0RDCLK : in std_ulogic;
     P0RDEN : in std_ulogic;
     P0RWRMASK : in std_logic_vector(3 downto 0);
     P0WRCLK : in std_ulogic;
     P0WRDATA : in std_logic_vector(31 downto 0);
     P0WREN : in std_ulogic;
     P1ARBEN : in std_ulogic;
     P1CMDBA : in std_logic_vector(2 downto 0);
     P1CMDBL : in std_logic_vector(5 downto 0);
     P1CMDCA : in std_logic_vector(11 downto 0);
     P1CMDCLK : in std_ulogic;
     P1CMDEN : in std_ulogic;
     P1CMDINSTR : in std_logic_vector(2 downto 0);
     P1CMDRA : in std_logic_vector(14 downto 0);
     P1RDCLK : in std_ulogic;
     P1RDEN : in std_ulogic;
     P1RWRMASK : in std_logic_vector(3 downto 0);
     P1WRCLK : in std_ulogic;
     P1WRDATA : in std_logic_vector(31 downto 0);
     P1WREN : in std_ulogic;
     P2ARBEN : in std_ulogic;
     P2CLK : in std_ulogic;
     P2CMDBA : in std_logic_vector(2 downto 0);
     P2CMDBL : in std_logic_vector(5 downto 0);
     P2CMDCA : in std_logic_vector(11 downto 0);
     P2CMDCLK : in std_ulogic;
     P2CMDEN : in std_ulogic;
     P2CMDINSTR : in std_logic_vector(2 downto 0);
     P2CMDRA : in std_logic_vector(14 downto 0);
     P2EN : in std_ulogic;
     P2WRDATA : in std_logic_vector(31 downto 0);
     P2WRMASK : in std_logic_vector(3 downto 0);
     P3ARBEN : in std_ulogic;
     P3CLK : in std_ulogic;
     P3CMDBA : in std_logic_vector(2 downto 0);
     P3CMDBL : in std_logic_vector(5 downto 0);
     P3CMDCA : in std_logic_vector(11 downto 0);
     P3CMDCLK : in std_ulogic;
     P3CMDEN : in std_ulogic;
     P3CMDINSTR : in std_logic_vector(2 downto 0);
     P3CMDRA : in std_logic_vector(14 downto 0);
     P3EN : in std_ulogic;
     P3WRDATA : in std_logic_vector(31 downto 0);
     P3WRMASK : in std_logic_vector(3 downto 0);
     P4ARBEN : in std_ulogic;
     P4CLK : in std_ulogic;
     P4CMDBA : in std_logic_vector(2 downto 0);
     P4CMDBL : in std_logic_vector(5 downto 0);
     P4CMDCA : in std_logic_vector(11 downto 0);
     P4CMDCLK : in std_ulogic;
     P4CMDEN : in std_ulogic;
     P4CMDINSTR : in std_logic_vector(2 downto 0);
     P4CMDRA : in std_logic_vector(14 downto 0);
     P4EN : in std_ulogic;
     P4WRDATA : in std_logic_vector(31 downto 0);
     P4WRMASK : in std_logic_vector(3 downto 0);
     P5ARBEN : in std_ulogic;
     P5CLK : in std_ulogic;
     P5CMDBA : in std_logic_vector(2 downto 0);
     P5CMDBL : in std_logic_vector(5 downto 0);
     P5CMDCA : in std_logic_vector(11 downto 0);
     P5CMDCLK : in std_ulogic;
     P5CMDEN : in std_ulogic;
     P5CMDINSTR : in std_logic_vector(2 downto 0);
     P5CMDRA : in std_logic_vector(14 downto 0);
     P5EN : in std_ulogic;
     P5WRDATA : in std_logic_vector(31 downto 0);
     P5WRMASK : in std_logic_vector(3 downto 0);
     PLLCE : in std_logic_vector(1 downto 0);
     PLLCLK : in std_logic_vector(1 downto 0);
     PLLLOCK : in std_ulogic;
     RECAL : in std_ulogic;
     SELFREFRESHENTER : in std_ulogic;
     SYSRST : in std_ulogic;
     UDQSIOIN : in std_ulogic;
     UDQSIOIP : in std_ulogic;
     UIADD : in std_ulogic;
     UIADDR : in std_logic_vector(4 downto 0);
     UIBROADCAST : in std_ulogic;
     UICLK : in std_ulogic;
     UICMD : in std_ulogic;
     UICMDEN : in std_ulogic;
     UICMDIN : in std_ulogic;
     UICS : in std_ulogic;
     UIDONECAL : in std_ulogic;
     UIDQCOUNT : in std_logic_vector(3 downto 0);
     UIDQLOWERDEC : in std_ulogic;
     UIDQLOWERINC : in std_ulogic;
     UIDQUPPERDEC : in std_ulogic;
     UIDQUPPERINC : in std_ulogic;
     UIDRPUPDATE : in std_ulogic;
     UILDQSDEC : in std_ulogic;
     UILDQSINC : in std_ulogic;
     UIREAD : in std_ulogic;
     UISDI : in std_ulogic;
     UIUDQSDEC : in std_ulogic;
     UIUDQSINC : in std_ulogic
  );
end component;


とてもじゃないが、プリミティブで使う気になれない。。。(詳しい機能は”Spartan-6 FPGA メモリ コントローラ ユーザー ガイド (英語版)”を参照のこと)やはりCORE GeneratorからMIGを起動して使うのが良いと思う。
上のコンポーネント宣言を見ると、独立したデータポート、コマンドポートが6つあるのがわかる。

MCBはコマンドを入れてRead, Write, Prechargeなどを行う。その辺の様子が、”Spartan-6 FPGA メモリ コントローラ ユーザー ガイド (英語版)”47ページのInstructionsから下辺りに書いてある。

大体、MCBの概要はわかったので、SP605に対応するDDR3 SDRAMコントローラをMIGで生成してシミュレーションしてみたい。
  1. 2010年04月20日 05:26 |
  2. Virtex-6, Spartan-6
  3. | トラックバック:0
  4. | コメント:0

映画、アリス・イン・ワンダーランド

アリス・イン・ワンダーランドを見てきました。3Dが凄かったです。すっかり、3Dの映画にはまってしまいました。トイ・ストーリー3も見に行くそうです。これで何年か後には、ディズニーランドかディズニーシーにアリスのアトラクションが出来るんでしょうね?
  1. 2010年04月18日 13:14 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

ランバーコアに桧を貼りつけました

今日は木工もしました。今、4つ引き出しがあるの収納家具を作っています。
ですが、引き出しはSPF材で作って表面板だけ桧を貼りつけます。引き出しを載せる板は、狂いが少ない21mm厚のシナランバーコアに桧を木工用ボンドで貼りつけます。その貼りつける工程をやっていました。下が張り付けているところです。貼りつける板に木工用ボンドを塗り、桧の角棒とランバーコアを貼りつけます。そして、自作クランプで当て木をして、締めているところです。これで4時間ほどおけば接着完了です。
hinoki_ranber_1_100417.jpg

はみ出した接着剤は濡れた布で拭きとってあります。桧の幅の狭い板から角棒を切り出すのが難しかったですね。1mmの狂いもなくまっすぐに切らないと家具が狂ってしまいます。丸のこがかからないので、当て木をしてクランプで止めながら切りました。
下の写真は貼りつけたところです。(今の張り付けている板の前に貼りつけた板です)
hinoki_ranber_2_100417.jpg

桧は本当に良い匂いですよ。おがくずを布袋に入れると、いい匂いのするクッションになるし、余った木切れをお風呂に入れて、桧風呂にして楽しんでいます。本当に良い匂いです。花粉は怖いですけどね。。。
  1. 2010年04月17日 11:55 |
  2. 木工
  3. | トラックバック:0
  4. | コメント:0

春の大雪

今日は今シーズン一番の大雪でした。朝6時頃はかなり降っていました。今は晴れてきて、とけてきちゃいましたが。。。びっくりしましたね。この時期に雪が降るなんて、記憶にありません。
写真は家の庭から撮った雪景色です。
yukigeshiki_100417.jpg
  1. 2010年04月17日 11:37 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

SP605のBuilt-In System Testをやってみた

前回のBase Reference Designはうまくいかなかったので、もう1つのテスト、Built-In System Test (BIST)をやった見た。

前回と同じように、”ザイリンクス Spartan-6 FPGA SP605 評価キット スタートアップ ガイド”の21ページから27ページを参照した。
前回と大体同じだが、System ACE CFイメージ選択 DIP スイッチ(S1)を1101から、0001に変更した。更に、基板の上側のUSB Mini-B にUSBケーブルを接続して、パソコンにつないだ。付属のUSBメモリからドライバをインストールした。
TeraTermをインストールし、シリアルの設定をして、SP605のSW9を押して、FPGAのコンフィギュレーション?をした。
そうするとシリアル(TeraTerm)のウインドウにメニューが出てきた。
BIST_Demo_1_100416.png

MicroBlazeは動作しているようだ。最初に”1: UART Test”をするために1のキーを押すと、下の図のようにUART Test Passed になった。USB-UARTも大丈夫そうだ。
BIST_Demo_2_100416.png

LED TestもTimer TestもPassedになってOK。”4: FLASH Test”のメッセージ。これも問題なく通ったようだ。
BIST_Demo_3_100416.png

IIC Test, Ethernet Loopback Test, Switch TestもOKだった。”8: External Memory Test"を行った。下の図がやっている様子だ。BIST_Demo_4_100416.png

これはテスト時間が長かった。DDR3 SDRAMをテストしているんだろう。問題なく通ったようだ。
BIST_Demo_5_100416.png

SPI Test, PushButton Test, System ACE CF TestもOKだった。最後のDVI/VGA Testをすると、画面が原色を表示して行って最後にカラーバーを表示した。
BIST_Demo_6_100416.png

BIST_Demo_7_100417.jpg

これで、Base Reference Designは動作しなかったが、BISTは通ったのでボードのハードウェアは安心だ。良かった。
  1. 2010年04月17日 04:36 |
  2. Spartan-6 FPGA SP605 評価キット
  3. | トラックバック:0
  4. | コメント:0

SP605のBase Reference Designをやってみた

今日はSpartan-6 FPGA SP605 評価キット(以後、SP605)の箱を開けて、Base Reference Designをやってみた。参考にしたのは、”ザイリンクス Spartan-6 FPGA SP605 評価キット スタートアップ ガイド”だ。
Base Reference Designは、SP605にイーサーネットとディスプレイをつないで、パソコンでXilinxアプリケーションを立ち上げる。イメージをイーサーネット経由でSP605に送って、そのイメージにフィルタを通して、パソコンに送り返すというものだ。下に”ザイリンクス Spartan-6 FPGA SP605 評価キット スタートアップ ガイド”の11ページの”図 1-2 : SP605ベース リファレンス デザインのブロック図”を引用する。
SP605_BDR_2_100416.png

図1-2を見ると、イーサーネット、DDR3 SDRAM、DVI、GTP Transceiverまで使ったでもであることがわかる。

1. まずは、アプリケーションGUIをインストールした。”ザイリンクス Spartan-6 FPGA SP605 評価キット スタートアップ ガイド”の12, 13ページ参照(以下、ページのみ示す)

2. デフォルトジャンパーピンの確認 13ページ

3. ケーブルおよび CompactFlashカードの接続、イーサーケーブルとDVI-VGA変換したVGAケーブル、電源ケーブルをつないで、CompactFlashカードをスロットに入れた。 14ページ

4. CF コンフィギュレーション モードの設定 M0, M1デップスイッチをOFFにして、。System ACE CFイメージ選択 DIP スイッチ(S1)を1101にした。 15ページ

5. ベース リファレンス デザイン GUI アプリケーションの起動 Base Reference Design Interfaceアプリケーションを起動した。 16ページ

6. System ACE CF のリセットボタン (SW9) を押して FPGAをコンフィギュレーション(たぶん?)した。 17ページ

7. イーサーネットリンクの設定 Base Reference Design Interfaceアプリケーションからイーサーネットポートを選択した。 18ページ

ここで、イーサーネット・ステータスLEDがつくはずなのだが、点かない?イーサーネットポートはパソコンに2つついているので、2つとも選んでみたが点かなかった。パソコンのOSはVistaだ。下にイーサーネット・ステータスLEDの写真を示す。
SP605_BDR_3_100416.jpg

ついでに、SP605全体の写真を下に示す。
SP605_BDR_4_100416.jpg

ここで、Base Reference Design InterfaceアプリケーションのShowボタンをクリックしたら、例外が発生してダイアログが出てしまった。Visual Basicを使っているらしい。
SP605_BRD_100415.png

フィルタ係数を書く表の左はじが狭いし、Windows Vistaでは動作しないのかな?スタートアップガイドのウインドウを見るとWindows XPのようだし?(左はじがアプリです。右のは、PDFで見ているスタートアップガイドです)
後は、イーサーポートがグローバルアドレス固定に設定されているのがおかしいのか?もしくは、Base Reference Design Interfaceアプリケーションでイーサーポートを入れ替えたら、FPGAのコンフィギュレーションをやり直す必要があるのだろうか?よくわからないので、このBase Reference Designはやめて他のサンプルデザインを試してみることにした。

おまけとして、Base Reference Designを動作させたときの放射温度計で測ったチップ・パッケージの温度を下に示す。なお、室温は23度くらいだと思う。(測るのを忘れてしまった。。。)
Spartan-6 LX45T-3 55.2度(触ると結構熱い)
DDR3 SDRAM    46.2度(暖かい)
TL1963A(基板の右下の黒い5端子シリーズレギュレータ) 60.8度(熱い)

結構、Spartan-6が熱かった。次のサンプルデザインではDDR3 SDRAM位の発熱だったので、Base Reference Designはより高クロックかリソースを食っているんだろう?後で確かめてみることにする。
  1. 2010年04月16日 05:08 |
  2. Spartan-6 FPGA SP605 評価キット
  3. | トラックバック:0
  4. | コメント:2

ISimでOVLのVHDL, Verilog混在シミュレーション(ISimでシミュレーション)

ISimでOVLのVHDL, Verilog混在シミュレーション(OVLライブラリのコンパイルと登録)”でISimでOVLライブラリのコンパイルとライブラリの登録をした。
今度は、ISimでシミュレーションをしてみようと思う。以前に”VHDLでOVLアサーションを使用する3(VHDLからVerilog OVLを使用する)”で使用したファイルを使用する。テストベンチのtb_req_ack.vhdはこの記事に載っているが、proj_pkg.vhd, req_sm.vhd, ack_sm は”VHDLでOVLアサーションを使用する2(VHDLライブラリを使用)”を参照。
今まではコマンドラインでコンパイルしていたが、今度はGUIを使用することにする。

1. 最初に、ISE11.5でプロジェクトを作成して、tb_req_ack.vhd, proj_pkg.vhd, req_sm.vhd, ack_sm をプロジェクトに追加する。Sources for: のSimulationのラジオボタンをクリックして、Behavioralを選択する。
OVL_ISim_3_100411.png

2. ProcessesペインのISim Simulator の+をクリックして展開し、Simulate Behavioral Modelを右クリックすると、ISimのプロパティダイアログが表示される。Process Properties...を選択し、Specify Search Directories for 'Include と Specify 'define Macro Name and Value を下の図のように設定する。(VHDLファイルをコンパイルしているので、この設定はいらないかも?ライブラリをコンパイルするときdefineしているわけだし。。。後で確かめてみます)
OVL_ISim_4_100411.png

3. Simulate Behavioral Modelをダブルクリックしてシミュレーションを開始するとエラーが出てしまった。ovl_nextとovl_frameのgeneric にcontrols がないというエラーだった。これは、VerilogのOVLを使用しているので、当然だと思う。ModelSimは通ってしまっているが、generic というかVerilogだとパラメータに定義してなくても無視するのかな?ovl_nextとovl_frameのcontrols をコメントアウトした。

4. もう一度、imulate Behavioral Modelをダブルクリックしてシミュレーションを開始した。4つのコンパイルモジュールのエラーが出たが、ISimのウインドウが出てきて、シミュレーションをすることができた。
OVL_ISim_5_100414.png

OVL_ISim_6_100411.png

Consoleには、OVL_NEXTとOVL_FRAMEのエラーメッセージも出ている。
OVL_ISim_7_100411.png

これで、フリーのISimでも、OVLのVerilog、VHDL混在シミュレーションをすることができた。
  1. 2010年04月14日 05:28 |
  2. ISim
  3. | トラックバック:0
  4. | コメント:0

ISimでOVLのVHDL, Verilog混在シミュレーション(OVLライブラリのコンパイルと登録)

OVLのVHDL, Verilog混在シミュレーションはフリーのModelSimでは不可能だった。フリーのシミュレータではISimがVHDL, Verilog混在シミュレーションに対応している。そこで、OVLのVHDL, Verilog混在シミュレーションをISimでやってみることにした。また、フリーのシミュレータでは、ISimでしかSpartan-6のMCBやPCIeなどをシミュレーションすることが出来ないはずだ。
ISimの事を勉強するにあたっては、ISE11.5のHelpのContentsタブのデザインのシミュレーションの下のISimヘルプを参照した。
まずは、”フォルダのファイル名をリストにして、コマンドバッチファイルを作る”の方法で、コンパイル用のバッチファイルを作り、OVLライブラリをコンパイルして登録する。

1. OVL Verilogのライブラリをコンパイルするバッチファイル (OVL_Verilog_Lib_Comp.bat) を実行して、OVL Verilogのコンパイルを行う。
下に、OVL_Verilog_Lib_Comp.batのリストを示す。

vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_always.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_always_on_edge.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_arbiter.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_bits.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_change.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_code_distance.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_cycle_sequence.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_decrement.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_delta.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_even_parity.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_fifo.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_fifo_index.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_frame.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_handshake.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_hold_value.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_implication.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_increment.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_memory_async.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_memory_sync.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_multiport_fifo.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_mutex.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_never.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_never_unknown.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_never_unknown_async.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_next.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_next_state.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_no_contention.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_no_overflow.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_no_transition.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_no_underflow.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_odd_parity.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_one_cold.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_one_hot.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_proposition.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_quiescent_state.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_range.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_reg_loaded.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_req_ack_unique.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_req_requires.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_stack.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_time.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_transition.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_unchange.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_valid_id.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_value.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_width.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_window.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_win_change.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_win_unchange.v
vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_zero_one_hot.v


実行後に、カレントフォルダにisimフォルダが生成され、その下にaccellera_ovl_vlogフォルダが生成された。accellera_ovl_vlogフォルダの中身を下に示す。
ISim_OVL_1_100413.png

2. OVL VHDLのライブラリをコンパイルするバッチファイル (OVL_VHDL_Lib_Comp.bat) を実行して、OVL VHDLのコンパイルを行う。
下に、OVL_VHDL_Lib_Comp.batのリストを示す。

vhpcomp -work accellera_ovl_vhdl H:\HDL\OVL\std_ovl\std_ovl.vhd
vhpcomp -work accellera_ovl_vhdl H:\HDL\OVL\std_ovl\std_ovl_procs.vhd
vhpcomp -work accellera_ovl_vhdl H:\HDL\OVL\std_ovl\std_ovl_components_vlog.vhd
vhpcomp -work accellera_ovl_vhdl H:\HDL\OVL\std_ovl\std_ovl_clock_gating.vhd
vhpcomp -work accellera_ovl_vhdl H:\HDL\OVL\std_ovl\std_ovl_reset_gating.vhd
vhpcomp -work accellera_ovl_vhdl H:\HDL\OVL\std_ovl\ovl_always.vhd
vhpcomp -work accellera_ovl_vhdl H:\HDL\OVL\std_ovl\ovl_cycle_sequence.vhd
vhpcomp -work accellera_ovl_vhdl H:\HDL\OVL\std_ovl\ovl_implication.vhd
vhpcomp -work accellera_ovl_vhdl H:\HDL\OVL\std_ovl\ovl_never.vhd
vhpcomp -work accellera_ovl_vhdl H:\HDL\OVL\std_ovl\ovl_never_unknown.vhd
vhpcomp -work accellera_ovl_vhdl H:\HDL\OVL\std_ovl\ovl_never_unknown_async.vhd
vhpcomp -work accellera_ovl_vhdl H:\HDL\OVL\std_ovl\ovl_next.vhd
vhpcomp -work accellera_ovl_vhdl H:\HDL\OVL\std_ovl\ovl_one_hot.vhd
vhpcomp -work accellera_ovl_vhdl H:\HDL\OVL\std_ovl\ovl_range.vhd
vhpcomp -work accellera_ovl_vhdl H:\HDL\OVL\std_ovl\ovl_zero_one_hot.vhd
vhpcomp -work accellera_ovl_vhdl H:\HDL\OVL\vhdl93\ovl_always_rtl.vhd
vhpcomp -work accellera_ovl_vhdl H:\HDL\OVL\vhdl93\ovl_cycle_sequence_rtl.vhd
vhpcomp -work accellera_ovl_vhdl H:\HDL\OVL\vhdl93\ovl_implication_rtl.vhd
vhpcomp -work accellera_ovl_vhdl H:\HDL\OVL\vhdl93\ovl_never_rtl.vhd
vhpcomp -work accellera_ovl_vhdl H:\HDL\OVL\vhdl93\ovl_never_unknown_async_rtl.vhd
vhpcomp -work accellera_ovl_vhdl H:\HDL\OVL\vhdl93\ovl_never_unknown_rtl.vhd
vhpcomp -work accellera_ovl_vhdl H:\HDL\OVL\vhdl93\ovl_next_rtl.vhd
vhpcomp -work accellera_ovl_vhdl H:\HDL\OVL\vhdl93\ovl_one_hot_rtl.vhd
vhpcomp -work accellera_ovl_vhdl H:\HDL\OVL\vhdl93\ovl_range_rtl.vhd
vhpcomp -work accellera_ovl_vhdl H:\HDL\OVL\vhdl93\ovl_zero_one_hot_rtl.vhd


実行後に、isimフォルダの下に、accellera_ovl_vhdlフォルダが生成された。accellera_ovl_vhdlフォルダの中身を下に示す。
ISim_OVL_2_100413.png

3. コンパイルした2つのライブラリを登録する。まずはライブラリのコピーから。私のパソコンで言うと、H:\HDL\Xilinx\11.1\ISE\verilog\hdp\nt フォルダに accellera_ovl_vlog ファルダをコピーする。

4. H:\HDL\Xilinx\11.1\ISE\vhdl\hdp\nt フォルダに accellera_ovl_vhdl フォルダをコピーする。

5. H:\HDL\Xilinx\11.1\ISE\vhdl\hdp\nt に xilinxsim.ini があるので、これに、accellera_ovl_vlogとaccellera_ovl_vhdl のエントリを追加する。

accellera_ovl_vlog=$XILINX/verilog/hdp/nt/accellera_ovl_vlog
accellera_ovl_vhdl=$XILINX/vhdl/hdp/nt/accellera_ovl_vhdl


これでライブラリの準備は終了のはず。。。
  1. 2010年04月13日 05:19 |
  2. ISim
  3. | トラックバック:0
  4. | コメント:0

フォルダのファイル名をリストにして、コマンドバッチファイルを作る

ISimによるOVLのシミュレーションに取り組んでいる。ISimではSpartan-6のMCBやPCIeなどをシミュレーションするはずなので、慣れていても良いと思った。とりあえずはライブラリを生成する必要がある。
ISimのVerilogコンパイルコマンドはvlogcompだった。(これはISim Helpで知った)
それで、ModelSimと同様にovl_*.v で全部のVerilogファイルをコンパイルしてくれるかと思ったがだめだった。
それで、ファイルにstd_ovlフォルダ下のすべての.vファイルを書き出そうとしたが、面倒だ。ネットを検索すると、”第6回 指定フォルダ内のファイル名一覧をExcelに書き出す”を見つけた。ExcelのVBAでファイル名をシートに入れる方法だった。記事のExcelのバージョンは2003だが、私の持っているExcelは2007なので、Visual Basic(VB)の作り方に違いがあった。
・ Officeボタンで出したメニューからExcelのオプションを選択する。
Cmd_list_1_100412.png

Excelは子供会の連絡書類作成に使っている(今年は地区長なのだ)。
・ 開発タブをリボンに表示するをチェックし、OKボタンをクリックする。
Cmd_list_2_100412.png

・ するとExcelのリボンインターフェースに開発タブが増えた。それをクリックすると、Visual Basicやマクロのアイコンが出てきた。
Cmd_list_3_100412.png

Visual Basicアイコンをクリックして、VBのウインドウをあけて、VBのマクロを追加した。マクロアイコンをクリックするとマクロが実行できる。下の図が実行して、ファイル名をゲットできたところ。
Cmd_list_4_100412.png

その後の手順を下に示す。

1. ファイル名だけをNotepad++にコピーして、.vhdファイルを除いた。
2. 最初にOVL_Verilog_Lib_Comp.do を作って、vlogcompコマンドを1つのVerilogファイル毎に1行とした。vlogcomp -f OVL_Verilog_Lib_Comp.doでファイルを読んで実行させたが、エラー。どうも複数行あるとダメらしい。
3. 次に、ISim Helpに、vlogcomp suba.v subb.vの例があったので、同様に51個のVerilogファイル名をつないで実行させたら、途中でエラーになった。
4. それではと、2. で作ったOVL_Verilog_Lib_Comp.doをOVL_Verilog_Lib_Comp.batと名前を変えて、バッチファイルとして実行したら、うまく行った。


下に1行目のvlogcompコマンドを示す。

vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i H:\HDL\OVL\std_ovl -work accellera_ovl_vlog H:\HDL\OVL\std_ovl\ovl_always.v


Notepad++で正規表現で置換できたので便利だった。先頭(^)に追加した。
  1. 2010年04月12日 05:04 |
  2. パソコン関連
  3. | トラックバック:0
  4. | コメント:2

KiCad-2010-04-06

KiCad-2010-04-06-SVN2508-final-WinXP_full_with_components_doc_autoinstall.zipが出ています。最近頻繁にアップデートされていますね。なにかバグが有ったのでしょうか?いずれにせよ。更新しておいた方が良いと思います。
  1. 2010年04月10日 06:39 |
  2. CADツール
  3. | トラックバック:0
  4. | コメント:0

Spartan-6のお勉強5(SelectIOリソース)

今度は、Spartan-6のSelectIOリソースについて勉強する。

1. LVDSなどで使用される差動信号の100Ω終端抵抗がFPGA内に内蔵されたそうだ。UCFの構文は、
  NET <I/O_NAME> DIFF_TERM = "<TRUE/FALSE>";
2. DDRシリーズのSDRAMにインターフェース用の終端抵抗が内蔵された。(Virtexシリーズでは以前から機能があった)
3. IOパッドの出力ドライバの出力インピーダンスも変更可能。


SelectIOロジックリソース
Spartan-6 FPGA SelectIO リソース ユーザー ガイド v1.2 (日本語版)”の”図 2-1 : I/O 入力タイル内のSelectIO ロジックリソース”を下に転載する。
SelcetIO_res_1_100409.png

Virtex-5のSelectIOと似たような感じだ。マスタIOBとスレーブIOBがあって、8:1などの大きな?シリアル・パラレル変換にはマスタIOBとスレーブIOBが連帯するのだと思う。
OLOGIC中にシリアライザ(T)と(D)があるのはどうしてなんだろうか?Tはハイインピーダンス・コントロールで、Dはデータでした。

1. IDDR2とODDR2は特に目立った変更はないようだ。
2. I/O遅延はリングオシレータとカウンタを使ったユニークな方式。1クロックサイクル未満の遅延となる。遅延タップの平均値は 80ps
3. 1つのISERDES2、OSEDES2では1:1~1:4まで、2つ使うと1:8までのSERDES(シリアルーパラレル変換)が可能。
4. 2つのISERDES2を使用して、位相検出器を構成することができるようだ。これは、差動信号のみとなる。
5. OSERDES2にはトレーニング機能があって、これをONにすると、指定のトレーニングパターンを送出するそうだ。DDR? メモリのトレーニングパターン送出時に都合がよい。


ユニークなI/O遅延についてもう少し書く。下に、”Spartan-6 FPGA SelectIO リソース ユーザー ガイド v1.2 (日本語版)”の”図 2-17 : 1つの遅延ブロックで 2つの遅延ラインを使用”の図を下に引用する。
SelcetIO_res_2_100409.png

上が立ち上がりエッジ、下が立ち下がりエッジのI/O遅延の回路だそうだ。この構成上、1クロックサイクル以上の遅延だとエッジがなくなってしまうことが考えられる。
I/0遅延のキャリブレーションもあって、I/0クロックが遅延タップ幾つ分かを自動的にチェックして、I/Oクロックの半分の遅延に自動的に設定することもできるようだ。

SelectIOリソースにも、いろいろ便利な機能が増えているようだ。
  1. 2010年04月10日 05:18 |
  2. Virtex-6, Spartan-6
  3. | トラックバック:0
  4. | コメント:0

Spartan-6のお勉強4(DCM_CLKGENのインプリメント)

今度は、DCM_CLKGENをインプリメントして確かめてみることにした。プリミティブだとインプリメントの仕方がわからないため、CORE GeneratorでDCM_CLKGENコアを生成することにした。

Core Generatorの起動の仕方は、”CORE Generatorで分散RAM(SLICEM)の同期FIFOを生成1”を参照のこと。
1. New Source WizardダイアログでClocking Wizard v1.4を選択する。
DCM_CLKGEN_0_100407.png

2. Clocking Wizardが出てくるので、最初のダイアログで、Clock Manager TypeのModeをManual Selectionに設定すると、下のPrimitiveが選択できる。DCM_CLKGENを選択する。DCM_CLKGENはジッタの低減ができるということなので、Jitter OptimizationをMinimize output jitter(low clock jitter filtering)をチェックしてみる。Input ClockのInput Freq(MHz)を50.00に設定した。
DCM_CLKGEN_1_100407.png

3. Clocking Wizardの2/6。Output Freq(MHz)を25.00に設定した。
DCM_CLKGEN_2_100407.png

4. Clocking Wizardの3/6。I/O and Feedback、デフォルトのままとする。
DCM_CLKGEN_3_100407.png

5. Clocking Wizardの4/6。DCM_CLKGEN Settings、デフォルトのままとする。
DCM_CLKGEN_4_100407.png

6. Clocking Wizardの5/6。Clk Summary、これもそのまま。
DCM_CLKGEN_5_100407.png

ここで、GenerateボタンでDCM_CLKGENを生成する。
Spartan-6のお勉強3(DCMのインプリメント)”のdcm_inst.v を下のように書き換えてDCM_CLKGENをインスタンスした。

// DCM module

`default_nettype none
`timescale 1ns / 1ps

module dcm_inst(clkin, reset, clkout, clkfx, clkdv, locked);
    input clkin;
    input reset;
    output clkout;
    output clkfx;
    output clkdv;
    output locked;
    
    wire clkin;
    wire reset;
    wire clkout;
    wire clkfx;
    wire clkdv;
    wire locked;
    
    wire clkout_node;
    
  DCM_CLKGEN_I DCM_CLKGEN_I_inst
   (// Clock in ports
    .CLK_IN1            (clkin),      // IN 
    .CLK_OUT1           (clkout_node),     // OUT
    .RESET              (reset),        // IN
    .LOCKED             (locked));      // OUT
    assign clkout = clkout_node;
    assign clkfx = clkout_node;
    assign clkdv = clkout_node;
endmodule


これで、ISE11.5でインプリメントして、FPGA Editorで見てみた。
DCM_CLKGEN_7_100408.png

DCM_SPとは違っている。フィードバック入力がないので、遅延はどうなっているのか?と思い、Timing Analyzerでクロックパスの遅延を見てみた。

  Maximum Clock Path at Slow Process Corner: clk to CharDispCtrler_inst/blue_node
    Location             Delay type         Delay(ns)  Physical Resource
                                                       Logical Resource(s)
    -------------------------------------------------  -------------------
    AB12.I               Tiopi                 0.904   clk
                                                       clk
                                                       dcm_inst_0/DCM_CLKGEN_I_inst/clkin1_buf
                                                       ProtoComp48.IMUX
    DCM_X0Y1.CLKIN       net (fanout=1)        2.930   dcm_inst_0/DCM_CLKGEN_I_inst/clkin1
    DCM_X0Y1.CLKFX       Tdmcko_CLKFX          0.350   dcm_inst_0/DCM_CLKGEN_I_inst/dcm_clkgen_inst
                                                       dcm_inst_0/DCM_CLKGEN_I_inst/dcm_clkgen_inst
    BUFGMUX_X2Y3.I0      net (fanout=1)        0.941   dcm_inst_0/DCM_CLKGEN_I_inst/clkfx
    BUFGMUX_X2Y3.O       Tgi0o                 0.209   dcm_inst_0/DCM_CLKGEN_I_inst/clkout1_buf
                                                       dcm_inst_0/DCM_CLKGEN_I_inst/clkout1_buf
    SLICE_X17Y14.CLK     net (fanout=55)       1.383   clkdv
    -------------------------------------------------  ---------------------------
    Total                                      6.717ns (1.463ns logic, 5.254ns route)
                                                       (21.8% logic, 78.2% route)


Spartan-6のお勉強3(DCMのインプリメント)”のDCM_SPと比べてみると一目瞭然だが、DCM_CLKGENは入力クロックの遅延分をキャンセルする機構がないようだ。

DCM_SP、DCM_CLKGEN、PLLの使い分けがよく分からないようだったら、Clocking Wizardに任せた方が良さそうだ。
  1. 2010年04月08日 05:55 |
  2. Virtex-6, Spartan-6
  3. | トラックバック:0
  4. | コメント:2

Spartan-6のお勉強3(DCMのインプリメント)

以前、”キャラクタ・ディスプレイ・コントローラ”を作ったが、これをそのまま、Spartan-6に載せ替えてみようと思う。ISEのバージョンはISE11.5を使用した。
このキャラクタ・ディスプレイ・コントローラ回路は、勝手にキャラクタを書きまくるので、RGBとHSYNC,VSYNCが出力されている。
下に、DCMの含まれているモジュール、dcm_inst.v を下に示す。

// DCM module

`default_nettype none
`timescale 1ns / 1ps

module dcm_inst(clkin, reset, clkout, clkfx, clkdv, locked);
    input clkin;
    input reset;
    output clkout;
    output clkfx;
    output clkdv;
    output locked;
    
    wire clkin;
    wire reset;
    wire clkout;
    wire clkfx;
    wire clkdv;
    wire locked;
    
    wire clk_ibuf;
    wire clkfb, clkfx_node;
    wire gnd, clk_node;
    wire clkdv_node, clkdv_bufg;
    
    assign gnd = 1'b0;
    
    IBUFG IBUFG_inst (
        .I(clkin),
        .O(clk_ibuf)
    );
    
    DCM DCM_INST1 (
        .CLKIN(clk_ibuf),
        .CLKFB(clkfb),
        .DSSEN(gnd),
        .PSINCDEC(gnd),
        .PSEN(gnd),
        .PSCLK(gnd),
        .RST(gnd), // リセットごとにDCMのロックが外れないようにgndにしておく
        .CLK0(clk_node),
        .CLK90(),
        .CLK180(),
        .CLK270(),
        .CLK2X(),
        .CLK2X180(),
        .CLKDV(clkdv_node),
        .CLKFX(clkfx_node),
        .CLKFX180(),
        .LOCKED(locked),
        .PSDONE(),
        .STATUS()
    );
    defparam DCM_INST1.CLKIN_PERIOD = 20.0;
    defparam DCM_INST1.DLL_FREQUENCY_MODE = "LOW";
    defparam DCM_INST1.DUTY_CYCLE_CORRECTION = "TRUE";
    defparam DCM_INST1.CLKDV_DIVIDE = 2.0;
    defparam DCM_INST1.PHASE_SHIFT = 0;
    defparam DCM_INST1.CLKOUT_PHASE_SHIFT = "NONE";
    defparam DCM_INST1.STARTUP_WAIT = "FALSE";
    defparam DCM_INST1.FACTORY_JF = 16'hFFFF;
    
    BUFG BUFG_inst(
        .I(clk_node),
        .O(clkfb)
    );
    
    BUFG BUFG_clkfx(
        .I(clkfx_node),
        .O(clkfx)
    );
    
    BUFG BUFG_clkdv(
        .I(clkdv_node),
        .O(clkdv_bufg)
    );
    assign clkout = clkdv_bufg;
    assign clkdv = clkdv_bufg;
endmodule
    


制約(UCF)ファイルは、入出力ピンの制約は外した。ピリオド制約とクロックの遅延値を見るために、1ピンだけセットアップ時間の制約を入れていある。

NET "clk" TNM_NET = "clk";
TIMESPEC "TS_clk" = PERIOD "clk" 20 ns HIGH 50 %;
NET "VGA_BLUE" OFFSET = OUT 20 ns AFTER "clk";


これで、xc6slx45t-3fgg484(Spartan-6の型番) でインプリメントしてみた。インプリメントできたものをFPGA Editorで見てみると、BUFIO2が使用されている。
BUFIO2_1_100406.png
 図1 キャラクタ・ディスプレイ・コントローラのBUFIO2

左のペインの赤い四角がBUFIO2だ。これを拡大してみた。
BUFIO2_2_100406.png
 図2 BUFIO2の拡大図

図2でDVICLKからBUFGにつながっているのがわかる。次にDCMの図を下に示す。
BUFIO2_4_100407.png
 図3 Spartan-6のDCM

DSS_MODEが出来ている。

図1を見返してみると、BUFIO2の下にBUFIO2FBというバッファがある。BUFIO2FBの入力には、bufg_inst_0/clkfbが接続されている。これは、今までのSpartan-3Aとかでは見ない形だ。どんな意味があるのか、早速、ユーザーズガイドを探してみると、”Spartan-6 FPGAクロック リソース ユーザーズガイド UG382 (v1.3) 2010年2月22日”の49ページの”図 1-33 : クロック配線遅延と一致する BUFIO2FBバッファ”に図があった。それを下に引用する。
BUFIO2_3_100406.png

ユーザーズガイドによると、”図 1-33 に示すようにBUFIO2FBバッファを使用し、CMT(PLLまたはDCM) リファレンス出力CLKIN とフィードバック CLKFB の間のクロック配線遅延を一致させることができます。”だそうだ。
今までは、DCMのフィードバックと言っても、クロック入力と遅延値が合わない、なんちゃってフィードバックだったが、今度は完璧なフィードバックになったようだ。DCMまでの遅延を0にできるはず。これは嬉しい。。。
CLKDVをFPGA内部クロックとした時のクロックパスの遅延値を下に示す。DCMの分周クロック出力を使用しているので、クロックフィードバックループの外にある。図1-33で言うと、CLKOUTからBUFGを通してクロック配線に行っている。

  Maximum Clock Path at Slow Process Corner: clk to CharDispCtrler_inst/blue_node
    Location             Delay type         Delay(ns)  Physical Resource
                                                       Logical Resource(s)
    -------------------------------------------------  -------------------
    N4.I                 Tiopi                 0.904   clk
                                                       clk
                                                       dcm_inst_0/IBUFG_inst
                                                       ProtoComp52.IMUX
    BUFIO2_X1Y15.I       net (fanout=1)        2.177   dcm_inst_0/clk_ibuf
    BUFIO2_X1Y15.DIVCLK  Tbufcko_DIVCLK        0.170   SP6_BUFIO_INSERT_ML_BUFIO2_0
                                                       SP6_BUFIO_INSERT_ML_BUFIO2_0
    DCM_X0Y1.CLKIN       net (fanout=1)        0.843   dcm_inst_0/DCM_INST1_ML_NEW_DIVCLK
    DCM_X0Y1.CLKDV       Tdmcko_CLKDV         -5.680   dcm_inst_0/DCM_INST1
                                                       dcm_inst_0/DCM_INST1
    BUFGMUX_X2Y3.I0      net (fanout=1)        0.941   dcm_inst_0/clkdv_node
    BUFGMUX_X2Y3.O       Tgi0o                 0.209   dcm_inst_0/BUFG_clkdv
                                                       dcm_inst_0/BUFG_clkdv
    SLICE_X18Y12.CLK     net (fanout=54)       1.382   clkdv
    -------------------------------------------------  ---------------------------
    Total                                      0.946ns (-4.397ns logic, 5.343ns route)
    


FPGA内部ロジック使用クロックのクロック入力パッドからの遅延は0.946nsecになった。BUFIO2_X1Y15.Iのネットの遅延が大きいが、これはFPGA Editorで見ると配線がぐるぐる廻っている。これでいいのか?

次にdcm_inst.v のコードを下のように変更して、FPGA内部クロックをCLKDVからCLKFBに変更する。これはクロックフィードバックループ内のクロックを使用することになる。

// assign clkdv = clkdv_bufg;
assign clkdv = clkfb;


クロックパスの解析結果を下に示す。

  Maximum Clock Path at Slow Process Corner: clk to CharDispCtrler_inst/blue_node
    Location             Delay type         Delay(ns)  Physical Resource
                                                       Logical Resource(s)
    -------------------------------------------------  -------------------
    N4.I                 Tiopi                 0.904   clk
                                                       clk
                                                       dcm_inst_0/IBUFG_inst
                                                       ProtoComp48.IMUX
    BUFIO2_X1Y15.I       net (fanout=1)        2.177   dcm_inst_0/clk_ibuf
    BUFIO2_X1Y15.DIVCLK  Tbufcko_DIVCLK        0.170   SP6_BUFIO_INSERT_ML_BUFIO2_0
                                                       SP6_BUFIO_INSERT_ML_BUFIO2_0
    DCM_X0Y1.CLKIN       net (fanout=1)        0.843   dcm_inst_0/DCM_INST1_ML_NEW_DIVCLK
    DCM_X0Y1.CLK0        Tdmcko_CLK           -5.694   dcm_inst_0/DCM_INST1
                                                       dcm_inst_0/DCM_INST1
    BUFGMUX_X2Y3.I0      net (fanout=1)        0.941   dcm_inst_0/clk_node
    BUFGMUX_X2Y3.O       Tgi0o                 0.209   dcm_inst_0/BUFG_inst
                                                       dcm_inst_0/BUFG_inst
    SLICE_X17Y14.CLK     net (fanout=56)       1.383   clkdv
    -------------------------------------------------  ---------------------------
    Total                                      0.933ns (-4.411ns logic, 5.344ns route)
    


以前と同様な結果になった。

DCMのCLKINとCLKFBの間の配線遅延を一致させるというのは、良い試みだと思う。今までは保証がなかった。DCMから遠いBUFGを使ってしまうと、DCMが遅延を合わせきれない恐れもあった。
次はDCM_CLKGENをインプリメントしてみようと思う。
  1. 2010年04月07日 05:18 |
  2. Virtex-6, Spartan-6
  3. | トラックバック:0
  4. | コメント:0

Spartan-6のお勉強2(クロック・マネージメント・テクノロジ)

まずはDCMだが、DCM_SPとDCM_CLKGENがある。
DCM_SPは以前のSpartan-3AのDCM_SPとほとんど変わらないようだ。
DCM_CLKGENがSpartan-6で追加された新しいDCMのようだ。”Spartan-6 FPGAクロック リソース ユーザーズガイド UG382 (v1.3) 2010年2月22日”の63ページのリストを転載する。

• CLKFX および CLKFX180で低出力ジッタ
• CLKIN でのジッタ許容を改善
• M および D 値をダイナミック プログラミング。
CLKFX_MULTIPLY および CLKFX_DIVIDE 属性を上書き し ます。
• 固定 CLKFX_MULTIPLY および CLKFX_DIVIDE 属性よ り 幅広い範囲から M および D 値を指定
• CLKFXDV で CLKFX 出力を追加逓倍
• 入力クロック 損失の場合のフリーランニング オシレータ
• スペクトラム拡散クロック生成


うたい文句通りに受けとれば、今までのDCMの欠点を克服している。
下に、”Spartan-6 FPGAクロック リソース ユーザーズガイド UG382 (v1.3) 2010年2月22日”の57ページのDCMの図を下に示す。
CMT_1_100405.png

PLLは、広範囲の周波数合成とDCMと併用した外部または内部のジッタフィルタに使われるそうだ。PLLはジッタを低減できるので、PCI Expressのカードエッジコネクタからの入力クロックのジッタを低減するので、使用できると思われる。その他、Virtex-5のPLLとどう違うかはよく分からない。

ジッタ低減DCMとPLLはどう使い分けるのかが、まだ良くわからない。

(2010/04/06:追加)
DCM_CLKGENには、CLKFB入力がなかった。これだと、クロック入力パッドからDCMまでの遅延はキャンセルすることが出来ないのだろうか?いろいろ興味がわいていきたので、試しにインプリメントしてみることにする。
  1. 2010年04月05日 20:43 |
  2. Virtex-6, Spartan-6
  3. | トラックバック:0
  4. | コメント:0

つくばでの花見、東京ショッピングツアー

昨日はとても忙しかった。早朝、つくばで花見をして、朝マクドナルドしてから、東京に行った。

つくば市の農林関係の独立行政法人が集まっているところに、桜の花見の名所がある。朝7時に車で出発。車をおいて、歩いて花見をした。
hanami_tokyo_1_100405.jpg
hanami_tokyo_2_100405.jpg

北側の方が7分咲き、南側は5分咲き位だった。来週の方が見頃だろう。
その後、マクドナルドで朝食を取った。その後、すぐに家に帰って支度してから、奥さんと小6の下の娘とTX(つくばエクスプレス)に乗って東京へ。新御徒町で降りて、上野公園まで歩く。途中でアメ横で寄り道。娘は可愛い携帯ストラップを買っていた。
上野公園に行くとお花見ですごい人だった。ココの桜は満開。つくばと東京では、やはり東京の方が暖かいのだろう。
hanami_tokyo_3_100405.jpg

上野公園を歩いて、国立西洋美術館へ。絵を書くのが好きな下の娘に西洋絵画を見せるのが目的だ。
フランク・ブラングィン特別展をしていたので、それも見ることにした。フランク・ブラングィンという人はいろいろなことをやっていた人のようだ。画家、工業デザイナー、etc... 絵は海賊バカニーアという絵と、海の葬送という絵が良かった。これらは大きな絵だった。娘も関心をもって見ているようだった。
特別展を見た後はつかれたので、国立西洋美術館のレストランへ。すいれんという名前のレストランだった。ここにはモネの睡蓮があるので、それにちなんだ名前なのかな?
ランチメニューを頼んだ。フィレステーキ、スープ、サラダ、パン、ハーブティー、桜のアイスで1,600円だった。フィレステーキは美味しかった。ミディアムで頼んだのだが、切ると肉汁たっぷりでとても美味しかった。スープはパプリカのスープ。桜のアイスは桜の葉を細かくしたものが混ざっている感じ。いわば、桜餅のアイス食べている感じだった。残念ながらメインディッシュだけ写真を取るのを忘れてしまった。残念。。。いつも食い気の方が勝ってしまう。どうしたもんか?下は、スープ、サラダの写真。
hanami_tokyo_4_100405.jpg

その後は、常設展をみた。モネの睡蓮やいろいろな絵があった。その中にルノアールも2点ほどあったが、やはり、私はルノアールの色使いが好きだ。
さて、今度は原宿に向かった。原宿の駅を降りる時に、ものすごい人。竹下通りも電車から見るとあふれかえらんばかりの人が。。。駅を降りるのをやめて、もう一度電車に乗って渋谷へ。渋谷で降りて、センター街を歩いているとなんか消防車がいた。火事のようだ。煙は出ていなかったが。。。渋谷は昔々の学生の頃、よく歩いていて土地勘があるのだが、若い女性の店はよく分からない???
もう一度、アメ横に行くことにした。アメ横は服はあっても男性向けが多い。靴屋とかも。私が東京で購入するのだったらアメ横だが、若い女性用ではないようだ。それでも、数件、若い女性向けの店があって、小6の娘がバックや服を買い込んでいた。竹下通り以外に若い女性向けの店はどこにあるんだろう?
それから、また新御徒町まで歩いてTXで帰ってきた。

#今日の教訓は、若い女性の買い物に付き合うのは、結構大変だ。ということだ。選ぶのに時間がかかる。夢中で選んでいたので、じっと道で待っていた。1軒で、こうなのだから、そういう店がずーと並んでいたら。。。今度は、竹下通りにリベンジというときには、私は行かないようにしようと思う。
#自分でも電子パーツや電動工具、木を見ているときは同じような感じなんだと思う。ただ、私は家族がいるときに、夢中になってしまうとまずいので、諦めるが。。。
  1. 2010年04月05日 05:40 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

サイクリング

今日は片道7Km位サイクリングをしてきた。ホームセンターで買い物をして、帰り道、農道を通ってきたのだが、道端につくしが沢山生えていた。春だな~という実感がした。
Cycling_1_100403.jpg

川の土手の上を走っていたら、菜の花が花ざかりだった。いい季節なんだけど、花粉が怖い。今も目が危ない。。。
Cycling_2_100403.jpg

明日は、早朝の桜の花見、朝マクドナルドだそうだ。その後、東京の原宿の竹下通りへ。娘のお供。奥さんと私と小5の娘で良く予定。その後、娘は絵が好きなので、上野の西洋美術館に行ってこようと思う。
  1. 2010年04月03日 20:59 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

Spartan-6のお勉強(クロックリソース編1)

さて、Spartan-6 FPGA SP605 評価キットをいじってみたいと思っているが、最初にSpartan-6の内部構造がどうなっているのかを勉強しようと思う。
最初に、クロックリソースから概略を把握しよう。

1. 超高速のロースキューI/Oリージョナル クロック リソースが40個ある。
2. BUFGMUXで駆動されるグローバル・クロックネットワークとI/Oクロック・バッファ(BUFIO2)、PLLクロックバッファ(BUFPLL)で駆動されるI/Oクロック・ネットワークがある。
3. BUFPLL及びBUFIO2は、ISEDESとOSERDESを駆動する。
4. BUFIO2はDDRバスのILOGIC及びOLOGICを駆動することができる。グローバル・クロック、DCMのGTPクロック、PLLクロック入力へ配線することができる。


BUFIO2から、ISERDES2を駆動して、更にBUFGを駆動してFPGAのロジックにクロックを供給することができるらしい。そのSDR(Single Data Rate)の例が、”Spartan-6 FPGAクロック リソース ユーザーズガイド UG382 (v1.3) 2010年2月22日”の25ページに載っている。下に図1-9を引用する。
Clock_Resource_100403.png

BUFIO2のDVICLK出力を通してBUFGに接続してFPGAロジックにクロックを供給している。Spartan-6のクロックバッファの目玉はどうやらこのBUFIO2みたいだ。クロックダブラで入力クロックを2倍にすることができてDDRのデータに対応することができて、更に、分周ができるので、SERDESのタイミングを取るのが容易になる。失敗したけれどもSUZAKU-VのDDR2 SDRAMコントローラを作るときに一番苦労したのが、SERDESクロックとメインのクロック間の同期をとるところだ。その部分の実装が簡単になりそうだ。
Spartan-6 FPGAクロック リソース ユーザーズガイド UG382 (v1.3) 2010年2月22日”の39ページから、BUFIO2の属性の表を引用する。
Clock_Resource_2_100403.png

上の表で例えば、DDRの信号で8ビットのシリパラ変換する場合は、USE_DOUBLER=TRUE, DIVIE=8に設定するのだと思う。
SDRでISEDESを使うときには、27ページの”図 1-11 : 例 1: ISERDES2 (DATA_RATE = SDR) を駆動する BUFIO2 ”を参照のこと。
DDRでISERDESを駆動する場合には、反転クロック用のBUFIO2がもう1つ必要になる。その図は、28ページの”図 1-12 : 例 2: ISERDES2 (DATA_RATE = DDR) を駆動する BUFIO2 ”を参照のこと。

BUFIO2はPLLと組み合わせても使えるし、GTP使うときにも使えるようだ。なかなか便利そうだ。
  1. 2010年04月03日 17:53 |
  2. Virtex-6, Spartan-6
  3. | トラックバック:0
  4. | コメント:2

FPGAの部屋の2010年3月までのアクセス数

FPGAの部屋の2010年のアクセス数の1月から3月までのアクセス数のグラフを下に示す。
Access_2010_100403.png

3月のアクセス数は39,259アクセス。1月から3月までは126,018アクセスだった。皆様、アクセスしていただいてありがとうございます。
1月、2月、3月とだんだんとアクセスが下がっているのが気になる。人気の無い記事だったかな?でも、SystemVerilogとCとの協調シミュレーションやOVLに限らないアサーションはこれから私及び皆様のためになると思っている。
それでも、39,259アクセスだと2009年の8月くらいのアクセス数なのでまあまあかもしれない。
Access_2009_100106.png

皆様、これからもよろしくお願いします。コメントを待っています。

今年はESECには行かないで、5月13-14日は、Virtex-6 ファミリ デザイン v11.3セミナーに行こうと思っている。5月25-26日は、Spartan-6 ファミリ デザイン v11.3セミナーに行く予定だ。
  1. 2010年04月03日 05:12 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

Spartan-6 FPGA SP605 評価キットを使うための準備1

Spartan-6 FPGA SP605 評価キットを使うための準備を初めている。このボードはFMCコネクタにサブボードを挿すことによって、いろいろな仕事にも役立つことだろう。
FMC XM105 デバッグ カードは2.54mmピッチの標準のヘッダがついているようなので(未確認)、aitendoカメラモジュール(OV7670)カメラモジュール(OV9655)ピンヘッダ用接続ケーブルで接続すれば、いろいろなカメラ入力用画像の処理ができると思う。
さらに、AVNET社にもいろいろなFMC拡張ボードがあるし、東京エレクトロンデバイス社にも、FMCボードがあるが、これはinrevium評価ボード 専用オプションボード FMCと書いてあるので、SP605につながるかどうかは検証が必要だ(もしこれらのボードを買われる際には確認をお願いします)。
さて、久しぶりにXilinx社のSpartan-6の資料ページを見てみると、日本語の資料が増えていた。うれしい。。。やはり、日本語の資料を読む方が楽だ。
その中に、Spartan-6 FPGA SP605 評価キット スタートアップ ガイド (日本語版)SP605 ハードウェア ユーザー ガイド v1.1 (日本語版)があった。これはとてもうれしい。これを読んで勉強することにする。
その他の、Spartan-6のユーザーズガイドも読み進めることにしよう。
  1. 2010年04月01日 19:04 |
  2. Spartan-6 FPGA SP605 評価キット
  3. | トラックバック:0
  4. | コメント:0