FC2カウンター FPGAの部屋 Virtex-6, Spartan-6
FC2ブログ

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

FPGAの部屋

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

Spartan-6のお勉強5(SelectIOリソース)

今度は、Spartan-6のSelectIOリソースについて勉強する。

1. LVDSなどで使用される差動信号の100Ω終端抵抗がFPGA内に内蔵されたそうだ。UCFの構文は、
  NET <I/O_NAME> DIFF_TERM = "<TRUE/FALSE>";
2. DDRシリーズのSDRAMにインターフェース用の終端抵抗が内蔵された。(Virtexシリーズでは以前から機能があった)
3. IOパッドの出力ドライバの出力インピーダンスも変更可能。


SelectIOロジックリソース
Spartan-6 FPGA SelectIO リソース ユーザー ガイド v1.2 (日本語版)”の”図 2-1 : I/O 入力タイル内のSelectIO ロジックリソース”を下に転載する。
SelcetIO_res_1_100409.png

Virtex-5のSelectIOと似たような感じだ。マスタIOBとスレーブIOBがあって、8:1などの大きな?シリアル・パラレル変換にはマスタIOBとスレーブIOBが連帯するのだと思う。
OLOGIC中にシリアライザ(T)と(D)があるのはどうしてなんだろうか?Tはハイインピーダンス・コントロールで、Dはデータでした。

1. IDDR2とODDR2は特に目立った変更はないようだ。
2. I/O遅延はリングオシレータとカウンタを使ったユニークな方式。1クロックサイクル未満の遅延となる。遅延タップの平均値は 80ps
3. 1つのISERDES2、OSEDES2では1:1~1:4まで、2つ使うと1:8までのSERDES(シリアルーパラレル変換)が可能。
4. 2つのISERDES2を使用して、位相検出器を構成することができるようだ。これは、差動信号のみとなる。
5. OSERDES2にはトレーニング機能があって、これをONにすると、指定のトレーニングパターンを送出するそうだ。DDR? メモリのトレーニングパターン送出時に都合がよい。


ユニークなI/O遅延についてもう少し書く。下に、”Spartan-6 FPGA SelectIO リソース ユーザー ガイド v1.2 (日本語版)”の”図 2-17 : 1つの遅延ブロックで 2つの遅延ラインを使用”の図を下に引用する。
SelcetIO_res_2_100409.png

上が立ち上がりエッジ、下が立ち下がりエッジのI/O遅延の回路だそうだ。この構成上、1クロックサイクル以上の遅延だとエッジがなくなってしまうことが考えられる。
I/0遅延のキャリブレーションもあって、I/0クロックが遅延タップ幾つ分かを自動的にチェックして、I/Oクロックの半分の遅延に自動的に設定することもできるようだ。

SelectIOリソースにも、いろいろ便利な機能が増えているようだ。
  1. 2010年04月10日 05:18 |
  2. Virtex-6, Spartan-6
  3. | トラックバック:0
  4. | コメント:0

Spartan-6のお勉強4(DCM_CLKGENのインプリメント)

今度は、DCM_CLKGENをインプリメントして確かめてみることにした。プリミティブだとインプリメントの仕方がわからないため、CORE GeneratorでDCM_CLKGENコアを生成することにした。

Core Generatorの起動の仕方は、”CORE Generatorで分散RAM(SLICEM)の同期FIFOを生成1”を参照のこと。
1. New Source WizardダイアログでClocking Wizard v1.4を選択する。
DCM_CLKGEN_0_100407.png

2. Clocking Wizardが出てくるので、最初のダイアログで、Clock Manager TypeのModeをManual Selectionに設定すると、下のPrimitiveが選択できる。DCM_CLKGENを選択する。DCM_CLKGENはジッタの低減ができるということなので、Jitter OptimizationをMinimize output jitter(low clock jitter filtering)をチェックしてみる。Input ClockのInput Freq(MHz)を50.00に設定した。
DCM_CLKGEN_1_100407.png

3. Clocking Wizardの2/6。Output Freq(MHz)を25.00に設定した。
DCM_CLKGEN_2_100407.png

4. Clocking Wizardの3/6。I/O and Feedback、デフォルトのままとする。
DCM_CLKGEN_3_100407.png

5. Clocking Wizardの4/6。DCM_CLKGEN Settings、デフォルトのままとする。
DCM_CLKGEN_4_100407.png

6. Clocking Wizardの5/6。Clk Summary、これもそのまま。
DCM_CLKGEN_5_100407.png

ここで、GenerateボタンでDCM_CLKGENを生成する。
Spartan-6のお勉強3(DCMのインプリメント)”のdcm_inst.v を下のように書き換えてDCM_CLKGENをインスタンスした。

// DCM module

`default_nettype none
`timescale 1ns / 1ps

