FC2カウンター FPGAの部屋 Spartan3A Starter Kit

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

FPGAの部屋

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

Spartan-3A Stater Kitを使用し、MIGでDDR2-SDRAMを制御

Spartan-3A Stater Kitを使用し、ISE12.1のMIGでDDR2-SDRAMを制御しようと思って、試しにやってみた。
最初にProject NavigatorからMIGのIPを生成しようとしたらTCLエラーで失敗。
結局、CORE Generator 単体で立ち上げて、Spartan-3A Stater Kit用のDDR2-SDRAMコントローラを生成することができました。
mig_v3_4\board_files\sp3a_board_files\ddr2_sdram\verilog\vlog_bl8\example_design\parフォルダのcreate_ise.batを起動して、ISE12.1のプロジェクトを作成した。これをインプリした。
sp3a_st_kit_MIG_1_100601.png

インプリメントできたので、Chipscope Proを立ち上げて、ダウンロードし、dbg_data_valid_outでトリガーしたら、dbg_cmp_dataにデータが出てきた。
sp3a_st_kit_MIG_2_100601.png

dbg_led_error_outも0なので、エラーなしで動いているみたいだ。まだマニュアルも読んでいないので、よくわからないけど。。。動作周波数は133MHz、ということはddr2-266だと思う。
  1. 2010年06月01日 17:45 |
  2. Spartan3A Starter Kit
  3. | トラックバック:0
  4. | コメント:0

Spartan3A Starter KitのDDR2 SDRAMコントローラのバーストテストのインプリメントエラー

Spartan3A Starter KitのDDR2 SDRAMコントローラのバーストテストのプロジェクト”で公開したSpartan3A Starter Kit のDDR2コントローラのバーストテストのプロジェクトをもう一度コンパイルしてみた。ChipScope Proが期限切れだったので、Removeしてインプリメントした。そうしたらPlace & Route でエラーとなってしまった。
Spa3A_StKit_DDR2Cont_1_090820.png

ISE11.2iにアップデートしたからおかしくなったのか?良くわからないが、エラーの全文を下に示す。

Place:1012 - A clock IOB / DCM component pair have been found that are not placed at an optimal clock IOB / DCM site pair. The clock component is placed at site . The clock IO/DCM site can be paired if they are placed/locked in the same quadrant. The IO component is placed at site . This will not allow the use of the fast path between the IO and the Clock buffer. If this sub optimal condition is acceptable for this design, you may use the CLOCK_DEDICATED_ROUTE constraint in the .ucf file to demote this message to a WARNING and allow your design to continue. However, the use of this override is highly discouraged as it may lead to very poor timing results. It is recommended that this error condition be corrected in the design. A list of all the COMP.PINs used in this clock placement rule is listed below. These examples can be used directly in the .ucf file to override this clock rule.
< NET "SYS_CLK" CLOCK_DEDICATED_ROUTE = FALSE; >
< PIN "dcm_DDR2_clk_inst/dcm_DDR2_clk_dcm/DCM_SP.CLKIN" CLOCK_DEDICATED_ROUTE = FALSE; >


結局、clock IO とDCMの位置は同じ1/4の領域においておかないとまずいということらしいが、DCMの位置は制約をかけていないのになぜ~?
検索をしてみると、”31462 - 10.1i Spartan-3A PAR - 「ERROR:Place:1012 - A clock IOB / DCM component pair have been found that are not placed at an optimal clock IOB / DCM site pair」というエラー メッセージが表示される”が引っ掛かった。
それによると、最新版の 10.1 サービス パックで修正されているということだったが、11.2で戻ってしまったのか?
しょうがないので、DCMの配置制約をかけることにした。ProcessペインのUser Constraints -> Floorplan Area/IO/Logic (PlanAhead) をダブルクリックしてPlabAheadを起動する。
Spa3A_StKit_DDR2Cont_2_090820.png

PlanAheadが起動したら、下のI/O Ports からSYS_CLK を選択した。
Spa3A_StKit_DDR2Cont_3_090820.png

右上のDevice で白く示されたところがSYS_CLK パッド。これから1/4領域のところにDCMを配置すれば良いはず。
まずは、DCMの位置を制約するために、Create Site Constraint Modeボタンをクリック し、サイ ト制約作成モードに切り替える。
Spa3A_StKit_DDR2Cont_5_090820.png

