非同期リセット、同期解放の理由
9996 ワード
非同期リセット同期解放---リセットに関する問題
http://blog.ednchina.com/ilove314/201656/message.aspx
単純な非同期リセットの例
1
module test
2 (
3
input clk,
4
input rst_n,
5
input data_in,
6
output
reg out
7 );
8
always @ (
posedge clk
or
negedge rst_n)
9
if(!rst_n) out <=
1
'
b0;
10
else out <= data_in;
11
endmodule
FPGAのレジスタには非同期のクリアエンド(CLR)があり,非同期リセットの設計ではこのポートは一般的にローレベルで有効なリセット信号rst_を接続するn.
あなたのデザインがハイレベルリセットだとしても、実際に統合するとリセット信号を逆にしてこのCLR端子に接続します.
簡単な同期リセットの例
1
module test
2 (
3
input clk,
4
input rst_n,
5
input data_in,
6
output
reg out
7 );
8
always @ (
posedge clk )
9
if(!rst_n) out <=
1
'
b0;
10
else out <= data_in;
11
endmodule
非同期リセットと比較して、同期リセットは上レジスタのCLRポートを使用せず、統合された実回路はリセット信号rst_をnは入力論理のイネーブル信号として機能する.このような同期リセットは、FPGA内部のリソース消費をさらに増大させることになる.
では、同期リセットと非同期リセットはどちらが優れているのか、どちらが劣っているのか.
それぞれに長所と短所があるとしか言いようがない.同期リセットは、クロック信号clkの上昇に沿ってトリガに沿ってシステムがリセットされるか否かの判断を行うだけで、準安定状態の出現確率を低減することが好ましい.その悪いことは、より多くのデバイスリソースを消費する必要があるということです.これは私たちが望んでいないことです.FPGAのレジスタには非同期リセット専用のポートがあり、非同期リセットを採用したポートはデバイスリソースの消費を追加する必要はないが、非同期リセットにも危険がある.非同期クロック領域の準定常状態問題は、非同期リセット信号とシステムクロック信号との間にも同様に存在する.
次の2段レジスタの非同期リセットの例を見てみましょう
1
module test
2 (
3
input clk,
4
input rst_n,
5
input a,
6
output
reg c
7 );
8
9
reg b;
10
always @ (
posedge clk
or
negedge rst_n)
11
if(!rst_n) b <=
1
'
b0;
12
else b <= a;
13
14
always @ (
posedge clk
or
negedge rst_n)
15
if(!rst_n) c <=
1
'
b0;
16
else c <= b;
17
18
endmodule
通常、clkの上昇はcに沿ってbに更新され、bはaに更新される.リセットに入ると、b、cはすべてクリアします.リセット信号rst_を特定することはできませんnはいつ終わりますか.b_で終わるとreg 0とc_reg 0の{launch edge–stup,launch edge+hold}時間が外であれば、すべてが正常になります.しかし、正反対なら、どんな状況になるのだろうか. rst_nの上昇変化はclk上昇の確立保持時間に現れ,このときclkが検出したrst_nの状態は準定常状態(0は1不確定)になる.コードからb_reg 0とc_reg 0はrst_nが0であれば、rst_nが1であれば、リセットから飛び出します.この時のrst_nの不確実性は,4つのケース,すなわちb_reg 0とc_reg 0はいずれもリセットまたはジャンプしてリセットし、もう1つはリセットをジャンプしてリセットします.後者はシステムの動作が同期しないという問題をもたらし、この簡単な2段階の非同期リセットの例ではこのような危害は明らかではないが、大きな工事プロジェクトで多くのレジスタがこのような状況になったらどうなるか考えてみよう.
上記の分析では,同期リセットも非同期リセットも信頼できないことを意識しているようだが,どうやって両者を結合し,長所を取って短所を補うのか.
非同期リセット、同期解放
1
module test
2 (
3
input clk,
4
input rst_n,
5
input a,
6
output
reg c
7 );
8
9
reg b,rst_nr;
10
always @ (
posedge clk)
11 rst_nr <= rst_n;
12
13
always @ (
posedge clk
or
negedge rst_nr)
14
if(!rst_nr) b <=
1
'
b0;
15
else b <= a;
16
17
always @ (
posedge clk
or
negedge rst_nr)
18
if(!rst_nr) c <=
1
'
b0;
19
else c <= b;
20
21
endmodule
これにより、同期リセットのリソース消費問題と、非同期リセットの準定常状態問題とが解決される.その根本的な考え方は,非同期信号を同期化することでもある.
最適な非同期リセット、同期解放------リセット方法
library IEEE;
use IEEE.std_logic_1164.
all;
use IEEE.std_logic_arith.
all;
use IEEE.std_logic_unsigned.
all;
entity test
is
port( sys_clk :
in
std_logic; rst_in :
in
std_logic; rst_out :
out
std_logic );
end test;
architecture behave
of test
is
begin rst_pro :
process(sys_clk,rst_in)
begin
if rst_in =
'
0
'
then rst_out <=
'
0
'; elsif
rising_edge(sys_clk)
then rst_out <=
'
1
';
end
if;
end
process rst_pro;
end behave;
対応するVerilogプログラムは以下の通りです.
1 module test
2 (
3
input clk,
4
input rst_n,
5
output reg rst_out
6 );
7
8 always @ (posedge clk,negedge rst_n)
9
if(!rst_n)
10 rst_out<=
1
'
b0;
11
else
12 rst_out<=
1
'
b1;
13
endmodule
コードが
1 module test
2 (
3
input clk,
4
input rst_n,
5
output reg rst_out
6 );
7
8 always @ (posedge clk,negedge rst_n)
9
if(!rst_n)
10 rst_out<=rst_n;
11
else
12 rst_out<=
1
'
b1;
13 endmodule
それでは統合されたRTL回路
--------------------------------------------------------------
改良された最終リセット回路は、以下の通りである.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
http://blog.ednchina.com/ilove314/201656/message.aspx
単純な非同期リセットの例
1
module test
2 (
3
input clk,
4
input rst_n,
5
input data_in,
6
output
reg out
7 );
8
always @ (
posedge clk
or
negedge rst_n)
9
if(!rst_n) out <=
1
'
b0;
10
else out <= data_in;
11
endmodule
FPGAのレジスタには非同期のクリアエンド(CLR)があり,非同期リセットの設計ではこのポートは一般的にローレベルで有効なリセット信号rst_を接続するn.
あなたのデザインがハイレベルリセットだとしても、実際に統合するとリセット信号を逆にしてこのCLR端子に接続します.
簡単な同期リセットの例
1
module test
2 (
3
input clk,
4
input rst_n,
5
input data_in,
6
output
reg out
7 );
8
always @ (
posedge clk )
9
if(!rst_n) out <=
1
'
b0;
10
else out <= data_in;
11
endmodule
非同期リセットと比較して、同期リセットは上レジスタのCLRポートを使用せず、統合された実回路はリセット信号rst_をnは入力論理のイネーブル信号として機能する.このような同期リセットは、FPGA内部のリソース消費をさらに増大させることになる.
では、同期リセットと非同期リセットはどちらが優れているのか、どちらが劣っているのか.
それぞれに長所と短所があるとしか言いようがない.同期リセットは、クロック信号clkの上昇に沿ってトリガに沿ってシステムがリセットされるか否かの判断を行うだけで、準安定状態の出現確率を低減することが好ましい.その悪いことは、より多くのデバイスリソースを消費する必要があるということです.これは私たちが望んでいないことです.FPGAのレジスタには非同期リセット専用のポートがあり、非同期リセットを採用したポートはデバイスリソースの消費を追加する必要はないが、非同期リセットにも危険がある.非同期クロック領域の準定常状態問題は、非同期リセット信号とシステムクロック信号との間にも同様に存在する.
次の2段レジスタの非同期リセットの例を見てみましょう
1
module test
2 (
3
input clk,
4
input rst_n,
5
input a,
6
output
reg c
7 );
8
9
reg b;
10
always @ (
posedge clk
or
negedge rst_n)
11
if(!rst_n) b <=
1
'
b0;
12
else b <= a;
13
14
always @ (
posedge clk
or
negedge rst_n)
15
if(!rst_n) c <=
1
'
b0;
16
else c <= b;
17
18
endmodule
通常、clkの上昇はcに沿ってbに更新され、bはaに更新される.リセットに入ると、b、cはすべてクリアします.リセット信号rst_を特定することはできませんnはいつ終わりますか.b_で終わるとreg 0とc_reg 0の{launch edge–stup,launch edge+hold}時間が外であれば、すべてが正常になります.しかし、正反対なら、どんな状況になるのだろうか. rst_nの上昇変化はclk上昇の確立保持時間に現れ,このときclkが検出したrst_nの状態は準定常状態(0は1不確定)になる.コードからb_reg 0とc_reg 0はrst_nが0であれば、rst_nが1であれば、リセットから飛び出します.この時のrst_nの不確実性は,4つのケース,すなわちb_reg 0とc_reg 0はいずれもリセットまたはジャンプしてリセットし、もう1つはリセットをジャンプしてリセットします.後者はシステムの動作が同期しないという問題をもたらし、この簡単な2段階の非同期リセットの例ではこのような危害は明らかではないが、大きな工事プロジェクトで多くのレジスタがこのような状況になったらどうなるか考えてみよう.
上記の分析では,同期リセットも非同期リセットも信頼できないことを意識しているようだが,どうやって両者を結合し,長所を取って短所を補うのか.
非同期リセット、同期解放
1
module test
2 (
3
input clk,
4
input rst_n,
5
input a,
6
output
reg c
7 );
8
9
reg b,rst_nr;
10
always @ (
posedge clk)
11 rst_nr <= rst_n;
12
13
always @ (
posedge clk
or
negedge rst_nr)
14
if(!rst_nr) b <=
1
'
b0;
15
else b <= a;
16
17
always @ (
posedge clk
or
negedge rst_nr)
18
if(!rst_nr) c <=
1
'
b0;
19
else c <= b;
20
21
endmodule
これにより、同期リセットのリソース消費問題と、非同期リセットの準定常状態問題とが解決される.その根本的な考え方は,非同期信号を同期化することでもある.
最適な非同期リセット、同期解放------リセット方法
library IEEE;
use IEEE.std_logic_1164.
all;
use IEEE.std_logic_arith.
all;
use IEEE.std_logic_unsigned.
all;
entity test
is
port( sys_clk :
in
std_logic; rst_in :
in
std_logic; rst_out :
out
std_logic );
end test;
architecture behave
of test
is
begin rst_pro :
process(sys_clk,rst_in)
begin
if rst_in =
'
0
'
then rst_out <=
'
0
'; elsif
rising_edge(sys_clk)
then rst_out <=
'
1
';
end
if;
end
process rst_pro;
end behave;
対応するVerilogプログラムは以下の通りです.
1 module test
2 (
3
input clk,
4
input rst_n,
5
output reg rst_out
6 );
7
8 always @ (posedge clk,negedge rst_n)
9
if(!rst_n)
10 rst_out<=
1
'
b0;
11
else
12 rst_out<=
1
'
b1;
13
endmodule
コードが
1 module test
2 (
3
input clk,
4
input rst_n,
5
output reg rst_out
6 );
7
8 always @ (posedge clk,negedge rst_n)
9
if(!rst_n)
10 rst_out<=rst_n;
11
else
12 rst_out<=
1
'
b1;
13 endmodule
それでは統合されたRTL回路
--------------------------------------------------------------
改良された最終リセット回路は、以下の通りである.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
module
rst
(
input
clk,
input
rst_n,
output
reg
rst_out
);
reg
R1;
always
@ (
posedge
clk,
negedge
rst_n)
if
(!rst_n)
begin
R1 <= 1'b0;
rst_out <= 1'b0;
end
else
begin
R1 <= 1'b1;
rst_out <= R1;
end
endmodule