module dcm_inst(clkin, reset, clkout, clkfx, clkdv, locked);
    input clkin;
    input reset;
    output clkout;
    output clkfx;
    output clkdv;
    output locked;
    
    wire clkin;
    wire reset;
    wire clkout;
    wire clkfx;
    wire clkdv;
    wire locked;
    
    wire clkout_node;
    
  DCM_CLKGEN_I DCM_CLKGEN_I_inst
   (// Clock in ports
    .CLK_IN1            (clkin),      // IN 
    .CLK_OUT1           (clkout_node),     // OUT
    .RESET              (reset),        // IN
    .LOCKED             (locked));      // OUT
    assign clkout = clkout_node;
    assign clkfx = clkout_node;
    assign clkdv = clkout_node;
endmodule


これで、ISE11.5でインプリメントして、FPGA Editorで見てみた。
DCM_CLKGEN_7_100408.png

DCM_SPとは違っている。フィードバック入力がないので、遅延はどうなっているのか?と思い、Timing Analyzerでクロックパスの遅延を見てみた。

  Maximum Clock Path at Slow Process Corner: clk to CharDispCtrler_inst/blue_node
    Location             Delay type         Delay(ns)  Physical Resource
                                                       Logical Resource(s)
    -------------------------------------------------  -------------------
    AB12.I               Tiopi                 0.904   clk
                                                       clk
                                                       dcm_inst_0/DCM_CLKGEN_I_inst/clkin1_buf
                                                       ProtoComp48.IMUX
    DCM_X0Y1.CLKIN       net (fanout=1)        2.930   dcm_inst_0/DCM_CLKGEN_I_inst/clkin1
    DCM_X0Y1.CLKFX       Tdmcko_CLKFX          0.350   dcm_inst_0/DCM_CLKGEN_I_inst/dcm_clkgen_inst
                                                       dcm_inst_0/DCM_CLKGEN_I_inst/dcm_clkgen_inst
    BUFGMUX_X2Y3.I0      net (fanout=1)        0.941   dcm_inst_0/DCM_CLKGEN_I_inst/clkfx
    BUFGMUX_X2Y3.O       Tgi0o                 0.209   dcm_inst_0/DCM_CLKGEN_I_inst/clkout1_buf
                                                       dcm_inst_0/DCM_CLKGEN_I_inst/clkout1_buf
    SLICE_X17Y14.CLK     net (fanout=55)       1.383   clkdv
    -------------------------------------------------  ---------------------------
    Total                                      6.717ns (1.463ns logic, 5.254ns route)
                                                       (21.8% logic, 78.2% route)


Spartan-6のお勉強3(DCMのインプリメント)”のDCM_SPと比べてみると一目瞭然だが、DCM_CLKGENは入力クロックの遅延分をキャンセルする機構がないようだ。

DCM_SP、DCM_CLKGEN、PLLの使い分けがよく分からないようだったら、Clocking Wizardに任せた方が良さそうだ。
  1. 2010年04月08日 05:55 |
  2. Virtex-6, Spartan-6
  3. | トラックバック:0
  4. | コメント:2

Spartan-6のお勉強3(DCMのインプリメント)

以前、”キャラクタ・ディスプレイ・コントローラ”を作ったが、これをそのまま、Spartan-6に載せ替えてみようと思う。ISEのバージョンはISE11.5を使用した。
このキャラクタ・ディスプレイ・コントローラ回路は、勝手にキャラクタを書きまくるので、RGBとHSYNC,VSYNCが出力されている。
下に、DCMの含まれているモジュール、dcm_inst.v を下に示す。

// DCM module

`default_nettype none
`timescale 1ns / 1ps

