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

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

評(píng)論