グローバルバッファのインスタンシエート
FPGAには、クロックをチップ全体のFFへ低スキューで分配できるように専用配線が備わっている。クロックラインはこの専用配線を使うように、論理合成でグローバルバッファが自動的に挿入される。ただし、次の場合は、RTL記述で明示的にグローバルバッファをインスタンシエートする必要がある。
例1) リセットをグローバルバッファで駆動したいとき
こうすると通常の配線を使わなくて済むので配置配線が楽になる。
// Xilinxの場合 BUFG bufg_rst(.O(rst_out),I(rst_in)); (注)似た名前でIBUFGというバッファがあるが、 これはグローバルバッファではなく、クロック専用ピンの入力バッファである。 |
もっともVivadoではFanoutが大きい信号にはグローバルバッファが自動挿入されるし、Quartusではオプション Auto Global Register Control Signals: Onを設定しておけばリセットにもグローバルバッファが挿入されるようである。
例2) クロックを選択したいとき
もともとグローバルバッファにはいろいろな機能がついていて、MUX機能もある。ただし、切り替え時にグリッチがでないように指定するとクロック同期で切り替えるので、切り替え元のクロックが止まっているときは切り替えできなくなることに注意。
// 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); |