對於復位信號的處理,爲了方便咱們習慣上採用全局復位,博主在很長一段時間內都是將復位信號做爲一個I/O口,經過撥碼開關硬件復位。後來也看了一些書籍,採用異步復位同步釋放,對本身設計的改進。html
不過自從我研讀了Xilinx的White Paper後,讓我對復位有了更新的認識。git
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建議的是儘可能避免使用全局復位,這是爲何呢。網絡
咱們習慣上一般使用的復位有三種,異步
硬件開關:復位信號接一個撥碼開關。佈局
電源芯片:上電時候電源芯片產生,能夠長時間維持,直到穩定。性能
控制芯片:控制芯片產生復位脈衝。spa
這些復位信號和FPGA內部信號的變化比起來是比較慢的。復位按鈕最快也會到達毫秒級別,而FPGA內部信號都是納秒級別的變化。全局復位的週期遠大於系統時鐘的週期,是徹底能夠保證全部的觸發器被成功復位的。設計
但隨着系統的頻率愈來愈快,全局復位信號的釋放造成一個高扇出的網絡。3d
Fan-out即扇出,模塊直接調用的下級模塊的個數,若是這個數值過大的話,在FPGA直接表現爲net delay較大,不利於時序收斂。所以,在寫代碼時應儘可能避免高扇出的狀況。
如圖,全局復位的釋放須要傳輸到不一樣的觸發器。每個觸發器須要被釋放復位,可是隨着時鐘頻率的提升,加上覆位路徑網絡的延遲,並且全局復位仍是一個高扇出的網絡,因此這對系統的時序是一個大挑戰。
一般狀況下,復位信號的異步釋放,沒有辦法保證全部的觸發器都能在同一時間內釋放。觸發器在A時刻接收到復位信號釋放是最穩定的,在下一個時鐘沿來臨被激活,可是若是在C時刻接收到復位信號釋放沒法被激活,在B時刻收到復位信號釋放,則會引發亞穩態。
隨着系統時鐘頻率的提升,並非全部的觸發器都能在同一個時刻從復位狀態被釋放。
白皮書上又說了,好的消息是99.9%的狀況下,全局復位的異步釋放並不會出現問題。因此大多數電路均可以正常工做。可是,若是你有了第一次就不能工做的電路,那你就是遇到那0.01%的狀況,很不幸你的復位信號被在錯誤的時刻重置。(哈哈,皮)
在一些狀況下,復位釋放的時間並不重要。
當你的數據採用流水線操做的時候,復位釋放的時間並不重要,由於無論你流水線後面的觸發器復位釋放後是否出錯,只須要一些週期後,整個流水線就又會正常工做了。白皮書上還說,這樣的復位也是沒有意義的。
可是有一些狀況下,復位的釋放後是很重要的。
好比獨熱碼狀態機。若是表示獨熱碼狀態的第一個觸發器比第二個觸發器早釋放了一個時鐘週期,那狀態機的狀態機會跳轉到一個無效的狀態。若是全部的表示獨熱碼的寄存器沒法在同一個週期內被釋放,那狀態機確定會跳轉到一個無效的狀態。還有一些例子,請讀者本身看白皮書。
其實當Xilinx FPGA配置或從新配置時,全部的單元都會被初始化。白皮書稱爲master reset,由於這可比你復位一些D觸發器要強得多,它甚至初始化了片內RAM。
Xilinx的器件也有嵌入處理的系列,軟核或硬核。在程序執行第一條指令前,程序和數據區域已經定義好了。有了上電覆位,還用專門消耗邏輯資源去復位觸發器是沒有意義的。
固然,白皮書也給出了處理復位的建議和方法。
Think Local, Not Global。異步復位,同步釋放的方法。用內部定義復位信號的方法來複位觸發器,而不是全都直接使用全局復位信號。當進行復位操做時,全部的觸發器被預設爲1。如上圖,移位寄存器的最後一個觸發器去操做模塊內部定義的復位網絡。當復位信號釋放時,移位寄存器通過移位,當最後一個觸發器由高電平變爲低電平時,對本地的復位網絡進行復位操做。也就是異步復位,同步釋放。
復位網絡佔用大量佈線資源。
提升了佈局佈線時間。
使用器件的邏輯資源。
會使你的設計變得更大。
佔用更多的邏輯資源確定會影響你的性能。
具體請參閱白皮書。
並非全部部分的設計都須要復位,因此設計者在設計過程當中應該準確判斷須要被複位的部分,從而採用異步復位、同步釋放的方法進行對復位的嚴格處理。
當咱們在設計每個部分的時候,都要心裏問問本身,這個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 應該儘可能避免全局復位,有些部分的設計均可以不用復位,必須要復位的設計而採用 同步 高復位。
代碼以下。設計中須要復位的部分,使用產生的sys_rst信號進行同步復位,並且是同步 高復位。再次貼出下圖。
1 module Sys_Rst( 2 input clk, 3 input rst, 4 output sys_rst 5 6 ); 7 8 reg rst_r0; 9 reg rst_r1; 10 11 always @(posedge clk or posedge rst)begin 12 if(rst)begin 13 rst_r0 <= 1'b1; 14 rst_r1 <= 1'b1; 15 end 16 else begin 17 rst_r0 <= 1'b0; 18 rst_r1 <= rst_r0; 19 end 20 end 21 22 assign sys_rst = rst_r1; 23 24 endmodule
轉載請註明出處:NingHeChuan(寧河川)
我的微信訂閱號:硅農
若是你想及時收到我的撰寫的博文推送,能夠掃描左邊二維碼(或者長按識別二維碼)關注我的微信訂閱號
知乎ID:NingHeChuan
微博ID:NingHeChuan