DDR SDRAMコントローラ

DDR SDRAMコントローラ

DDR SDRAMコントローラ作製予定
(XAPP268動的位相調整でクロックをシフトしてちょうど良いクロックの位置を自動的に検出してDDR SDRAMのデータを受けようと決意)
DDR SDRAMコントローラ その後
(シミュレーションしたらバグがぽろぽろ)
DDR SDRAMコントローラ その後2
(DDR SDRAMコントローラとマイクロンのチップMT46V16M16、4個のモデルをつないで、シミュレーション、シュミレーション波形あり)
DDR SDRAMコントローラのインプリメント
(Xilinx社のFPGA、Virtex2の6000,FF1517ピンでインプリメントするが、タイミングが満足しない)
DDR SDRAMコントローラのインプリメント2
(まだ、タイミングが満足しない。syn_maxfanディレクティブ(Synplify Pro)を使用して、ファンアウトを制御してタイミングミート)
DVIボードのDDR SDRAMコントローラのテスト
(いままで作ってきたDDR SDRAMコントローラを実記に入れてテストしてみたが動作せず)
DDR SDRAMコントローラ何回目だがわからない
(166MHzでは動かないので、83MHzでやってみたら動作した)
DDR SDRAMコントローラ何回目だかわからない2
(PCI66MHzの2倍、133MHzでインプリメントしたがだめ、使うクロックの種類を少なくした。clk180をnot clkに変更)
V2, V2proでのDDR SDRAMコントローラ1
(V2, V2proでのDDR SDRAMコントローラを作るときの方式の詳しい検討)
V2, V2proでのDDR SDRAMコントローラ2
(V2, V2proでのDDR SDRAMコントローラを作るときの方式の詳しい検討の続き、タイミングチャートあり)
DDR SDRAMのDQS信号でデータをサンプルする方法2のまえふり
(図らずも-- pragma translate on のバグの紹介、気をつけよう)
DDR SDRAMのDQS信号でデータをサンプルする方法2
(DDR SDRAMのDQS信号でデータをサンプルする方法のうち、SRL16EプリミティブでFIFOを作って実際にDDR SDRAMのデータを受ける方法、サンプルプロジェクトを示し、やり方、結果を図で丁寧に説明)

このブログでは記事をカテゴリ分けしているがカテゴリを分けていくと、どっちに入れていいか悩む記事も出てくる。
Spartan3E Starter Kit用DDR SDRAMコントローラも”DDR SDRAMコントローラ”というカテゴリに入れないで”Spartan3E Starter Kit”のカテゴリに入れてしまった。やはり”DDR SDRAMコントローラ”に入っていないのはおかしいのでリンクを入れることにした。”DDR SDRAMコントローラ”カテゴリをご覧の方はリンクを置いておきますので興味がありましたら飛んでください。
Spartan3E Starter KitでのDDR SDRAMコントローラのテスト
DDR SDRAMコントローラ回路の途中経過
Spartan3E Starter KitのDDR SDRAMコントローラについての疑問
Spartan3E Starter KitのDDR SDRAMコントローラについての疑問2
Spratan3E Starter KitのDDR SDRAMコントローラまとめ
Spratan3E Starter KitのDDR SDRAMコントローラまとめ2
Spratan3E Starter KitのDDR SDRAMコントローラまとめ3
Spratan3E Starter KitのDDR SDRAMコントローラ(プロジェクト)
Spratan3E Starter KitのDDR SDRAMコントローラの説明

更に不完全ですがFree Model Foundryのモデルを使用してDDR SDRAMコントローラのシミュレーションをしてみたのがこちらです。
DDR SDRAMシミュレーションモデル
DDR SDRAMコントローラのシミュレーション(FMFライブラリを作る)
DDR SDRAMコントローラのシミュレーション1(コンパイルスクリプト)
DDR SDRAMコントローラのシミュレーション2(シミュレーションスクリプト)

