復(fù)位電路也是數(shù)字邏輯設(shè)計中常用的電路,不管是 FPGA 還是 ASIC 設(shè)計,都會涉及到復(fù)位,一般 FPGA或者 ASIC 的復(fù)位需要我們自己設(shè)計復(fù)位方案。復(fù)位指的是將寄存器恢復(fù)到默認(rèn)值。一般復(fù)位功能包括同步復(fù)位和異步復(fù)位。復(fù)位一般由硬件開關(guān)觸發(fā)引起,也可以由復(fù)位邏輯控制引起。
復(fù)位電路的作用
數(shù)字電路中寄存器和 RAM 在上電之后默認(rèn)的狀態(tài)和數(shù)據(jù)是不確定的,如果有復(fù)位,就可以把寄存器復(fù)位到初始狀態(tài) 0,RAM 的數(shù)據(jù)可以通過復(fù)位來觸發(fā) RAM 初始化到全 0,因為一般邏輯起始都是從 0 開始變化的,這個是根據(jù)設(shè)計的需要設(shè)定的一個值,如果設(shè)計需要寄存器上電復(fù)位為 1,也是可以的。
還有就是如果邏輯進(jìn)入了錯誤的狀態(tài),通過復(fù)位可以把所有的邏輯狀態(tài)恢復(fù)到初始值。
復(fù)位電路的控制方式
1 按鍵復(fù)位
在硬件電路設(shè)計中,一般會留下一個復(fù)位按鍵,按下開關(guān)復(fù)位,就可以簡單快捷地進(jìn)行復(fù)位。
但按鍵復(fù)位存在一個問題,就是一般按鍵在按下時會產(chǎn)生抖動,釋放時也會產(chǎn)生抖動。這是因為大多數(shù)按鍵所使用的開關(guān)為機(jī)械彈性開關(guān),當(dāng)我們按下或松開按鍵時,由于彈片的物理特性,不能立即閉合或斷開,往往會在斷開或閉合的短時間內(nèi)產(chǎn)生機(jī)械抖動。
按鍵消抖可分為硬件消抖和軟件消抖。硬件消抖主要使用RS觸發(fā)器或電容等方法實現(xiàn)消抖, 一般在按鍵較少時使用。軟件消抖的原理主要為按鍵按下或松開后延時5ms—20ms采樣,這種方法經(jīng)常使用。
按鍵去抖的思路是檢測到按下時延時 20ms,再檢測,如果狀態(tài)仍為按下,則確認(rèn)是按下的;如果狀態(tài)為彈起的,則確認(rèn)是干擾,無按鍵按下。
假如rst_in 為一個 普通 按鍵,直接連接至 FPGA里面的復(fù)位引腳作為全局復(fù)位,所以按鍵消抖的原理為:當(dāng) rst_in按鍵按下時可能會出現(xiàn)抖動,需要 等 20ms之后再去檢測這個按鍵是否按下 FPGA里面的這個引腳的電平是否改變 )),這樣就達(dá)到了按鍵消抖的目的 。
如下圖所示:
檢測到第一次按下(檢測到低電平),此時延遲20ms,然后 20ms之后,再次檢測是否有穩(wěn)定的低電平 。
由于按鍵 彈片的物理特性,按鍵按下時會有抖動,也就是說我們其實只按一次,但是實際產(chǎn)生的“按下”卻是許多次的,這些許多次集中在這 20ms里。通過延時 20ms,把其他的“按下(也就是抖動)給濾除了。然后再次判斷是否有按下,因為有的時候干擾很大。
2 RC復(fù)位電路
這種是一種簡單的 RC 復(fù)位電路,電源接通時候,通過 R1 對 C2 進(jìn)行充電,經(jīng)過一段延遲后加到電路當(dāng)中產(chǎn)生復(fù)位信號,這個復(fù)位信號的上升速度低于電源的上電速度,當(dāng)復(fù)位引腳檢測到高電平時候,系統(tǒng)復(fù)位結(jié)束,進(jìn)入正常工作狀態(tài)。
3 FPGA上電復(fù)位
如果在硬件電路設(shè)計時沒有留下復(fù)位按鍵,對FPGA來說也沒有太大問題,因為 FPGA 內(nèi)部也會有上電復(fù)位的功能,就是 POR(Power On Reset)電路。FPGA 芯片內(nèi)部有一個上電檢測模塊,一旦檢測到電源電壓超過檢測門限后,就產(chǎn)生一個上電復(fù)位脈沖(Power On Reset)并將其送給所有的寄存器,這個脈沖會自動作用在各個寄存器的復(fù)位端,和功能復(fù)位管腳共同控制寄存器的復(fù)位。
另外,就是 FPGA 重新配置之后,也會觸發(fā)上電復(fù)位。
復(fù)位電路的類型
同步復(fù)位
同步復(fù)位指的是當(dāng)時鐘上升沿檢測到復(fù)位信號,執(zhí)行復(fù)位操作,有效的時鐘沿是前提。實現(xiàn)同步復(fù)位通常意味著將復(fù)位信號與時鐘信號同步。
以下是一個簡單的例子,展示了如何使用同步復(fù)位來重置一個計數(shù)器:
module sync_reset_counter( input wire clk, // 時鐘信號 input wire rst, // 同步復(fù)位信號(高電平有效) input wire enable, // 使能信號 input wire inc_dec, // 增減控制信號(例如,1為增,0為減) output reg [7:0] count // 計數(shù)器輸出 ); always @(posedge clk) begin if (rst) begin // 當(dāng)rst為高電平時,進(jìn)行同步復(fù)位 count <= 8'h00; // 計數(shù)器被重置為0 end else if (enable) begin // 如果復(fù)位信號無效且使能信號有效,則更新計數(shù)器 if (inc_dec) begin // 如果inc_dec為高,則增加計數(shù)器 if (count < 8'hFF) // 防止計數(shù)器溢出 count <= count + 1'b1; end else begin // 如果inc_dec為低,則減少計數(shù)器 if (count > 8'h00) // 防止計數(shù)器下溢 count <= count - 1'b1; end end end endmodule
在這個例子中,rst是同步復(fù)位信號,它是一個高電平有效的信號。當(dāng)rst為高時,在下一個clk的上升邊沿到來時,計數(shù)器count會被重置為0。與異步復(fù)位不同,同步復(fù)位不會立即發(fā)生,而是會在下一個時鐘邊沿發(fā)生時生效。
同步復(fù)位的優(yōu)點如下:
能確保復(fù)位信號和時鐘信號的相位一致,從而避免由于信號傳輸延遲而導(dǎo)致的問題;
以同步的方式與其他信號進(jìn)行控制,減少信號沖突的可能性;
避免由于時序問題(如時鐘閃爍、時鐘脈沖不穩(wěn)定等)而導(dǎo)致的系統(tǒng)復(fù)位不準(zhǔn)確或延遲;
便于仿真;
可以使所設(shè)計的系統(tǒng)成為 100%的同步時序電路,有利于時序分析,而且可綜合出較高的 Fmax;
由于只在時鐘有效電平到來時才有效,所以可以濾除高于時鐘頻率的復(fù)位毛刺,可有效避免因毛刺造成的亞穩(wěn)態(tài)和錯誤。
同步復(fù)位也有一些缺點,缺點如下:
復(fù)位信號的有效時長必須大于時鐘周期,才能真正被系統(tǒng)識別并完成復(fù)位任務(wù)。由于線路上的延遲,可能需要多個時鐘周期的復(fù)位脈沖寬度。此外,很難保證復(fù)位信號到達(dá)各個寄存器的時序,這增加了設(shè)計的復(fù)雜性。
同步復(fù)位是依賴于時鐘信號的。如果電路中的時鐘信號出現(xiàn)問題,例如時鐘停振或者時鐘周期不穩(wěn)定,那么同步復(fù)位可能無法完成,導(dǎo)致電路無法正常工作。
由于大多數(shù)的邏輯器件的目標(biāo)庫內(nèi)的 DFF 都只有異步復(fù)位端口,所以,倘若采用同步復(fù)位的話,綜合器就會在寄存器的數(shù)據(jù)輸入端口插入組合邏輯,這樣就會一方面額外增加 FPGA 內(nèi)部的邏輯資源,另一方面也增加了相應(yīng)的組合邏輯門時延。
異步復(fù)位
異步復(fù)位指的是無論時鐘沿是否到來,只要復(fù)位信號有效,就對系統(tǒng)進(jìn)行復(fù)位。實現(xiàn)異步復(fù)位電路通常涉及在寄存器或狀態(tài)機(jī)的更新邏輯中包含一個復(fù)位信號。
以下是一個簡單的例子,展示了如何在Verilog中使用異步復(fù)位來重置一個計數(shù)器:
module async_reset_counter( input wire clk, // 時鐘信號 input wire rst_n, // 異步復(fù)位信號(低電平有效) input wire enable, // 使能信號 input wire inc_dec, // 增減控制信號(例如,1為增,0為減) output reg [7:0] count // 計數(shù)器輸出 ); always @(posedge clk or negedge rst_n) begin if (!rst_n) begin // 當(dāng)rst_n為低電平時,進(jìn)行異步復(fù)位 count <= 8'h00; // 計數(shù)器被重置為0 end else if (enable) begin // 如果復(fù)位信號無效且使能信號有效,則更新計數(shù)器 if (inc_dec) begin // 如果inc_dec為高,則增加計數(shù)器 if (count < 8'hFF) // 防止計數(shù)器溢出 count <= count + 1'b1; end else begin // 如果inc_dec為低,則減少計數(shù)器 if (count > 8'h00) // 防止計數(shù)器下溢 count <= count - 1'b1; end end end endmodule
在這個例子中,rst_n是異步復(fù)位信號,它是一個低電平有效的信號。當(dāng)rst_n為低時,無論時鐘信號clk的狀態(tài)如何,計數(shù)器count都會被立即重置為0。當(dāng)rst_n為高且enable信號也為高時,計數(shù)器會根據(jù)inc_dec信號的值進(jìn)行增加或減少。
優(yōu)點:
大多數(shù)目標(biāo)器件庫的 DFF 都有異步復(fù)位端口,那么該觸發(fā)器的復(fù)位端口就不需要額外的組合邏輯,這樣就可以節(jié)省資源;
某些情況下,使用異步復(fù)位可以簡化邏輯設(shè)計。由于復(fù)位操作不依賴于時鐘信號,因此不需要額外的邏輯來同步復(fù)位信號和時鐘信號;
可以在任何時間響應(yīng)復(fù)位信號,而不需要等待下一個時鐘邊沿。這意味著復(fù)位操作能夠立即發(fā)生;
在某些應(yīng)用中,異步復(fù)位可以提高系統(tǒng)的可靠性。例如,在電源上電或復(fù)位按鈕被按下時,異步復(fù)位能夠確保系統(tǒng)迅速并可靠地進(jìn)入已知狀態(tài)。
異步復(fù)位也有一些缺點,缺點如下:
最大的問題在于它屬于異步邏輯,問題出現(xiàn)在復(fù)位釋放時,而不是有效時,如果復(fù)位釋放接近時鐘有效沿,則觸發(fā)器的輸出可能進(jìn)入亞穩(wěn)態(tài)(此時 clk 檢測到的 rst_n 的狀態(tài)就會是一個亞穩(wěn)態(tài),即是 0 是 1是不確定的),從而導(dǎo)致復(fù)位失敗。
可能因為噪聲或者毛刺造成虛假復(fù)位信號(比如系統(tǒng)正常工作時突然復(fù)位)(注意:時鐘端口、清零和置位端口對毛刺信號十分敏感,任何一點毛刺都可能會使系統(tǒng)出錯,因此判斷邏輯電路中是否存在冒險以及如何避免冒險是設(shè)計人員必須要考慮的問題);
靜態(tài)定時分析比較困難,靜態(tài)時序分析一般是針對同步設(shè)計的,都是基于時鐘周期來分析時序的;
對于 DFT(DesignForTest 可測性設(shè)計)設(shè)計,如果復(fù)位信號不是直接來自于 I/O 引腳,在 DFT 掃描和測試時,復(fù)位信號必須被禁止,因此需要額外的同步電路;
在某些情況下,異步復(fù)位信號可能會與時鐘信號或其他輸入信號產(chǎn)生沖突,導(dǎo)致冒險現(xiàn)象(冒險條件)。這可能會導(dǎo)致系統(tǒng)進(jìn)入不確定的狀態(tài),需要進(jìn)行額外的邏輯設(shè)計來避免這種情況。
總結(jié)下來,我們推薦使用異步復(fù)位、同步釋放的方式,并且復(fù)位信號為低電平有效。即:
1、復(fù)位信號到來的有效與否與 clk 無關(guān),而且復(fù)位信號的撤除也與 clk 無關(guān),但是復(fù)位信號的撤除是在下一個 clk 來到后才起的作用。
2、異步復(fù)位同步撤離的目的為了防止復(fù)位信號撤除時,可能產(chǎn)生的亞穩(wěn)態(tài)。
這意味著復(fù)位操作是異步的(可以在任何時刻發(fā)生),但復(fù)位后的撤離(即恢復(fù)正常的邏輯操作)是同步的(在時鐘邊沿發(fā)生)。
以下是一個使用這種策略的計數(shù)器的Verilog代碼示例:
module async_reset_sync_release_counter( input wire clk, // 時鐘信號 input wire rst_n, // 異步復(fù)位信號(低電平有效) input wire enable, // 使能信號 input wire inc, // 增加控制信號 output reg [7:0] count // 計數(shù)器輸出 ); // 初始化計數(shù)器為0,但注意這里不會立即生效,因為Verilog沒有真正的初始化語句 reg [7:0] count_reg = 8'h00; // 使用局部變量進(jìn)行初始化 always @(posedge clk or negedge rst_n) begin if (!rst_n) begin // 異步復(fù)位,任何時候rst_n為低時,計數(shù)器立即被置0 count_reg <= 8'h00; end else begin // 同步撤離,在rst_n為高且時鐘上升邊沿到來時,根據(jù)enable和inc更新計數(shù)器 if (enable) begin if (inc) begin if (count_reg < 8'hFF) // 防止計數(shù)器溢出 count_reg <= count_reg + 1'b1; end end end end // 同步輸出到外部接口 assign count = count_reg; endmodule
來源:https://blog.csdn.net/u011565038/article/details/139690846
-
FPGA
+關(guān)注
關(guān)注
1643文章
21925瀏覽量
612614 -
asic
+關(guān)注
關(guān)注
34文章
1242瀏覽量
121811 -
寄存器
+關(guān)注
關(guān)注
31文章
5403瀏覽量
122936 -
復(fù)位電路
+關(guān)注
關(guān)注
13文章
324瀏覽量
45033
原文標(biāo)題:FPGA中復(fù)位電路的設(shè)計
文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設(shè)計論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
CPU與單片機(jī)的復(fù)位電路的作用及基本復(fù)位方式

rc復(fù)位電路的電阻作用
單片機(jī)復(fù)位電路的作用是什么
復(fù)位電路的作用及基本的復(fù)位方式

評論