在數(shù)字邏輯電路中,復(fù)位信號的設(shè)計是首要解決的基本問題痴昧。在進行復(fù)位信號設(shè)計之前,需要明確的是冠王,復(fù)位信號只對時序電路有效赶撰,因為時序電路屬于雙穩(wěn)態(tài)電路,在上電后需要保證電路處于已知的初始態(tài),才能保證正常運行豪娜。而對于組合邏輯電路來說餐胀,組合邏輯本身不具有存儲的功能,因此不需要復(fù)位信號瘤载。
復(fù)位信號可以分為同步復(fù)位和異步復(fù)位兩大類否灾。
同步復(fù)位指的是當(dāng)復(fù)位信號發(fā)生變化時,并不立即生效鸣奔,而是等到有效時鐘沿采集到復(fù)位信號的變化后墨技,才會對寄存器進行復(fù)位操作。從同步復(fù)位的描述中挎狸,就可發(fā)現(xiàn)同步復(fù)位的過程是依賴于時鐘信號的扣汪,所以稱之為同步。而異步復(fù)位則不依賴于系統(tǒng)時鐘锨匆,一旦信號發(fā)生變化崭别,就會立即對寄存器進行復(fù)位操作。
由于在現(xiàn)有的大多數(shù)邏輯器件庫中统刮,觸發(fā)器DFF都是只包含有異步復(fù)位端口紊遵,所以同步復(fù)位的使用會造成冗余組合邏輯的使用,浪費資源侥蒙。因此暗膜,大多數(shù)數(shù)字設(shè)計中都采用的是異步復(fù)位信號。
雖然異步復(fù)位信號更加方便使用鞭衩,但是因為復(fù)位信號與系統(tǒng)時鐘異步的關(guān)系学搜,很容易出現(xiàn)復(fù)位信號釋放位置恰恰出現(xiàn)在時鐘有效沿附近,導(dǎo)致亞穩(wěn)態(tài)的出現(xiàn)论衍。對于異步復(fù)位瑞佩,有類似于寄存器建立時間和保持時間的說法,分別是recovery time 和temoval time坯台。如下面兩張圖所示:
recovery time是異步復(fù)位的恢復(fù)時間炬丸,指的是復(fù)位釋放與下一個時鐘有效邊沿之間需要間隔的最小時間。
removal time是異步復(fù)位的去除時間蜒蕾,指的是復(fù)位釋放與上一個時鐘有效邊沿之間需要間隔的最小時間稠炬。
如果異步復(fù)位的釋放時間不滿足以上這兩個條件,寄存器很可能進入亞穩(wěn)態(tài)咪啡,導(dǎo)致電路運行失常首启。為了保證解決這個問題,可以采用異步復(fù)位同步釋放的復(fù)位信號設(shè)計方法撤摸。顧名思義毅桃,異步復(fù)位同步釋放就是對復(fù)位信號的釋放過程做同步處理褒纲,使得釋放的過程能夠與系統(tǒng)時鐘同步。
異步復(fù)位钥飞,同步釋放本質(zhì)就是引入兩個觸發(fā)器莺掠,其電路圖和時序處理如下圖所示:
觀察上述電路圖和時序圖就知道,其實異步復(fù)位同步釋放和兩級打拍的跨時鐘域信號處理很相似代承,本質(zhì)上都是對信號進行同步處理汁蝶。上述電路的代碼如下渐扮,很簡單:
module rst_n_sync(
input clk , // 輸入時鐘
input rst_n , // 輸入異步復(fù)位信號
output rst_n_sync // 輸出同步釋放后的復(fù)位信號
);
reg rst_n_r1 ; // 第1級寄存器
reg rst_n_r2 ; // 第2級寄存器
assign rst_n_sync = rst_n_r2 ;
always @ (posedge clk or negedge rst_n) begin
if (~rst_n) begin
rst_n_r1 <= 1'b0 ;
rst_n_r2 <= 1'b0 ; // 復(fù)位信號有效時拉低
end //
else begin
rst_n_r1 <= 1'b1 ;
rst_n_r2 <= rst_n_r1; // 復(fù)位信號無效后论悴,通過兩級打拍,實現(xiàn)釋放同步
end //
end //
endmodule
上述代碼在vivado軟件中生成的RTL電路如下:
可以看到墓律,代碼生成的電路與之前的電路原理圖完全一致膀估。
異步復(fù)位同步釋放的復(fù)位信號設(shè)計方法能夠有效地實現(xiàn)系統(tǒng)的復(fù)位,且因為進行了信號的同步釋放處理耻讽,使得復(fù)位信號在撤離時能夠滿足恢復(fù)和去除時間的要求察纯,從而避免了亞穩(wěn)態(tài)的產(chǎn)生。