グローバルバッファのインスタンシエート

[] [] []


FPGAには、クロックをチップ全体のFFへ低スキューで分配できるように専用配線が備わっている。クロックラインはこの専用配線を使うように、論理合成でグローバルバッファが自動的に挿入される。クロック以外でも、Quartusではリセットラインに、ISE,VivadoではFanout3000以上の信号に、グローバルバッファが自動挿入されるようである。

しかし、次の場合は、RTL記述で明示的にグローバルバッファをインスタンシエートする必要がある

1) リセットをグローバルバッファで駆動したいとき

こうすると通常の配線を使わなくて済むので配置配線が楽になる。

// Xilinxの場合

BUFG bufg_clk(.O(rst_out),I(rst_in));

// Alteraの場合

altclkctrl altclkctrl_rst(.clkselect(2'd0),.ena(1'b1),.inclk({3'd0,rst_in}),.outclk(rst_out)

BUFGに似た名前でIBUFGというバッファがあるが、これはグローバルバッファではなく、クロック用の入力バッファである。

Quartusでは、RTL記述に明示的に書かなくても、オプション Auto Global Register Control Signals: Onを設定しておけばリセットにも自動的にグローバルバッファが挿入されるようである。

2 リージョナルクロック(チップの部分領域のみに分配可)があり、これを使わせたいとき

チップ全体でなく、ある入力インターフェイス部分でだけ使うクロックにはこれを使うと、グローバルバッファを他の信号に回すことができるし、低スキューになる。

// Xilinxの場合

BUFR bufr_clk(.O(clk_out),I(clk_in));

// Alteraの場合

altclkctrl altclkctrl_rst #(.clock_type("LCLK"))

(.clkselect(2'd0),.ena(1'b1),.inclk({3'd0,clk_in}),.outclk(clk_out));

3) クロックを選択したいとき

// Xilinxの場合

BUFGMUX bufgmux_clk(.O(clk_out),.I0(clk_in0),.I1(clk_in1),.S(sel));         // 切り替え時にグリッチが出ない

BUFGCTRL bufgmux_clk(.O(clk_out),.CE0(1'b1),CE1(1'b1),.I0(clk_in0),.I1(clk_in1)

  ,.IGNORE0(1'b1),.IGNORE1(1'b1),.S0(~sel),.S1(sel);       // グリッチは出るが、クロックが止まってても切り替え可

// Alteraの場合

altclkctrl altclkctrl_clkmux #(.use_glitch_free_switch_over_implementation("OFF"))

(.clkselect({1'b0,sel}),.ena(1'b1),.inclk({2'd0,clk_in1,clk_in0}),.outclk(clk_out));

もともとグローバルバッファにはいろいろな機能がついているので、これのMUX機能を使うこともできる。ただし、切り替え時にグリッチがでないように指定するとクロック同期で切り替えるので、切り替え元のクロックが止まっているときは切り替えできなくなることに注意。


[] [] []