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の実用的なケース)