FC2カウンター FPGAの部屋 Spartan3Aのプログラマブル遅延素子1
fc2ブログ

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

FPGAの部屋

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

Spartan3Aのプログラマブル遅延素子1

Sparatan3Eの時もプログラマブルな遅延素子があったが、動的に遅延を変更することが出来なかった。Spartan3AはIBUF_DELAY_VALUEのうち8タップを変更することが出来る。下にSpartan-3 Generation FPGA User Guideの323ページの”Figure 10-10: Spartan-3A/3AN/3A DSP Programmable Dynamic Input Delay Elements”を引用する。
Spa3A_IDEALY_1_090302.png

上の図でCoarse Delayが前段の遅延素子でこれを入れるか、入れないかでIFD_DELAY_VALUEは2X4タップ、IBUF_DELAY_VALUEは2X8タップの遅延素子になる。IBUF_DELAY_VALUEの8タップはS[2:0]で選択することが出来て、動的に遅延を変更することが出来るようだ。

とりあえずSpartan3Aのxc3s700a-4fg484 でIBUF_DELAY_VALUEを測定してみよう。
まずはIOB_Delay_test.vをインプリメントしてみた。ソースを下に示す。

`timescale 1ns / 1ps

module IOB_Delay_test(
    input clk,
    input reset,
    input testin,
    output testout
    );
    
    reg in_ff, in2_ff;
    
    always @(posedge clk) begin
        if (reset) begin
            in_ff <= 1'b0;
            in2_ff <= 1'b0;
        end else begin
            in_ff <= testin;
            in2_ff <= in_ff;
        end
    end
    
    assign testout = in2_ff;
endmodule


次にUCF。遅延を見るだけなので位置は固定していない。

NET "clk" TNM_NET = clk;
TIMESPEC TS_clk = PERIOD "clk" 8 ns HIGH 50%;
NET "testin" OFFSET = IN 5 ns BEFORE "clk" RISING;
NET "testout" OFFSET = OUT 7 ns AFTER "clk";


これでインプリメントを行い、ProcessesウインドウのImplement Design -> View/Edit Routed Design (FPGA Editor) をダブルクリックしてFPGA Editor でclk 入力パッドのIOBを見てみる。
Spa3A_IDEALY_2_090303.png

入力パッドの遅延、IBUF_DELAY_VALUEが0 (IBUF_DELAYがDLY0) になっている。この時の入力の遅延をTiming Analyzerで見ると、下のようになる。
Spa3A_IDEALY_3_090303.png

右上の画面のを見ると、データのパスが1.718ns 、クロックのパスが1.844ns となっていて、クロックのパスの方が、0.126ns 遅延が多くなっている。これだとクロックがデータの真ん中だといい感じ。そしてclk のTiopiが0.730ns になっている。これを覚えておいて、今度はclk にIBUF_DLY_ADJ を挿入してインスタンシエーションしてみる。ソースは下のように変更した。IBUF_DLY_ADJはIBUFの遅延を変更できるプリミティブだ。S入力の値を変えることでダイナミックに遅延を変更することが出来る。Figure 10-10のCoarse Delay を入れるためには、DELAY_OFFSETをONにする。

`timescale 1ns / 1ps

module IOB_Delay_test(
    input clk,
    input reset,
    input testin,
    output testout
    );
    
    reg in_ff, in2_ff;
    wire ibuf_out;

    IBUF_DLY_ADJ  #(
        .DELAY_OFFSET("OFF"),      //  Enable  Initial  Delay  Offset,  "OFF"  or  "ON"
        .IOSTANDARD("DEFAULT")    //  Specify  the  input  I/O  standard
    )IBUF_DLY_ADJ_inst  (
        .O(ibuf_out),      //  Buffer  output
        .I(clk),      //  Buffer  input  (connect  directly  to  top-level  port)
        .S(3'b000)        //  3-bit  buffer  delay  select  input
    );    
    always @(posedge ibuf_out) begin
        if (reset) begin
            in_ff <= 1'b0;
            in2_ff <= 1'b0;
        end else begin
            in_ff <= testin;
            in2_ff <= in_ff;
        end
    end
    
    assign testout = in2_ff;
endmodule


これでインプリメントして、FPGA Editorで見てみると下のようになる。
Spa3A_IDEALY_4_090303.png

S入力の入力が増えて、IBUF_DELAYもDLY1になった。これでTiming Analyzer で見てみよう。
Spa3A_IDEALY_5_090303.png

クロックのパスを見ると1.844ns が2.841ns と遅延が変化した。その差は0.997nsだ。だが良く見ると、最初のインプリはBUFGが入っているが、今回はBUFGが入っていない。
とりあえず最初のTiming AnalyzerのクロックパスのTiopi = 0.730ns と次のTiming AnalyzerのクロックパスのTiopid = 1.495ns で比べてみると、0.765nsとなった。
次回ははBUFGを入れてインプリしなおしてみてみようと思う。BUFGを使うか使わないかはわからないが。。。
  1. 2009年03月04日 06:09 |
  2. FPGAチップ内の配線方法
  3. | トラックバック:0
  4. | コメント:2

コメント

わくわくしますね。

こう言う丁寧で高度なブログって、読んでいてもわくわくしますね。
久しくFPGAを触っていなかったのですが、また始めようと思います。Spartan3Aか3ANを基準に勉強かな。
続編期待しています。頑張ってくださいな。
  1. 2009/03/06(金) 13:34:23 |
  2. URL |
  3. hazezi #VE4l5UG6
  4. [ 編集 ]

こんにちは。

ほめていただいて、ありがとうございます。
ほどほどに頑張って書いていこうと思っています。
  1. 2009/03/06(金) 18:32:58 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

コメントの投稿


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

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