2006/12/19 : Spartan3E Starter KitでのDDR SDRAMコントローラのブログを読んでいると整合性が取れないと思います。それは最初はDDR SDRAMコントローラ作製予定の ようにDCMの動的位相シフトを利用してクロックをシフトしてリードデータを受けるクロックをうまい位置にあわせようとしていたからです。そのうちに Virtex4やSpartan3EのIOBの遅延素子のことをテストするうちに、Spartan3Eでもこれを利用してリードデータそのものを遅延させ ればOKでは?と考えて、そうしてみたらうまくいったようだというのがSpratan3E Starter KitのDDR SDRAMコントローラまとめです。

2007/02/22: Verilog 2001版DDR SDRAMコントローラへのリンクを追加します。
Verilog 2001版DDR SDRAMコントローラは、以前作ってあったSpartan3E Starter Kit用VHDL版DDR SDRAMコントローラをVerilog2001に書き直したものです。VHDL版では秘密だった controller.vhd も controller.v としてソースを入れてあります。
Verilog2001版DDR SDRAMコントローラーのインプリメント
Verilog2001版DDR SDRAMコントローラーのインプリメント2

2007/09/02:追加
Verilog2001版DDR SDRAMコントローラーのシミュレーションについてのやり方をリンクしました。
Verilog2001版DDR SDRAMコントローラーのModelSimシミュレーションまとめ1
Verilog2001版DDR SDRAMコントローラーのModelSimシミュレーションまとめ2

 Verilog版DDR SDRAMコントローラ、DDR2 SDRAMコントローラのバグ
(Verilog版DDR SDRAMコントローラでは110行目、DDR2 SDRAMコントローラでは144行目の equal_active_bank の論理にバグがあったので修正した)
 Verilog版DDR SDRAMコントローラのバグフィックス 
(たっくさんのおかげでVerilog版DDR SDRAMコントローラのバグがフィックスしたと思ったら、まだあったのだった。とりあえずこのときはバグがフィックスしたと思っている)
 DDR SDRAMコントローラの高度なシミュレーション
(たっくさんに書いていただたVerilog版DDR SDRAMコントローラのテストベンチをバースト・アクセスが続くように書き直した。でも、もっとWriteとReadの間のレイテンシを短くしたいと思った)
 DDR SDRAMコントローラの高度なシミュレーション2 
 DDR SDRAMコントローラの高度なシミュレーション のWriteとReadの間のレイテンシを短くしたいという課題をクリアした)
 DDR SDRAMコントローラの高度なシミュレーション3 
 DDR SDRAMコントローラの高度なシミュレーション2 の時のVerilog HDLコードを公開した)
 DDR, DDR2 SDRAMコントローラの今後の展開について 
(DDR SDRAMコントローラ、DDR2 SDRAMコントローラの今後の展開について書いている。2008/04/08現在DDR SDRAMコントローラは大体終了。DDR2 SDRAMコントローラは本格的に修正をしようと思っている)
 DDR SDRAMコントローラの変更 
(DDR SDRAMコントローラを修正した。修正点はなるべくIOB = TRUE の制約をUCFファイルから、Verilog HDLソースに移すようにしたことと、リードの最初にデータを受けるFFの記述をプリミティブに変更)
 Verilog版DDR SDRAMコントローラのテスト回路
(DDR SDRAMコントローラの高度なシミュレーション2 で行ったシミュレーションをテスト回路に実装して、FPGAにダウンロードし、DDR SDRAMコントローラのテストを行った。とりあえず問題なし。DDR SDRAMコントローラのテスト回路のソースファイルをダウンロードすることができる)

DDR2 SDRAMコントローラ

