FPGA實(shí)戰開(kāi)發(fā)技巧(13)
5.7 FPGA設計的IP和算法應用
基于IP的設計已成為目前FPGA設計的主流方法之一,本章首先給出IP的定義,然后以FFT IP核為例,介紹賽靈思IP核的應用。
本文引用地址:http://dyxdggzs.com/article/201710/365624.htm5.7.1 IP核綜述
IP(Intelligent Property) 核是具有知識產(chǎn)權核的集成電路芯核總稱(chēng),是經(jīng)過(guò)反復驗證過(guò)的、具有特定功能的宏模塊,與芯片制造工藝無(wú)關(guān),可以移植到不同的半導體工藝中。到了SOC 階段,IP核設計已成為ASIC電路設計公司和FPGA提供商的重要任務(wù),也是其實(shí)力體現。對于FPGA 開(kāi)發(fā)軟件,其提供的IP核越豐富,用戶(hù)的設計就越方便,其市場(chǎng)占用率就越高。目前,IP核已經(jīng)變成系統設計的基本單元,并作為獨立設計成果被交換、轉讓和銷(xiāo)售。
從IP核的提供方式上,通常將其分為軟核、硬核和固核這3類(lèi)。從完成IP核所花費的成本來(lái)講,硬核代價(jià)最大;從使用靈活性來(lái)講,軟核的可復用使用性最高。( 這部分內容前面已經(jīng)闡述,這里再重申一下)
軟核(Soft IP Core)
軟核在EDA設計領(lǐng)域指的是綜合之前的寄存器傳輸級(RTL) 模型;具體在FPGA設計中指的是對電路的硬件語(yǔ)言描述,包括邏輯描述、網(wǎng)表和幫助文檔等。軟核只經(jīng)過(guò)功能仿真,需要經(jīng)過(guò)綜合以及布局布線(xiàn)才能使用。其優(yōu)點(diǎn)是靈活性高、可移植性強,允許用戶(hù)自配置;缺點(diǎn)是對模塊的預測性較低,在后續設計中存在發(fā)生錯誤的可能性,有一定的設計風(fēng)險。軟核是IP 核應用最廣泛的形式。
固核(Firm IP Core)
固核在EDA設計領(lǐng)域指的是帶有平面規劃信息的網(wǎng)表;具體在FPGA設計中可以看做帶有布局規劃的軟核,通常以RTL 代碼和對應具體工藝網(wǎng)表的混合形式提供。將RTL描述結合具體標準單元庫進(jìn)行綜合優(yōu)化設計,形成門(mén)級網(wǎng)表,再通過(guò)布局布線(xiàn)工具即可使用。和軟核相比,固核的設計靈活性稍差,但在可靠性上有較大提高。目前,固核也是IP核的主流形式之一。
硬核(Hard IP Core)
硬核在EDA 設計領(lǐng)域指經(jīng)過(guò)驗證的設計版圖;具體在FPGA 設計中指布局和工藝固定、經(jīng)過(guò)前端和后端驗證的設計,設計人員不能對其修改。不能修改的原因有兩個(gè):首先是系統設計對各個(gè)模塊的時(shí)序要求很?chē)栏?,不允許打亂已有的物理版圖;其次是保護知識產(chǎn)權的要求,不允許設計人員對其有任何改動(dòng)。IP 硬核的不許修改特點(diǎn)使其復用有一定的困難,因此只能用于某些特定應用,使用范圍較窄。
IP Core生成器(Core Generator) 是Xilinx FPGA設計中的一個(gè)重要設計工具,提供了大量成熟的、高效的IP Core為用戶(hù)所用,涵蓋了汽車(chē)工業(yè)、基本單元、通信和網(wǎng)絡(luò )、數字信號處理、FPGA特點(diǎn)和設計、數學(xué)函數、記憶和存儲單元、標準總線(xiàn)接口等8 大類(lèi),從簡(jiǎn)單的基本設計模塊到復雜的處理器一應俱全。配合賽靈思網(wǎng)站的IP中心使用,能夠大幅度減輕設計人員的工作量,提高設計可靠性。
Core Generator最重要的配置文件的后綴是xco,既可以是輸出文件又可以是輸入文件,包含了當前工程的屬性和IP Core的參數信息。
5.7.2 FFT IP核應用示例
ISE提供了FFT/IFFT的IP Core,可以完成實(shí)數、復數信號的FFT以及IFFT運算。FFT的IP Core提供三種結構,分別為:
(1) 流水線(xiàn),Streaming I/O結構:允許連續的數據處理;
(2) 基4,Burst I/O結構:提供數據導入/導出階段和處理階段。此結構擁有較小的結構,但轉換時(shí)間較長(cháng);
(3) 基2,Burst I/O結構:使用最少的邏輯資源,同Radix-4相同,提供兩階段的過(guò)程。其配置界面有3頁(yè),第一頁(yè)如圖5-57所示,主要用于配置實(shí)現結構;第二頁(yè)配置數據位寬以及數據處理操作;第三頁(yè)配置數據緩存空間。
圖5-57 FFT IP core的用戶(hù)界面
在實(shí)際硬件操作中,模塊的執行速度是很重要的參數,所以本文分析第一種結構,即流水線(xiàn)Streaming I/O結構,以進(jìn)行連續的數據處理。在進(jìn)行當前幀的N點(diǎn)數據時(shí),可加載下一幀的N點(diǎn)數據,同時(shí)輸出前一幀的N點(diǎn)數據。此結構由多個(gè)基2的蝶形處理單元構成,每個(gè)單元都有自己的存儲單元來(lái)存儲輸入和中間處理的數據,其結構如圖5-58所示。
圖5-58 FFT模塊的流水線(xiàn),Streaming I/O結構
FFT的計算單元具有豐富的控制信號,其詳細說(shuō)明見(jiàn)下文。
XN_RE、XN_IM :輸入操作數,分別為實(shí)部和虛部,以2 的補碼輸入。在使用時(shí)應當確定其位寬。
START :FFT開(kāi)始信號,高有效。當此信號變高時(shí),開(kāi)始輸入數據,隨后直接進(jìn)行FFT 轉換操作和數據輸出。一個(gè)START脈沖,允許對一幀進(jìn)行FFT 轉換。如果每N 個(gè)時(shí)鐘有一個(gè)START脈沖或者START始終為高,,則都可以連續進(jìn)行FFT。如果在最初的START前,還沒(méi)有NFFT_WE,FWD_INV_WE,SCALE_SCH_WE信號,則START變高后就使用這些信號的默認值。由于此IP Core支持非連續的數據流,因此在任何時(shí)間輸入START,即可開(kāi)始數據的加載。當加載N個(gè)數據結束后,就開(kāi)始FFT轉換運算。
UNLOAD :對于Burst I/O結構,此信號將開(kāi)始輸出處理的結果。對于流水線(xiàn)結構和比特逆序輸出的情況,此端口不是必要的。
NFFT :此端口只對實(shí)時(shí)可配置應用時(shí)有用。
NFFT_WE :此端口是NFFT 端口的使能信號。
FWD_INV :用以指示IP Core為FFT還是IFFT,其等于1時(shí)IP Core進(jìn)行FFT運算,否則進(jìn)行IFFT 運算。至于采用哪種轉換運算是可以逐幀變化的。這一端口給FFT的使用提供了很大的方便。
FWD_INV_WE :作為FWD_INV端口的使能信號。
SCALE_SCH:(1) 在IP Core設計時(shí),如果選擇在計算過(guò)程中進(jìn)行中間數據的縮減,那么此信號才可起作用;(2) 輸入的位寬等于2*ceil(NFFT/2),其中NFFT = log2(point size)。(3) 流水線(xiàn)結構中,將每個(gè)基2的蝶形處理單元視為一個(gè)階段,每個(gè)階段進(jìn)行一次數據的縮減,縮減的比例以此輸入中對應階段的兩比特表示。(4) 每階段的兩比特數可以是3,2,1或0 :它們表示了數據所需要移動(dòng)的比特數。
SCALE_SCH_WE :作為SCALE_SCH的使能信號。
SCLR :可選端口。
Reset :重置信號端口。Reset=1時(shí),所有工作都停止且初始化。但內部的幀緩存保留其內容。
CE :可選端口。
CLK :輸入時(shí)鐘。
XK_RE,XK_IM :輸出數據總線(xiàn),以2 的補碼輸出。SCALE_SCH_WE有效時(shí),輸出位寬等于輸入;否則,輸出位寬= 輸入位寬+NFFT+1。
XN_INDEX :位寬等于log2(point size),輸入數據的下標。
XK_INDEX :位寬等于log2(point size),輸出數據的下標。
RFD :數據有效信號,高有效,在加載數據時(shí)為高電平。
BUSY :IP Core 工作狀態(tài)的指示信號,在計算FFT 轉換時(shí)為高電平。
DV :數據有效指示信號,當輸出端口存在有效數據時(shí)變高。
EDONE :高有效。在DONE 信號變高的前一個(gè)時(shí)鐘變?yōu)楦唠娖健?br />DONE :高有效。在FFT 完成后變高,且只存在一個(gè)時(shí)鐘。在DONE 變高后,IP Core開(kāi)始輸出計算結果。
BLK_EXP :當使用Burst I/O 結構時(shí)可用,若選擇流水線(xiàn),則此端口無(wú)效
OVFLO :算法溢出指示。在數據輸出時(shí),如每幀有溢出,此信號變高。在每幀開(kāi)始處,此信號重置。
例5.7.1使用IP Core實(shí)例化一個(gè)16點(diǎn)、位寬為16位的FFT 模塊。
IP Core 直接生成的乘法器的Verilog 模塊接口為:
module fft16(sclr, fwd_inv_we, rfd, start, fwd_inv, dv, scale_sch_we, done, clk, busy, edone, scale_sch,xn_re, xk_im, xn_index, xk_re, xn_im, xk_index);
input sclr , fwd_inv_we, start, fwd_inv, scale_sch_we, clk;
input [3 : 0] scale_sch;
input [15 : 0] xn_re;
output rfd, dv, done, busy, edone;
output [15 : 0] xk_im;
output [3 : 0] xn_index;
output [15 : 0] xk_re;
input [15 : 0] xn_im;
output [3 : 0] xk_index;
……
endmodule
在使用時(shí),直接調用mulTIply 模塊即可,如
module fft16(sclr, fwd_inv_we, rfd, start, fwd_inv, dv, scale_sch_we, done, clk, busy,
edone, scale_sch, xn_re, xk_im, xn_index, xk_re, xn_im, xk_index);
input sclr , fwd_inv_we, start, fwd_inv, scale_sch_we, clk;
input [3 : 0] scale_sch;
input [15 : 0] xn_re;
output rfd, dv, done, busy, edone;
output [15 : 0] xk_im;
output [3 : 0] xn_index;
output [15 : 0] xk_re;
input [15 : 0] xn_im;
output [3 : 0] xk_index;
fft fft1( // 調用FFT 的IPCore
.sclr(sclr), .fwd_inv_we(fwd_inv_we), .rfd(rfd), .start(start), .fwd_inv(fwd_inv),
.dv(dv), .scale_sch_we(scale_sch_we), .done(done), .clk(clk), .busy(busy),
.edone(edone), .scale_sch(scale_sch), .xn_re(xn_re), .xk_im(xk_im),
.xn_index(xn_index), .xk_re(xk_re), .xn_im(xn_im), .xk_index(xk_index));
endmodule
經(jīng)過(guò)仿真測試得到的功能波形圖如圖5-59所示:
圖5-59 FFT的IP core仿真波形
評論