EditメニューからFind... を選択すると、Find ダイアログが表示される。一番右のリストボックスでDCMを選択してOKボタンをクリックする。
Spa3A_StKit_DDR2Cont_4_090820.png

そうすると、下のFind Results にDCMが表示される。そのうちのdcm_DDR2_inst/dcm_DDR2_clk_dcm がクロックからつながっているDCMなので、それを選択する。そのまま、それをDeviceペインにドラック&ドロップする。
Spa3A_StKit_DDR2Cont_6_090820.png

下のようにアサインできた。
Spa3A_StKit_DDR2Cont_7_090820.png

これでdcm_DDR2_inst/dcm_DDR2_clk_dcm の位置を固定できた。
FileメニューからSave Flooorplan を選択する。
Spa3A_StKit_DDR2Cont_8_090820.png

すると、UCFにDCMの位置固定制約が書かれた。

INST "dcm_DDR2_clk_inst/dcm_DDR2_clk_dcm" LOC = DCM_X2Y3;


これでDCMの位置が固定されたので、PlanAheadを終了し、もう一度ISE11.2iでインプリメントしたら、無事にPlace & Routeが通った。しかし、1つタイミング制約を満足でなかった。ほんの少しなので、Place & Route のプロパティからCost Table の値を変えて何回かインプリメントを行った。最初は1だったが5を入れてインプリメントすると、全部のタイミング制約が満足した。
Spa3A_StKit_DDR2Cont_9_090820.png

インプリメント後のFPGA Editor の内容を下に示す。
Spa3A_StKit_DDR2Cont_10_090820.png

指定の位置にDCMがアサインされている。
これで一度、Spartan3 Starter Kit にコンフィグして動作を見てみたが、問題なく動作した。
  1. 2009年08月21日 05:16 |
  2. Spartan3A Starter Kit
  3. | トラックバック:0
  4. | コメント:0

Spartan3A Starter KitのDDR2 SDRAMコントローラのバーストテストのプロジェクト

Spartan3A Starter KitのDDR2 SDRAMコントローラのバーストテストのプロジェクトを置いておくので、興味のある方はダウンロードしてください。いつものように保証なし、原則転載禁止(転載したい方はメールでお知らせください)とします。それからSpartan3A Starter Kitを持っている方は正常に動作したかどうかをぜひ教えてください。よろしくお願いします。ISE11.1iを持っていない方もddr2_burst_testフォルダの下にビットファイルddr2_burst_test.bitを入れておきますので、iMPACTでコンフィグすれば確かめてみることができます。これはChipScope入りのビットファイルです。

ZIPファイルを開けて、ddr2_burst_test/Synth111フォルダの中にISE11.1iのプロジェクトファイルddr2_burst_test.xise がある。今回のプロジェクトにはChipScopeは入っていないが、ChipScopeをインストールしてある方は、DDR2_burst_test_cs.cdc をプロジェクトに入れてほしい。ChipScopeのプロジェクトDDR2_burst_test_cs.cpj も入れてある。ddr2_burst_test/Synth111フォルダの内容を下に示す。
Spa3A_STKit_DDR2_proj_1_090622.png

下がProject Navigatorのプロジェクトの階層だ。
Spa3A_STKit_DDR2_proj_2_090622.png

プロジェクトはインプリメントしていない状態なので、ビットファイルを生成して、iMPACTでSpartan3A Starter KitのSpartan3Aをコンフィギュレーションしてほしい。その辺のやり方は、”ISE11.1iのチュートリアル6(デザインのインプリメント)”、”ISE11.1iのチュートリアル7(FPGAのコンフィギュレーション)”を参照のこと。

使用方法だが、チップスコープを使って、Readデータを見ないと本当に詰まらない動作だ。使用するのはLD0, LD1の2つのLEDとリセット用の押しボタンスイッチSOUTH (T15) 。LD0 はDDR2 SDRAMのバーストテストが正常に読み書きできているときに点灯している。これが点灯していれば、Writeしたバーストデータが正常にバーストRead出来ていることを表す。LD0 が消えてLD1 が点灯するとWriteしたデータと異なるデータがReadされたことを示す。
ChipScopeがインストールされていて、DDR2_burst_test_cs.cdc をプロジェクトに入れてインプリメントすると下の図のようにどのようなデータをリードしているかが分かる。
Spa3A_STKit_DDR2_Debug_6_090617.png