DDR2 SDRAM(Micron MTH16M16-37E)の初期化について
(DDR2 SDRAM(Micron MTH16M16-37E)の初期化手順を確認。書き留めておく)
DDR2 SDRAMコントローラのシミュレーション時のバグ
(DDR2 SDRAM(Micron MTH16M16-37E)のモデルは、モードレジスタの誤った設定値も検出しくれる優れもの)
VeritakでのDDR2 SDRAMコントローラのシミュレーション (初期化)
VeritakでDDR2 SDRAMコントローラの初期化部分のシミュレーション部分の説明。DDR2 SDRAM(Micron MTH16M16-37E)のモデルの表示出力も表示している)
VeritakでのDDR2 SDRAMコントローラのシミュレーション2(Read, Write)
(DDR2 SDRAMコントローラのRead, Writeのシミュレーションのテストベンチ(taskを含む)。全体の流れ。
VeritakでのDDR2 SDRAMコントローラのシミュレーション3(Write)
DDR2 SDRAMコントローラの Writeのシミュレーションの詳細)
VeritakでのDDR2 SDRAMコントローラのシミュレーション4(Read)
DDR2 SDRAMコントローラの Readのシミュレーションの詳細)
DDR2 SDRAMコントローラを試しにインプリメント
(DDR2 SDRAMコントローラをためしにインプリメントしてみたらDDRレジスタのところでエラーが発生。原因はddr2_dqのVerilogファイルのポート宣言がoutputだけになっていたためだった。inoutに変更したら、FDDRCPEプリミティブを使用してもMAPが成功するようになった)
DDR2 SDRAMコントローラのインプリメントテスト(動作周波数の確保)
(動 作周波数を確保する方法1。IOBの出力用のDDRレジスタに入れるところで、組み合わせ回路を入れるとその組み合わせ回路分のディレイがクリティカルパ スになってしまった。解決方法としては、1クロック前の信号からとって、組み合わせ回路を作り、それを1クロック遅延するようにした)
DDR2 SDRAMコントローラのインプリメントテスト2(動作周波数の確保2)
(動作周波数を確保する方法2。、FF(フリップフロップ)が一番下で4つのファンアウトを持っていると、どうしてもルーティングが厳しくなるので、FFを複製してファンアウトを1にしてパスのディレイを低減する方法)
DDR2 SDRAMコントローラのシミュレーションまとめ
( DDR2 SDRAMコントローラのシミュレーション用Verilog HDLファイルを公開、(インプリメントにはまだ考察が足りない) Veritakシミュレータでのシミュレーションのやり方を図入りで解説)
DDR2 SDRAMコントローラのインプリメントテスト(IOB)
(IOB へのレジスタのアサイン方法。IOB内のトライステート・イネーブル制御用のDDRレジスタは出力用DDRレジスタとクロックが異なるとIOBのアサイン できない。そのためFloorplannerで近くのスライスに固定した(DQS)、Virtex4を使用している)
DDR2 SDRAMコントローラのインプリメントテスト(終わり)
( DDR2 SDRAMコントローラのインプリメントテストが終了した。タイミングもミートした。これでddr2 controllerのインプリメントは終わったので、以前テストした表示部とあわせて、Suzaku-Vにインプリメントして動作確認をする予定)
DDR SDRAMコントローラのインプリメント結果
(”DDR2 SDRAMコントローラのインプリメントテスト(IOB)”、”DDR2 SDRAMコントローラのインプリメントテスト(終わり)”、”ISE9.2iでのTiming Analyzerの起動方法”を確かめてみるのに、ISE9.2iSP4でインプリメントしたプロジェクトをダウンロードできるようにしておく
DDR2 SDRAMコントローラのその後(DDR2-400では動作せず)
( DDR2 SDRAMコントローラは動作周波数200MHz (DDR2-400) でインプリメントしてSuzaku-V(SZ410)にダウンロードしてテストしているが、なかなかうまくいかないので、動作周波数を125MHzにしてテストしてみることにした)
DQの最適な遅延値を測定するDDR2 SDRAMコントローラのシミュレーション
(DQの最適な遅延値を測定するDDR2 SDRAMコントローラのシミュレーションが大体完成した。今度のDDR2 SDRAMコントローラはDQの遅延値を0から63まで増やしていって、ちゃんと受けられるDQの遅延値を計算して、その遅延値をDQの遅延値とするもの だ。)
DQの最適な遅延値を測定するDDR2 SDRAMコントローラの問題点
(DQの最適な遅延値を測定するDDR2 SDRAMコントローラの問題点がわかった。
controller.v はclkx(clkからは180度位相がずれている)で動作しているが、データパスは大体clkで動作している。この間のパスは動作周波数を200MHz とすると、周期は5nsとなるので、clkxの動作回路からclkの動作回路までの最大遅延は5nsの半分の2.5nsとなる。逆も同じだ。
このパスが、軒並みクリティカルパスになっている。以前の100MHz動作のDDR SDRAMでは問題にならなかったが、200MHz動作にすると、そこのクリティカルパスが問題となって、タイミングがミートしない。)
DQの最適な遅延値を測定するDDR2 SDRAMコントローラの問題点の解決
(”DQの最適な遅延値を測定するDDR2 SDRAMコントローラの問題点”で予定した動作周波数(200MHz) で動作しないという問題点があったが解決できたようだ。
以 前の問題は0度のクロックと、180度のクロックを2つ使っていたので、それぞれのクロックを使用するFFをつなぐパスがクリティカルパスになってしまっ たということだった。つまり、200MHzなので5nsに収まっていれば良いところ、2.5nsにパスの遅延を収めなければならなくなっていた。
そこで、ほとんどの動作クロックを0度クロックにすることにした。ステートマシンなども0度クロックに変更した。180度のクロックを使うところも最後の最後だけ180度クロックで受けるようにした。その結果、だいぶタイミングに余裕ができたようだ。)
DQの最適な遅延値を測定するDDR2 SDRAMコントローラのインプリメント
(とりあえず、詳細なシミュレーションは後に回して、DQの最適な遅延値を測定するDDR2 SDRAMコントローラをインプリメントしてやってみた。その結果は動作しなかった。そこでChipscopeを入れて観察してみた。)
DQの最適な遅延値を測定するDDR2 SDRAMコントローラのインプリメント2
(”DQの最適な遅延値を測定するDDR2 SDRAMコントローラのインプリメント”でリセットSWを追加して、初期化時の遅延値を調整するフェーズをChipscopeで観測することにした。)
DQの最適な遅延値を測定するDDR2 SDRAMコントローラのインプリメント3
(”DQの最適な遅延値を測定するDDR2 SDRAMコントローラのインプリメント2”で200MHzの16分周クロックがうまく出ていないようなので、Chipscopeで見てみるということだったので、実際に見てみた。)
DQSをクロックとしてDQのリードデータを受けるDDR2 SDRAMコントローラの構想
(DQSをクロックとしてDQのリードデータを受けるDDR2 SDRAMコントローラの構想を考えている。とりあえず、DQSを半クロック程度DQから遅延させてIOBのDDRレジスタのクロックとしてリードデータを受ける)
DQSをクロックとしてDQのリードデータを受けるDDR2 SDRAMコントローラの構想2
(”DQSをクロックとしてDQのリードデータを受けるDDR2 SDRAMコントローラの構想”でDQSをクロックとしてDQをサンプルする方法について述べたが、シミュレーション波形で、いったいどんなことを想定しているのかを詳しく説明しようと思う。ここで検討した構成ではなく、ISERDES, OSERDESを使用していくことになる。)
DQSをクロックとしてDQのリードデータを受けるDDR2 SDRAMコントローラの構想3
(問題が発生した。”DQSをクロックとしてDQのリードデータを受けるDDR2 SDRAMコントローラの構想2”で、ISERDESでDQを受けられるようにDDR2 SDRAMコントローラを変更してやってみたのだが、どうもPlace & Routeでルートができなくて止まってしまう。)
DQSをクロックとしてDQをリードするDDR2 SDRAMコントローラの遅延の検討
(DDR2 SDRAMコントローラのREADデータを受けるときの遅延の検討を行った)
DQSをクロックとしてDQをリードするDDR2 SDRAMコントローラのOSERDES使用法
(DQSをクロックとしてDQをリードするDDR2 SDRAMコントローラのOSEDES使用法をタイミングチャートや図を使って説明)
やったー! DDR2 SDRAMコントローラが動いたようだ?
(ついにDDR2-400のDDR2 SDRAMコントローラが動いたようだ。SUZAKU-Vのスイッチと7セグLEDで簡易的に確かめてみた。)
DQSをクロックとしてDQをリードするDDR2 SDRAMコントローラのISERDES使用法
(DDR2 SDRAMコントローラは一応の完成を見たが、ここでISERDESのタイミングを検証してみた。ISEDES使用法をタイミングチャートや図を使って説明)
DDR2 SDRAMコントローラをランダムなバースト長でテスト(シミュレーション編)
(Suzaku-V(SZ410)用DDR2 SDRAMコントローラをランダムなバースト長でテストするためにDDR2_burst_test.v を書いので、シミュレーションをしてみた。)
DDR2 SDRAMコントローラをランダムなバースト長でテスト(インプリメント編)
”DDR2 SDRAMコントローラをランダムなバースト長でテスト(シミュレーション編)”でシミュレーションしたDDR2 SDRAMコントローラをランダムなバースト長でテストする回路をインプリメントしてやってみた。
結果はどうもうまくいかないようだ。)
DDR2 SDRAMコントローラの経過説明
(DDR2 SDRAMコントローラはどうもバーストテストがうまくいかない。Chipscopeを入れてもリードデータの2バーストデータのうち1個だけ受かってい るように見えるときもあるが、ほんの少しパラメータを変えたら(関係のなさそうな)リードデータがなくなったりしてしまう。どうも、趣味のレベルではとり あえずうまくいかなそう。。。)
SuzakuVのDQSでリードデータを受けるDDR2 SDRAMコントローラ
(SuzakuV のDQSでリードデータを受けるDDR2 SDRAMコントローラのプロジェクトがダウンロードできる。ただし、多分、DDR2 SDRAMコントローラ部分にバグがあってバーストアクセスは今のところできないようである。このプロジェクトはSuzakuV(SZ410) スタータキットの7セグメントLEDとスイッチ、ロータリーエンコーダーを使用して、DDR2 SDRAMの読み書きをテストするためのものだ。)
DQSをクロックとしてDQをリードするDDR2 SDRAMコントローラの再検討
(DQSをクロックとしてDQをリードするDDR2 SDRAMコントローラの初期化時に、トレーニング・シーケンスを行って、うまくリードデータが受かる遅延を探る方法を検討している。)
DDR2 SDRAMコントローラにODT機能を追加
(ET2008 のDDR SDRAMのセミナに行って、ODT(On-Die Termination) はWrite時にだけONすると良いと言うことを聞いてきた。それも、FPGA側にDCI (Digitally Controlled Impedance) を使用するとベストだそうだ。ODTをWriteのときにだけONしてみることにした。シミュレーションで確認した)
DDR2 SDRAMコントローラにODT機能を追加しインプリメント
(前回”DDR2 SDRAMコントローラにODT機能を追加”でDDR2 SDRAMコントローラにODT機能を追加しシミュレーションしたが、ISE10.1i でインプリメントして確かめてみた。結局だめだった)
なひたふさんのところでSpartan3EでDDR2-400動作確認
(なひたふさんの作っているPCIeの基板でSpartan3EでDDR2-400が動作したと言う記事(Spartan3E+DDR2メモリで400Mbps)を見た。)

