Get Smart About Reset: Think Local, Not Global
對于復位信號的處理,為了方便我們習慣上采用全局復位,博主在很長一段時間內(nèi)都是將復位信號作為一個I/O口,通過撥碼開關硬件復位。后來也看了一些書籍,采用異步復位同步釋放,對自己設計的改進。
不過自從我研讀了Xilinx的White Paper后,讓我對復位有了更新的認識。
One of the commandments of digital design states,"Thou shalt have a master reset for all flip-flops so that the test engineer will love you, and your simulations will not remain undefined for time eternal."
這句是用來裝逼的。使用全局復位有利于我們仿真,所有的寄存器都是有初始值的,也可以在任意時刻讓你的寄存器恢復初值,所以驗證工程師很喜歡這樣的設計,但是Xilinx建議的是盡量避免使用全局復位,這是為什么呢。
全局復位并不是好的處理方式
我們習慣上通常使用的復位有三種,
硬件開關:復位信號接一個撥碼開關。
電源芯片:上電時候電源芯片產(chǎn)生,可以長時間維持,直到穩(wěn)定。
控制芯片:控制芯片產(chǎn)生復位脈沖。
這些復位信號和FPGA內(nèi)部信號的變化比起來是比較慢的。復位按鈕最快也會到達毫秒級別,而FPGA內(nèi)部信號都是納秒級別的變化。全局復位的周期遠大于系統(tǒng)時鐘的周期,是完全可以保證所有的觸發(fā)器被成功復位的。
但隨著系統(tǒng)的頻率越來越快,全局復位信號的釋放形成一個高扇出的網(wǎng)絡。
Fan-out即扇出,模塊直接調(diào)用的下級模塊的個數(shù),如果這個數(shù)值過大的話,在FPGA直接表現(xiàn)為net delay較大,不利于時序收斂。因此,在寫代碼時應盡量避免高扇出的情況。
如圖,全局復位的釋放需要傳輸?shù)讲煌挠|發(fā)器。每一個觸發(fā)器需要被釋放復位,但是隨著時鐘頻率的提高,加上復位路徑網(wǎng)絡的延遲,而且全局復位還是一個高扇出的網(wǎng)絡,所以這對系統(tǒng)的時序是一個大挑戰(zhàn)。
通常情況下,復位信號的異步釋放,沒有辦法保證所有的觸發(fā)器都能在同一時間內(nèi)釋放。觸發(fā)器在A時刻接收到復位信號釋放是最穩(wěn)定的,在下一個時鐘沿來臨被激活,但是如果在C時刻接收到復位信號釋放無法被激活,在B時刻收到復位信號釋放,則會引起亞穩(wěn)態(tài)。
隨著系統(tǒng)時鐘頻率的提高,并不是所有的觸發(fā)器都能在同一個時刻從復位狀態(tài)被釋放。
復位真的有那么重要嗎?
白皮書上又說了,好的消息是99.9%的情況下,全局復位的異步釋放并不會出現(xiàn)問題。所以大多數(shù)電路都可以正常工作。但是,如果你有了第一次就不能工作的電路,那你就是遇到那0.01%的情況,很不幸你的復位信號被在錯誤的時刻重置。(哈哈,皮)。
在一些情況下,復位釋放的時間并不重要。
當你的數(shù)據(jù)采用流水線操作的時候,復位釋放的時間并不重要,因為不管你流水線后面的觸發(fā)器復位釋放后是否出錯,只需要一些周期后,整個流水線就又會正常工作了。白皮書上還說,這樣的復位也是沒有意義的。
但是有一些情況下,復位的釋放后是很重要的。
比如獨熱碼狀態(tài)機。如果表示獨熱碼狀態(tài)的第一個觸發(fā)器比第二個觸發(fā)器早釋放了一個時鐘周期,那狀態(tài)機的狀態(tài)機會跳轉(zhuǎn)到一個無效的狀態(tài)。如果所有的表示獨熱碼的寄存器無法在同一個周期內(nèi)被釋放,那狀態(tài)機肯定會跳轉(zhuǎn)到一個無效的狀態(tài)。還有一些例子,請讀者自己看白皮書。
解決99.99%的情況
其實當Xilinx FPGA配置或重新配置時,所有的單元都會被初始化。白皮書稱為master reset,因為這可比你復位一些D觸發(fā)器要強得多,它甚至初始化了片內(nèi)RAM。
Xilinx的器件也有嵌入處理的系列,軟核或硬核。在程序執(zhí)行第一條指令前,程序和數(shù)據(jù)區(qū)域已經(jīng)定義好了。有了上電復位,還用專門消耗邏輯資源去復位觸發(fā)器是沒有意義的。
解決0.01%的方法
當然,白皮書也給出了處理復位的建議和方法。
Think Local, Not Global。異步復位,同步釋放的方法。用內(nèi)部定義復位信號的方法來復位觸發(fā)器,而不是全都直接使用全局復位信號。當進行復位操作時,所有的觸發(fā)器被預設為1。如上圖,移位寄存器的最后一個觸發(fā)器去操作模塊內(nèi)部定義的復位網(wǎng)絡。當復位信號釋放時,移位寄存器經(jīng)過移位,當最后一個觸發(fā)器由高電平變?yōu)榈碗娖綍r,對本地的復位網(wǎng)絡進行復位操作。也就是異步復位,同步釋放。
復位的消耗的資源比你想象的要多
復位網(wǎng)絡占用大量布線資源。
提高了布局布線時間。
使用器件的邏輯資源。
會使你的設計變得更大。
占用更多的邏輯資源肯定會影響你的性能。
具體請參閱白皮書。
總結
并不是所有部分的設計都需要復位,所以設計者在設計過程中應該準確判斷需要被復位的部分,從而采用異步復位、同步釋放的方法進行對復位的嚴格處理。
當我們在設計每一個部分的時候,都要內(nèi)心問問自己,這個bit需要被復位嗎?
那么怎樣處理Xilinx FPGA中的復位呢?Xilinx的工程師也給出了解釋和方法。
https://www.eetimes.com/document.asp?doc_id=1278998
http://xilinx.eetrend.com/d6-xilinx/article/2013-07/4343.html
White Paper獲得在微信訂閱號后臺回復“wp272”即可獲得!
簡單總結就是,Xilinx的FPGA應該盡量避免全局復位,有些部分的設計都可以不用復位,必需要復位的設計而采用 同步 高復位。
代碼如下。設計中需要復位的部分,使用產(chǎn)生的sys_rst信號進行同步復位,而且是同步 高復位。再次貼出下圖。
1module Sys_Rst(
2 input clk,
3 input rst,
4 output sys_rst
5
6);
7
8reg rst_r0;
9reg rst_r1;
10
11always @(posedge clk orposedge rst)begin
12 if(rst)begin
13 rst_r0 <= 1'b1;
14 rst_r1 <= 1'b1;
15 end
16 elsebegin
17 rst_r0 <= 1'b0;
18 rst_r1 <= rst_r0;
19 end
20end
21
22assign sys_rst = rst_r1;
23
24endmodule
-
FPGA
+關注
關注
1645文章
22046瀏覽量
618286 -
寄存器
+關注
關注
31文章
5434瀏覽量
124438 -
Xilinx
+關注
關注
73文章
2185瀏覽量
125299
原文標題:你真的會Xilinx FPGA的復位嗎?
文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
fpga設計實戰(zhàn):復位電路仿真設計

詳細解讀FPGA復位的重點
基于Xilinx FPGA的復位信號處理

FPGA全局復位及局部復位設計分享
在FPGA開發(fā)中盡量避免全局復位的使用?(2)

FPGA的理想的復位方法和技巧

Xilinx FPGA的同步復位和異步復位
FPGA怎么搭復位電路 fpga復位電路設計方案
FPGA設計實戰(zhàn)-復位電路仿真設計
FPGA復位電路的實現(xiàn)方式

你真的會Xilinx FPGA的復位嗎?

FPGA同步復位和異步復位
FPGA復位的8種技巧

評論