module dcm_inst(clkin, reset, clkout, clkfx, clkdv, locked);
    input clkin;
    input reset;
    output clkout;
    output clkfx;
    output clkdv;
    output locked;
    
    wire clkin;
    wire reset;
    wire clkout;
    wire clkfx;
    wire clkdv;
    wire locked;
    
    wire clk_ibuf;
    wire clkfb, clkfx_node;
    wire gnd, clk_node;
    wire clkdv_node, clkdv_bufg;
    
    assign gnd = 1'b0;
    
    IBUFG IBUFG_inst (
        .I(clkin),
        .O(clk_ibuf)
    );
    
    DCM DCM_INST1 (
        .CLKIN(clk_ibuf),
        .CLKFB(clkfb),
        .DSSEN(gnd),
        .PSINCDEC(gnd),
        .PSEN(gnd),
        .PSCLK(gnd),
        .RST(gnd), // リセットごとにDCMのロックが外れないようにgndにしておく
        .CLK0(clk_node),
        .CLK90(),
        .CLK180(),
        .CLK270(),
        .CLK2X(),
        .CLK2X180(),
        .CLKDV(clkdv_node),
        .CLKFX(clkfx_node),
        .CLKFX180(),
        .LOCKED(locked),
        .PSDONE(),
        .STATUS()
    );
    defparam DCM_INST1.CLKIN_PERIOD = 20.0;
    defparam DCM_INST1.DLL_FREQUENCY_MODE = "LOW";
    defparam DCM_INST1.DUTY_CYCLE_CORRECTION = "TRUE";
    defparam DCM_INST1.CLKDV_DIVIDE = 2.0;
    defparam DCM_INST1.PHASE_SHIFT = 0;
    defparam DCM_INST1.CLKOUT_PHASE_SHIFT = "NONE";
    defparam DCM_INST1.STARTUP_WAIT = "FALSE";
    defparam DCM_INST1.FACTORY_JF = 16'hFFFF;
    
    BUFG BUFG_inst(
        .I(clk_node),
        .O(clkfb)
    );
    
    BUFG BUFG_clkfx(
        .I(clkfx_node),
        .O(clkfx)
    );
    
    BUFG BUFG_clkdv(
        .I(clkdv_node),
        .O(clkdv_bufg)
    );
    assign clkout = clkdv_bufg;
    assign clkdv = clkdv_bufg;
endmodule
    


制約(UCF)ファイルは、入出力ピンの制約は外した。ピリオド制約とクロックの遅延値を見るために、1ピンだけセットアップ時間の制約を入れていある。

NET "clk" TNM_NET = "clk";
TIMESPEC "TS_clk" = PERIOD "clk" 20 ns HIGH 50 %;
NET "VGA_BLUE" OFFSET = OUT 20 ns AFTER "clk";


これで、xc6slx45t-3fgg484(Spartan-6の型番) でインプリメントしてみた。インプリメントできたものをFPGA Editorで見てみると、BUFIO2が使用されている。
BUFIO2_1_100406.png
 図1 キャラクタ・ディスプレイ・コントローラのBUFIO2

左のペインの赤い四角がBUFIO2だ。これを拡大してみた。
BUFIO2_2_100406.png
 図2 BUFIO2の拡大図

図2でDVICLKからBUFGにつながっているのがわかる。次にDCMの図を下に示す。
BUFIO2_4_100407.png
 図3 Spartan-6のDCM

DSS_MODEが出来ている。

図1を見返してみると、BUFIO2の下にBUFIO2FBというバッファがある。BUFIO2FBの入力には、bufg_inst_0/clkfbが接続されている。これは、今までのSpartan-3Aとかでは見ない形だ。どんな意味があるのか、早速、ユーザーズガイドを探してみると、”Spartan-6 FPGAクロック リソース ユーザーズガイド UG382 (v1.3) 2010年2月22日”の49ページの”図 1-33 : クロック配線遅延と一致する BUFIO2FBバッファ”に図があった。それを下に引用する。
BUFIO2_3_100406.png

ユーザーズガイドによると、”図 1-33 に示すようにBUFIO2FBバッファを使用し、CMT(PLLまたはDCM) リファレンス出力CLKIN とフィードバック CLKFB の間のクロック配線遅延を一致させることができます。”だそうだ。
今までは、DCMのフィードバックと言っても、クロック入力と遅延値が合わない、なんちゃってフィードバックだったが、今度は完璧なフィードバックになったようだ。DCMまでの遅延を0にできるはず。これは嬉しい。。。
CLKDVをFPGA内部クロックとした時のクロックパスの遅延値を下に示す。DCMの分周クロック出力を使用しているので、クロックフィードバックループの外にある。図1-33で言うと、CLKOUTからBUFGを通してクロック配線に行っている。

  Maximum Clock Path at Slow Process Corner: clk to CharDispCtrler_inst/blue_node
    Location             Delay type         Delay(ns)  Physical Resource
                                                       Logical Resource(s)
    -------------------------------------------------  -------------------
    N4.I                 Tiopi                 0.904   clk
                                                       clk
                                                       dcm_inst_0/IBUFG_inst
                                                       ProtoComp52.IMUX
    BUFIO2_X1Y15.I       net (fanout=1)        2.177   dcm_inst_0/clk_ibuf
    BUFIO2_X1Y15.DIVCLK  Tbufcko_DIVCLK        0.170   SP6_BUFIO_INSERT_ML_BUFIO2_0
                                                       SP6_BUFIO_INSERT_ML_BUFIO2_0
    DCM_X0Y1.CLKIN       net (fanout=1)        0.843   dcm_inst_0/DCM_INST1_ML_NEW_DIVCLK
    DCM_X0Y1.CLKDV       Tdmcko_CLKDV         -5.680   dcm_inst_0/DCM_INST1
                                                       dcm_inst_0/DCM_INST1
    BUFGMUX_X2Y3.I0      net (fanout=1)        0.941   dcm_inst_0/clkdv_node
    BUFGMUX_X2Y3.O       Tgi0o                 0.209   dcm_inst_0/BUFG_clkdv
                                                       dcm_inst_0/BUFG_clkdv
    SLICE_X18Y12.CLK     net (fanout=54)       1.382   clkdv
    -------------------------------------------------  ---------------------------
    Total                                      0.946ns (-4.397ns logic, 5.343ns route)
    


