//不帶pll的非同步復位,同步釋放:
//其實就是用的打節拍的方式將復位訊號控制成clk控制的訊號而已!
module reset
(input clk,
input reset,
output reset_2
);reg reset_1;
reg reset_2;
always@(posedge clk or negedge reset)
if(!reset)
reset_1<=1'b0;
else
reset_1<=1'b1;
always@(posedge clk or negedge reset)
if(!reset)
reset_2<=1'b0;
else
reset_2<=reset_1;
endmodule
//特權同學寫的帶有pll的非同步復位,同步釋放
//思想:先將fpga的復位訊號做一次非同步復位,同步處理,將這個復位訊號輸入給pll,
//接著在將pll的復位訊號做一次非同步復位,同步處理,得到系統的復位訊號
//其實就是用的打節拍的方式處理非同步訊號的,使其都只受時鐘控制的訊號!
module sys_reset
(input clk,
input reset,
output sys_reset,
output clk_25,
output clk_100
);//第一次非同步復位,同步處理
reg reset_1;
reg reset_2;
wire pll_reset;
always@(posedge clk or negedge reset)
if(!reset)
reset_1 <= 1'b0;
else
reset_1 <= 1'b1;
always@(posedge clk or negedge reset)
if(!reset)
reset_2 <= 1'b0;
else
reset_2 <= reset_1;
assign pll_reset = reset_2;
//第二次非同步復位,同步處理,將系統用的復位訊號輸出
wire locked;//pll輸出有效標誌位,高電平表示pll輸出有效
wire sys_reset_0;
reg sys_reset_1;
reg sys_reset_2;
assign sys_reset_0 = reset & locked;//用這兩個訊號來標誌復位開始,然後用時鐘將其控制成同步訊號!
always@(posedge clk_100 or negedge sys_reset_0)
if(!sys_reset_0)
sys_reset_1 <= 1'b0;
else
sys_reset_1 <= 1'b1;
always@(posedge clk_100 or negedge sys_reset_0)
if(!sys_reset_0)
sys_reset_2 <= 1'b0;
else
sys_reset_2 <= sys_reset_1;
assign sys_reset =sys_reset_2;
//這個例化其實應該放在第一次非同步復位,同步處理之後,這樣看的更清楚
pll u1
(.inclk0(clk),
.areset(pll_reset),
.c0(clk_25),
.c1(clk_100),
.locked(locked)
);endmodule
同步復位和非同步復位的比較
同步復位 同步復位 顧名思義,同步復位就是指復位訊號只有在時鐘上公升沿到來時,才能有效。否則,無法完成對系統的復位工作。用verilog描述如下 always posedge clk begin if rst n end 非同步復位 非同步復位 它是指無論時鐘沿是否到來,只要復位訊號有效,就對系統進...
同步復位與非同步復位的區別
假設電路都是低電平復位 1 同步復位 復位的有效條件與clk的上公升沿有關,當clk的上公升沿採到rst n為低的時候可復位。如下圖所示 波形如下圖所示 解釋 復位訊號拉低後,當時鐘訊號上公升沿到來時,輸出訊號才復位。2 非同步復位 復位的觸發條件不僅與clk的上公升沿有關,還與rst n的下降沿有...
fpga的非同步復位同步釋放操作
大多數的復位操作通常是直接將rst n訊號拉低或置高,直接進行復位。但是這樣會產生乙個很大的問題,如果復位操作位於資料取樣沿的setup或holdon時間內,會發生什麼?整個電路會出現亞穩態,可能導致復位失敗。此時,如果採用非同步復位,同步釋放的操作,就能避免亞穩態的出現。先上 module rst...