FC2カウンター FPGAの部屋 Spartan3Eの入力用プログラマブル遅延素子
FC2ブログ

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

FPGAの部屋

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

Spartan3Eの入力用プログラマブル遅延素子

いまSpartan3E Starter KitのDDRコントローラを作成中だが、Spartan3Eで新たに加わった入力用プログラマブル遅延素子が気になっているのでちょっと使ってみようということで調べてみた。
Spartan3Eのデータシートの11ページによると、0~6000psの間で遅延を挿入できるそうだ。
IOBのFFを使う場合は500psタップでIOBのFFを使わない場合は250psタップで遅延素子を挿入できるそうだ。250psのタップが7タップあるそうだ。それに加えて4000psのInitial Delayがあるようだ。(下図Spartan3Eのデータシートの11ページの図6参照)
Spartan3E_IOB_Delay_1_060528.png

遅延値はコンフィギュレーション時に決定しデバイスの動作中には設定できないそうである。これではダイナミックに遅延量を変更することができない。DDR SDRAMのデータ受信用にデータを遅延させるとしても基板やチップの遅延値から計算した遅延を設定するしかないようだ。ダイナミックに遅延を測定して、ちょうど良いところに設定するという方法は取れないことになる。
次にSpartan3Eのデータシートの11ページには、こう書いてある。

入力遅延エレメントは、グローバル クロックを使用した入力フリップフロップを使用する際に、ホールド タイムが 0 になるようにするために使用します。 必要な値は、デバイス サイズに応じてザイリンクス ソフトウェアにより選択されます。 クロック パスに DCM が使用される場合、遅延エレメントは 0 に設定しても問題ありません。この場合でも、ホールド タイムは 0 になります。


引用終わり。
これによるとデバイスサイズ応じてISEによってIOBのDelayが自動的に決定されるそうだ。
本当なのだろうか? いままでもVirtex2でクロックが遅れてホールド時間が不正になった場合にはIOBのDelayを入れてホールド時間を稼いだことがあった。
この前のロータリースイッチのプロジェクト、RotarySW_LCDプロジェクトで見てみよう。
rot_a入力を見てみることにしよう。
ISEからFPGA Editorを起動する。起動したらList1ウインドウからrot_aを選んで選択する。Zoom SelectionアイコンをクリックしてIOBの内容を表示してみよう。
FPGA Editorの使い方は”FPGA Editorの使い方1”を見てほしい。
Spartan3E_IOB_Delay_2_060528.png

IOBの内容を見るとIFD DelayがDLY2にチェックが入っている。DCMを使用しないとxc3s500e-4fg320はDLY2が入るのだろうか?
reset以外の入力はDLY2の遅延が入っているようだ。入力遅延はどのくらいになっているのだろうか。Timing Analyzerで見てみよう。
ISEからTiming Analyzerを起動する。”ISEで任意のパスのディレイを見る方法”を参照してください。
今回はセットアップ時間を測定するので、Timing Analyzerの"Analyze against User Specified Path by defining Clock and IO Timing"(ピンクの丸のアイコン)をクリックする。
Spartan3E_IOB_Delay_3_060528.png

"Analyze against User Specified Path by defining Clock and IO Timing"のダイアログが開く。"Clock/IO"タブで"Port Name"の"rot_a"の所を見ると、"Pad to Setup"に10(ns)を入力し”OK"ボタンをクリックする。
Spartan3E_IOB_Delay_4_060528.png

そうすると"rot_a"のセットアップ時間を表示する。
Spartan3E_IOB_Delay_5_060528.png

入力パッドからIOBのFF間での遅延は6.930ns、クロックの遅延は2.826nsになる。よって、セットアップ時間は4.104nsになっているようだ。
ISE8.1iの制約ガイドの147ページに書いてあるIFD_DELAY_VALUEを0にしてインプリメントをしてみよう。UCFファイルに以下の分を追加してインプリメントしてみた。

NET "ROT_A" IFD_DELAY_VALUE = 0;


クロックパス遅延は変わらないがデータパス遅延は以下のように変わった。

Data Path: rot_a to input_4hex_top_inst/rot_enc_cont_inst/rot_a_node
Delay type Delay(ns) Logical Resource(s)
---------------------------- -------------------
Tiopick 2.540 rot_a
rot_a_IBUF
input_4hex_top_inst/rot_enc_cont_inst/rot_a_node
---------------------------- ---------------------------
Total 2.540ns (2.540ns logic, 0.000ns route)
(100.0% logic, 0.0% route)


6.930ns - 2.540ns = 4.390nsの差だった。4nsを超えているので以前のものはInitial Delayが入っているのかと思ったが、そうではないようだ。今回はIF_Delayも通っていないようだ。
Spartan3E_IOB_Delay_6_060528.png

IFD_DELAY_VALUEは0~8まであるのでやってみる。結果は以上のとおりである。

IFD_DELAY_VALUE=0 の時rot_aデータパス遅延は2.540ns
IFD_DELAY_VALUE=1 の時rot_aデータパス遅延は6.245ns 差分 3.705ns
IFD_DELAY_VALUE=2 の時rot_aデータパス遅延は6.930ns 差分 0.685ns
IFD_DELAY_VALUE=3 の時rot_aデータパス遅延は7.540ns 差分 0.610ns
IFD_DELAY_VALUE=4 の時rot_aデータパス遅延は8.688ns 差分 1.148ns
IFD_DELAY_VALUE=5 の時rot_aデータパス遅延は9.373ns 差分 0.685ns
IFD_DELAY_VALUE=6 の時rot_aデータパス遅延は9.983ns 差分 0.610ns
IFD_DELAY_VALUE=7 の時rot_aデータパス遅延は2.540ns
IFD_DELAY_VALUE=8 の時rot_aデータパス遅延は2.540ns


IFD_DELAY_VALUE=7は一時10.???nsと出たときもあったのだが、もう2回やってみたら2.540nsだった。
8の時も2.540nsだし、怪しいところはあるが7以上は遅延が入らないようだ。Timinig Analyzerの結果がおかしいのかもしれないが、どういう基準で遅延量が決まるのかが良くわからない。
とりあえずこれではDDR SDRAM用の遅延回路は組めないようだ。今度は0~16まで変化できるIBUF_DELAY_VALUEについて調べてみようと思う。いずれにせよコンフィグ時に固定だが、こっちはきちんと計算できればDDR SDRAMのデータ受信用に使えるだろうか?

Xilinxのアンサーデータベース、アンサー #22368 Spartan-3E - 入力遅延エレメントを使用する際の注意点を見ると7と8は使わないでくれと書いてあるようだ。
このアンサーを良く見ると0-3と4-6の組み合わせに分かれるようだ。道理で3と4の間の遅延が多い。4-6の方にはInitial Delayが入っているのだろう。(FPGA Editorではそうは見えないが)

その後、5と6はFPGA Editorで見るとInitial Delayが入っているように見えることがわかった。
  1. 2006年05月28日 08:57 |
  2. FPGAチップ内の配線方法
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog.fc2.com/tb.php/230-b7e2cf24
この記事にトラックバックする(FC2ブログユーザー)