Spartan3A Starter KitでのLD0、LD1と押しボタンスイッチSOUTH (T15) の位置を下の写真に示す。
Spa3A_STKit_Pict_090623.jpg

シミュレーションのやり方は次回に。

2009/06/27 追記:
ddr2_bust_testのダウンロードできるプロジェクトを変更しました。

2009/08/21 追記:
ISE11.2でインプリメントエラーが出るようになってしまったので、ダウンロードプロジェクトを変更しました。詳しくは、”Spartan3A Starter KitのDDR2 SDRAMコントローラのバーストテストのインプリメントエラー”をご覧ください。

2010/08/27 追記:
<注意> バグが発覚したので、Spartan3A Starter KitのDDR2 SDRAMコントローラのバーストテストのプロジェクトを修正しました。必要な方はもう一度ダウンロードしてください。
Spartan-3A Starter KitでCMOSカメラ・ディスプレイ回路19(DDR2 SDRAMコントローラのバグフィック)”参照
  1. 2009年06月23日 05:30 |
  2. Spartan3A Starter Kit
  3. | トラックバック:0
  4. | コメント:0

Spartan3A Starter KitのDDR2 SDRAMコントローラのバーストテストのデバック2(sd_loop_outの処理)

Spartan3A Starter KitのDDR2 SDRAMコントローラのバーストテストのデバック”でsd_loop_inを前に1クロック前に伸ばすという結論になった。sd_loop_inを前に1クロック前に伸ばすには、sd_loop_outを1クロック前に伸ばす必要がある。(結局、sd_loop_outのタイミングはそのままとしました)
その前に、そういえばsd_loop_outのケアを忘れていたことに気がついた。はたしてsd_loop_outはどのようにインプリメントされているの調べるということでFPGA Editorを立ち上げて調べてみた。
sd_loop_outのIOBをのぞいてみたところが下の図。
Spa3A_STKit_DDR2_Debug_3_090617.png

IOBのフリップフロップ(FF)を使用していない。これはまずい。最初にIOBのFFを使うようにVerilog ソースを変更し、もう一度データを取る必要がある。この状態ではsd_loop_outが遅れてREADの時の最初のデータを取れていない可能性がある。UCFも調べてみたらsd_loop_outの制約もなかった。早速、sd_loop_outの最終のフリップフロップ(FF)をIOBに入れることにした。具体的には下のようにVerilogファイルを変更した。(一部です)

    (* IOB = "FORCE" *)output    reg    sd_loop_out;    // DDR2の遅延をキャンセルするための出力パッド


    always @ (posedge clk) begin
        if (reset)
            sd_loop_out = 1'b0;
        else begin
            sd_loop_out = read_timing_1b;
        end
    end


一番上の行は宣言文だが(* IOB ="FORCE" *)制約を付けている。今回、制約ガイドを見て初めて知ったのだが、こうするとsd_loop_outがIOBに入らないとエラーが出るそうだ。
これでインプリメントしたところに下に示すようにIOBにFFが入った。
Spa3A_STKit_DDR2_Debug_4_090617.png

これでコンフィグしてやってみたところ、ChipScopeでの波形もOKだった。波形は下。信号名が表示されていないが、前回と一緒で、その下にread_error信号が追加されている。
Spa3A_STKit_DDR2_Debug_5_090617.png

前回のシミュレーション波形と比べてみる。
Spa3A_STKit_DDR2_Debug_2_090617.png

シミュレーションと波形が一致した。
この前、シミュレーションでマージンがないという話をしたが、それはTiming Analyzerで性的 静的に解析したタイミング情報を論理シミュレーションに反映していないためだった。実際はReadデータとDQSのクロックはFPGA内部では1.5nsの差がある。同位相できたReadデータとDQSクロックは、DQSクロックのほうが約1.5ns程度、FPGA内部で遅れるようにタイミングを組み上げている。よってsd_loop_outから出たReadのタイミング信号はsd_loop_inから入って、ReadのEnableとして使えば、Readのデータが読めるはずだ。そのためにsd_loop_inにはMAXDEALY制約とMAXSKEW制約をかけてある。
ずーとバーストテストをしながらSparatan3A Starter Kitを放置していたが、エラーは出ていないようだ。
ChipScopeで見ても、正常にテストを行っている。
Spa3A_STKit_DDR2_Debug_6_090617.png

