你真的會Xilinx FPGA的復位嗎?
Get Smart About Reset: Think Local, Not Global。
對於復位訊號的處理,為了方便我們習慣上採用全域性復位,博主在很長一段時間內都是將復位訊號作為一個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建議的是儘量避免使用全域性復位,這是為什麼呢。
全域性復位並不是好的處理方式
我們習慣上通常使用的復位有三種,
硬體開關:復位訊號接一個撥碼開關。
電源晶片:上電時候電源晶片產生,可以長時間維持,直到穩定。
控制晶片:控制晶片產生復位脈衝。
這些復位訊號和FPGA內部訊號的變化比起來是比較慢的。復位按鈕最快也會到達毫秒級別,而FPGA內部訊號都是納秒級別的變化。全域性復位的週期遠大於系統時鐘的週期,是完全可以保證所有的觸發器被成功復位的。
但隨著系統的頻率越來越快,全域性復位訊號的釋放形成一個高扇出的網路。
Fan-out即扇出,模組直接呼叫的下級模組的個數,如果這個數值過大的話,在FPGA直接表現為net delay較大,不利於時序收斂。因此,在寫程式碼時應儘量避免高扇出的情況。
如圖,全域性復位的釋放需要傳輸到不同的觸發器。每一個觸發器需要被釋放復位,但是隨著時鐘頻率的提高,加上覆位路徑網路的延遲,而且全域性復位還是一個高扇出的網路,所以這對系統的時序是一個大挑戰。
通常情況下,復位訊號的非同步釋放,沒有辦法保證所有的觸發器都能在同一時間內釋放。觸發器在A時刻接收到復位訊號釋放是最穩定的,在下一個時鐘沿來臨被啟用,但是如果在C時刻接收到復位訊號釋放無法被啟用,在B時刻收到復位訊號釋放,則會引起亞穩態。
隨著系統時鐘頻率的提高,並不是所有的觸發器都能在同一個時刻從復位狀態被釋放。
復位真的有那麼重要嗎?
白皮書上又說了,好的訊息是99.9%的情況下,全域性復位的非同步釋放並不會出現問題。所以大多數電路都可以正常工作。但是,如果你有了第一次就不能工作的電路,那你就是遇到那0.01%的情況,很不幸你的復位訊號被在錯誤的時刻重置。(哈哈,皮)
在一些情況下,復位釋放的時間並不重要。
當你的資料採用流水線操作的時候,復位釋放的時間並不重要,因為不管你流水線後面的觸發器復位釋放後是否出錯,只需要一些週期後,整個流水線就又會正常工作了。白皮書上還說,這樣的復位也是沒有意義的。
但是有一些情況下,復位的釋放後是很重要的。
比如獨熱碼狀態機。如果表示獨熱碼狀態的第一個觸發器比第二個觸發器早釋放了一個時鐘週期,那狀態機的狀態機會跳轉到一個無效的狀態。如果所有的表示獨熱碼的暫存器無法在同一個週期內被釋放,那狀態機肯定會跳轉到一個無效的狀態。還有一些例子,請讀者自己看白皮書。
解決99.99%的情況
其實當Xilinx FPGA配置或重新配置時,所有的單元都會被初始化。白皮書稱為master reset,因為這可比你復位一些D觸發器要強得多,它甚至初始化了片內RAM。
Xilinx的器件也有嵌入處理的系列,軟核或硬核。在程式執行第一條指令前,程式和資料區域已經定義好了。有了上電覆位,還用專門消耗邏輯資源去復位觸發器是沒有意義的。
解決0.01%的方法
當然,白皮書也給出了處理復位的建議和方法。
Think Local, Not Global。非同步復位,同步釋放的方法。用內部定義復位訊號的方法來複位觸發器,而不是全都直接使用全域性復位訊號。當進行復位操作時,所有的觸發器被預設為1。如上圖,移位暫存器的最後一個觸發器去操作模組內部定義的復位網路。當復位訊號釋放時,移位暫存器經過移位,當最後一個觸發器由高電平變為低電平時,對本地的復位網路進行復位操作。也就是非同步復位,同步釋放。
復位的消耗的資源比你想象的要多
復位網路佔用大量佈線資源。
提高了佈局佈線時間。
使用器件的邏輯資源。
會使你的設計變得更大。
佔用更多的邏輯資源肯定會影響你的效能。
具體請參閱白皮書。
總結
並不是所有部分的設計都需要復位,所以設計者在設計過程中應該準確判斷需要被複位的部分,從而採用非同步復位、同步釋放的方法進行對復位的嚴格處理。
當我們在設計每一個部分的時候,都要內心問問自己,這個bit需要被複位嗎?
那麼怎樣處理Xilinx FPGA中的復位呢?Xilinx的工程師也給出瞭解釋和方法。
ofollow,noindex" target="_blank">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 應該儘量避免全域性復位,有些部分的設計都可以不用復位,必需要復位的設計而採用 同步 高復位。
程式碼如下。設計中需要復位的部分,使用產生的sys_rst訊號進行同步復位,而且是同步 高復位。再次貼出下圖。
1 module Sys_Rst( 2inputclk, 3inputrst, 4outputsys_rst 5 6 ); 7 8 regrst_r0; 9 regrst_r1; 10 11 always @(posedge clk or posedge rst)begin 12if(rst)begin 13rst_r0 <= 1'b1; 14rst_r1 <= 1'b1; 15end 16else begin 17rst_r0 <= 1'b0; 18rst_r1 <= rst_r0; 19end 20 end 21 22 assignsys_rst = rst_r1; 23 24 endmodule
轉載請註明出處:NingHeChuan(寧河川)
個人微信訂閱號:矽農
如果你想及時收到個人撰寫的博文推送,可以掃描左邊二維碼(或者長按識別二維碼)關注個人微信訂閱號
知乎ID: NingHeChuan
微博ID:NingHeChuan