FC2カウンター FPGAの部屋 2005年09月25日
FC2ブログ

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

FPGAの部屋

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

UCFの書き方3

今回は自分で便利に使っているやり方を書きます。”こんなことも出来るよ。それよりもっとこんなふうにやれば良いのに。間違っているよ”、ということがあれば、ぜひコメントに書き込みお願いします。
まずは、前回の補足からタイミング制約でクロックの入力ポートに、動作クロックの周期(動作周波数)の制約を書いたが、この制約はDCMの後にも伝播するようだ。つまり、66MHzをクロック入力して、それをDCMに入れて、2倍の133MHzにして、回路に供給したとする。DCMの出力に制約を新たに書かなくても、66MHzのクロックの入力ポートに15nsの制約を書いておけば、DCMが出力したクロックの制約は7.5nsになる。
DDR SDRAMコントローラなどを作ると、沢山のクロックが必要となる。私が作っているのは、PCIバスから66MHzを供給して、それを元クロックとすると、
66MHz、133MHz0度、133MHz90度、133MHz180度、133MHz270度、133MHzの受信用、133MHzの16分周、位相シフト用
の8種類使用している。
特に、133MHzの受信用クロックは動的に位相をシフトしているので、他のクロックとの位相関係が静的にはわからない。従って、他のクロックで動作している回路へデータを渡す場合には、非同期FIFOを使用している。非同期FIFOの入力と出力で違うクロックになるわけだが、異なるクロックで動作し、データを受け渡すFFを制約に加えてしまうと、大幅にタイミング違反になってしまう場合がある。その場合に、受け渡すクロックの間の依存関係は無視するという制約を書く。
それが以下の制約だ。
PIN "U_ddr_cont_inf/DDR_CONT/dynamic_phase_adjustment_inst/bufg_fb.O" TNM = CLK_RX_O;
PIN "U_ddr_cont_inf/DDR_CONT/dcm_module_inst/clk_bufg_inst.O" TNM = CLK_DDR_O;
TIMESPEC TS_IGNORE3 = FROM CLK_RX_O TO CLK_DDR_O TIG;
TIMESPEC TS_IGNORE4 = FROM CLK_DDR_O TO CLK_RX_O TIG;

最初の行は、受信クロックを出力しているbufg(グローバルバッファ)の出力(.O)を使用しているFF全般にCLK_RX_Oという名前をつける。
次に、133MHz0度クロックを出力してるbufgの出力を使用しているFF全般にCLK_DDR_Oという名前をつける。
CLK_RX_OからCLK_DDR_Oへのデータパスのタイミング検出を無視(TIG)する。
CLK_DDR_OからCLK_RX_Oへのデータパスのタイミング検出を無視(TIG)する。
こうすると、非同期FIFOのタイミング検出を無視できるはずである。事実、タイミング違反が無くなった。

制約に関してはもう1回くらい書きたい。
  1. 2005年09月25日 20:00 |
  2. UCFの書き方
  3. | トラックバック:0
  4. | コメント:0

UCFの書き方2

今度は、タイミング制約だ。
一番基本的な制約は、動作周波数である。
制約エディタ(ISE7.1i)でやると一番簡単だ。制約エディタの最初の画面に、クロックはリストされている。右側のPeriodの欄をダブルクリックすると、クロック制約を設定するダイアログが開く。
constraint_editor2.jpg
Clock Signal Definitionの欄にクロック制約を入力することになるが、大体はSpecify Timeの欄に入力することになる。
予定動作周波数の周期をTimeに入力する。この場合は50MHzの予定なので、周期は20nsなので、20と入力。デューティはだいたの場合は50%だろうから、Time HIGHはディフォルトの50でOK。
テキストエディタで見ると制約はこうなる。
NET "clk" TNM_NET = "clk";
TIMESPEC "TS_clk" = PERIOD "clk" 20 ns HIGH 50 %;

今度はセットアップ時間の設定。制約エディタでPortsタブをクリックすると、ポート(入出力ピン)の設定が出来る。当たり前だが入力ポートのみセットアップ時間を設定できる。Pad to Setup欄をダブルクリック。Pad to Setupのダイアログが開く。
constraint_editor3.jpg
Time Requirementの欄にセットアップ時間を入力(20ns)。クロックが複数ある場合は、Relative to Clock Pad Netで関連するクロックを選択。この場合はclkのみ。
テキストエディタで見るとこうなる。
NET "sw<0>" OFFSET = IN 20 ns BEFORE "clk" ;
ちなみにベクタの括弧が<>になっている。UCFの書き方1では、()だったが、これは論理合成ツールによって異なっている。()はSynplify Pro、<>はXST(ISEのディフォルト)。XSTは括弧をプロパティから変更可能。
この後、ベクタに同じセットアップ時間を設定する場合には、テキストエディタで、<*>に変更する。
NET "sw<*>" OFFSET = IN 20 ns BEFORE "clk" ;

今度は、クロックからの出力時間を設定する。同じPortsタブの画面から、Clock to Padをダブルクリック。そうすると、Clock to Padのダイアログが開く。
constraint_editor4.jpg
OFFSETの欄にクロックからの出力時間を設定(20ns)。後は、セットアップ時間と同様。
テキストエディタで見るとこうなる。
NET "seg_out<0>" OFFSET = OUT 20 ns AFTER "clk" ;
これで、タイミング制約の基礎はOK。
次回は、応用編。
  1. 2005年09月25日 10:32 |
  2. UCFの書き方
  3. | トラックバック:0
  4. | コメント:0