FC2カウンター FPGAの部屋 2009年10月02日
fc2ブログ

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

FPGAの部屋

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

ISE11.3のConstrants Editorの使い方2

ISE11.3のConstrants Editorの使い方1”の続き。

IOのタイミング制約をやってみることにする。まずはInputを制約する。
左のConstraint TypeからInputsを選択する。そうすると、Unconstrained Input Ports に各入力ポートが出てくるので、とりあえず、その中からcam_href をダブルクリックして、制約を追加しよう。
Constraints_Editor_6_091001.png

そうすると、Create Setup_Time (OFFSETIN) ダイアログが開く。ここではInterface Tyte やData rate Clock edge などを選択するが、この場合はデフォルト値でOKなので、そのままNext > ボタンをクリックして次に進める。
Constraints_Editor_7_091001.png

CMOSイメージセンサOmniVision社のOV7640のマニュアルから、最悪値で行くと、HREFはPCLKの立下りから5nsで有効 (tpHH) になって、PCLKの立下りから0nsで無効 (tpHL) になることが分かる。つまり、クロックの立ち上がりでサンプルする時のセットアップ時間は41.66/2 -5 = 15.83 ns 、HREFが有効な時間は15.83 + 41.66/2 = 36.66 ns であるので、それぞれExternal setup time とData valid duration に値を設定する。
Constraints_Editor_8_091002.png

そして、Finishボタンをクリックすると、Constraints EditorのCreate Timing Constraints for Input (OFFSET IN) にcam_hrefの制約が入る。
Constraints_Editor_9_091002.png

次はcam_vsyncも同様の値を入力する。
次はcam_ydataのタイミング制約を入力する。まずはUnconstrained Input Ports の中のcam_ydata<0>をダブルクリックする。
Constraints_Editor_10_091002.png

そうすると、Create Setup_Time (OFFSETIN) ダイアログが開く。ここではInterface Tyte やData rate Clock edge などを選択するが、この場合はデフォルト値でOKなので、そのままNext > ボタンをクリックして次に進める。(キャプチャ図は省略)
Yデータのクロックの立ち上がりからのセットアップ時間は15 ns 、ホールド時間は8 ns なので、セットアップ時間はそのままだが、有効な時間は34.66 ns 23 nsとなる。
Constraints_Editor_11_091002.png

それで、Finishボタンをクリックする。
Constraints_Editor_12_091002.png

ここまで終了したら、いったんSaveアイコンをクリックして、セーブしてからConstraints Editorを終了する。
CamDispCntrl_SRAM.ucf ファイルを見てみよう。

NET "clk" TNM_NET = clk;
TIMESPEC TS_clk = PERIOD "clk" 20.83 ns HIGH 50%;
NET "cam_pclk" TNM_NET = cam_pclk;
TIMESPEC TS_cam_pclk = PERIOD "cam_pclk" 41.66 ns HIGH 50%;
NET "cam_href" OFFSET = IN 15.83 ns VALID 36.66 ns BEFORE "cam_pclk" RISING;
NET "cam_vsync" OFFSET = IN 15.83 ns VALID 36.66 ns BEFORE "cam_pclk" RISING;
NET "cam_ydata<0>" OFFSET = IN 15 ns VALID 23 ns BEFORE "cam_pclk" RISING;


上のような制約が追加されている。他のcam_ydataはConstraints Editorから制約しても良いのだが、面倒なので、テキストエディタ(私はPeggyに自作のUCF用の定義ファイルを適用して使っています。”PeggyのUCFファイル用KWDファイル”参照)で制約を複製してしまうのが面倒がなくて良いと思っている(もちろんProject Navigaterから呼び出せる付属のテキストエディタで修正しても良い)。
Constraints_Editor_13_091002.png

もう一度、ProcessesペインのUser Constraints -> Create Timing Constrints をダブルクリックしてConstrinats Editor を起動する。そうすると、Constraints EditorのCreate Timing Constraints for Input (OFFSET IN) にcam_ydataがすべて入っている。
Constraints_Editor_14_091002.png

