作者:NingHeChuan
Get Smart About Reset: Think Local, Not Global。
對(duì)于復(fù)位信號(hào)的處理,為了方便我們習(xí)慣上采用全局復(fù)位,博主在很長(zhǎng)一段時(shí)間內(nèi)都是將復(fù)位信號(hào)作為一個(gè)I/O口,通過撥碼開關(guān)硬件復(fù)位。后來也看了一些書籍,采用異步復(fù)位同步釋放,對(duì)自己設(shè)計(jì)的改進(jìn)。
不過自從我研讀了Xilinx的White Paper后,讓我對(duì)復(fù)位有了更新的認(rèn)識(shí)。
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."
這句是用來裝逼的。使用全局復(fù)位有利于我們仿真,所有的寄存器都是有初始值的,也可以在任意時(shí)刻讓你的寄存器恢復(fù)初值,所以驗(yàn)證工程師很喜歡這樣的設(shè)計(jì),但是Xilinx建議的是盡量避免使用全局復(fù)位,這是為什么呢。
全局復(fù)位并不是好的處理方式
我們習(xí)慣上通常使用的復(fù)位有三種,
硬件開關(guān):復(fù)位信號(hào)接一個(gè)撥碼開關(guān)。
電源芯片:上電時(shí)候電源芯片產(chǎn)生,可以長(zhǎng)時(shí)間維持,直到穩(wěn)定。
控制芯片:控制芯片產(chǎn)生復(fù)位脈沖。
這些復(fù)位信號(hào)和FPGA內(nèi)部信號(hào)的變化比起來是比較慢的。復(fù)位按鈕最快也會(huì)到達(dá)毫秒級(jí)別,而FPGA內(nèi)部信號(hào)都是納秒級(jí)別的變化。全局復(fù)位的周期遠(yuǎn)大于系統(tǒng)時(shí)鐘的周期,是完全可以保證所有的觸發(fā)器被成功復(fù)位的。
但隨著系統(tǒng)的頻率越來越快,全局復(fù)位信號(hào)的釋放形成一個(gè)高扇出的網(wǎng)絡(luò)。
Fan-out即扇出,模塊直接調(diào)用的下級(jí)模塊的個(gè)數(shù),如果這個(gè)數(shù)值過大的話,在FPGA直接表現(xiàn)為net delay較大,不利于時(shí)序收斂。因此,在寫代碼時(shí)應(yīng)盡量避免高扇出的情況。
如圖,全局復(fù)位的釋放需要傳輸?shù)讲煌挠|發(fā)器。每一個(gè)觸發(fā)器需要被釋放復(fù)位,但是隨著時(shí)鐘頻率的提高,加上復(fù)位路徑網(wǎng)絡(luò)的延遲,而且全局復(fù)位還是一個(gè)高扇出的網(wǎng)絡(luò),所以這對(duì)系統(tǒng)的時(shí)序是一個(gè)大挑戰(zhàn)。
通常情況下,復(fù)位信號(hào)的異步釋放,沒有辦法保證所有的觸發(fā)器都能在同一時(shí)間內(nèi)釋放。觸發(fā)器在A時(shí)刻接收到復(fù)位信號(hào)釋放是最穩(wěn)定的,在下一個(gè)時(shí)鐘沿來臨被激活,但是如果在C時(shí)刻接收到復(fù)位信號(hào)釋放無法被激活,在B時(shí)刻收到復(fù)位信號(hào)釋放,則會(huì)引起亞穩(wěn)態(tài)。
隨著系統(tǒng)時(shí)鐘頻率的提高,并不是所有的觸發(fā)器都能在同一個(gè)時(shí)刻從復(fù)位狀態(tài)被釋放。
復(fù)位真的有那么重要嗎?
白皮書上又說了,好的消息是99.9%的情況下,全局復(fù)位的異步釋放并不會(huì)出現(xiàn)問題。所以大多數(shù)電路都可以正常工作。但是,如果你有了第一次就不能工作的電路,那你就是遇到那0.01%的情況,很不幸你的復(fù)位信號(hào)被在錯(cuò)誤的時(shí)刻重置。(哈哈,皮)
在一些情況下,復(fù)位釋放的時(shí)間并不重要。
當(dāng)你的數(shù)據(jù)采用流水線操作的時(shí)候,復(fù)位釋放的時(shí)間并不重要,因?yàn)椴还苣懔魉€后面的觸發(fā)器復(fù)位釋放后是否出錯(cuò),只需要一些周期后,整個(gè)流水線就又會(huì)正常工作了。白皮書上還說,這樣的復(fù)位也是沒有意義的。
但是有一些情況下,復(fù)位的釋放后是很重要的。
比如獨(dú)熱碼狀態(tài)機(jī)。如果表示獨(dú)熱碼狀態(tài)的第一個(gè)觸發(fā)器比第二個(gè)觸發(fā)器早釋放了一個(gè)時(shí)鐘周期,那狀態(tài)機(jī)的狀態(tài)機(jī)會(huì)跳轉(zhuǎn)到一個(gè)無效的狀態(tài)。如果所有的表示獨(dú)熱碼的寄存器無法在同一個(gè)周期內(nèi)被釋放,那狀態(tài)機(jī)肯定會(huì)跳轉(zhuǎn)到一個(gè)無效的狀態(tài)。還有一些例子,請(qǐng)讀者自己看白皮書。
解決99.99%的情況
其實(shí)當(dāng)Xilinx FPGA配置或重新配置時(shí),所有的單元都會(huì)被初始化。白皮書稱為master reset,因?yàn)檫@可比你復(fù)位一些D觸發(fā)器要強(qiáng)得多,它甚至初始化了片內(nèi)RAM。
Xilinx的器件也有嵌入處理的系列,軟核或硬核。在程序執(zhí)行第一條指令前,程序和數(shù)據(jù)區(qū)域已經(jīng)定義好了。有了上電復(fù)位,還用專門消耗邏輯資源去復(fù)位觸發(fā)器是沒有意義的。
解決0.01%的方法
當(dāng)然,白皮書也給出了處理復(fù)位的建議和方法。
Think Local, Not Global。異步復(fù)位,同步釋放的方法。用內(nèi)部定義復(fù)位信號(hào)的方法來復(fù)位觸發(fā)器,而不是全都直接使用全局復(fù)位信號(hào)。當(dāng)進(jìn)行復(fù)位操作時(shí),所有的觸發(fā)器被預(yù)設(shè)為1。如上圖,移位寄存器的最后一個(gè)觸發(fā)器去操作模塊內(nèi)部定義的復(fù)位網(wǎng)絡(luò)。當(dāng)復(fù)位信號(hào)釋放時(shí),移位寄存器經(jīng)過移位,當(dāng)最后一個(gè)觸發(fā)器由高電平變?yōu)榈碗娖綍r(shí),對(duì)本地的復(fù)位網(wǎng)絡(luò)進(jìn)行復(fù)位操作。也就是異步復(fù)位,同步釋放。
復(fù)位的消耗的資源比你想象的要多
復(fù)位網(wǎng)絡(luò)占用大量布線資源。
提高了布局布線時(shí)間。
使用器件的邏輯資源。
會(huì)使你的設(shè)計(jì)變得更大。
占用更多的邏輯資源肯定會(huì)影響你的性能。
具體請(qǐng)參閱白皮書。
總結(jié)
并不是所有部分的設(shè)計(jì)都需要復(fù)位,所以設(shè)計(jì)者在設(shè)計(jì)過程中應(yīng)該準(zhǔn)確判斷需要被復(fù)位的部分,從而采用異步復(fù)位、同步釋放的方法進(jìn)行對(duì)復(fù)位的嚴(yán)格處理。
當(dāng)我們?cè)谠O(shè)計(jì)每一個(gè)部分的時(shí)候,都要內(nèi)心問問自己,這個(gè)bit需要被復(fù)位嗎?
那么怎樣處理Xilinx FPGA中的復(fù)位呢?Xilinx的工程師也給出了解釋和方法。
https://www.eetimes.com/document.asp?doc_id=1278998
http://xilinx.eetrend.com/d6-xilinx/article/2013-07/4343.html
簡(jiǎn)單總結(jié)就是,Xilinx的FPGA 應(yīng)該盡量避免全局復(fù)位,有些部分的設(shè)計(jì)都可以不用復(fù)位,必需要復(fù)位的設(shè)計(jì)而采用 同步 高復(fù)位。
代碼如下。設(shè)計(jì)中需要復(fù)位的部分,使用產(chǎn)生的sys_rst信號(hào)進(jìn)行同步復(fù)位,而且是同步 高復(fù)位。再次貼出下圖。
module Sys_Rst(
input clk,
input rst,
output sys_rst
);
reg rst_r0;
reg rst_r1;
always @(posedge clk or posedge rst)begin
if(rst)begin
rst_r0 rst_r1 end
else begin
rst_r0 rst_r1 end
end
assign sys_rst = rst_r1;
endmodule
編輯:hfy
-
FPGA
+關(guān)注
關(guān)注
1644文章
21989瀏覽量
615218 -
寄存器
+關(guān)注
關(guān)注
31文章
5426瀏覽量
123677 -
Xilinx
+關(guān)注
關(guān)注
73文章
2184瀏覽量
124569 -
狀態(tài)機(jī)
+關(guān)注
關(guān)注
2文章
493瀏覽量
28111
發(fā)布評(píng)論請(qǐng)先 登錄
XILINX XCZU67DR FPGA完整原理圖
Xilinx Shift RAM IP概述和主要功能
進(jìn)群免費(fèi)領(lǐng)FPGA學(xué)習(xí)資料!數(shù)字信號(hào)處理、傅里葉變換與FPGA開發(fā)等
復(fù)位電路的作用、控制方式和類型

xilinx FPGA IOB約束使用以及注意事項(xiàng)

基于Xilinx ZYNQ7000 FPGA嵌入式開發(fā)實(shí)戰(zhàn)指南
FPGA 實(shí)時(shí)信號(hào)處理應(yīng)用 FPGA在圖像處理中的優(yōu)勢(shì)
FPGA復(fù)位的8種技巧

采用Xilinx FPGA的AFE79xx SPI啟動(dòng)指南

復(fù)位電路的設(shè)計(jì)問題

基于DSP TMS320C6678+FPGA XC7V690T的6U VPX信號(hào)處理卡

Xilinx 7系列FPGA PCIe Gen3的應(yīng)用接口及特性

評(píng)論