1、clk中為什么用posedge而不用negedge?
(1)、一般情況下,系統(tǒng)中統(tǒng)一用posedge避免用negedge,降低設(shè)計(jì)的復(fù)雜度,可減少出錯(cuò)。
(2)、在modelsim仿真中,時(shí)鐘是很嚴(yán)格的,但是在真實(shí)的晶振所產(chǎn)生的clock卻是不嚴(yán)格的,比如高電平和低電平的時(shí)間跨度就不一樣,甚至非周期性的微小波動(dòng)。如果只是用posedge,則整個(gè)系統(tǒng)的節(jié)拍都按照clock上升沿對(duì)齊,如果用到了negedge,則系統(tǒng)的節(jié)拍就沒有統(tǒng)一到一個(gè)點(diǎn)上。上升沿到上升沿肯定是一個(gè)時(shí)鐘周期,但是上升沿到下降沿卻很可能不是半個(gè)周期。
(3)、FPGA特有的東西:GLOBAL clk。FPGA內(nèi)部有專門的時(shí)鐘線,和一般的邏輯門走法不一樣,目的是為了保證整個(gè)FPGA內(nèi)部時(shí)鐘盡可能的偏差小。
?
2、BANK劃分與供電策略
FPGA內(nèi)I/O的排布是通過(guò)BANK劃分來(lái)實(shí)現(xiàn)的,若干user I/O與電源I/O被劃分為一個(gè)BANK。如下圖,整個(gè)芯片的user I/O被分成8個(gè)BANK。BANK與BANK之間是相互獨(dú)立的。每個(gè)BANK的user I/O可由不同電平的電源供電而不會(huì)相互影響。不同BANK的user I/O可以配置為不同的I/O標(biāo)準(zhǔn)和電平標(biāo)準(zhǔn),提高了user I/O使用的靈活性。
?
由同一個(gè)電源供電的多個(gè)user I/O同時(shí)跳變時(shí),會(huì)帶來(lái)相當(dāng)大的瞬時(shí)動(dòng)態(tài)電流。由于PAD和封裝引起的電感,這個(gè)電流可能會(huì)在電源軌線上帶來(lái)壓降,嚴(yán)重時(shí)會(huì)因邏輯電平降低而引起翻轉(zhuǎn),使電路工作失效。
?
采用劃分BANK的方法對(duì)user I/O進(jìn)行排布,可以有效改善這個(gè)問(wèn)題。將FPGA中所有的user I/O劃分為多個(gè)BANK分別進(jìn)行獨(dú)立的供電,用戶在編程時(shí)將使用到的user I/O配置于不同的I/O BANK,可以控制每個(gè)BANK內(nèi)同時(shí)翻轉(zhuǎn)的user I/O的數(shù)量,降低瞬時(shí)的動(dòng)態(tài)電流,也可以避免觸地反彈現(xiàn)象的出現(xiàn)。對(duì)于沒有使用到的BANK,還可以關(guān)閉該BANK的電源,能夠有效降低功耗。
?
FPGA中的user I/O一般通過(guò)劃分BANK的方式獨(dú)立進(jìn)行供電,為保證器件在輸出電流驅(qū)動(dòng)片外負(fù)載的情況下能夠正常工作,并保證ESD放電現(xiàn)象發(fā)生時(shí),電源軌線不會(huì)因瞬間的高熱而熔斷燒毀,I/O的電源軌線必須滿足一定的寬度,且留有足夠金屬通孔(VLA)數(shù)量。在設(shè)計(jì)前期,由BANK內(nèi)user I/O的數(shù)量、I/O最大驅(qū)動(dòng)電流以及BANK內(nèi)電源PAD數(shù)量對(duì)BANK內(nèi)電源軌線上通過(guò)最大電流進(jìn)行預(yù)估,根據(jù)Foundry提供的金屬電流密度參數(shù),設(shè)計(jì)合理的電源軌線寬度。
?
在FPGA中,一般有多個(gè)專用I/O的供電和特點(diǎn),對(duì)整個(gè)FPGA芯片的BANK布局進(jìn)行改造,保持user I/O的8個(gè)獨(dú)立BANK不變,在芯片的四角加入了專用I/O對(duì)應(yīng)的4個(gè)BANK----BANKA-BANKD,將所有專用IO和芯核,電源都置于該BANK中,芯核電源的ESD保護(hù)電路通過(guò)該BANK的電源軌線對(duì)ESD放電電流進(jìn)行泄放,而不通過(guò)user I/O對(duì)應(yīng)的BANK進(jìn)行泄放。由于從整個(gè)芯片上電起,專用I/O就由該BANK的電源I/O進(jìn)行供電,不會(huì)存在為了減小功耗而切斷該BANK電源的現(xiàn)象。
3、為什么verilog HDL設(shè)計(jì)中一定要用同步而不能用異步時(shí)序邏輯?
同步時(shí)序邏輯是指狀態(tài)的寄存器組的值只可能在唯一確定的觸發(fā)條件時(shí)刻改變。只能由時(shí)鐘的正條邊沿或負(fù)跳變沿觸發(fā)的狀態(tài)機(jī)就是一例。always@(posedge clock)就是一個(gè)同步時(shí)序邏輯的觸發(fā)條件,表示由該always控制begin end塊中寄存器變量重新賦值的情形只可能是在clock正條邊沿發(fā)生。
?
而異步時(shí)序邏輯是指觸發(fā)條件由多個(gè)控制因素組成,任何一個(gè)因素的跳變都可以引起觸發(fā)。記錄狀態(tài)的寄存器組其是在輸入端不是都連接在同一個(gè)時(shí)鐘信號(hào)上。例如用一個(gè)觸發(fā)器的輸出連接到另一個(gè)觸發(fā)器的時(shí)鐘端去觸發(fā)就是異步時(shí)序邏輯。
?
用Verilog HDL設(shè)計(jì)的可綜合模塊,必須是避免使用異步時(shí)序邏輯,這不但是因?yàn)樵S多綜合器不支持異步時(shí)序邏輯的綜合,而且也因?yàn)橛卯惒綍r(shí)序邏輯確實(shí)難以控制由組合邏輯和延遲所產(chǎn)生的冒險(xiǎn)和競(jìng)爭(zhēng)。當(dāng)電路復(fù)雜度增加時(shí),異步時(shí)序邏輯無(wú)法調(diào)試。工藝的細(xì)微變化也會(huì)造成異步時(shí)序邏輯電路的失效。因?yàn)楫惒綍r(shí)序邏輯中觸發(fā)條件很隨意,任何時(shí)刻都有可能發(fā)生,所以記錄狀態(tài)的寄存器組的輸出在任何時(shí)刻都有可能發(fā)生變化。而同步時(shí)序邏輯中的觸發(fā)輸入至少可以維持一個(gè)時(shí)鐘后才會(huì)發(fā)生第二次觸發(fā)。這是一個(gè)非常重要的差別,因?yàn)槲覀兝眠@一個(gè)時(shí)鐘的時(shí)間在下一次觸發(fā)信號(hào)到來(lái)前,為電路狀態(tài)的改變創(chuàng)造一個(gè)穩(wěn)定可靠的條件。
?
因?yàn)槲覀兛梢缘贸鼋Y(jié)論:同步時(shí)序邏輯比異步時(shí)序邏輯具有更可靠更簡(jiǎn)單的邏輯關(guān)系。如果我們強(qiáng)行做出規(guī)定,用Verilog來(lái)設(shè)計(jì)可綜合的狀態(tài)機(jī)必須使用同步時(shí)序邏輯,有了這個(gè)前提條件,實(shí)現(xiàn)自動(dòng)生成電路結(jié)構(gòu)的綜合器有了可能。一碗這樣大大減少了綜合工具的復(fù)雜度。
?
同步、異步時(shí)序邏輯的差異:
在同步邏輯電路中,觸發(fā)信號(hào)是時(shí)鐘的正跳變沿(或負(fù)跳變沿);觸發(fā)器的輸入與輸出是經(jīng)由兩個(gè)時(shí)鐘來(lái)完成的。第一個(gè)時(shí)鐘的正跳沿(或負(fù)跳沿)為輸入做準(zhǔn)備,在第一個(gè)時(shí)鐘正跳沿(或負(fù)跳沿)到來(lái)后到第二個(gè)時(shí)鐘正跳沿(負(fù)跳沿)到來(lái)之前這段時(shí)間內(nèi),有足夠的時(shí)間使輸入穩(wěn)定。當(dāng)?shù)诙€(gè)時(shí)鐘正跳沿(負(fù)跳沿)到來(lái)時(shí)刻,由前一個(gè)時(shí)鐘沿創(chuàng)造的條件已經(jīng)穩(wěn)定,所以能夠使下一個(gè)狀態(tài)正確地輸出。
?
若在同一時(shí)鐘的正跳沿(負(fù)跳沿)下對(duì)寄存器組既進(jìn)行輸入又進(jìn)行輸出,很有可能由于門的延遲使輸入條件還未確定時(shí),就輸出了下一個(gè)狀態(tài),這種情況會(huì)導(dǎo)致邏輯紊亂。
而利用上一個(gè)時(shí)鐘為下一個(gè)時(shí)鐘創(chuàng)造的觸發(fā)條件是安全可靠的。前提是:確定下一個(gè)狀態(tài)所使用的組合電路的延遲與時(shí)鐘到各觸發(fā)器餓的差值必須小于一個(gè)時(shí)鐘周期的寬度。只有滿足這一前提才可以避免邏輯紊亂。實(shí)際電路中有以下幾點(diǎn)可以保證這一條件成立:
(1)、全局時(shí)鐘時(shí)鐘網(wǎng)絡(luò)布線時(shí)盡量各分支的時(shí)鐘一致;
(2)、應(yīng)平衡樹結(jié)構(gòu),在每一級(jí)加入緩沖器,使到達(dá)每個(gè)觸發(fā)器時(shí)鐘端的時(shí)鐘同步。
?
通過(guò)這些措施基本可以保證時(shí)鐘的同步,在后仿真時(shí),若邏輯與預(yù)期設(shè)計(jì)的不一樣,可降低時(shí)鐘頻率,就有可能消除由時(shí)鐘過(guò)快引起的觸發(fā)器輸入端由延遲和冒險(xiǎn)競(jìng)爭(zhēng)造成的不穩(wěn)定從而使邏輯正確。
?
在組合邏輯電路中,多路信號(hào)的輸入使各信號(hào)在同時(shí)變化時(shí)很容易產(chǎn)生競(jìng)爭(zhēng)冒險(xiǎn),從而結(jié)果難以預(yù)料。
?
4、function and task
function的邏輯被綜合成了什么?
?
由于function中沒有任何時(shí)序結(jié)構(gòu),function只能綜合出組合邏輯。
?
每次調(diào)用function時(shí),局部變量和返回值都被賦值,否則將導(dǎo)致形成鎖存器。例如,以下示例中,if條件語(yǔ)句沒有else語(yǔ)句。也就是說(shuō),如果sel是false,該function將返回其先前調(diào)用的值,就好像結(jié)果被鎖存住了。
fucntion只用于綜合成組合邏輯。但是,fucntion的最終結(jié)果可以用作D觸發(fā)器的輸入。
fucntion不應(yīng)包括延遲(#)或事件控制(@,wait)語(yǔ)句。
fucntion可以調(diào)用其他fucntion,但不能調(diào)用task。
fucntion在調(diào)用時(shí)會(huì)返回一個(gè)值。
?
雖然在task中可以有@等時(shí)序控制結(jié)構(gòu)中,它僅適用于仿真。綜合工具會(huì)忽略所有task中的時(shí)序結(jié)構(gòu)。因此,如果task中存在時(shí)序控制結(jié)構(gòu),可能會(huì)存在仿真和綜合不匹配的現(xiàn)象。
因此,在可綜合verilog中一般只會(huì)使用task綜合基本的組合邏輯,在testbench中調(diào)用帶有時(shí)序控制結(jié)構(gòu)的task具有較好的通用性。
?
5、FPGA設(shè)計(jì)技巧
DSP:實(shí)際上就是乘加器,F(xiàn)PGA內(nèi)部可以集成多個(gè)乘加器,而一般的DSP芯片往往每個(gè)core只有一個(gè)。換言之,F(xiàn)PGA可以更容易實(shí)現(xiàn)多個(gè)DSP core功能。在某些需要大量乘加計(jì)算的場(chǎng)合,往往多個(gè)乘加器并行工作的速度可以遠(yuǎn)遠(yuǎn)超過(guò)一個(gè)高速乘加器。
SERDES:高速串行接口。將來(lái)PCI-E、XAUI、HT、S-ATA等高速串行接口會(huì)越來(lái)越多。有了SERDES模塊,F(xiàn)PGA可以很容易將這些高速串行接口集成進(jìn)來(lái),無(wú)需再購(gòu)買專門的接口芯片。
CPU core:分為2種,軟core和硬core。軟core是用邏輯代碼寫的CPU模塊,可以在任何資源足夠的FPGA中實(shí)現(xiàn),使用非常靈活。而且在大容量的FPGA中還可以集成多個(gè)軟core,實(shí)現(xiàn)多核并行處理。硬core是在特定的FPGA內(nèi)部做好的CPU core,優(yōu)點(diǎn)是速度快、性能好,缺點(diǎn)是不夠靈活。
?
FPGA設(shè)計(jì)技巧(1):時(shí)鐘樹
對(duì)于FPGA設(shè)計(jì)來(lái)說(shuō),要盡可能的避免異步設(shè)計(jì),盡可能的采用同步設(shè)計(jì)。同步設(shè)計(jì)的第一個(gè)關(guān)鍵是時(shí)鐘樹。時(shí)鐘樹的設(shè)計(jì)原則如下:
(1)盡可能采用單一時(shí)鐘
(2)如果有多個(gè)時(shí)鐘域,注意時(shí)鐘域的劃分
(3)跨時(shí)鐘域的信號(hào)一定要做同步處理。對(duì)于控制信號(hào),可以采用雙采樣;對(duì)于數(shù)據(jù)信號(hào),可以采用異步fifo。需要注意的是,異步fifo不是萬(wàn)能的,一個(gè)異步fifo也只能解決一定范圍內(nèi)的頻差問(wèn)題。
(4)盡可能使用FPGA內(nèi)部的PLL、DLL和MMCM,不要自己產(chǎn)生時(shí)鐘。
(5)對(duì)于特殊的IO接口,需要仔細(xì)計(jì)算Tsu、Tco、Th,并利用PLL、DLL、DDIO、管腳可設(shè)置的delay等多種工具來(lái)實(shí)現(xiàn)。簡(jiǎn)單對(duì)管腳進(jìn)行Tsu、Tco、Th的約束往往是不行的。
?
FPGA設(shè)計(jì)技巧(2):乒乓操作
乒乓操作是FPGA設(shè)計(jì)中經(jīng)常用到的設(shè)計(jì)思想,常用于需要提高數(shù)據(jù)效率的地方。其主要特點(diǎn)有:
1、 實(shí)現(xiàn)數(shù)據(jù)的無(wú)縫緩沖和處理;
2、 可節(jié)約緩沖區(qū)空間;
3、 可實(shí)現(xiàn)低速模塊處理高速模塊如圖所示:
T1時(shí)刻,DATA_T1存入buffer 1;
T2時(shí)刻,buffer 1已被寫滿,DATA_T2存入buffer 2, 同時(shí)buffer 1將DATA_T1送至運(yùn)算模塊處理;
T3時(shí)刻,DATA_T3存入buffer A1,同時(shí)buffer 2將DATA_T2送至運(yùn)算模塊處理;
然后重復(fù)2、3階段的操作。
?
FPGA設(shè)計(jì)技巧(3):串并轉(zhuǎn)換
串并轉(zhuǎn)化的思想,旨在與提升運(yùn)算和芯片運(yùn)行的速度,串行轉(zhuǎn)并行已經(jīng)成為設(shè)計(jì)中不可缺少的一種思維。
串轉(zhuǎn)并的設(shè)計(jì)思想具體是這樣的,首先準(zhǔn)備好一組寄存器,當(dāng)來(lái)了一位數(shù)據(jù)的時(shí)候,寄存器組左移(右移)一位,然后把發(fā)送過(guò)來(lái)的數(shù)據(jù)寄存到寄存器組的最低位(最高位),當(dāng)一組數(shù)據(jù)完整接收完畢的時(shí)候,標(biāo)志位會(huì)變高,表示當(dāng)前數(shù)據(jù)可以采樣。
?
module study(clk, rst_n, data, data_out); //端口列表input clk, rst_n; //時(shí)鐘,復(fù)位輸入input data; //輸入數(shù)據(jù)output reg [7:0] data_out;reg [3:0] count; reg [7:0] temp;always @ (posedge clk or negedge rst_n) //時(shí)序邏輯,異步復(fù)位if(!rst_n)
? begin
? ?data_out <= 0;
? ?temp <= 0;
? ?count <= 0;
? end
?else if(count < 8) //計(jì)數(shù)表示只接8個(gè)數(shù)據(jù)? begin
? ?temp <= {temp[6:0],data}; //移位寄存器? ?count <= count +1'b1;
? end
?else
? begin
? ?data_out <= temp; //接到后輸出? endendmodule
?
?
采用計(jì)數(shù)方法,將并行的數(shù)據(jù)的總數(shù)先表示出來(lái),然后發(fā)送一位數(shù)據(jù)減一,后面的接收的這樣表示: data_out <=data[cnt];
?
module study(clk, rst_n, data, data_out,load,turn); //端口列表input clk, rst_n; //時(shí)鐘,復(fù)位輸入input data; //輸入數(shù)據(jù)input load; //并行數(shù)據(jù)使能信號(hào)input turn; //串行數(shù)據(jù)使能信號(hào)output reg [7:0] data_out;reg [7:0] temp;always @ (posedge clk or negedge rst_n) //時(shí)序邏輯,異步復(fù)位if(!rst_n)
? begin
? ?data_out <= 0;
? ?temp <= 0;
? end
?else if(load)
? temp<=data;
?else if(turn) //計(jì)數(shù)表示只接8個(gè)數(shù)據(jù)? ?temp <= {temp[6:0],temp[7]}; //移位寄存器 else
? begin
? ?temp <= temp[7]; //接到后輸出? endassign data=temp;endmodule
?
FPGA設(shè)計(jì)技巧(4):流水線(面積換取速度)
流水線設(shè)計(jì)就是將組合邏輯系統(tǒng)地分割,并在各個(gè)部分(分級(jí))之間插入寄存器,并暫存中間數(shù)據(jù)的方法。目的是將一個(gè)大操作分解成若干的小操作,每一步小操作的時(shí)間較小,所以能提高頻率,各小操作能并行執(zhí)行,所以能提高數(shù)據(jù)吞吐率(提高處理速度)。使用流水線一般是時(shí)序比較緊張,對(duì)電路工作頻率較高的時(shí)候。典型情況如下:
1)功能模塊之間的流水線,用乒乓 buffer 來(lái)交互數(shù)據(jù)。代價(jià)是增加了 memory 的數(shù)量,但是和獲得的巨大性能提升相比,可以忽略不計(jì)。
2) I/O 瓶頸,比如某個(gè)運(yùn)算需要輸入 8 個(gè)數(shù)據(jù),而 memroy 只能同時(shí)提供 2 個(gè)數(shù)據(jù),如果通過(guò)適當(dāng)劃分運(yùn)算步驟,使用流水線反而會(huì)減少面積。
3)片內(nèi)SRAM的讀操作,因?yàn)镾RAM的讀操作本身就是兩極流水線,除非下一步操作依賴讀結(jié)果,否則使用流水線是自然而然的事情。
4)組合邏輯太長(zhǎng),比如(a+b)*c,那么在加法和乘法之間插入寄存器是比較穩(wěn)妥的做法。
?
流水線優(yōu)缺點(diǎn)
1)優(yōu)點(diǎn):流水線縮短了在一個(gè)時(shí)鐘周期內(nèi)給定信號(hào)必須通過(guò)的通路長(zhǎng)度,增加了數(shù)據(jù)吞吐量,從而可以提高時(shí)鐘頻率,但也導(dǎo)致了數(shù)據(jù)的延時(shí)。
2) 缺點(diǎn):功耗增加,面積增加,硬件復(fù)雜度增加,流水線就是插入寄存器,以面積換取速度。
?
審核編輯:湯梓紅
評(píng)論
查看更多