非同期リセットと同期リリース
同期リセット、非同期リセット
同期リセット:リセット信号は、クロックの立ち上がりエッジが到着したときにのみ有効です。
利点:(1)クロックの実効レベルに達したときにのみ有効であるため、クロック周波数よりも高いバリを除去できます。(2)設計されたシステムを100%同期順序回路にすることができ、タイミング分析に役立ちます。 。
短所:(1)システムによって真に認識され、リセットタスクを完了するには、リセット信号の有効期間がクロックサイクルより長くなければなりません。同時に、clkスキュー、コンビナトリアルロジックパス遅延、リセット遅延などの要因を考慮する必要があります。(2)FPGAロジックデバイスのターゲットライブラリ内のほとんどのDFFには非同期リセットポートしかないため、同期リセットを使用する場合、シンセサイザーは組み合わせロジックをレジスタのデータ入力ポートに挿入します。これにより、より多くのロジックリソースが消費されます。
非同期リセット:クロックエッジの到来に関係なく、リセット信号が有効である限り、リセットが実行されます。
利点:(1)高速応答;(2)比較的単純な設計;(3)ターゲットデバイスライブラリのほとんどのDFFには非同期リセットポートがあるため、非同期リセットはリソースを節約できます。
短所:(1)リセット信号はグリッチの影響を受けやすい。(2)リセット信号を解除すると問題が発生しやすくなります。具体的には、リセットリリースがクロックの有効なエッジの近くにある場合、レジスタ出力が準安定に見えるようになり、準安定状態になります。
非同期リセットと同期リリース
非同期リセットの高速応答の利点を維持し、リセット信号が解放されたときの準安定状態を回避するために、非同期リセット同期解放回路が生成されます。
(ゲート回路を使用してグリッチフィルターを形成し、グリッチ干渉を減らすことができます。)
resetSynchronizer.v
`timescale 1ns / 1ps
// Company:
// Engineer:
//
// Create Date: 2020/12/17
// Author Name: Sniper
// Module Name: resetSynchronizer
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
module resetSynchronizer(
input clk,
input extern_rst_n,
output system_rst_n
);
reg buff1;
reg buff2;
always@(posedge clk or negedge extern_rst_n)
if(!extern_rst_n)
buff1 <= 1'b0;
else
buff1 <= 1'b1;
always@(posedge clk or negedge extern_rst_n)
if(!extern_rst_n)
buff2 <= 1'b0;
else
buff2 <= buff1;
assign system_rst_n = buff2;
endmodule
tb_resetSynchronizer.v
`timescale 1ns / 1ps
// Company:
// Engineer:
//
// Create Date: 2020/12/17
// Author Name: Sniper
// Module Name: tb_resetSynchronizer
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
module tb_resetSynchronizer;
//input
reg clk;
reg extern_rst_n;
//output
wire system_rst_n;
initial
begin
clk = 0;
extern_rst_n = 0;
#100;
extern_rst_n = 1;
#86;
extern_rst_n = 0;
#8;
extern_rst_n = 1;
#86;
extern_rst_n = 0;
#68;
extern_rst_n = 1;
end
//clock
always #5 clk = ~clk;
//DUT
resetSynchronizer DUT
(
.clk(clk),
.extern_rst_n(extern_rst_n),
.system_rst_n(system_rst_n)
);
initial
begin
$dumpfile("tb_resetSynchronizer.vcd");
$dumpvars(0,tb_resetSynchronizer);
end
initial #1000 $finish;
endmodule
シミュレーション結果
vcs -R resetSynchronizer.v tb_resetSynchronizer.v
この結果から、system_rst_nのリリースはclkと同期されており、チップ内の非同期リセットソース信号として使用できることがわかります。