Verilogプログラミング仕様-リセット

Verilogプログラミング仕様-リセット

この記事の内容はVerilog、プログラミング仕様のリセット信号からFPGA途中のリセットシーンまで学ぶ方法があります。

内容の本質は、学習のための統合のためだけに、本「コミュニケーションICデザイン」から来ています。

Verilogプログラミング仕様でリセット

規則1:同期リセットを実現するために以下のコードを使用することは禁止されています。

通常の状況では、どのモジュールも同期的および非同期的にリセットできます。ただし、一般に、単一のグローバル同期リセット回路または単一のグローバル非同期リセット回路を同じクロックドメインで使用する必要があります。

また、ほとんどのASIC設計は通常、FPGA上記で検証する必要がありFPGA、同期リセットと非同期リセットの処理には一貫性がありません。

コードの普遍性を確保するために、ASICプロジェクト非同期リセット方式必須であるため、次の同期リセット方式は禁止されています。

always @ ( posedge clk ) begin
    if (syn_rst) begin
        ;
    end else begin
        ;
    end
end

ルール2:同期非同期リセット信号を使用することをお勧めします。実現回路は次の図のようになります。

非同期リセット同期

上の図でext_asy_rst、これは外部リセット信号です。asy_rst_12p88立ち下がりエッジはクロックと同期していますが、非同期リセットとして使用されています。

原則として、すべてのクロックソースは非同期リセット信号を出力します。

上記の回路の標準的なVerilog手順は次のとおりです。

always @ ( posedge clk_122p88 or posedge ext_asy_rst ) begin
    if ( ext_asy_rst ) begin
        rst_shft[1:0] <= 2'b11; 
    end else begin
        rst_shft[1:0] <= {rst_shft[0], 1'b0};
    end
end

assign asy_rst_122p88 = rst_shft[1];

標準の非同期リセットステートメントのルールは次のとおりです。

always @ ( posedge clk_122p88 or posedge asy_rst_122p88 ) begin
    if ( asy_rst_122p88 ) begin
        ;
    end else begin
        ;
    end
end

ルール3:サードパーティのIPが策定されていない限り、すべての非同期リセットは均一な有効レベルを使用する必要があります。

FPGAでのリセットのアプリケーションシナリオ

このASIC場合、同期レジスタユニットをリセットする必要があります。このFPGA場合、正確なルールはありません。

実際、FPGAリセット信号は通常FPGA内部チャネルリソースを占有する必要があり、リセット信号の負荷が大きいため、多くのユニットをリセットする必要はありません。これにより、リセット信号の配線が困難になり、全体的なパフォーマンスが低下する可能性があります。 、およびコンパイル時間の増加。

したがってFPGA、設計で省略できるリセット可能な限り省略されます

さらにFPGA、レジスタのリセット信号レベルは通常、詳細オプションで均一に設定されるため、リセットリソースのオーバーヘッドをさらに節約できます。

省略できるリセットの例をいくつか示しますが、完全に適用できるわけではありません。

シフトレジスタ

通常の状況では、シフトレジスタの最初のステージをリセットしてから数サイクル保持するだけで、各シフトユニットにリセットを追加することなく、シフトレジスタが完全にリセットされます。

すべてのユニットをリセットする必要がある場合、必然的に純粋なDフリップフロップの実装につながりFPGAメーカーがIPマッピングを提供します。

周波数分割用カウンター

分周回路はマルチビットカウンタです。初期位相を制御する必要がない場合は、カウンタを初期化する必要はなく、各クロックを追加するだけ1です。たとえば、以下は2**Nカウンターディバイダーです。

reg [N-1:0] cnt;
always @ ( posedge clk ) begin
   cnt <= cnt + 1'b1; 
end

ムーア型ステートマシン出力

Mooreタイプステートマシンの出力の場合、ステートマシンがリセットされている限り、次のサイクルがリセットされます。保管状態のリセットに失敗すると、バックショックの不安定性(X)の問題が発生する可能性がありますこの問題は、レジスタに初期値を割り当てることで解決できます。例:

reg[N-1:0] current_state = 0;

同期リセットと非同期リセット

リセット設計では、回路が同期リセットを採用するか非同期リセットを採用するかが一般的な問題です。

Xilinx推奨される回路は同期リセットを採用していますが、作成者は同期非同期リセットを採用しています。次の表に、長所と短所を示します。

同期リセットに対する非同期リセットの長所と短所

以下は、図に示すように、作成者が推奨する非同期リセット同期方法です。

ここに画像の説明を挿入

実装コードは次のとおりです。

module reset_sync(
	input clk,
 	input  rst_x_in, //
 	output reg rst_x_out //
 	);
reg rst_x1,rst_x2,rst_x3;
wire rst_x_pulse;
 
always @(posedge clk)begin
	rst_x1<=rst_x_in;
	rst_x2<=rst_x1;
	rst_x3<=rst_x2;
end
 
assign rst_x_pulse=rst_x2|rst_x3;
always @(posedge clk)
	rst_x_out<=rst_x_pulse;
endmodule

同期リセット、非同期リセット、非同期リセット同期のいずれであっても、上記の設計のいくつかは以前に発生しましたが、ルールはなく、どのタイプのリセットをいつ使用する必要があるかが明確ではありません。

過去にデザインするとき、私は自分の考え、それをどのようにやりたいか、そしてどのようにそれをしたかに従いました。

Design rules時間を節約し、設計の重複を回避するだけでなく、業界標準に従うために、一連の実用的なものが緊急に必要とされています。統一された標準は効率を大幅に向上させます。

要するに、リセット設計:

私の理解によれば、最後に推奨される非同期クロックとのすべての同期が最適なソリューションです。

ここに広告を挿入できますか?

Pythonを学ぶためのプラグマティズム(Xiaobaiが学びやすいPythonの実用的なケース)

おすすめ

転載: blog.csdn.net/sinat_31206523/article/details/106728442