1時間バーストテストを行ったが結局エラーは出なかった。これでSpartan3A Starter KitのDDR2-300 SDRAMコントローラは完成とする!!!
うれしいです!!!みなさん、拍手などでのご声援ありがとうございました。
思えばいろいろな苦労があった。自分で非同期FIFOも作ることになったし、Readデータを受ける初段に分散RAMを使用したので、フロアプランに苦労した。でも、だいぶ勉強になった気がする。
Spartan3A Starter KitのDDR2-300 SDRAMコントローラ、誰か欲しいでしょうか? Verilog ソースとUCFにノウハウが詰まっているので、Verilogをそのまま他の基板に移植しただけでは、まず動かないと思います。Spartan3A Starter Kitの下の写真のような等長配線があって初めて実現できたとも言えます。
Spa3A_STKit_DDR2_1_090619.jpg

インプリメント結果ですが、ChipScopeを入れると、少しですがタイミングエラーが出ていますが、動作には問題ないようです。
Spa3A_STKit_DDR2_Debug_7_090617.png

ChipScopeを入れないとタイミングエラーは出ません。どっちにしろタイミングはきついところみたいです。やりませんけど、IPとして配布する場合には相対配置制約をかけたほうがいいかもしれません。
  1. 2009年06月19日 04:52 |
  2. Spartan3A Starter Kit
  3. | トラックバック:0
  4. | コメント:2

Spartan3A Starter KitのDDR2 SDRAMコントローラのバーストテストのデバック

ChipScope Pro 11.1を使ってSpartan3A Starter KitのDDR2 SDRAMコントローラのバーストテストのデバックをしている。
だいぶ原因が分かってきた。
下がチップスコープの波形。
Spa3A_STKit_DDR2_Debug_1_090617.png

主に、リードデータを受けるためのrddata_afifoを見ている。FALLが立下り用の非同期FIFOで、RISEが立ち上がり用の非同期FIFO。dout_nodeがリードデータの出力で途中で00000001が見えると思うが、その後は00000002, 00000003, 00000004, 00000005と続いている。読まれる予定のデータは0, 1, 2, 3, 4, 5の6個なので、最初の0が読めていないことになる。
次に、似たような信号をVeritakでシミュレーションした結果を示す。
Spa3A_STKit_DDR2_Debug_2_090617.png

上のChipScopeの波形と比べてみるとRISE非同期FIFOのwpの値が1つ多い。wpはVeritakの結果では、FALLのwpより早く、赤いカーソルのところで増え始めている。ChipScopeでは1つ遅れている。Veritakでwr_clkをとwr_enの関係を見てみると、ほんの少しの余裕しかない。たぶん、これが悪いのだろう。sd_loop_inを前に1クロック伸ばしてみることにする。

しかし、本当にChipScopeは便利だ。これがあればスタータキット内をいじる限りでは、オシロスコープもいらない場合が多いだろう。ChipScopeで波形を取って、シミュレーション結果と比べられると本当にどこが悪いのかよくわかると思う。

#もしChipScope ProがWebPACKからも無料で使えるならば、本当にうれしいんだけど。。。
#Veritakもできれば、ChipScopeのように階層が信号名の前に表示されて、信号名の右合わせで信号を表示できるオプションがあれば良いと思う。(注:今でも、Scopeで階層は表示できます)
  1. 2009年06月17日 05:51 |
  2. Spartan3A Starter Kit
  3. | トラックバック:0
  4. | コメント:2

Spartan3A Starter KitのDDR2 SDRAMコントローラのその後2

前回、うまくインプリメントが出来た!!と思ったSpartan3A Starter KitのDDR2 SDRAMコントローラだが、動作しなかった。がっくり。。。
よく調べてみると、Spartan3A Starter Kitの水晶発振器って50MHz!!100MHzと思ってやっていた。ということで入力周波数を50MHzに変更。良しこれで、と思ってもやはりだめ。

そういえばDCMの位置固定を今回外してしまったんだっけ。ということで、前の自分のブログの記事を読みながら、お勉強しています。こんなとき、経過を書いてあると便利です。でも、全く忘れてしまうなんて、本当に困ります。もう一度調整しなおしですね。

前の月曜日に下痢で大変な目にあったので、昨日、ウォシュレットを買ってきました。汚い話で申し訳ないですが、10分に1回トイレに行っていたので、お尻がはんぱなく痛かったです。ウォシュレット必須です。今日自分で取り付けます。
  1. 2009年06月14日 05:31 |
  2. Spartan3A Starter Kit
  3. | トラックバック:0
  4. | コメント:0

