2011年11月28日月曜日

(LP)DDR-SDRAMCの作成 2

何点か修正箇所はあったものの、合成の方はわりとすんなりとMetし実機での動作確認も上手くいったのだが、一つ大きな勘違いをしていた。それは、FPGAのSpeed Gradeを最速の3にしてしまっていたことだ。 MicroBoardに実装されているのは2なのでこれではいけない。(とは言え、実機では動作しているのだが。。偶々かも知れない。) そこで、Speed Gradeの設定を2にして合成し直してからが大変だった。なかなかMetしてくれない。 RTLのあちこちを修正し、ISEのDesign Goals and StrategiesをTiming Performanceにし且つMap PropertiesのStarting Placer Cost Tableの値を3にして漸くMetした。


Memory R/W TestのProgramを走らせていてPassする度にLEDを点滅させているだけなので面白みにかけるが、以下は動作している様子だ。

video

Memory Readの為のCalibrationは無しで動作できている。
LPDDR(Mobile DDR)はDLLを内蔵していないため、tACの振れ幅がものすごく大きい。
普通のDDRの場合は±700ps位の値だ。

JEDECの規格書から引用


これに対してLPDDRの場合は2.0ns~5.0nsもある。

JEDECの規格書から引用


MicronのDatasheetから引用




このtACはClockに対するDQの出力遅延で2.0ns~5.0nsもの振れ幅がある。 勿論動的にjitter的にこの範囲で揺れ動く訳ではないのだろうが、こんだけ幅があるということは、DQをFPGAのIDDRで取り込む場合に、Clockの立上りから取り込みが始まる場合と、立ち下がりからになる場合があるということだ。 以下はMicronのMobile DDR Simulation Modelを使って本SDRAMCをSimulationした波形だ。下がtACが5.0nsの場合で上は2.0nsの場合だ。



波形下部のw_dinはIOBUFの出力、w_din2はIDDR2の出力部だ。 IOBUFとIDDR2間にIODELAY2を置いてこの遅延量を調整(Calibration)しようにも、最大では1Bit期間(2.5ns)以上も遅延させることになり無理が有る。 そこで、本SDRAMCではDQSの値からDataの順序を判定するようにしている。 DQSはH→Lの順に振れるのでHがどのClock Edge側で取り込まれているかで判定をしている。 勿論、DQ、DQSのEdgeがIDDR2のSetup/Holdに引っかかる場合も有り得るので、IODELAY2による遅延調整もできるようにしているが、これはあくまでもSetup/Hold違反の為の調整であって、取り込みEdgeの調整用ではないということだ。

結局PHY_DP部は以下のようになった。

Write系


258行目のfor calibrationはIODELAY2自体のCalibrationの為のState Machineだ。IODELAY2は最初に(あるいは適宜)入力信号(Bit信号)の1期間を教える必要がある。本SDRAMCでは起動時に自動でCalibrationを実行する。また、任意のTimingでSoftwareからこのState Machineを起動することもできる。


以下はCalibrationの様子。Bit期間を教えればいいので、FPGAからDQとDQSを出力しこれをIDDR側にU Ternさせて調整をさせている。


DQSはmclk、DQはこれに270°位相遅れのmclk_270で駆動している関係で、どちらかを遅らせて位相を合わせる必要があるが、現状はDQSの位相を遅らせている。具体的にはDQS側のIODELAY2のIDELAY_TYPE値をVARIABLE_FROM_HALF_MAXにしている。Calibartion完了後、IODELAY2にRSTを印加するとこの遅延値に設定される。


Read系

2011年11月20日日曜日

(LP)DDR-SDRAMCの作成

AvnetのSpartan6 FPGA LX9 MicroBoardはLPDDR-SDRAMが実装されていて、これをTargetにして(LP)DDR-SDRAMCの作成に挑戦している。 (LP)の意味はLPDDRの特徴である省電力機能(部分的SelfRefresh等)の利用を特に意識していないためである。 で、一応RTLは出来た。自作のSDRAMCとしてはDDR2-SDRAMCとSDR-SDRAMCがあるが、今回はSDR-SDRAMCのRTLを元にDDR用に発展させる形にした。下図がブロック図である。


SDRAMは200MHz、FPGA内部(MPIF側)は100MHzで動作させる。 MPIF側のBus幅は64bitにした。MPIFのI/F仕様はbit幅が広がった点を除いてこれまでと同様だ。


PHY_CP部は以下のようにした。


最下部のassignで#3.29の遅延を付けているがこれはSimulation用に付けており、実回路での遅延を目的としているものでは無い。
PHY_DP部のWrite側は以下のようにした。


今回はSpartan6をTarget Deviceとしているが、別種FPGAへの移植も一応念頭においてRTLを作成した。具体的にはDDRの部分はDeviceによって細部が変わる可能性があるためdc_ddrio, dc_ddroというmoduleにした。
そのdc_ddrioであるが、現状以下のようになっている。

(出力系)


Spartan6では出力信号をODDRから出す場合、OEN信号もODDR出力でなければならないようだ。(Spartan3Aの場合はそういう制約はなかった。) また、Clockも共通になる。

(入力系)


IOBUFからIDELAYを通ってIDDR2に行く。
本DDR-SDRAMCではDQSではなく、DQの位相を制御する。
このIDDR2の出力を受けるPHY_DPのRead系は以下のようになっている。


Clock生成はDCMではなくPLLを使う。


PLLでmclk(200MHz)、mclk_270 (mclkの270°遅れ位相)、vclk (25MHz)を生成している。 bclk(100MHz)は、PLLの外でmclkを分周して作成している。これはClock載せ替えのGearBoxでbclkのValid Timing信号(bc_vldで、これ自体はmclk同期)が必要で当然bclkとH/Lの関係が確定している必要があるためこのようにしている。

以下はWriteのSimulation波形だ。


Writeの場合DQSとDQ,DMは90°の位相差が必要だが、このCONTROLLERではDQ,DMの位相をずらしている。(つまり、DQSはCK_Pと同位相)

以下はReadのSimulation波形だ。



MPIF側のCommand受信からRead Data出力迄のLatencyはBankが閉じている場合(Bank Activeが発生する)は13、開いている場合(Bank Activeは発生しない)は11になる。

合成でTimingはMetした。


さてさて、後は実機に流して動作確認になるが、上手く動くか?
IDELAYのCalibrationが必要になると思うがこれからかな?

2011年11月15日火曜日

ガニメデの優しい巨人

創元SF文庫のジェイムズ・P・ホーガンの「星を継ぐもの」シリーズにはまっていて、今は「ガニメデの優しい巨人」を読んでいる。 これのp217の記述 「ハードウェアの構成自体がプログラム可能であって ~   言うなれば、ソフト・ハードウェアだな。」ってまるでFPGAだね。。。この作品は本当に面白い!!

この作品のCopyright情報によれば、「INHERIT THE STARS」(星を継ぐもの)は1977 in USA、「THE GENTLE GIANTS OF GANYMEDE」(ガニメデの優しい巨人)は1978 in USAとなっている。一方、Wikipediaによると、「プログラム可能なロジックアレイ、論理ゲート、論理ブロックといった基本概念は1985年、David W. Page と LuVerne R. Peterson の取得した特許に既に見られる」そうだが、これの出典である特許(http://www.google.com/patents?id=BB4vAAAAEBAJ&dq=4508977)によるとFilling date(申請?)が1981年、特許内で引用している他の特許でもっとも古いのが1971年のものになっている。作者ジェイムズ・P・ホーガンの作品中の上記記述は彼の独創によるものなのか、それとも作品とほぼ同時期に発明されていたPLA (Program Logic Array)の概念について既に知っていたんだろうか・・・ どうでもいいっちゃどうでもいいことなんだけど、ちょっと興味があるな。

2011年11月13日日曜日

Spartan6 FPGA LX9 MicroBoard

AvnetのSpartan6 FPGA LX9 MicroBoardを入手した。

このBoardはLPDDR-SDRAMを実装しており、DDR CONTROLLERを作ってみたいと考え入手したのだった。また、PMODというUser I/O用のConnectorも有るので、例えばDVI出力もできるかも知れないと期待してのことだった。。が残念なことにPMODはFPGAのBank1の端子が使われている。 DS162によるとBank1は差動系のI/Fは殆ど使えないようだ。遊び心がないなぁー Avnetって。 それにU60_xlx_s9_lx9_fpga_microboard-ug022811.pdfというUser Guideによると、PMODはBank0になってるんだけどな。。。



でも、DDR CONTROLLERの作成はできると思うので挑戦してみよう。

2011年11月7日月曜日

Spartan3A StarterKit 用 DVI (HDMI)変換基板の作成

Spartan3A StarterKitのDVI I/F用コネクタは下の写真の通りHDMIコネクタに線材を直付けしていて、いつか変換基板を作ることが懸案事項になっていた。


ようやく、今日ユニバーサル基板を用いて変換基板を作成した。


配線はUEW線を使用したが差動信号なのでツイストペアにし、長さも揃えた。


気持ち LCD Displayの同期のかかりも早くなった気がする。

video

アップロードした動画は階調が落ちる?らしく上の動画ではLCD Displayの表示画面の画質や階調が悪く見えるが、実際は綺麗に表示されている。


2011年11月3日木曜日

SDRAMCのLattice XP2への実装 7

ようやく、ちゃんとした画が映るようになった。

video

ちゃんとした画がでるようにはなったのだが、Timing解析の結果ではクロック載せ替えの部分でSetup ErrorとHold Errorが若干ある。 これらはfalse pathやmulticycle path指定すればいいとは思うのだが、Diamondでの制約の付け方が資料を見たりもしているのだが、何かよく判らない。 また、RTLを編集してClock位相関係を変えて合成するとTiming Errorはまったく出なくなるのだが、実際の動作は画がでなかったり不安定になったりする。 Timing Error有りだと安定動作、Timing Error無しだと不安定という、よく判らない状態だ。

何んかもやもやした気分だが、SDRAMCの作成はこれで終了としようと思う。

ここまでのRTL一式はいつも通り、
http://www.hi-ho.ne.jp/bravo-fpga/
に置いた。

TE0720 No.4 (BNN-PYNQを動かしてみる 2)

TE0720でBNN-PYNQを動かすことが出来た。 以下は前回に続いてBNN-PYNQが動くまでの記録。 gdb (GNU debugger)で例外が出る原因を調べてみた。 例外が発生しているのはシェアードライブラリ(python_hw-cnv-pynq.so)の中であ...