DDR3 SDRAMコントローラ

DDR3 SDRAMの新機能のまとめ
さ て、Spartan-6 FPGA SP605 評価キットを試してみたいのだが、その前にDDR3 SDRAMの新機能について勉強してみることにした。参照する資料はエルピーダ社のDDR3 SDRAMの新機能の使い方 - ユーザーズマニュアルを使用した。日本語でうまくまとまっていて、このシリーズにはDDR SDRAMの時代からお世話になっている。ありがとうございます。


Spartan3A Starter KitのDDR2 SDRAMコントローラの構想
(Spartan3A Starter KitのDDR2 SDRAMコントローラをどのように実装するかを考えてみた。SD_LOOP_OUT、SD_LOOP_INを使って、やってみたかった分散RAMを使った非同期FIFOでリードデータを受けることにする)
Spartan3A Starter KitのDDR2 SDRAMコントローラの構想2
(前回の”Spartan3A Starter KitのDDR2 SDRAMコントローラの構想”でDDR2 SDRAMコントローラの回路を考察したのだが、回路をVerilogで書いているうちにまずいところを発見し修正した)
Spartan3A Starter KitのDDR2 SDRAMコントローラの途中経過3(フロアプランを試す)
(”Spartan3A Starter KitのDDR2 SDRAMコントローラの途中経過2(DQSからBUFGをまわしたクロック)”で、お任せでインプリメントをしてみたが、遅延がばらついてしまった。そ れで今回はFloorplan Editorでエリア制約を試してみることにした)
Spartan3A Starter KitのDDR2 SDRAMコントローラの途中経過4(ロジックセルを固定する)
(”Spartan3A Starter KitのDDR2 SDRAMコントローラの途中経過3(フロアプランを試す)”でフロアプランのエリア制約をかけてみたところ、IOパッドから分散RAM使用のFIFOの 入り口までのネットの遅延がばらばらという問題があった。これを入り口のロジックセルを狙い撃ちして位置を固定することで遅延の短縮ならびに、平均化を図 ることにした)
Spartan3A Starter KitのDDR2 SDRAMコントローラの途中経過5(ロジックセルの固定の微調整)
(”Spartan3A Starter KitのDDR2 SDRAMコントローラの途中経過4(ロジックセルを固定する)”でロジックセルを固定したが、微妙な遅延差が残った。今回は微妙な遅延差の解消を目指した。最適なフロアプランにできた。)
Spartan3A Starter KitのDDR2 SDRAMコントローラの途中経過6(DCMやBUFGの配置)
(”Spartan3A Starter KitのDDR2 SDRAMコントローラの途中経過5(ロジックセルの固定の微調整)”でデータパスの遅延調整は終了したので、今度はクロックパスの遅延を調整した)
Spartan3A Starter KitのDDR2 SDRAMコントローラIOテストモジュールのシミュレーション1
(Spartan3A Starter KitのDDR2 SDRAMコントローラIOテストモジュールができあがったので、シミュレーションをしてみた。その結果まだ、おかしい。ddr2_dqが最初から0000を出力してしまっている。これはZZZZのはず。。。)
Spartan3A Starter KitのDDR2 SDRAMコントローラIOテストモジュールのシミュレーション2
(不具合はIOBUFのトライステート条件を入力するT入力の論理を間違えていたからだった。やはりCoregenで生成したFIFOではフリーランクロックでないと駄目のようだ)
Spartan3A Starter KitのDDR2 SDRAMコントローラIOテストモジュールのシミュレーション3
(CoreGenで作った非同期FIFOが使用にマッチしないので、”同期FIFOと非同期FIFO”で自作した非同期FIFOで再チャレンジした)
Spartan3A Starter KitのDDR2 SDRAMコントローラのインプリメント(再度インプリ)
(自作の非同期FIFOを使用したので、再度インプリメントした。その結果、インバータを入れるソースファイルの階層によって、インプリメント結果が異なることが分かった)
Spartan3A Starter KitのDDR2 SDRAMコントローラIOテストモジュール公開
(Spartan3A Starter KitのDDR2 SDRAMコントローラIOテストモジュールを公開した。ここからダウンロードできます。ただし、本当のIOpバッドや非同期FIFOの素子の配置を確認 するためのプロジェクトです。制御用のステートマシンなどはこれからです)

inserted by FC2 system