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”を引用する。

上の図で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を見てみる。

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

右上の画面のを見ると、データのパスが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で見てみると下のようになる。

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

クロックのパスを見ると1.844ns が2.841ns と遅延が変化した。その差は0.997nsだ。だが良く見ると、最初のインプリはBUFGが入っているが、今回はBUFGが入っていない。
とりあえず最初のTiming AnalyzerのクロックパスのTiopi = 0.730ns と次のTiming AnalyzerのクロックパスのTiopid = 1.495ns で比べてみると、0.765nsとなった。
次回ははBUFGを入れてインプリしなおしてみてみようと思う。BUFGを使うか使わないかはわからないが。。。
- 2009年03月04日 06:09 |
- FPGAチップ内の配線方法
-
| トラックバック:0
-
| コメント:2
わくわくしますね。
こう言う丁寧で高度なブログって、読んでいてもわくわくしますね。
久しくFPGAを触っていなかったのですが、また始めようと思います。Spartan3Aか3ANを基準に勉強かな。
続編期待しています。頑張ってくださいな。
- 2009/03/06(金) 13:34:23 |
- URL |
- hazezi #VE4l5UG6
- [ 編集 ]