次は、mem_dataだ。やり方は前と同じなので省略する。SRAMのデータシートによると、アドレスやOE確定から10 ns なので、FPGAからのアドレス出力やOE出力のクロックからの出力時間を10 ns とする。さらにデータが有効になるのはアドレスやOE確定後から10 ns 後となる。と、セットアップ時間は41.66 - 10 - 10 = 21.66 ns となる。余裕がある。データが有効な時間は21.66 + データホールドの最小時間 0 nsなのだが、OEやアドレスの遅延時間の最小値を3 ns と見込んで = 24.66 nsとした。
同様にテキストエディタで複製し、修正したので、最終的なinputの制約は下のようになった。

NET "clk" TNM_NET = clk;
TIMESPEC TS_clk = PERIOD "clk" 20.83 ns HIGH 50%;
NET "cam_pclk" TNM_NET = cam_pclk;
TIMESPEC TS_cam_pclk = PERIOD "cam_pclk" 41.66 ns HIGH 50%;
NET "cam_href" OFFSET = IN 15.83 ns VALID 36.66 ns BEFORE "cam_pclk" RISING;
NET "cam_vsync" OFFSET = IN 15.83 ns VALID 36.66 ns BEFORE "cam_pclk" RISING;
NET "cam_ydata<0>" OFFSET = IN 15 ns VALID 23 ns BEFORE "cam_pclk" RISING;
NET "cam_ydata<1>" OFFSET = IN 15 ns VALID 23 ns BEFORE "cam_pclk" RISING;
NET "cam_ydata<2>" OFFSET = IN 15 ns VALID 23 ns BEFORE "cam_pclk" RISING;
NET "cam_ydata<3>" OFFSET = IN 15 ns VALID 23 ns BEFORE "cam_pclk" RISING;
NET "cam_ydata<4>" OFFSET = IN 15 ns VALID 23 ns BEFORE "cam_pclk" RISING;
NET "cam_ydata<5>" OFFSET = IN 15 ns VALID 23 ns BEFORE "cam_pclk" RISING;
NET "cam_ydata<6>" OFFSET = IN 15 ns VALID 23 ns BEFORE "cam_pclk" RISING;
NET "cam_ydata<7>" OFFSET = IN 15 ns VALID 23 ns BEFORE "cam_pclk" RISING;
NET "mem_data<0>" OFFSET = IN 21.66 ns VALID 24.66 ns BEFORE "cam_pclk" RISING;
NET "mem_data<1>" OFFSET = IN 21.66 ns VALID 24.66 ns BEFORE "cam_pclk" RISING;
NET "mem_data<2>" OFFSET = IN 21.66 ns VALID 24.66 ns BEFORE "cam_pclk" RISING;
NET "mem_data<3>" OFFSET = IN 21.66 ns VALID 24.66 ns BEFORE "cam_pclk" RISING;
NET "mem_data<4>" OFFSET = IN 21.66 ns VALID 24.66 ns BEFORE "cam_pclk" RISING;
NET "mem_data<5>" OFFSET = IN 21.66 ns VALID 24.66 ns BEFORE "cam_pclk" RISING;
NET "mem_data<6>" OFFSET = IN 21.66 ns VALID 24.66 ns BEFORE "cam_pclk" RISING;
NET "mem_data<7>" OFFSET = IN 21.66 ns VALID 24.66 ns BEFORE "cam_pclk" RISING;
NET "mem_data<8>" OFFSET = IN 21.66 ns VALID 24.66 ns BEFORE "cam_pclk" RISING;
NET "mem_data<9>" OFFSET = IN 21.66 ns VALID 24.66 ns BEFORE "cam_pclk" RISING;
NET "mem_data<10>" OFFSET = IN 21.66 ns VALID 24.66 ns BEFORE "cam_pclk" RISING;
NET "mem_data<11>" OFFSET = IN 21.66 ns VALID 24.66 ns BEFORE "cam_pclk" RISING;
NET "mem_data<12>" OFFSET = IN 21.66 ns VALID 24.66 ns BEFORE "cam_pclk" RISING;
NET "mem_data<13>" OFFSET = IN 21.66 ns VALID 24.66 ns BEFORE "cam_pclk" RISING;
NET "mem_data<14>" OFFSET = IN 21.66 ns VALID 24.66 ns BEFORE "cam_pclk" RISING;
NET "mem_data<15>" OFFSET = IN 21.66 ns VALID 24.66 ns BEFORE "cam_pclk" RISING;



(2009/10/07 修正)
cam_ydataのValid時間を34.66 nsから23 nsに修正しました。

  1. 2009年10月02日 05:45 |
  2. Constraints Editor
  3. | トラックバック:0
  4. | コメント:2