一開(kāi)始接觸到FPGA,肯定都知道”復(fù)位“,即簡(jiǎn)單又復(fù)雜。簡(jiǎn)單是因?yàn)槌鯇W(xué)時(shí),只需要按照固定的套路——按鍵開(kāi)關(guān)復(fù)位,見(jiàn)寄存器就先低電平復(fù)位一次,這樣一般情況可以解決99%的問(wèn)題,甚至簡(jiǎn)單的設(shè)計(jì),就不可能有問(wèn)題。復(fù)雜是因?yàn)閺?fù)位本身是對(duì)大規(guī)模的硬件單元進(jìn)行一種操作,必須要結(jié)核底層的設(shè)計(jì)來(lái)考慮問(wèn)題。
1. 常見(jiàn)問(wèn)題
自己在學(xué)習(xí)實(shí)踐過(guò)程中,以及看到網(wǎng)友詢問(wèn)的,有關(guān)FPGA復(fù)位設(shè)計(jì)大概有以下幾類問(wèn)題:
我板子上沒(méi)有設(shè)計(jì)按鍵復(fù)位怎么辦?
怎么設(shè)計(jì)上電復(fù)位?不可能上電都要去按鍵吧
同步復(fù)位還是異步復(fù)位?各自優(yōu)勢(shì)是啥?
高電平復(fù)位還是低電平復(fù)位?
……
歸根結(jié)底,就是怎樣設(shè)計(jì)復(fù)位,我可能給不出完美的答案,但查閱了一些資料,總結(jié)了一些設(shè)計(jì)中考慮的因素,在加上參考文獻(xiàn),應(yīng)該能解決99.9%的疑惑。
2. 常見(jiàn)的復(fù)位方式
我們習(xí)慣上通常使用的復(fù)位有三種方式:
硬件開(kāi)關(guān):復(fù)位信號(hào)接一個(gè)撥碼開(kāi)關(guān)或按鍵,或者RC電路
電源芯片:上電時(shí)候電源芯片產(chǎn)生,可以長(zhǎng)時(shí)間維持,直到穩(wěn)定。
控制芯片:控制芯片產(chǎn)生復(fù)位脈沖。
沒(méi)有專門的電源或控制芯片,甚至連按鍵都忘記設(shè)計(jì)的情況下,有人提出可不可以拿內(nèi)部計(jì)數(shù)器做一個(gè)所謂的上電“軟”復(fù)位,如下代碼所示,當(dāng)cnt計(jì)數(shù)到一定的值時(shí),產(chǎn)生一個(gè)復(fù)位脈沖信號(hào)。
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt else
begin
if(cnt cnt else
cnt end
end
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
rst_nr0 rst_nr1 end
else if(cnt == 23‘d50_00000)
begin
rst_nr0 rst_nr1 end
else
begin
rst_nr0 rst_nr1 end
end
沒(méi)有設(shè)計(jì)外部硬件復(fù)位的同學(xué)又會(huì)反駁,我rst_n都沒(méi)有!去掉復(fù)位,默認(rèn)上電cnt = 0,可不可以?既然默認(rèn)cnt = 0了,那其他所有的寄存器不都默認(rèn)為0了嗎?接著往下分析。
3. 合理的復(fù)位設(shè)計(jì)
從參考文獻(xiàn)中得出有關(guān)復(fù)位設(shè)計(jì)的幾條重要結(jié)論,有助于我們明確復(fù)位設(shè)計(jì)的方向,如下:
1. 低電平復(fù)位并不是最合理的處理方式;
2. 建議采用異步復(fù)位同步化(異步復(fù)位同步釋放處理);
3. 全局復(fù)位并不是最佳方式;
4. 并不是所有時(shí)序電路都要加復(fù)位;
對(duì)上述結(jié)論分析,見(jiàn)后續(xù)總結(jié)。
3.1 復(fù)位電平
有關(guān)復(fù)位電平,實(shí)際上是跟FPGA芯片內(nèi)部的觸發(fā)器結(jié)構(gòu)有關(guān),在之前的博文有提到過(guò)。作為xilinx 7系列觸發(fā)器,其 R 端口既可用作同步置位/復(fù)位端口,也可用作異步預(yù)設(shè)/清除端口,但無(wú)論哪種方式,都是高電平有效。Altera的是低電平有效。
當(dāng)在7系列芯片上采用低電平復(fù)位,會(huì)有什么問(wèn)題呢?如下:
如果RTL代碼采用了低電平有效的復(fù)位模式,綜合器將在復(fù)位信號(hào)驅(qū)動(dòng)寄存器SR控制端之前的插入一個(gè)反相器(interver)。你必須使用一個(gè)查找表(look up table)來(lái)實(shí)現(xiàn)反向器,以利用LUT的輸入端口。低電平有效的控制信號(hào)帶來(lái)的額外的邏輯可能拉長(zhǎng)了執(zhí)行時(shí)間(runtime),將導(dǎo)致更低的FPGA資源利用率,也將影響時(shí)序和功耗。
到底我想說(shuō)點(diǎn)什么呢?盡可能的在HDL代碼或者實(shí)例化的模塊中使用高電平有效的控制信號(hào)。如果在設(shè)計(jì)中,你不能夠改變這些控制信號(hào)的極性,你需要在代碼的頂層文件反轉(zhuǎn)這些控制信號(hào)。采用這種方式描述電路的話,這些反向器將被吸收到I/O邏輯中,而不需要使用額外的FPGA邏輯、路徑。
所以再次強(qiáng)調(diào):復(fù)位電平的選擇跟芯片結(jié)構(gòu)有關(guān)!
3.2 異步復(fù)位同步化
異步復(fù)位同步化簡(jiǎn)單的說(shuō)就是將異步復(fù)位信號(hào)在相關(guān)的時(shí)鐘域模塊中進(jìn)行同步化處理。單純的同步復(fù)位、異步復(fù)位以及其他的一些復(fù)位方式,都存在一些缺陷,比如抗噪聲、存在亞穩(wěn)態(tài)等問(wèn)題,深入學(xué)習(xí)可以查閱相關(guān)文獻(xiàn)。
異步復(fù)位同步化處理的結(jié)構(gòu)代碼及schematic(xilinx 7系列)如下:
module rst_signal(
input clk,
input rst,
output sys_rst
);
reg r1_rst,r2_rst;
always@(posedge clk or negedge rst) begin
if(rst) begin
r1_rst r2_rst end else begin
r1_rst r2_rst end
end
assign sys_rst = r2_rst;
endmodule
可以看到,模塊將系統(tǒng)輸入的異步復(fù)位信號(hào)進(jìn)行同步,產(chǎn)生了一個(gè)后續(xù)邏輯使用的同步化了的異步復(fù)位,隨后即可將該復(fù)位信號(hào)sys_rst用于其他模塊的復(fù)位。為了減少亞穩(wěn)態(tài)對(duì)上述同步器中的兩個(gè)寄存器的影響,這兩個(gè)寄存器應(yīng)該在FPGA中被放置的越靠近越好(相應(yīng)的約束:set_property ASYNC_REG TRUE [get_cells [list r1_rst_reg r2_rst_reg]]),盡量減少布線延遲。
以上只是一個(gè)基本原理示意,在實(shí)際使用過(guò)程中還應(yīng)注意以下兩點(diǎn):
外部輸入異步復(fù)位信號(hào)應(yīng)該增加濾波和去抖處理;
在復(fù)位之前,確保由 MMCM 或PLL 生成的時(shí)鐘是穩(wěn)定且被鎖定的;
將異步復(fù)位信號(hào)分別引入不同的時(shí)鐘域進(jìn)行同步化
綜上,復(fù)位處理的原理圖如下所示:
3.3 恰到好處的復(fù)位
看似簡(jiǎn)單的復(fù)位,實(shí)際上不簡(jiǎn)單,來(lái)系數(shù)復(fù)位的N宗罪:
復(fù)位網(wǎng)絡(luò)需要占用布線資源;
導(dǎo)致其余信號(hào)的布線信號(hào)受到影響,降低了它們布線的自由度;
增加的布線網(wǎng)絡(luò)往往需要使用更高速率的芯片;
復(fù)位網(wǎng)絡(luò)占用大量布線資源,使得Place&Route的時(shí)間大大增加;
復(fù)位信號(hào)需要占用大量的邏輯資源;
復(fù)位信號(hào)需要使用觸發(fā)器的專用復(fù)位管腳;
可操作的復(fù)位信號(hào)往往導(dǎo)致D觸發(fā)器的輸入前增加額外的門操作或?qū)S玫膹?fù)位信號(hào)輸入;
增大整個(gè)設(shè)計(jì) 的尺寸;
額外的邏輯消耗降低了系統(tǒng)的性能;
阻止了使用高效特征,如Xilinx FPGA特有的SRL16E 移位寄存器。
簡(jiǎn)單的說(shuō),復(fù)位的存在會(huì)對(duì)FPGA的綜合面積產(chǎn)生影響,主要體現(xiàn)在兩個(gè)方面:第一、在編寫代買的時(shí)候,習(xí)慣給所有時(shí)序電路都加上復(fù)位信號(hào),這樣往往會(huì)導(dǎo)致資源無(wú)形的浪費(fèi);第二,沒(méi)有合理的設(shè)計(jì)復(fù)位電路會(huì)產(chǎn)生額外的資源消耗。
什么時(shí)候可以叫復(fù)位呢?一般判斷原則是:
類似于移位寄存器這類直通型電路,只起到一個(gè)傳輸信號(hào)的作用,本身不會(huì)對(duì)信號(hào)產(chǎn)生任何影響。其傳輸信號(hào)正確與否,在于其輸入端的信號(hào)是否正確。因此,此類電路自身無(wú)需加復(fù)位信號(hào),而只需再起輸入端口加復(fù)位信號(hào)(也就是數(shù)據(jù)來(lái)源處的電路),以控制輸入數(shù)據(jù)。
4. 補(bǔ)充
4.1 所謂的上電初始化
當(dāng)一個(gè)Xilinx的FPGA芯片被重新配置時(shí),每一個(gè)單元都將被初始化。在某種意義上講,這是一個(gè)上電之后的“終極的”全局復(fù)位操作,因?yàn)樗粌H僅是對(duì)所有的觸發(fā)器進(jìn)行了復(fù)位操作,還初始化了所有的RAM單元。隨著Xilinx FPGA芯片內(nèi)部的嵌入式RAM資源越來(lái)越多,這種“終極的”全局復(fù)位操作越來(lái)越有意義。對(duì)所有的RAM單元進(jìn)行預(yù)定義,在軟件仿真和實(shí)際操作中都是非常有幫助的,因?yàn)檫@樣避免了在上電時(shí)采用復(fù)雜的啟動(dòng)順序來(lái)清除存儲(chǔ)單元內(nèi)容的操作。
所以在xilinx平臺(tái),開(kāi)篇的“軟”復(fù)位,實(shí)際上是沒(méi)有多大意義的。
綜上,采用以上總結(jié)的復(fù)位處理方法,應(yīng)該能解決99.9%的問(wèn)題了
評(píng)論
查看更多