インテル® Quartus® Prime プロ・エディションのユーザーガイド: デザインの推奨事項

ID 683082
日付 8/03/2023
Public
ドキュメント目次

1.5.2. レジスターの二次コントロール信号 (クリアおよびクロックイネーブルなど)

インテルFPGAのレジスターは、多くの二次コントロール信号を提供します。これらの信号を使用することで、余分な論理セルを使用することなく各レジスターのコントロール・ロジックを実装します。 インテルFPGAデバイスファミリーにおける二次信号のサポートは異なるため、該当するデバイスファミリーのデータシートを参照し、ターゲットデバイスで利用可能な信号を確認してください。

デバイスで信号を最も効率的に使用するには、HDLコードがデバイス・アーキテクチャーに可能な限り一致するようにします。アーキテクチャーの性質上、コントロール信号には特定の優先順位があります。HDLコードは可能な限りその優先順位に従っている必要があります。

合成ツールでは、通常のロジックを使用してあらゆるコントロール信号をエミュレーションすることができます。よって、機能的に正しい結果を得ることは常に可能です。ただし、デザイン要件においてコントロール信号の使用と優先順位を柔軟に制御できる場合は、デザインをターゲットデバイスのアーキテクチャーに合わせることで、最も効率的な結果を達成します。デザインにおける信号の優先順位がターゲットのアーキテクチャーとは異なる場合、コントロール信号の実装に追加ロジックが必要になることがあります。この追加ロジックはデバイスリソースを追加使用するため、コントロール信号の遅延が大きくなる可能性があります。

特定のケースでは、デバイスのアーキテクチャーで専用のコントロール・ロジック以外のロジックを使用すると、より大きな影響が生じることがあります。例えば、clock enable 信号は、デバイス・アーキテクチャーにおいて同期 reset または clear 信号よりも優先されます。clock enable によりLABのクロックラインはオフになります。また、clear 信号は同期型です。したがって、デバイス・アーキテクチャーでは、同期クリアはクロックエッジが発生している際にのみ有効になります。

同期 clear 信号を備えるレジスターを定義し、その信号が clock enable 信号よりも優先される場合、 インテル® Quartus® Primeの合成では、レジスターへのデータ入力を使用してクロックイネーブル機能をエミュレーションします。エミュレーションされる機能ではレジスターの clock enable ポートを使用しないため、Clock Enable Multicycle制約を適用することはできません。この場合、異なる優先順位を使用すると、clock enable 信号への割り当てで予期しない結果が発生します。

この信号の順序はすべてのインテルFPGAデバイスファミリーで同じです。ただし、すべてのデバイスファミリーがすべての信号を提供しているわけではありません。優先順位は次のとおりです。

  1. 非同期クリア ( clrn) - 最も高い優先順位
  2. イネーブル (ena)
  3. 同期クリア (sclr)
  4. 同期ロード (sload)
  5. データ入力 (data) - 最も低い優先順位

インテルFPGAデバイスの二次コントロール信号の優先順位は、他のベンダーが提供するFPGAデバイスの優先順位とは異なります。デザイン要件において優先順位を柔軟に許容できる場合は、FPGAベンダー間でデザインを移行する際に、二次コントロール信号がデザインのパフォーマンス要件を満たしていることを確認します。最良の結果を達成するには、ターゲットデバイスのアーキテクチャーと一致するようにします。

Verilogにおける二次信号を備えるDタイプ・フリップフロップ・バス

このモジュールでは、すべての インテル® Arria® 10 DFF二次信号 (clrnenasclrsload) を使用します。この場合、単一のDFFではなく、DFFの8ビット・バスがインスタンス化されることに注意してください。合成において、一部の二次信号は、同じ二次信号を備えるDFFが複数ある場合にのみ推論されます。

module top(clk, clrn, sclr, sload, ena, data, sdata, q);
	input clk, clrn, sclr, sload, ena;
	input [7:0] data, sdata;
	output [7:0] q;
	reg [7:0] q;
	always @ (posedge clk or posedge clrn)
		begin
		if (clrn)
			q <= 8'b0;
		else if (ena)
			begin
			if (sclr)
				q <= 8'b0;
			else if (!sload)
				q <= data;
			else
				q <= sdata;
			end
		end
endmodule