FPGA内部ロジック使用クロックのクロック入力パッドからの遅延は0.946nsecになった。BUFIO2_X1Y15.Iのネットの遅延が大きいが、これはFPGA Editorで見ると配線がぐるぐる廻っている。これでいいのか?

次にdcm_inst.v のコードを下のように変更して、FPGA内部クロックをCLKDVからCLKFBに変更する。これはクロックフィードバックループ内のクロックを使用することになる。

// assign clkdv = clkdv_bufg;
assign clkdv = clkfb;


クロックパスの解析結果を下に示す。

  Maximum Clock Path at Slow Process Corner: clk to CharDispCtrler_inst/blue_node
    Location             Delay type         Delay(ns)  Physical Resource
                                                       Logical Resource(s)
    -------------------------------------------------  -------------------
    N4.I                 Tiopi                 0.904   clk
                                                       clk
                                                       dcm_inst_0/IBUFG_inst
                                                       ProtoComp48.IMUX
    BUFIO2_X1Y15.I       net (fanout=1)        2.177   dcm_inst_0/clk_ibuf
    BUFIO2_X1Y15.DIVCLK  Tbufcko_DIVCLK        0.170   SP6_BUFIO_INSERT_ML_BUFIO2_0
                                                       SP6_BUFIO_INSERT_ML_BUFIO2_0
    DCM_X0Y1.CLKIN       net (fanout=1)        0.843   dcm_inst_0/DCM_INST1_ML_NEW_DIVCLK
    DCM_X0Y1.CLK0        Tdmcko_CLK           -5.694   dcm_inst_0/DCM_INST1
                                                       dcm_inst_0/DCM_INST1
    BUFGMUX_X2Y3.I0      net (fanout=1)        0.941   dcm_inst_0/clk_node
    BUFGMUX_X2Y3.O       Tgi0o                 0.209   dcm_inst_0/BUFG_inst
                                                       dcm_inst_0/BUFG_inst
    SLICE_X17Y14.CLK     net (fanout=56)       1.383   clkdv
    -------------------------------------------------  ---------------------------
    Total                                      0.933ns (-4.411ns logic, 5.344ns route)
    


以前と同様な結果になった。

DCMのCLKINとCLKFBの間の配線遅延を一致させるというのは、良い試みだと思う。今までは保証がなかった。DCMから遠いBUFGを使ってしまうと、DCMが遅延を合わせきれない恐れもあった。
次はDCM_CLKGENをインプリメントしてみようと思う。
  1. 2010年04月07日 05:18 |
  2. Virtex-6, Spartan-6
  3. | トラックバック:0
  4. | コメント:0

Spartan-6のお勉強2(クロック・マネージメント・テクノロジ)

まずはDCMだが、DCM_SPとDCM_CLKGENがある。
DCM_SPは以前のSpartan-3AのDCM_SPとほとんど変わらないようだ。
DCM_CLKGENがSpartan-6で追加された新しいDCMのようだ。”Spartan-6 FPGAクロック リソース ユーザーズガイド UG382 (v1.3) 2010年2月22日”の63ページのリストを転載する。

• CLKFX および CLKFX180で低出力ジッタ
• CLKIN でのジッタ許容を改善
• M および D 値をダイナミック プログラミング。
CLKFX_MULTIPLY および CLKFX_DIVIDE 属性を上書き し ます。
• 固定 CLKFX_MULTIPLY および CLKFX_DIVIDE 属性よ り 幅広い範囲から M および D 値を指定
• CLKFXDV で CLKFX 出力を追加逓倍
• 入力クロック 損失の場合のフリーランニング オシレータ
• スペクトラム拡散クロック生成


うたい文句通りに受けとれば、今までのDCMの欠点を克服している。
下に、”Spartan-6 FPGAクロック リソース ユーザーズガイド UG382 (v1.3) 2010年2月22日”の57ページのDCMの図を下に示す。
CMT_1_100405.png

PLLは、広範囲の周波数合成とDCMと併用した外部または内部のジッタフィルタに使われるそうだ。PLLはジッタを低減できるので、PCI Expressのカードエッジコネクタからの入力クロックのジッタを低減するので、使用できると思われる。その他、Virtex-5のPLLとどう違うかはよく分からない。

ジッタ低減DCMとPLLはどう使い分けるのかが、まだ良くわからない。

