在IC設計種,復位策略分為同步復位和異步復位兩種設計,根據(jù)不同的設計,會采用不同的復位方式。
復位的文章已有很多文章講解了,這里只討論實現(xiàn)策略。
?一、異步復位
1、優(yōu)點:
1)無需額外的邏輯資源,實現(xiàn)簡單,可以保證復位引腳到各個寄存器的時鐘偏移最??;
2)復位信號不依賴時鐘;
2、缺點:
1)復位信號易受到外界干擾,并且對電路內(nèi)部的毛刺敏感;
2)復位信號的隨機性,可能產(chǎn)生時序違規(guī)并導致電路處于亞穩(wěn)態(tài);
3、代碼設計:
假設外部復位時鐘信號為clk_o,復位信號為rst_n_hw。這個復位信號,我們不能直接應用于異步復位寄存器中。需要對其進行處理后,再進行使用。分析如下:
1)先對rst_n_hw進行第一次處理,產(chǎn)生“異步復位、同步釋放”復位信號rst_n_sync;
這樣方式,是在異步復位中,為了避免時序問題,必然要使用的。
其實,這種策略就是利用了同步復位和異步復位折中的方式。復位電路中的寄存器同步異步復位,全部功能寄存器同時復位,與時鐘異步發(fā)生;當復位信號釋放,位于這個區(qū)域的時鐘在功能觸發(fā)器脫離復位前必須連續(xù)觸發(fā)兩次以上,以避免亞穩(wěn)態(tài)問題。
reg rst_sync0_n ,rst_sync1_n ,rst_sync1_n ;
asisgn rst_n_sync = rst_sync2_n ;
always @(posedge clk_o or negedge rst_n_hw)
if(~rst_n_hw) begin
rst_sync0_n <= 1'b0;
rst_sync1_n <= 1'b0;
rst_sync2_n <= 1'b0;
end
else begin
rst_sync0_n <= 1'b1;
rst_sync1_n <= rst_sync0_n ;
rst_sync2_n <= rst_sync1_n ;
end
2、將處理后的reset信號,再作用于各個寄存器,如:
reg [3:0] data_out1 ,data_out2 ;
always @(posedge clk_o or negedge rst_n_sync)
begin
if(~rst_n_sync )
data_out1 <= 4'h0;
else
data_out1 <= data_in1[3:0];
end
always @(posedge clk_o or negedge rst_n_sync)
begin
if(~rst_n_sync )
data_out2 <= 4'h0;
else
data_out2 <= data_in2[3:0];
end
二、同步復位
1、優(yōu)點:
1)抗干擾性強,可以剔除復位信號種周期短于時鐘周期的毛刺;
2)所有的功能觸發(fā)器的復位信號完全同步于時鐘源;從而確保了該時鐘和reset作用下的邏輯電路的啟動工作的一致性,避免因為復位和時鐘的關系異步,造成的啟動不一致(例如:錯位一個時鐘周期。如果都是控制計數(shù)器工作,這些計數(shù)器工作是同時的;如果為異步復位,這些計數(shù)器工作可能會不同時工作,這樣就需要利用其它邏輯來保證其同時工作)
3)有利于靜態(tài)時序分析工具的分析;
4)有利于基于周期的仿真工具的仿真。
2、缺點:
1)占用更多的邏輯資源;
2)對復位信號的脈沖寬度有要求,必須大于指定的時鐘周期,且很難保證復位信號到達各個寄存器的時序;
3)復位信號依賴于時鐘,如果電路中的時鐘信號出現(xiàn)問題,則無法完成復位。
3、代碼設計:
假設外部復位時鐘信號為clk_o,復位信號為rst_n_hw。這個復位信號,我們不能直接應用于同步復位寄存器中。需要對其進行處理后,再進行使用。分析如下:
1)先對rst_n_hw同步處理:因為該reset將要引入到clk_o同步時鐘域中,而且會當作普通的信號使用,此時必須做跨時鐘域處理后,在進行使用:
注意:1.1)可以看出使用同步復位時,需要保證在復位時,需要有時鐘的存在而且需要大于時鐘周期,否則復位信號無法被捕獲到該邏輯中。
? ? ? ? ? 1.2)在時鐘存在時,reset才會有作用;在上電復位時,在時鐘未開啟時,所以的邏輯都處于未知狀態(tài);只有時鐘到來后,reset才會起作用,最終進入到復位狀態(tài);等到復位釋放,整個電路邏輯,進入正常工作狀態(tài)。文章來源:http://www.zghlxwxcb.cn/news/detail-622383.html
reg rst_sync0_n ,rst_sync1_n ,rst_sync1_n ;
asisgn rst_n_sync = rst_sync2_n ;
always @(posedge clk_o)
begin
rst_sync0_n <= rst_n_hw;
rst_sync1_n <= rst_sync0_n ;
rst_sync2_n <= rst_sync1_n ;
end
2、將同步后的reset信號,再作用于各個寄存器,如:文章來源地址http://www.zghlxwxcb.cn/news/detail-622383.html
reg [3:0] data_out1 ,data_out2 ;
always @(posedge clk_o)
begin
if(~rst_n_sync )
data_out1 <= 4'h0;
else
data_out1 <= data_in1[3:0];
end
always @(posedge clk_o)
begin
if(~rst_n_sync )
data_out2 <= 4'h0;
else
data_out2 <= data_in2[3:0];
end
到了這里,關于復位策略:同步復位與異步復位的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!