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

復位電路的作用及基本的復位方式

評論