(2010/04/06:追加)
DCM_CLKGENには、CLKFB入力がなかった。これだと、クロック入力パッドからDCMまでの遅延はキャンセルすることが出来ないのだろうか?いろいろ興味がわいていきたので、試しにインプリメントしてみることにする。
  1. 2010年04月05日 20:43 |
  2. Virtex-6, Spartan-6
  3. | トラックバック:0
  4. | コメント:0

Spartan-6のお勉強(クロックリソース編1)

さて、Spartan-6 FPGA SP605 評価キットをいじってみたいと思っているが、最初にSpartan-6の内部構造がどうなっているのかを勉強しようと思う。
最初に、クロックリソースから概略を把握しよう。

1. 超高速のロースキューI/Oリージョナル クロック リソースが40個ある。
2. BUFGMUXで駆動されるグローバル・クロックネットワークとI/Oクロック・バッファ(BUFIO2)、PLLクロックバッファ(BUFPLL)で駆動されるI/Oクロック・ネットワークがある。
3. BUFPLL及びBUFIO2は、ISEDESとOSERDESを駆動する。
4. BUFIO2はDDRバスのILOGIC及びOLOGICを駆動することができる。グローバル・クロック、DCMのGTPクロック、PLLクロック入力へ配線することができる。


BUFIO2から、ISERDES2を駆動して、更にBUFGを駆動してFPGAのロジックにクロックを供給することができるらしい。そのSDR(Single Data Rate)の例が、”Spartan-6 FPGAクロック リソース ユーザーズガイド UG382 (v1.3) 2010年2月22日”の25ページに載っている。下に図1-9を引用する。
Clock_Resource_100403.png

BUFIO2のDVICLK出力を通してBUFGに接続してFPGAロジックにクロックを供給している。Spartan-6のクロックバッファの目玉はどうやらこのBUFIO2みたいだ。クロックダブラで入力クロックを2倍にすることができてDDRのデータに対応することができて、更に、分周ができるので、SERDESのタイミングを取るのが容易になる。失敗したけれどもSUZAKU-VのDDR2 SDRAMコントローラを作るときに一番苦労したのが、SERDESクロックとメインのクロック間の同期をとるところだ。その部分の実装が簡単になりそうだ。
Spartan-6 FPGAクロック リソース ユーザーズガイド UG382 (v1.3) 2010年2月22日”の39ページから、BUFIO2の属性の表を引用する。
Clock_Resource_2_100403.png

上の表で例えば、DDRの信号で8ビットのシリパラ変換する場合は、USE_DOUBLER=TRUE, DIVIE=8に設定するのだと思う。
SDRでISEDESを使うときには、27ページの”図 1-11 : 例 1: ISERDES2 (DATA_RATE = SDR) を駆動する BUFIO2 ”を参照のこと。
DDRでISERDESを駆動する場合には、反転クロック用のBUFIO2がもう1つ必要になる。その図は、28ページの”図 1-12 : 例 2: ISERDES2 (DATA_RATE = DDR) を駆動する BUFIO2 ”を参照のこと。

BUFIO2はPLLと組み合わせても使えるし、GTP使うときにも使えるようだ。なかなか便利そうだ。
  1. 2010年04月03日 17:53 |
  2. Virtex-6, Spartan-6
  3. | トラックバック:0
  4. | コメント:2

Spartan-6のMemory Controller Block(MCB) を試してみた

Alteraの方もやりたいが、Spartan-6のMemory Controller Block(MCB) のユーザーズガイド、Spartan-6 FPGA Memory Controller User Guideを見つけたので、やってみたくなった。
15ページからのGetting Started で、CORE Generator (CORE Gen) からMIGを使用してMCBを使うやり方が書いてあったのでやってみることにした。
Memory Controller Block(MCB) のユーザーズガイドに沿ってやってみた。
下の図はMCB_testというCORE Genのプロジェクトを作ったところ。
MCB_test_1_090711.png

ユーザーズガイドではMIG3.0だが、ISE11.2のCORE GenではMIG3.1になっている。これを開いてMCBのIPを生成して行こう。DDR2-800 のMCBを生成する。選択したSparatan-6はxc6slx16-2cs324で、ユーザーズガイドの通りとした。このxc6slx16-2cs324には、MCBが2つ入っていて、そのうちのBANK3のMCBを選択して、DDR2 SDRAMの設定をした。
MCB_test_2_090711.png

ユーザーズガイドの24ページはCustom Part を作れとあるが、最初やってみたら、DDR2 SDRAMのモデルが生成されなかったので、ここはディフォルトのマイクロンのDDR2 SDRAMを使うことにしてMCBを生成してみることにする。
MCB_test_3_090711.png

ユーザーズガイドの通りにステップを進めていき、Port Configuration for MEMC 3 はこんな感じ。
MCB_test_4_090711.png