Spartan3A Starter KitのDDR2 SDRAMコントローラのバーストテストのインプリメント3(DDR2-300がOK)

さて、Spartan3A Starter KitのDDR2 SDRAMコントローラのバーストテストのインプリメントはDDR2-300に目標を変更してインプリメントを行っている。
1つクリティカルパスをつぶしたところ、タイミングが満足した。それは、ddr2_ckeを出力するためのカウンタだが、そのイネーブルを180度位相のクロックからとっていたのが、問題だった。+1するので、キャリーチェーンが伸びているのだが、そこが半分のクロックのパスとなり、タイミングが満足できなかった。イネーブルを0度位相のクロックで一度ラッチしたらクリティカルパスではなくなった。
インプリメントの結果は無事にタイミングを満足した。クロック周波数は150MHz。下にSummaryを示す。
Spa3A_STKit_DDR2_imp_16_090613.png

さて、よく考えてみると制約を忘れているところが。。。それはDQをサンプルする非同期FIFOのライトイネーブルになるsd_loop_inの制約だ。これは150MHzの周期6.67nsの半分タイミングでサンプルされるので、少なくとも3.34ns - 分散RAMのWEのセットアップタイムである必要がある。(入力パッドの遅延時間はDQも入っているので相殺されるとします)
とりあえず制約がかかっていない状態をFPGA Editorで見てみよう。Project NavigatorからFPGA Editorを立ち上げ、sd_loop_inの入力パッドからのネットsd_loop_in_IBUFをハイライトしてみてみた。
Spa3A_STKit_DDR2_imp_17_090613.png

遅延も0.753nsから3.041ns まで幅がある。
これでは困るので、制約をかけてみよう。かけるのはMAXDELAYとMAXSKEW。
Project NavigatorのProcessesペインのUser Constraintsを開いて、Create Timing Constraintsをダブルクリックする。
Spa3A_STKit_DDR2_imp_18_090613.png

するとタイミング制約用のContraints Editorが立ち上がる。左のConstraint TypeからExceptionsを開いてNetsをクリックする。そして右側上のdouble click to add a new constraint.. をダブルクリックして制約を追加しよう。
Spa3A_STKit_DDR2_imp_19_090613.png

ダイアログが開く。
1.Filter:のところにsd_loop_in_IBUF と入れて、Findボタンを押すとsd_loop_in_IBUFがAvailable nets:のところに表示される。
2.sd_loop_in_IBUFを選択し、真ん中の>ボタンを押してNet Targets: のところにsd_loop_in_IBUFを入れる。
3.MaxDelay & MaxSkewのラジオボタンをクリック。
4.MaxDelayに1.51ns、MaxSkewに0.865nsを入れる。
Spa3A_STKit_DDR2_imp_20_090613.png

6.OKボタンをクリックする。

そうすると、MaxDelay & MaxSkewが表示されるので、SaveしてContraints Editorを閉じよう。ちなみに制約がやけに細かいのは、一旦やってみて様子を見てからブログを書いているからなのだ。ぶっつけ本番でブログを書くこともあるし、様子を見てから書くこともある。
さて、これまでの作業で実際に追加された制約を下に示す。

NET "sd_loop_in_IBUF" MAXDELAY = 1.51 ns;
NET "sd_loop_in_IBUF" MAXSKEW = 0.865 ns;


これでもう一度インプリメントをしてみよう。インプリメントしたら制約はすべて満たされた。
FPGA Editorでもう一度sd_loop_in_IBUFネットを見てみたのが下の図。
Spa3A_STKit_DDR2_imp_21_090613.png

上の制約がないsd_loop_in_IBUFの配線よりもすっきりしている。
遅延は0.808ns~1.492nsの0.684nsの間に収まっている。

これでインプリメントは終了したので、実機で動かしてみることにする。わくわく、ドキドキだ。すぐに動かし見たいような、でも結果を見るのが怖いような。。。複雑な気持ち。。。でも、今日中にはやってみようと思う。その前にUCFのIOパッド番号だけでももう一度チェックしよう。。。
  1. 2009年06月13日 13:16 |
  2. Spartan3A Starter Kit
  3. | トラックバック:0
  4. | コメント:0
»