
在FPGA設(shè)計(jì)中,當(dāng)復(fù)位整個(gè)系統(tǒng)或功能模塊時(shí),需要將先關(guān)寄存器被清零或者賦初值,以保證整個(gè)系統(tǒng)或功能運(yùn)行正常。在大部分的設(shè)計(jì)中,我們經(jīng)常用“同步復(fù)位”或“異步復(fù)位”直接將所有的寄存器全部復(fù)位,這部分可能大家都習(xí)以為常。但實(shí)際上,是否需要每個(gè)寄存器都進(jìn)行復(fù)位呢?這是一個(gè)值得探討的問題。
(資料圖片僅供參考)
在FPGA設(shè)計(jì)中,復(fù)位是一個(gè)基本操作。復(fù)位的目的是將FPGA的寄存器清零或賦初值,以確保仿真或正常上板運(yùn)行時(shí)正常,以防止出現(xiàn)不確定的運(yùn)行狀態(tài)。
需要注意的是,F(xiàn)PGA中可編程邏輯塊和寄存器,可能運(yùn)行在不同的時(shí)鐘和狀態(tài)下,在某些功能突然停止運(yùn)行時(shí),可能處于未知狀態(tài),如果不按照預(yù)期的方式進(jìn)行復(fù)位操作,F(xiàn)PGA可能無法正常工作。
如果需要了解同步復(fù)位與異步復(fù)位,請(qǐng)看這篇文章:FPGA中的異步復(fù)位、同步復(fù)位與異步復(fù)位同步釋放。
根據(jù)復(fù)位方式的不同,F(xiàn)PGA復(fù)位信號(hào)可以分為外部復(fù)位和內(nèi)部復(fù)位兩種,復(fù)位信號(hào)也要分為高電平復(fù)位有效或低電平復(fù)位有效。
外部復(fù)位是指由硬件按鍵或芯片產(chǎn)生的復(fù)位信號(hào),也可由軟件產(chǎn)生,但這些信號(hào)往往與FPGA內(nèi)部各個(gè)時(shí)鐘信號(hào)異步。
內(nèi)部復(fù)位是由FPGA內(nèi)部邏輯產(chǎn)生的復(fù)位信號(hào),例如在上電后自動(dòng)復(fù)位或識(shí)別到某種內(nèi)部命令后自發(fā)產(chǎn)生復(fù)位信號(hào)。這些復(fù)位信號(hào)相對(duì)于某一時(shí)鐘域往往是同步的,但如果存在多個(gè)時(shí)鐘域,也可能會(huì)存在異步復(fù)位信號(hào)的情況。
對(duì)于一個(gè)正常的FPGA系統(tǒng)來說,上電自動(dòng)復(fù)位和手動(dòng)按鍵復(fù)位都是必須的,二者相輔相成。除此之外,我們還需要根據(jù)實(shí)際情況確定是否需要對(duì)每個(gè)寄存器進(jìn)行復(fù)位操作,以及選擇適當(dāng)?shù)膹?fù)位方式和控制復(fù)位操作的時(shí)機(jī)。在進(jìn)行FPGA復(fù)位設(shè)計(jì)時(shí),還需要注意復(fù)位電路的功耗,以減少不必要的功耗損失。
注意:軟復(fù)位邏輯需要注意復(fù)位信號(hào)持續(xù)時(shí)間,比如一般fifo復(fù)位至少需要保持8個(gè)周期以上。
(1)復(fù)位網(wǎng)絡(luò)需要占用布線資源,會(huì)使得剩余的布線資源變少,對(duì)于布線設(shè)計(jì)帶來挑戰(zhàn)。(2)復(fù)位信號(hào)的引入可能會(huì)對(duì)其他信號(hào)的布線自由度造成限制,這意味著布線可能需要更多的代價(jià)才能成功完成。(3)復(fù)位網(wǎng)絡(luò)占用大量的布局網(wǎng)絡(luò)資源,會(huì)導(dǎo)致Place & Route的時(shí)間大大增加。(4)復(fù)位信號(hào)需要占用額外的邏輯資源,可能會(huì)影響整個(gè)FPGA芯片設(shè)計(jì)的資源消耗。(5)需要使用觸發(fā)器的專用復(fù)位管腳才能實(shí)現(xiàn)復(fù)位信號(hào)的輸入,這也會(huì)占用有限的管腳資源。(6)可操作的復(fù)位信號(hào)往往需要在D觸發(fā)器輸入前增加額外的門操作或?qū)S玫膹?fù)位信號(hào)輸入,可能會(huì)降低系統(tǒng)性能。
(7)大量的使用全局復(fù)位,復(fù)位信號(hào)將變成一個(gè)高扇出的信號(hào),這對(duì)時(shí)序收斂無疑是一個(gè)巨大的挑戰(zhàn)
FPGA的內(nèi)部資源(觸發(fā)器和RAM)等都會(huì)在上電后默認(rèn)賦初值,一般是0,也可以在定義寄存器時(shí)賦初值,如:
reg [1:0] test = "d2; //定義時(shí)賦初值
以上這個(gè)賦初值操作實(shí)際意義不大,但只在系統(tǒng)上電后有效,當(dāng)FPGA中系統(tǒng)運(yùn)行起來后,這個(gè)變量的值處于變化的狀態(tài),還是需要通過復(fù)位信號(hào)或者使能信號(hào)來控制將信號(hào)復(fù)位。
FPGA復(fù)位需要消耗FPGA內(nèi)部資源,也會(huì)影響FPGA布線和時(shí)序收斂,所以對(duì)于每個(gè)寄存器都進(jìn)行復(fù)位并不是最優(yōu)方案,比如寄存器變量延遲幾拍、有使能信號(hào)或有效信號(hào)控制的信號(hào)變量等情況都可以不做復(fù)位處理,如下所示:
module test( input clk, input rst, input data_valid_i, input data_i, output reg data0_valid_o, output reg data0_o, output reg data1_valid_o, output reg data1_o, output reg data2_valid_o, output reg data2_o);reg d_r0, d_r1;always @(posedge clk) begin d_r0 <= data_i; d_r1 <= d_r0;?endalways @(posedge clk) begin data0_valid_o <= data_valid_i; if(data_valid_i) begin data0_o <= data_i; end else begin data0_o <= "b0; endendalways @(posedge clk) begin if(rst) begin data1_valid_o <= "b0; data1_o <= "b0; end else begin data1_valid_o <= data_valid_i; if(data_valid_i) begin data1_o <= data_i; end else begin data1_o <= "b0; end endendalways @(posedge clk or posedge rst) begin if(rst) begin data2_valid_o <= "b0; data2_o <= "b0; end else begin data2_valid_o <= data_valid_i; if(data_valid_i) begin data2_o <= data_i; end else begin data2_o <= "b0; end endendendmodule
vivado綜合后電路如下:
無復(fù)位信號(hào)
同步復(fù)位
異步復(fù)位
以上圖中可以看出,沒有復(fù)位信號(hào)的模塊中,F(xiàn)DRE型觸發(fā)器的復(fù)位輸入接入了地,節(jié)省了復(fù)位信號(hào)的扇出。
標(biāo)簽: