FPGAの部屋

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

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。ご利用ください。 http://marsee101.web.fc2.com/index.html

2008年06月

DDR2 SDRAMコントローラを作っていると、DQなどの入出力ピンの入力をISERDESにして、出力をODDRにすると、どうもPlace & Route でルートできないといわれてエラーになってしまう。
Virtex4のIOブロックの詳細回路図がないのかと思って探したのだが、良くわからなかった。そこでISERDESにはOSERDESを使っておけば問題ないだろうということで、OSERDESを使うことにした。でもOSERDESも内部構造がなぞである。Virtex4 FPGAユーザーズガイド(英語版)ににも載っていないし。。。
でもありました。Xilinx社のアプリケーションノート、XAPP721 ISERDES と OSERDES を使用した高性能DDR2 SDRAM インターフェイスにOSREDESの内部回路が載っていた。説明が少なくてなぞの端子があるが、大体このアプリケーションノートを見るとわかった。でも、もっともっとユーザーズマニュアルに詳しく書いて欲しいと思った。
下にXilinx社のアプリケーションノート、XAPP721 ISERDES と OSERDES を使用した高性能DDR2 SDRAM インターフェイスの3ページより転載します。
cfc34852.png


OSERDESをDDRモードにすると、最低4ビット入力となって、CLKDIVはCLK入力の1/2にする必要がある。そうなると、CLKDIVは100MHz、CLKは200MHzとなる。今までは、DDR2 SDRAMコントローラは200MHzで動作していたのだが、OSERDESを使う出力だけは100MHzでデータをロードする必要が出てきた。(ISERDESは200MHzで使うことができた)
最初からすべてのDDR2への出力にOSERDESを使うことを前提に100MHzで設計していたら良いのだろうが、200MHzで動く資産があるので、これを使うには、100MHzで動作するOSERDESとの同期を取る必要がある。200MHzで発行するWriteコマンドを100MHzのクロックエッジに同期させる必要が出てきたので、同期信号を作成した。この同期信号に同期してWriteを発行すれば、100MHzに対してのタイミングが確定されるので、OSERDESでDQとDQSを出力することが出来るようになる。

Doxygenでは日本語の文字コードをUTF-8にする必要があるが、そうするとISEのEditorで表示すると文字化けしてしまう。
どうしようか悩んだが、Xilinxのアンサー、”13713 - Project Navigator - Project Navigator でのサードパーティ HDL エディタのサポート”をみてISE(Project Navigator) の外部エディタとしてNotepad++を使うことにした。

1.設定の仕方は、Project Navigator のEditメニューからPreferences...を選ぶ。
2.Preferencesダイアログが出てくるので、ISE General の下の Editorsを選択する。
3.Text editorフィールドのEditor をCustom にCommand line syntax: に下のコマンドを設定する。

{C:\Program Files\Notepad++\notepad++.exe} -n$2 $1


697e08bb.png


パスは各環境でのNotepad++のパスを指定する必要がある。(当たり前)
これで、XSTでエラーのときにもNotepad++でエラーの行番号に飛ぶことができる。
ちなみにNotepad++のCommand Line Arguments のページ。

”DCMを使わないクロックを使いIOB内のFFでデータを受ける”でDCMを使わないクロックでのデータの受け方を練習したが、クロックを遅延させる方法はどうも危ない気がするし、違う方法を模索してみることにした。
ISE9.2.03とSynplify9.2、FPGAはVirtex2pだ。今どきVirtex2を使っている人は少ないと思うが、Spartan3にも適応できるので良いと思う。(もっとVirtex4などの方が簡単なのだが。。。)
状況は、他にチップからのデータを向こうの受信クロックで受ける。チップが多いのでDCMは使用できない。クロックはBUFGMUXのみを通してFPGA内に供給している。
その時に、セットアップ時間を制約しているが、(1.5ns) それだけだと、制約をオーバーしたり、マイナスになることがよくある。それで、ちょうどうまくセットアップ時間を確保するにはどうすればよいかを探る。
たとえば下のTiming Analyzerのようにマイナスになってしまう。こうなるとホールド時間がきつくなってしまう。さらに結構ばらついてしまう。
5793f0e9.png


とりあえずばらつきを防止するために、Floorplannnerでデータの最初のFFの位置を全部固定した。
c957d062.png


パッドと最初のFFを割り当てるスライスの間が離れると配線の自由度が上がるので、値がばらつくだろうという考えのもとに、パッドからなるべく近くのスライスに配線した。
これでインプリメントしてみた。
34363438.png


そうするとデータ入力のセットアップ時間が同じような値でマイナスになった。これをプラスにするためにデータ入力のIOBDELAYを入れることにした。

INST "lvds_rx0_data[*]" IOBDELAY=BOTH;
INST "lvds_rx1_data[*]" IOBDELAY=BOTH;
INST "lvds_rx2_data[*]" IOBDELAY=BOTH;
INST "lvds_rx3_data[*]" IOBDELAY=BOTH;
INST "lvds_rx4_data[*]" IOBDELAY=BOTH;
INST "lvds_rx5_data[*]" IOBDELAY=BOTH;
INST "lvds_rx6_data[*]" IOBDELAY=BOTH;


これでインプリメントすると、セットアップ時間内にばらつきが少なくおさまった。
31904487.png


前と同じパッドのTiming Analyzer解析結果はこうなった。
c549365a.png


IOBDELAYを入れたので、入力パッドの遅延が増えている。次のFFまでのネットの遅延は減っている。総合的にちょうど良くなった。これでもう少し、セットアップ時間を増やしたいときにはFloorplannerで固定するFFの位置を離せば良いと思う。あまり離すと遅延値がぶれてしまう可能性があると思うが。。。もしどうしても必要があるのならば、FPGA Editorで配線も固定する必要があるかもしれない。

ISE9.2.03とSynplify Pro9.2で、ファイルを整理してプロジェクトを作り直していたら、Timing Analyzerに出てくるクロック周期がおかしい。
クロック周期のピリオド制約をコメントアウトして、もう一度Constraints Editor で制約しようとしたら、もうすでに15.151nsという制約が入っていて、Constraints Editor でもう一度7.5ns に書き換えようと思っても書き換えることができない。
ede98a0b.png


これはなんだろうと思っていたら、そういえば、前もこんなことで悩んだことがあるような気になってきた。
確か、これはSynplify Proの制約ファイルが出力されてしまって、Translateで解釈されてしまうのが問題だったような。。。
というわけでISEのSynplify Proのプロパティを出してみると、Write Vender Constraint File にチェックが入っていた。
0230ead1.png


やはり、これだった。早速、Write Vender Constraint File にチェックを外して、プロジェクト名.ncf ファイルを削除した。
089eeaa8.png


これで、インプリメントしたところ正常な制約が適用されているようだった。良かった。

自分のブログを検索すると、”お手軽にISEでSynplifyを使う上での注意点”で同じ過ちをしていた。
どうも、同じ過ちをしてしまう。。。

しかし、Write Vender Constraint File がデフォルトでチェックされているのいただけない。デフォルトではチェックなしにしてほしい。

”DQSをクロックとしてDQのリードデータを受けるDDR2 SDRAMコントローラの構想2”で、ISERDESでDQを受けられるようにDDR2 SDRAMコントローラを変更してやってみたのだが、どうもPlace & Routeでルートができなくて止まってしまう。
どうやらDQSのOLOGICに、クロックの違うFFが入っているのと、OLOGICのResetに他のOLOGIC内のFFと違ったReset信号が入っているので、ルートできないようだ。
実は、OLOGICにインスタンシエーションされるとだめなのは、以前からわかっていて、これらのFFをOLOGICにインスタンシエーションされないようにしておいたはずなのだが、ISERDESを使った過程でOLOGICの中に組み込まれてしまっているようだ。ちなみにDQSとDQの入力はISERDESに変更したが、出力の方はODDRを使用している。そのせいかな?
いろいろXSTのディレクティブを使用したりしてみたが、どうもうまくいかない。昨日1日それでつぶしてしまった。。。
もしかすると、何か制限があるかもしれないので、もう一度、マニュアルを読み返すか? ラッツネットになっているFPGA Editorを見てどうなっているか解釈してみるつもりだ。
出力もOSERDESにしてみようかとも思う。
もしそれでもだめならば、今のところは、DQはDDR2 SDRAMのクロックの立ち上がりに同期して出力し、DQSはそれよりも位相を90度送られて出力している。だが、DQの方を位相を90度進ませて(270度)出して、DQSをDDR2 SDRAMのクロックの立ち上がりに同期して出力すると、DQSはOLOGICにすんなり入るようにVerilogソースを書き換えられると思うので、それも考慮の対象としたい。

↑このページのトップヘ