大家好,談到同步復(fù)位和異步復(fù)位,那咱們就不得不來(lái)聊一聊復(fù)位這個(gè)詞了。在數(shù)字邏輯電路設(shè)計(jì)中,電路通過(guò)復(fù)位來(lái)啟動(dòng),復(fù)位猶如數(shù)字電路的“起搏器”。那在設(shè)計(jì)中,主要會(huì)出現(xiàn)以下三種類型的,一是無(wú)復(fù)位:天生就強(qiáng)壯著,上電就啟動(dòng);二是異步復(fù)位:好心人路過(guò),隨便踢了一腳,起搏了,這完全沒有心理準(zhǔn)備,隨時(shí)都有可能復(fù)活?。蝗峭綇?fù)位:專業(yè)救援隊(duì),手按住胸口,不起博按住不放啊。直到聽到“砰砰”聲才離開,非常關(guān)鍵,必須要按住一會(huì)會(huì)。
那下面咱們就來(lái)詳細(xì)聊聊這三種類型。
一、無(wú)復(fù)位
沒見過(guò)這樣寫代碼的,竟然沒有復(fù)位,老師都說(shuō)數(shù)字電路離不開復(fù)位的,沒有復(fù)位,寄存器怎么賦初值???沒有確定的初值,這電路怎么工作呢?
其實(shí),不用擔(dān)心,FPGA上電之后,寄存器初始值默認(rèn)為“0”,當(dāng)然,也可以人為的賦初值。下面為無(wú)復(fù)位的代碼舉例:
reg [7:0] a;
always @(posedge clk)
begin
a <= b;
end
如果沒有復(fù)位信號(hào),省了很多資源,編譯和布線時(shí)間也縮短不少,如果規(guī)模很大,對(duì)提高設(shè)計(jì)整體性能也是有幫助的。但是在數(shù)字電路設(shè)計(jì)中,我們很少不用復(fù)位電路。到是我們經(jīng)常利用FPGA這個(gè)特性,自己產(chǎn)生內(nèi)部復(fù)位電路。
二、異步復(fù)位
異步復(fù)位電路描述:在always語(yǔ)句中添加復(fù)位信號(hào)在敏感量列表中,即可實(shí)現(xiàn)異步復(fù)位。下面為異步復(fù)位的代碼舉例以及電路圖舉例:
reg [7:0] a;
always @(posedge clk, posedge rst_n)
begin
if(rst_n)
begin
a <= 8’h0;
end
else
begin
a <= b;
end
end
異步復(fù)位的缺點(diǎn):
異步復(fù)位對(duì)復(fù)位信號(hào)要求很嚴(yán)格的,不然隨便一個(gè)毛刺就會(huì)把電路給復(fù)位掉的。
另外,異步復(fù)位信號(hào)依賴于FPGA內(nèi)部的傳導(dǎo)延時(shí),因此,在微小的電壓或溫度差異下,設(shè)計(jì)都有可能輸出錯(cuò)誤,設(shè)計(jì)的可移植性也很差。上面不是說(shuō)了嘛,這隨便一腳提過(guò)來(lái),有時(shí)候能感覺到,有時(shí)候感覺不到啊。冬天穿個(gè)大棉襖,就得使個(gè)大勁才能提醒。
正因?yàn)閷?duì)不同寄存器延遲是不同的,所以容易引發(fā)間斷性設(shè)計(jì)問題。怎么理解呢?
如圖所示,2 bit的移位寄存器組成一個(gè)環(huán),復(fù)位后,左邊寄存器清零,右邊寄存器置位,而且都在同一上升沿觸發(fā),所以,如果左邊寄存器上升沿來(lái)的時(shí)候,復(fù)位信號(hào)已經(jīng)釋放掉了,但是右邊寄存器還處于復(fù)位狀態(tài),這個(gè)時(shí)候數(shù)據(jù)就錯(cuò)誤。
異步復(fù)位的優(yōu)點(diǎn):
異步復(fù)位不依賴于時(shí)鐘。所以如果時(shí)鐘是外部輸入的,而且時(shí)鐘有可能丟失,例如處于省電模式時(shí),只能使用異步復(fù)位。
另外一個(gè)優(yōu)勢(shì)是設(shè)計(jì)更快的物理實(shí)現(xiàn)。相對(duì)于同步復(fù)位,異步復(fù)位有更寬松的時(shí)序約束。從而布局布線工具使用更少的時(shí)間便可達(dá)到約束條件。
三、同步復(fù)位
同步復(fù)位就是非常專業(yè),不留一點(diǎn)馬虎,和他的名字一樣,只在時(shí)鐘的有效沿發(fā)生,所以一個(gè)有效的同步信號(hào),至少要維持一個(gè)時(shí)鐘周期(把你叫不醒,是不會(huì)停的)。由于僅僅在時(shí)鐘的有效沿有效,所以可以濾除復(fù)位信號(hào)上的毛刺,電路可靠性好很多。下面為同步復(fù)位的代碼舉例:
reg [7:0] a;
always @(posedge clk)
begin
if(rst_n)
begin
a <= 8’h0;
end
else
begin
a <= b;
end
end
所以,總結(jié)一下。其優(yōu)點(diǎn)是“彌補(bǔ)了異步復(fù)位的所有缺點(diǎn)”,其缺點(diǎn)是“沒有異步復(fù)位的優(yōu)點(diǎn)“”。這個(gè)總結(jié)夠簡(jiǎn)單吧。
總結(jié)
我們熟悉了3種復(fù)位方式,了解了他們的脾氣,那就總結(jié)一下,在我們平時(shí)設(shè)計(jì)中如何使用他們。
盡量用同步復(fù)位,如果你的規(guī)模不是特別大,雖然占有布線資源多一點(diǎn),但是對(duì)系統(tǒng)可靠性還是有幫助的。
規(guī)模很大的時(shí)候,可以考慮混和復(fù)位方式,在什么場(chǎng)合呢?比如說(shuō)設(shè)計(jì)中有多個(gè)IP核和功能模塊,要求有不同的復(fù)位方式,這個(gè)時(shí)候就要求混和復(fù)位方式,另外,還有電路延遲,大型電路中兩個(gè)模塊之間信號(hào)延遲可能超過(guò)10ns,如果時(shí)鐘周期為3ns,需要3個(gè)時(shí)鐘周期才能通過(guò),所以,大型設(shè)計(jì)中完全同步是非常不容易的。如圖所示為一個(gè)復(fù)雜的混和復(fù)位樹。各種復(fù)位都用上了。
各位,加油,共同進(jìn)步!
-
FPGA
+關(guān)注
關(guān)注
1625文章
21620瀏覽量
601239 -
同步復(fù)位
+關(guān)注
關(guān)注
0文章
26瀏覽量
10694
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論