常見的FPGA復(fù)位設(shè)計(jì)

2023-05-14 15:15:30 來源:FPGA入門到精通

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è)值得探討的問題。


(資料圖片僅供參考)

一、為什么需要進(jìn)行復(fù)位?

在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ù)位同步釋放。

二、常見的復(fù)位設(shè)計(jì)

根據(jù)復(fù)位方式的不同,F(xiàn)PGA復(fù)位信號(hào)可以分為外部復(fù)位和內(nèi)部復(fù)位兩種,復(fù)位信號(hào)也要分為高電平復(fù)位有效或低電平復(fù)位有效。

1、外部復(fù)位

外部復(fù)位是指由硬件按鍵或芯片產(chǎn)生的復(fù)位信號(hào),也可由軟件產(chǎn)生,但這些信號(hào)往往與FPGA內(nèi)部各個(gè)時(shí)鐘信號(hào)異步。

2、內(nèi)部復(fù)位

內(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è)周期以上。

3、復(fù)位信號(hào)特點(diǎn)

(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)

4、寄存器復(fù)位與賦初值

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ù)位。

三、是否需要對(duì)每個(gè)寄存器都進(jìn)行復(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)簽:

上一篇:CAN總線相關(guān)知識(shí)點(diǎn)歸納 快消息
下一篇:最后一頁