Summary Pageは下。
MCB_test_5_090711.png

mig_31のIPが生成できました。
MCB_test_6_090711.png

プロジェクト名 (MCB_test) \mig_31の下に、example_design と user_design フォルダが生成されている。そのうちのexample_design\parを開いて、create_ise.batをダブルクリックする。
MCB_test_7_090711.png

ISEのプロジェクト (test.xise, test_ise) が生成される。
MCB_test_8_090711.png

このプロジェクトをISE11.2のProject Navigator から読みこんでインプリメントしてみた。タイミング制約を見たしてインプリメントすることができた。
MCB_test_9_090711.png

DDR2 SDRAMのDQが4ビットでDDR2-800なのだから、コントローラのRead/Writeポート幅が32ビットだとすると、動作周波数は100MHzとなるはず。
次にFPGA Editorで内部構造を見てみた。
MCB_test_10_090711.png

FPGA全体に配線が回っている。赤くハイライトしたのがMCB、右側のMCBは使用されていない。
  1. 2009年07月11日 06:23 |
  2. Virtex-6, Spartan-6
  3. | トラックバック:0
  4. | コメント:0

Virtex-6とSpartan-6のスライス構造とパスの比較

どうもRubyプログラムに手間取っていてキャラクタ・ジェネレータのデータを移行出来ないでいるので、Virtex-6とSpartan-6のスライス構造とパスの比較をしてみたいと思う。

まずはVirtex-6から、使用する回路は以前の”ISE11.2iでのSpartan-3とSpartan-6の速度差”で使用したキャラクタ・ディスプレイ・コントローラ。
まずは、Virtex-6 (xc6vlx75-1ff484) でインプリメントした結果をFPGA Editorで見る。
V6_S6_1_090705.png

全体図はこんな感じ。SLICEを見てみよう。最初にSLICEMから、SLICEMは分散RAMにもなるSLICEだ。
V6_S6_2_090705.png

FFの数が多い。Virtex-5の倍の数が入っている。以前のVirtex-5のSLICEの図は”Virtex5, Virtex4, Spartan3Eのインプリメント結果2(分散RAM)”を参照のこと。
次はSLICEL。SLICELは分散RAMの機能がないSLICE。
V6_S6_3_090705.png

SLICEMに比べてLUTが簡素化されている。
次にクリティカルパスを下に示す。

================================================================================
Timing constraint: TS_clk = PERIOD TIMEGRP "clk" 3 ns HIGH 50%;
 2859 paths analyzed, 605 endpoints analyzed, 23 failing endpoints
 23 timing errors detected. (23 setup errors, 0 hold errors, 0 component switching limit errors)
 Minimum period is   3.754ns.
--------------------------------------------------------------------------------
Slack:                  -0.754ns (requirement - (data path - clock path skew + uncertainty))
  Source:               CharDispCtrler_inst/frame_buffer_inst/FRAME_BUFFER_GEN[4].FRAME_BUFFER (RAM)
  Destination:          CharDispCtrler_inst/red_node (FF)
  Requirement:          3.000ns
  Data Path Delay:      3.589ns (Levels of Logic = 1)
  Clock Path Skew:      -0.130ns (1.393 - 1.523)
  Source Clock:         clk_BUFGP rising at 0.000ns
  Destination Clock:    clk_BUFGP rising at 3.000ns
  Clock Uncertainty:    0.035ns

  Clock Uncertainty:          0.035ns  ((TSJ^2 + TIJ^2)^1/2 + DJ) / 2 + PE
    Total System Jitter (TSJ):  0.070ns
    Total Input Jitter (TIJ):   0.000ns
    Discrete Jitter (DJ):       0.000ns
    Phase Error (PE):           0.000ns

  Maximum Data Path at Slow Process Corner: CharDispCtrler_inst/frame_buffer_inst/FRAME_BUFFER_GEN[4].FRAME_BUFFER to CharDispCtrler_inst/red_node
    Location             Delay type         Delay(ns)  Physical Resource
                                                       Logical Resource(s)
    -------------------------------------------------  -------------------
    RAMB18_X0Y16.DO17    Trcko_DOB             2.073   CharDispCtrler_inst/frame_buffer_inst/FRAME_BUFFER_GEN[4].FRAME_BUFFER
                                                       CharDispCtrler_inst/frame_buffer_inst/FRAME_BUFFER_GEN[4].FRAME_BUFFER
    SLICE_X2Y36.A6       net (fanout=2)        0.691   CharDispCtrler_inst/display_dout<9>
    SLICE_X2Y36.A        Tilo                  0.075   CharDispCtrler_inst/n0084
                                                       CharDispCtrler_inst/Mmux_n008411
    OLOGIC_X0Y36.D1      net (fanout=1)        0.240   CharDispCtrler_inst/n0084
    OLOGIC_X0Y36.CLK     Todck                 0.510   CharDispCtrler_inst/red_node
                                                       CharDispCtrler_inst/red_node
    -------------------------------------------------  ---------------------------
    Total                                      3.589ns (2.658ns logic, 0.931ns route)
                                                       (74.1% logic, 25.9% route)


