インテルのみ表示可能 — GUID: mwh1409959605598
Ixiasoft
インテルのみ表示可能 — GUID: mwh1409959605598
Ixiasoft
1.6.2. クロックの多重化
ロジックの多重化を使用する代わりに、専用のハードウェアを使用して、可能な場合にクロックの多重化を実行します。例えば、特定のインテルFPGAデバイスで利用可能なクロックのスイッチオーバー機能またはクロック・コントロール・ブロックを使用することができます。これらの専用ハードウェア・ブロックでは、グリッチを回避し、グローバルな低スキュー配線ラインを使用することを保証します。また、クロックラインのロジック遅延によるデバイスのホールド時間の問題を避けることができます。インテルFPGAデバイスは、PLLのダイナミック・リコンフィグレーションもサポートします。これは、デバイスの動作時にクロックレートを変更する最も安全で堅牢な方法です。
デザインのクロックが多すぎてクロック・コントロール・ブロックを使用できない場合、またはダイナミック・リコンフィグレーションがデザインにおいて複雑すぎる場合は、クロック・マルチプレクサーをロジックセルに実装することができます。ただし、この実装を使用する場合は、入力の同時トグルを検討し、グリッチのない遷移を確保します。
各デバイスのデータシートには、LUTの機能とは別に、入力信号の同時トグル時にLUT出力がどのようにグリッチするかが記載されています。4:1のMUX機能はデータ入力の同時トグル時に検出可能なグリッチを生成しませんが、多重化ロジックのセル実装には大きなグリッチが発生するものもあります。よって、このクロック・マルチプレクサー構造は推奨されません。この実装の別の問題は、clk_select 信号が変化している際に出力が不規則に動作することです。この動作により、システムクロックから供給されているすべてのレジスターでタイミング違反が発生し、メタスタビリティーが発生する可能性があります。
より洗練されたクロック選択構造により、同時トグルと切り替えの問題を解消することができます。
この構造は、任意の数のクロックチャネルに一般化することができます。このデザインでは、他のすべてのクロックが少なくとも数サイクル非アクティブになるまでどのクロックもアクティブにならず、クロックがLowの際にアクティブ化が発生することが保証されます。このデザインでは、synthesis_keep ディレクティブを右側のANDゲートに適用します。これにより、clk_out ORゲートの入力に同時トグルがないことを保証します。
Verilog HDLにおけるクロック多重化デザインでのグリッチ回避
この例は、Verilog-2001で機能します。
module clock_mux (clk,clk_select,clk_out); parameter num_clocks = 4; input [num_clocks-1:0] clk; input [num_clocks-1:0] clk_select; // one hot output clk_out; genvar i; reg [num_clocks-1:0] ena_r0; reg [num_clocks-1:0] ena_r1; reg [num_clocks-1:0] ena_r2; wire [num_clocks-1:0] qualified_sel; // A look-up-table (LUT) can glitch when multiple inputs // change simultaneously. Use the keep attribute to // insert a hard logic cell buffer and prevent // the unrelated clocks from appearing on the same LUT. wire [num_clocks-1:0] gated_clks /* synthesis keep */; initial begin ena_r0 = 0; ena_r1 = 0; ena_r2 = 0; end generate for (i=0; i<num_clocks; i=i+1) begin : lp0 wire [num_clocks-1:0] tmp_mask; assign tmp_mask = {num_clocks{1'b1}} ^ (1 << i); assign qualified_sel[i] = clk_select[i] & (~|(ena_r2 & tmp_mask)); always @(posedge clk[i]) begin ena_r0[i] <= qualified_sel[i]; ena_r1[i] <= ena_r0[i]; end always @(negedge clk[i]) begin ena_r2[i] <= ena_r1[i]; end assign gated_clks[i] = clk[i] & ena_r2[i]; end endgenerate // These will not exhibit simultaneous toggle by construction assign clk_out = |gated_clks; endmodule