數(shù)字IC手撕代碼-異步復(fù)位同步釋放
????????大家好我是酸菜魚,這個(gè)系列著重講解數(shù)字ic或FPGA實(shí)習(xí)面試及秋招面試的高頻手撕代碼題 。?
往期手撕代碼題:
數(shù)字IC手撕代碼-分頻器(任意偶數(shù)分頻) - 嗶哩嗶哩 (bilibili.com)
數(shù)字IC手撕代碼-分頻器(任意奇數(shù)分頻) - 嗶哩嗶哩 (bilibili.com)
數(shù)字IC手撕代碼-分頻器(任意小數(shù)分頻) - 嗶哩嗶哩 (bilibili.com)
數(shù)字IC手撕代碼-序列檢測(cè)(狀態(tài)機(jī)寫法) - 嗶哩嗶哩 (bilibili.com)
數(shù)字IC手撕代碼-序列檢測(cè)(移位寄存器寫法) - 嗶哩嗶哩 (bilibili.com)
異步復(fù)位同步釋放
請(qǐng)你用verilog,設(shè)計(jì)一個(gè)電路實(shí)現(xiàn)異步復(fù)位同步釋放功能。
為什么要,異步復(fù)位同步釋放?這個(gè)功能有什么用?
這八個(gè)字包含兩個(gè)步驟,異步復(fù)位,同步釋放
異步復(fù)位的意思是復(fù)位信號(hào)rstn和clk信號(hào)不是同時(shí)到來的,在always語句塊中表現(xiàn)為:
always @(posedge clk or negedge rstn) begin
????if(!rstn)
????????reg?_1???<= 1'b0;
end
????????當(dāng)異步復(fù)位信號(hào)到來時(shí),寄存器 reg_1 會(huì)被直接拉低,這是不會(huì)產(chǎn)生問題的,當(dāng)rstn下降沿和clk上升沿同時(shí)到來時(shí),如果rstn比clk先到來一瞬間,且原來的reg_1信號(hào)為1,reg_1會(huì)被拉低為0,后一瞬間,clk來了,因?yàn)榍耙凰查g的reg_1值被拉低了,所以在clk到來時(shí),一定有set_up不滿足要求...但是!一進(jìn)always 語句塊后,由于rstn是0,所以reg_1會(huì)被賦值為0,還是0。也就是說不管我reg_1的set_up / hold滿不滿足要求,reg_1都會(huì)被重置到0,不會(huì)有任何問題,如圖所示:

????????綜上所述,異步復(fù)位信號(hào)是不會(huì)產(chǎn)生問題的,但是為什么要同步釋放?是釋放信號(hào)會(huì)出問題嗎?
????????答:是的,當(dāng)rstn釋放的時(shí)候(從0變1)時(shí),如果rstn釋放邊沿和clk釋放邊沿很接近,那么就會(huì)出現(xiàn)亞穩(wěn)態(tài),而亞穩(wěn)態(tài)在電路里面是非常致命的,在亞穩(wěn)態(tài)采樣到的數(shù)據(jù)是不準(zhǔn)確的,而電路中一個(gè)不準(zhǔn)確的值,會(huì)導(dǎo)致這后面的所有值都不準(zhǔn)確。

????? ??????? ? 當(dāng)rstn釋放的時(shí)候,寄存器的輸入端D可能因?yàn)槟硞€(gè)組合邏輯電路和rstn有關(guān)系,導(dǎo)致D隨rstn同步拉高。那在clk上升沿到來的時(shí)候,就會(huì)有D的set_up不滿足,出現(xiàn)亞穩(wěn)態(tài),邊沿采樣的時(shí)候,輸出reg_1不知道該采D=0的信號(hào)還是D=1的信號(hào),所以不妨打兩拍,不著急在rstn釋放的時(shí)候采樣,用兩個(gè)寄存器來延遲兩個(gè)周期,等到數(shù)據(jù)D穩(wěn)定了之后再同步拉高rstn采樣。
代碼:

Testbench:

波形:

總結(jié):異步復(fù)位為0 的時(shí)候不做處理,當(dāng)rstn從0變1的時(shí)候,打兩拍隨clk同步拉高,此時(shí)寄存器輸入的D已經(jīng)穩(wěn)定很長(zhǎng)時(shí)間,可以避免亞穩(wěn)態(tài)的發(fā)生。