3.589nsとさすがに速い。

次に同じキャラクタ・ディスプレイ・コントローラをSprtan-6 (xc6slx9-2csg225) でインプリメントして、同様にFPGA Editorで見ると。
V6_S6_4_090705.png

チップが小さいのだが、Virtex-6よりもロジックが分散しているような気がする。
SlICEMを見てみる。この回路はSLICEMは使用されていないので未使用のもの。
V6_S6_5_090705.png

Virtex-6と同じよう。
次にSLICEL。これは使用されているもの。
V6_S6_6_090705.png

これもまたVirtex-6と同じような気がする。
次にSpartan-6で新しく搭載されたSLICEX。これはSLICELからキャリーチェーンが除かれている。
V6_S6_7_090705.png

次にクリティカルパスを下に示す。

================================================================================
Timing constraint: TS_clk = PERIOD TIMEGRP "clk" 3 ns HIGH 50%;
 2859 paths analyzed, 605 endpoints analyzed, 23 failing endpoints
 23 timing errors detected. (23 setup errors, 0 hold errors, 0 component switching limit errors)
Timing constraint: TS_clk = PERIOD TIMEGRP "clk" 5 ns HIGH 50%;
 2858 paths analyzed, 708 endpoints analyzed, 43 failing endpoints
 43 timing errors detected. (43 setup errors, 0 hold errors, 0 component switching limit errors)
 Minimum period is   5.638ns.
--------------------------------------------------------------------------------
Slack:                  -0.638ns (requirement - (data path - clock path skew + uncertainty))
  Source:               CharDispCtrler_inst/disp_timing_inst/v_point_1 (FF)
  Destination:          CharDispCtrler_inst/disp_timing_inst/v_point_9 (FF)
  Requirement:          5.000ns
  Data Path Delay:      5.631ns (Levels of Logic = 5)
  Clock Path Skew:      -0.007ns (0.099 - 0.106)
  Source Clock:         clk_BUFGP rising at 0.000ns
  Destination Clock:    clk_BUFGP rising at 5.000ns
  Clock Uncertainty:    0.000ns

  Maximum Data Path: CharDispCtrler_inst/disp_timing_inst/v_point_1 to CharDispCtrler_inst/disp_timing_inst/v_point_9
    Location             Delay type         Delay(ns)  Physical Resource
                                                       Logical Resource(s)
    -------------------------------------------------  -------------------
    SLICE_X8Y12.BQ       Tcko                  0.628   CharDispCtrler_inst/disp_timing_inst/v_point<3>
                                                       CharDispCtrler_inst/disp_timing_inst/v_point_1
    SLICE_X9Y13.C3       net (fanout=9)        0.780   CharDispCtrler_inst/disp_timing_inst/v_point<1>
    SLICE_X9Y13.CMUX     Tilo                  0.580   CharDispCtrler_inst/disp_timing_inst/n0065_inv
                                                       CharDispCtrler_inst/disp_timing_inst/n0065<10>_SW1
    SLICE_X9Y13.A4       net (fanout=5)        0.969   N16
    SLICE_X9Y13.A        Tilo                  0.487   CharDispCtrler_inst/disp_timing_inst/n0065_inv
                                                       CharDispCtrler_inst/disp_timing_inst/Mcount_v_point_lut<0>
    SLICE_X8Y12.A4       net (fanout=1)        0.651   CharDispCtrler_inst/disp_timing_inst/Mcount_v_point_lut<0>
    SLICE_X8Y12.COUT     Topcya                0.832   CharDispCtrler_inst/disp_timing_inst/v_point<3>
                                                       CharDispCtrler_inst/disp_timing_inst/Mcount_v_point_lut<0>_rt
                                                       CharDispCtrler_inst/disp_timing_inst/Mcount_v_point_cy<3>
    SLICE_X8Y13.CIN      net (fanout=1)        0.024   CharDispCtrler_inst/disp_timing_inst/Mcount_v_point_cy<3>
    SLICE_X8Y13.COUT     Tbyp                  0.098   CharDispCtrler_inst/disp_timing_inst/v_point<7>
                                                       CharDispCtrler_inst/disp_timing_inst/Mcount_v_point_cy<7>
    SLICE_X8Y14.CIN      net (fanout=1)        0.024   CharDispCtrler_inst/disp_timing_inst/Mcount_v_point_cy<7>
    SLICE_X8Y14.CLK      Tcinck                0.558   CharDispCtrler_inst/disp_timing_inst/v_point<10>
                                                       CharDispCtrler_inst/disp_timing_inst/Mcount_v_point_xor<10>
                                                       CharDispCtrler_inst/disp_timing_inst/v_point_9
    -------------------------------------------------  ---------------------------
    Total                                      5.631ns (3.183ns logic, 2.448ns route)
                                                       (56.5% logic, 43.5% route)


