FC2カウンター FPGAの部屋 クロックを遅延する方法
FC2ブログ

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

FPGAの部屋

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

クロックを遅延する方法

今回はグローバルバッファに入る前にクロックを内部の論理素子で遅延する方法だ。使用するFPGAチップはXC2V50-6FF1152とする。
たとえば下の図のようにFPGAの入力ピンに入力される信号波形が乱れているとしよう。FPGAの入力用FFのクロックのラッチポイントが波形の乱れの近くにある場合はセットアップ時間やホールド時間に波形の乱れが入る場合がある。その場合、下図ではVil(max)を超えていないが、超える場合も考えられる。Vil(max)を超えてスレッショルドに近くなるとFFがミスる場合も考えられる。その場合にクロックを信号が安定しているところにずらせば安定してデータを受けることができるようになる。クロックをずらすためにグローバルバッファ(BUFGMUX)の前に遅延素子を入れるわけだ。
input_wave_form_060407.png


その方法を見てみよう。最初にチャレンジしたのはMUXF5プリミティブを使って遅延する方法だった。以前使用したBUFプリミティブはTranslateの時点でインスタンスが見えないのでフロアプランできなかったため不可となった。
今回の遅延素子のブロック図を下に示す。delay_timeの値で遅延の量を変化できるようになっている。
delay_circuit_block_060409.png


以前に使用した"KEEP"制約を使用しても最初のMUXF5プリミティブがなくなってしまった。ソースの一部を示す。

attribute KEEP : string;
attribute KEEP of clk_node: signal is "ture";
attribute KEEP of clk_delay_1: signal is "true";
attribute KEEP of clk_delay_2: signal is "true";
attribute KEEP of clk_delay_3: signal is "true";

begin
 logic1 <= '1';

 ibufg_inst : ibufg port map(i=>clk, o=>clk_node);

 delay_time <= "11";
 delay1 : MUXF5
  port map(
   o => clk_delay_1,
   i0 => clk_node,
   i1 => clk_node,
   s => logic1 -- sel
  );
 delay2 : MUXF5
  port map(
   o => clk_delay_2,
   i0 => clk_node,
   i1 => clk_delay_1,
   s => delay_time(0)
  );
 delay3 : MUXF5
  port map(
   o => clk_delay_3,
   i0 => clk_node,
   i1 => clk_delay_2,
   s => delay_time(1)
  );

 bufg_inst : bufg port map(
  i => clk_delay_3,
  o => clk_bufg_out
 );


MUXF5を使用するとフロアプランナーで1スライス分論理素子を占有してしまう。なぜかわからなかったのでTiming Analyzerの説明を見てみたらLUTの後ろのMUXを使用しているようだ。それがMUXF5というらしい。
MUXF5_circuit_060409.png


これでBUFGMUXの前に遅延はいれることができたが、1スライスを占有するのでどうももったいない。やはりMUXプリミティブ系にはLUTを使用するものがないので直接LUTプリミティブを使用しないと問題を解決できないようだ。
そこでLUT3を使用することにする。LUT3を使用するのはINITの値を考えるのが楽であるためだ。LUTを使用してMUXを構成できるようにINIT値を決めた。これでMUXF5の代わりにこれを使用する。VHDLコードは下のようになった。

attribute KEEP : string;
attribute KEEP of clk_node: signal is "ture";
attribute KEEP of clk_delay_1: signal is "true";
attribute KEEP of clk_delay_2: signal is "true";
attribute KEEP of clk_delay_3: signal is "true";

begin
 logic1 <= '1';

 ibufg_inst : ibufg port map(i=>clk, o=>clk_node);

 delay_time <= "11";
 delay1 : LUT3
 generic map(
   INIT => X"CA")
  port map(
   o => clk_delay_1,
   i0 => clk_node,
   i1 => clk_node,
   i2 => logic1 -- sel
  );
 delay2 : LUT3
  generic map(
   INIT => X"CA")
  port map(
   o => clk_delay_2,
   i0 => clk_node,
   i1 => clk_delay_1,
   i2 => delay_time(0)
  );
 delay3 : LUT3
  generic map(
   INIT => X"CA")
  port map(
   o => clk_delay_3,
   i0 => clk_node,
   i1 => clk_delay_2,
   i2 => delay_time(1)
  );

 bufg_inst : bufg port map(
  i => clk_delay_3,
  o => clk_bufg_out
 );


LUTは下の図のように論理素子を使用する。
LUT_circuit_060409.png


これならばスライスのFかGにフロアプランナーで配置できる。しかし、同じスライスの2つともこのLUT3プリミティブを配置することはできないようだ。これで良いだろう。

クロックの遅延素子なし、MUXF5遅延素子つき、LUT3遅延素子つきのFPGA Editorの画面を示す。
最初にクロックの遅延素子なしを示す。
no_delay_FPGA_Editor_060409.png


遅延素子がなくてもかなりCLKピンからBUFGMUXまでの配線が回っているようだ。
次にMUXF5遅延素子つきを示す。
MUXF5_delay_FPGA_Editor_060409.png


1つ予定より遅延素子が少ない。
LUT3遅延素子つきを示す。
LUT_delay_FPGA_Editor_060409.png


Timinig Analyzerの結果も示す。この結果はCLKピンからBUFGMUXの入力までの遅延だ。
最初にクロックの遅延素子なしを示す。
no_delay_tim_ana_060409.png


次にMUXF5遅延素子つきを示す。
MUXF5_delay_060409.png


最後にLUT3遅延素子つきを示す。
LUT3_delay_060409.png


どっちの遅延素子つきも1.406ns~1.675ns程度遅れている。
MUXF5の方は上のスライスのブロック図を見てもわかるが、信号通過の経路が増えているためLUTに比べて論理素子で倍以上の遅延があるようだ。
  1. 2006年04月09日 14:15 |
  2. FPGAチップ内の配線方法
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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