Verilog2001版DDR SDRAMコントローラーのインプリメントの続きです。
ProcessesペインのSynthesizeを右クリックして Properties... を選択します。
Process Propertiesダイアログが出るので、Synthesis Options を選択。ダイアログの Verilog Include Directories の右端の "..." ボタンをクリックすると”フォルダの参照”ダイアログが出るので、"DDRtest_verilog/DDRtest_synth" を選択する。その後、”フォルダの参照”ダイアログの OK ボタンをクリック。
Process Propertiesダイアログに戻るので Verilog Include Directories にパスが入ってることを確認して OK ボタンをクリック。これで .vh のインクルードファイルのパスを指定する。
これで設定は終わったので、Processesペインの Generate Programming File をダブルクリックして、プログラミングファイルを作る。
全部チェックがついてインプリメント、プログラミングファイルが出来たら今度は Configure Deviceをダブルクリックして iMPACT でFPGAをコンフィギュレーションしてみよう。
これから先は特に説明しないので、
スパルタン3スタータキットでのISE8.1iのチュートリアル7(コンフィギュレーション編) などを見ながらやってみよう。Spartan3E Starter Kitでは3つ出てくるが最初の xc3s500e にだけDDRtest.bitを読み込ませて、右クリックで Program を選択してコンフィギュレーションしてみよう。
うまくコンフィギュレーションできれば、下の写真のように表示される。(といっても、LCDの上下行の 931B が表示されているところの初期値は 0000 です)
LCDの上の最初の4桁の数字 (931B) をロータリーエンコーダで入力できる。その次の3桁 (13C) のキャラクタの最初の'1'は値を変更する桁を表す。'1'だとLCDの上の最初の4桁の数字 (931B) のうちの2桁目の'1'のところを表す。'0'だと1桁目 (B)、'3'だと4桁目 (9) を表す。
(13C) のうちの'3'はステータスを表す。つぎの'C'はChangeモードを表しているChangeモードでは、ロータリーエンコーダを回すと、その桁の値が増減する。(チャッタリングがあるので、うまくアップダウンしないことがあるかもしれない)。ロータリーエンコーダのつまみを一回クリックすると'C'で表されるChangeモードから、'M'と表示される。Moveモードに移行する。これでは値を変更できる桁が、ロータリーエンコーダをまわすと移動する。ロータリーエンコーダをもう一度押すとChangeモードに移行する。
上の最初の4桁の数字 (931B) を設定する時には、Moveモードで変更する桁まで移動してから、Changeモードにして値を変更する。
ロータリーエンコーダの右のボタンを押すと、値を設定した最初の4桁の数字 (931B) を DDR SDRAMコントローラーでDDR SDRAMに書き込む。ロータリーエンコーダの左ボタンを押すとDDR SDRAMから読み出して、下の行の4桁の数字で表示する。
上の写真は 931B をDDR SDRAMへ書き込んで、DDR SDRAMから読み出したところ 931B が読めたということだ。
なお、現在のところISE8.2iでインプリメントするとSpartan3E Starter Kitで正常に動作するようだが、ISE9.1iでインプリメントすると動作しないので、注意してください。 2007/06/24: 追記
ISE9.1iでもインプリメントして動作しました。詳しくは
Verilog2001版DDR SDRAMコントローラーのISE9.1iSP1によるインプリメント をご覧ください。
2007年02月16日 21:11 |
Spartan3E Starter Kit
| トラックバック:0
| コメント:0
Verilog2001版DDR SDRAMコントローラーのインプリメントの仕方をちょっとだけ。。。
インプリメントに使用するVerilogファイルはシミュレーションに使用したものと同じものです。 Verilog2001版DDR SDRAMコントローラーのModelSimシミュレーションまとめ1 からダウンロードしてください。
最初にWebPACK ISE8.2iを起動する。
File -> New Project... を選択する。
New Project Wizard - Create New Projectウインドウが開くので、Project Nameを DDRtest_Synth と入力する。Project Location の脇の”...”ボタンをクリックすると"フォルダ参照”ダイアログが開くので、 DDRtest_verilogを選択する。
New Project Wizard - Device Propertiesウインドウが開くのでFamily, Device, Package, Speed, Simulatorの部分を入力する。Next>ボタンをクリック。
New Project Wizard - Create New Sourceウインドウが開く。Next>ボタンをクリック。
New Project Wizard - Add Existing Sourcesウインドウが開く。
Add Source ボタンをクリックするとファイルを選択するダイアログが開くので "dcm100.xaw" と "DDRtest.ucf" を選択する。
”開く”ボタンをクリックすると、"dcm100.xaw" と "DDRtest.ucf" が Add Existing Sources に追加される。
もう一度、Add Source ボタンをクリックする。ファイル選択のダイアログで1つ上のフォルダ (DDRtest_verilog) に移動して、下の図の通りにファイルを選択して”開く”ボタンをクリック。
今、プロジェクトに入れたVerilogファイルは、Add Existing Sources の Copy to Project がチェックが入っていると思う。このままだとプロジェクトフォルダにコピーされてしまうので、チェックをはずそう。
次にもう一度、Add Source ボタンをクリックする。ファイル選択のダイアログで DDRtest_verilog/ddr_controller に移動し、下の図の通りにVerilogファイルを選択する。そして”開く”ボタンをクリック。
やはりここでも、プロジェクトに入れたVerilogファイルは、Add Existing Sources の Copy to Project がチェックが入っていると思う。このままだとプロジェクトフォルダにコピーされてしまうので、チェックをはずそう。
New Project Wizard - Project Summary が出るので Finish ボタンをクリックして終了。
Adding Source Files... ダイアログが出るので、OK ボタンをクリック。
これでプロジェクトが完成。
今日はここまで。
2007年02月15日 21:27 |
Spartan3E Starter Kit
| トラックバック:0
| コメント:2
Spratan3E Starter KitのDDR SDRAMコントローラの説明をしようと思う。
Spratan3E Starter KitのDDR SDRAMコントローラのトップはddr_sdram_cont.vhdだ。
まずはWriteの場合。
・input_addressに書き込むアドレスをセット
・input_maskに書き込みマスクをセット
・read_writeをwriteの0にする
・input_dataにデータをセット
この下準備の後にwrdata_fifo_wrenとaddr_fifo_wrenを1クロックの間だけ1にする。
その後でコントローラがWriteコマンドを発行してDDR SDRAMへデータを書き込む。
下の図を参照。
Readの場合
・input_addressに読み込むアドレスをセット
・read_writeをReadの1にする
この下準備の後にaddr_fifo_wrenだけを1クロックの間だけ1にする。
これでコントローラがReadコマンドを発行してDDR SDRAMからデータを読み出す。
データはoutput_dataに出てくる。output_dataが有効なのはrddata_validが1の時である。
Writeの時のレイテンシは80ns、Readの時のレイテンシは130nsのようだ。ちょっとレイテンシが大きい気もするが、チューニングはしていないのでしょうがないだろう。実際に使う場合にはもう少しチューニングできると思う。今は詳しい検討はしていない。チューニングはFPGAチップのスピードグレードや動作周波数にも影響されるし時間がかかる作業だ。
2006年07月07日 20:30 |
Spartan3E Starter Kit
| トラックバック:0
| コメント:0
Spratan3E Starter KitのDDR SDRAMコントローラのプロジェクトをここにおいておく ので、興味のある方は試してみてください。例によって保証はありません。
プロジェクトやファイルは個人的に実験するのみで、商用に使用することや再配布は禁止します。 DDR SDRAMコントローラを部品として組み込んで使う場合には何の一部として使ったかコメントで教えてください。
XilinxのアプリケーションノートXAPP253を参考に作ってありますが、自分で書き換えてあります。
DDR SDRAMコントローラの中のcontrollerはNGCファイルになっています。(とりあえず秘密!)
残念ながら論理シミュレーションは出来ません。simurationフォルダの中にはテストベンチ(DDRtest_tb.vhd)も入っていますがmt46v16m16.vhdというマイクロンのDDR SDRAMのモデルをダウンロードしないと使えません。でももうVHDLのモデルはないようです。
もう1つ足りないものはPicoBlaze本体です。これはいままで同様Xilinxからダウンロードしてください。そうしたらkcpsm3.vhdをAdd Sourceしてからインプリメントしてください。
しかし、NGCファイルをプロジェクトのルートディレクトリに入れておかなかったので、Translateでエラーが出てしまった。これはTranslateのプロパティでマクロの検索パスを指定していないためだった。だいぶ時間を無駄にしてしまった。こうやって覚えていくのだからしょうがないだろうけど。今度、IPを使う時には覚えておこう。
8.1i ISE - CORE Generator のマクロを使用すると「ERROR:NGDBuild:604 - Logical block 'xxxxx' with type 'xxxxx' is unexpanded」というエラー メッセージが表示され、変換ができない
TranslateのプロパティのMacro Search Pathに./ddr_controllerを設定してOKになった。
(2006年9月4日追記) DDRtest_IP/simulationの下にms60d_lib_ddr_cont_controllerをおいた。これはddr_controllerの中でVHDLファイルがないcontroller.vhdのModelSim6.0dでコンパイルしたライブラリだ。これをModelSim6.0dでコンパイルする時にライブラリ登録するとシミュレーションが出来る。まだDDR SDRAMのモデルが必要だが、後で暇になったら書いてみようかな?
2006年07月06日 20:39 |
Spartan3E Starter Kit
| トラックバック:0
| コメント:10
”Spratan3E Starter KitのDDR SDRAMコントローラまとめ” を良く見てみると、リード時のデータを3/4クロックずらすより、1/4クロックずらせて立下りエッジからデータをサンプルした方が受けられるIFD_DELAY_VALUEの値の幅が広くてよいと思った。
下の図がいままでの3/4クロックずらせて立ち上がりからデータをサンプルする方法だ。
そしてこれが1/4クロックずらせて立下りエッジからデータをサンプルする方法だ。
2つの図のddr_dq_fpgaを比べてみてほしい。
1/4クロックずらせて立下りエッジからデータをサンプルするので、
”Spratan3E Starter KitのDDR SDRAMコントローラまとめ” のIFD_DELAY_VALUEの表からIFD_DELAY_VALUE=2を選択してインプリメントしてボードにダウンロードして確かめてみたところOKだった。
2006年07月04日 19:31 |
Spartan3E Starter Kit
| トラックバック:0
| コメント:0
今度はDDR SDRAMの論理シミュレーションから動作を説明しようと思う。
DDR SDRAMの初期化は
エルピーダ社のユーザーズマニュアル、DDR SDRAMの使い方 の初期化を参考に作った。下の図で言うとピンクの四角で囲まれた部分だ。ここでバースト長を2、バースト・シーケンスをシーケンシャル・タイプ、CASレイテンシを2にモードレジスタを設定している。
白い四角で囲んだ部分がリフレッシュ・コマンドで、7.8usごとに出力している。
黄色で囲んだ部分がデータのライト、赤で囲んだ部分がデータのリード、青で囲んだ部分がプリチャージ・コマンドとリフレッシュ・コマンドだ。ちなみにライト・コマンドもリード・コマンドもプリチャージなしである。
次にライト・コマンドの様子を詳しく見てみよう。下図はその様子だ。
ddr_cke=1, ddr_csb=0, ddr_casb=1, ddr_web=1の時にddr_rasb=0にするとACTコマンドで指定されたバンクをライト・コマンドやリード・コマンドで読み書きすることが出来る。このときにddr_ba(バンクアドレス)とddr_address(行アドレス)にはメモリのアドレスをFPGAがドライブする。
(オール0)
次に1クロック、ウエイトしてddr_casbとddr_webを0にするとライト・コマンドになる。その時にFPGAはddr_addressに列アドレスをドライブする。それと同時にといってもコマンドは半クロックずれているが、データをドライブする。データをドライブしてから1/4クロック後にDQSを立ち上げる。(データとDQSはFPGA側とSDRAM側に分かれていて遅延をくわえてある)
今度はリード・コマンドを簡単に説明する。下の図を見てほしい。
ddr_cke=1, ddr_csb=0, ddr_rasb=1, ddr_web=1の時にddr_casbだけを0にするとリード・コマンドになる。ライト・コマンドと一緒でFPGAはddr_addressに列アドレスをドライブする。そうするとSDRAMはCASレイテンシ後にデータを出力する。FPGAのIFD_DELAYと配線遅延でデータを遅延するが、現在はIFD_DELAY_VALUEをUCFに記述しているためシミュレーションのソースの方で遅延させている。それがddr_dq_fpgaである。そのデータをサンプルしてリードしている。
これでライトやリードは終了だが、バンクをアクティブにしてあるので、リフレッシュする場合はプリチャージしてからリフレッシュしている。それが一番上の図の青で囲まれた部分だ。
2006年07月03日 18:19 |
Spartan3E Starter Kit
| トラックバック:0
| コメント:0
Spratan3E Starter KitのDDR SDRAMコントローラがとりあえず動いてきた。
クロックはSpratan3E Starter Kitの50MHzクロックを2倍にした100MHzだ。
以前、Internal Errorで落ちると言っていたが、少なくともODDR2とIDDR2、IOBUFの組み合わせを使うとInternal Errorで落ちるようだ。
それ以前に同じIOパッドのODDR2とIDDR2のセット・リセット信号を完全にあわせないと下図のエラーで落ちるようだ。セット・リセット信号は完全にあわせないとだめなようだ。1つだけGNDにつながっていてもだめで、完全に一致しなければだめな様である。
そのため、以前はs(セット)で制御していたIOバッファのイネーブル用DDRレジスタだが、それを止めてDの入力信号に組み合わせ回路を加えて対処し、セット・リセット信号を完全にあわせた。
-- Insantiate three-state DDR registers dq_tri_d0 <= dqs_reset_2d_dqtri or not_dqs_enable_2d; dq_tri_d1 <= not_dqs_enable_2d; WRDATA_DDR_TRI_INST : for i in DDR_DATA_WIDTH-1 downto 0 generate WRDATA_DDR_TRI : FDDRRSE port map( q => out_tri(i), d0 => dq_tri_d0(i/8), -- DQSが0になる最初のクロックで1なので、一番最初の半クロックだけディスエーブル d1 => dq_tri_d1(i/8), c0 => clk, c1 => clkx, ce => vcc, r => reset, -- s => not_dqs_enable_2d(i/8) s => gnd ); end generate WRDATA_DDR_TRI_INST;
ちなみにSpartan3EでもFDDRCPE,FDDRRSEも使用できた。ODDR2でもどっちでも良いようだが、Internal Errorの危険があるので、今のところFDDRCPE,FDDRRSEの方がいいだろう。
DDR SDRAMはいままでいろいろ書いてきたが、今回のタイミングダイアグラムは以下の図のDDR SDRAM Read timing 1のタイミングチャートでCL=2で出てきたリードデータを配線とIOB内のDELAYで3/4クロック(7.5nsもしくはセットアップ時間を確保するためにもう少し短く)ずらしてFPGA内部100MHzクロックで受ける予定だ。
やっと近頃バグが取れたようなので依然作った
ロータリーエンコーダ入力のLCD表示回路 (下図)に接続してテストした。
LCD表示器の上の4桁はロータリーエンコーダで設定することが出来る。そのデータをeast押しボタンスイッチを押すとDDR SDRAMのオール0番地に書き込むことが出来る。次にwest押しボタンスイッチを押すとDDR SDRAMのオール0番地から読み出して下の4桁の表示する。
押しボタンを押すとかなりの回数連続的に読み書きするが、とりあえずDDR SDRAMにアクセスできるかどうかはわかる。
いろいろIOB内のDELAYを変更してやった結果が下である。
IFD_DELAY_VALUE=0 確実に2番目のデータを表示(X) IFD_DELAY_VALUE=1 確実に2番目のデータを表示(X) IFD_DELAY_VALUE=2 確実に2番目のデータを表示(X) IFD_DELAY_VALUE=3 確実に2番目のデータを表示(X) IFD_DELAY_VALUE=4 正常に表示できるときもあるがミスる(△) IFD_DELAY_VALUE=5 正常に1番目のデータを表示(○) IFD_DELAY_VALUE=6 正常に1番目のデータを表示(○)
IFD_DELAY_VALUE=6がよさそうである。まだちょっと遅延が足りない可能性もあるが、とりあえずこれで行くことにした。
遅延量を評価してみる。
1.まずはFPGAのチップ内配線での遅延はIOパッドのクロック出力をフィードバック・パッドに戻してFBかけているので0とする。(異論もあるだろうが。。。)
2.FR-4基板の遅延量を75ps/cmとし、大体往復で6cmとすると450ps
よってDDR SDRAMのデータを受けるIOBのDDRレジスタへのクロック配線のスキューは大体0なので、データをIOBのDELAYで7.5ns - 0.45ns=7.05ns遅延させると良い。
Spartan3Eの入力用プログラマブル遅延素子 を参照すると、一番近いのは”IFD_DELAY_VALUE=2 の時rot_aデータパス遅延は6.930ns”のようだが、実際にはDDRの逆側のデータが見えてしまっている。これは遅延量が少ないため次のデータがサンプルされているものと思われる。(DDR SDRAMは常に2つのデータの組でデータを出力するが、現在は最初のデータだけを使用しているため)
IFD_DELAY_VALUE=5以降は正常にデータが読めている。初めにこれはものすごく荒い計算だということを断っておかなければならない。あえて言うと、これは何を意味しているかというとTiming Analyzerの遅延値はかなり余裕を持った値かもしれないということだと思う。以前Spartan3ではTiming Analyzerの遅延値よりも実測値は70%ではないかという結果が出た。
(FPGAの性能) Timing AnalyzerでIFD_DELAY_VALUE=6 の時rot_aデータパス遅延は9.983nsなので、これの70%は約7ns。この性能の推定は大体あっているのかもしれない。
DDR SDRAMコントローラの公開をどうするかはこれからの課題だが、とりあえず、iMPACTでダウンロードできるようにBITファイルと本当にDDR使っているよということを示すためにFPGA EditorのファイルであるNCDファイルを
ここにおいて置くので、試したい方は試してください 。例によって保証はありません。うちのキットでは動いていますが、回路が間違っているかもしれませんので、その場合はボードにダメージを与える場合も0ではありません。
一応動作するようだが、まだ腑に落ちない部分があるのでもう少しチューニングすることにする。
そういえばBIT,NCDファイルのやり方わかるだろうか? Windowsのスタートのすべてのプログラムから"Xilinx ISE 8.1i"の"アクセサリ"の中のiMPACTやFPGA Editorを使用してほしい。使い方のわからない方はコメントで問い合わせください。
2006年07月01日 20:20 |
Spartan3E Starter Kit
| トラックバック:0
| コメント:2