上のパスと同様のパスをVirtex-6のパスから検索したので下に示す。

--------------------------------------------------------------------------------
Slack (setup path):     0.246ns (requirement - (data path - clock path skew + uncertainty))
  Source:               CharDispCtrler_inst/disp_timing_inst/v_point_1 (FF)
  Destination:          CharDispCtrler_inst/disp_timing_inst/v_point_9 (FF)
  Requirement:          3.000ns
  Data Path Delay:      2.704ns (Levels of Logic = 5)
  Clock Path Skew:      -0.015ns (0.100 - 0.115)
  Source Clock:         clk_BUFGP rising at 0.000ns
  Destination Clock:    clk_BUFGP rising at 3.000ns
  Clock Uncertainty:    0.035ns

  Clock Uncertainty:          0.035ns  ((TSJ^2 + TIJ^2)^1/2 + DJ) / 2 + PE
    Total System Jitter (TSJ):  0.070ns
    Total Input Jitter (TIJ):   0.000ns
    Discrete Jitter (DJ):       0.000ns
    Phase Error (PE):           0.000ns

  Maximum Data Path at Slow Process Corner: CharDispCtrler_inst/disp_timing_inst/v_point_1 to CharDispCtrler_inst/disp_timing_inst/v_point_9
    Location             Delay type         Delay(ns)  Physical Resource
                                                       Logical Resource(s)
    -------------------------------------------------  -------------------
    SLICE_X12Y36.BQ      Tcko                  0.381   CharDispCtrler_inst/disp_timing_inst/v_point<3>
                                                       CharDispCtrler_inst/disp_timing_inst/v_point_1
    SLICE_X13Y37.D5      net (fanout=8)        0.331   CharDispCtrler_inst/disp_timing_inst/v_point<1>
    SLICE_X13Y37.D       Tilo                  0.075   N16
                                                       CharDispCtrler_inst/disp_timing_inst/n0065<10>_SW1
    SLICE_X13Y37.C2      net (fanout=1)        0.501   N16
    SLICE_X13Y37.C       Tilo                  0.075   N16
                                                       CharDispCtrler_inst/disp_timing_inst/Mcount_v_point_lut<0>
    SLICE_X12Y36.A2      net (fanout=1)        0.753   CharDispCtrler_inst/disp_timing_inst/Mcount_v_point_lut<0>
    SLICE_X12Y36.COUT    Topcya                0.417   CharDispCtrler_inst/disp_timing_inst/v_point<3>
                                                       CharDispCtrler_inst/disp_timing_inst/Mcount_v_point_lut<0>_rt
                                                       CharDispCtrler_inst/disp_timing_inst/Mcount_v_point_cy<3>
    SLICE_X12Y37.CIN     net (fanout=1)        0.000   CharDispCtrler_inst/disp_timing_inst/Mcount_v_point_cy<3>
    SLICE_X12Y37.COUT    Tbyp                  0.078   CharDispCtrler_inst/disp_timing_inst/v_point<7>
                                                       CharDispCtrler_inst/disp_timing_inst/Mcount_v_point_cy<7>
    SLICE_X12Y38.CIN     net (fanout=1)        0.000   CharDispCtrler_inst/disp_timing_inst/Mcount_v_point_cy<7>
    SLICE_X12Y38.CLK     Tcinck                0.093   CharDispCtrler_inst/disp_timing_inst/v_point<10>
                                                       CharDispCtrler_inst/disp_timing_inst/Mcount_v_point_xor<10>
                                                       CharDispCtrler_inst/disp_timing_inst/v_point_9
    -------------------------------------------------  ---------------------------
    Total                                      2.704ns (1.119ns logic, 1.585ns route)
                                                       (41.4% logic, 58.6% route)


全体的にスピードが全く違う。
例えば最初のCharDispCtrler_inst/disp_timing_inst/v_point<3>のTckoもVirtex-6の0.381nsに対して、Spartan-6は0.628nsと倍近い。やはり半導体プロセスが違うのか?そうなると消費電力には大きな差が出てくるのかもしれない???

最後に、上の書いたのはVirtex-6 (xc6vlx75-1ff484)ですが、これをVirtex-6 (xc6vlx75-3ff484) スピードグレード3でインプリメントしてみると、クリティカルパスは2.959ns、最大動作周波数は338MHzとなりました。
  1. 2009年07月05日 06:15 |
  2. Virtex-6, Spartan-6
  3. | トラックバック:0
  4. | コメント:2