一、案例說明 - Kintex-7 FPGA使用SRIO IP核作為Initiator,通過AD9613模塊采集AD數(shù)據(jù)。AD9613采樣率為250MSPS,雙通道12bit,12bit按照16bit發(fā)送,因此數(shù)據(jù)量為16bit * 2 * 250M = 8Gbps;
- AD數(shù)據(jù)通過SRIO由Kintex-7發(fā)送到C6678 DSP(Target)的0x0C3F0000~0x0C3F7FFF的地址空間,數(shù)據(jù)量為32KByte,使用SWRITE方式,期間每傳16KByte數(shù)據(jù)后就發(fā)送一個(gè)DOORBELL信息,讓C6678做乒乓處理。Kintex-7通過SRIO與C6678連接,共4個(gè)lane,每個(gè)lane的通信速率為5Gbps,數(shù)據(jù)有效帶寬為20Gbps * 80% = 16Gbps;
- 采集到的AD數(shù)據(jù)可分別通過Xilinx Vivado和TI CCS軟件查看波形,并在C6678做FFT處理。
此開發(fā)案例基于創(chuàng)龍Kintex-7+C6678評估板TL6678F-EasyEVM進(jìn)行。 二、案例框圖 三、案例演示 硬件連接:
- 將創(chuàng)龍AD9613高速AD模塊TL9613/9706F(此模塊集成高速DA,DA芯片為AD9706)通過FMC接口與評估板連接。
- 信號發(fā)生器設(shè)置成兩路正弦波輸出,幅度設(shè)置:1.5Vpp以及無直流偏置,頻率設(shè)置:1MHz。
- 信號發(fā)生器的兩路輸出分別連接到模塊的ADC_CHA、ADC_CHB。
參考TL6678F-EasyEVM評估板光盤用戶手冊《基于下載器的程序固化與加載》文檔中“Vivado下bit文件加載步驟”章節(jié),將tl_fmc_ad9613_srio_tl6678f_xc7k325t.bit文件燒錄到FPGA。燒寫bit文件時(shí),指定調(diào)試文件tl_fmc_ad9613_srio_tl6678f_xc7k325t.ltx,可以觀察到ILA調(diào)試信號,查看ADC采樣波形。 ADC兩路信號tl_fmc_ad9613_srio_bd_i/xlslice_l_Dout[11:0] 和tl_fmc_ad9613_srio_bd_i/xlslice_l_Dout[11:0]在ILA內(nèi)嵌邏輯分析儀中均設(shè)置為有符號數(shù)、模擬波形顯示,如下圖所示: ILA觸發(fā)抓取兩路ADC采樣波形,如下圖所示(兩路正弦波形): 2​​​​​​​. DSP端
參考TL6678F-EasyEVM評估板光盤用戶手冊《CCS工程的生成與加載》文檔,在“tl-fmc-ad9613-srio/DSP/src”目錄下建立CCS工程并導(dǎo)入到CCS軟件中編譯生成tl-srio-fft.out文件,通過仿真器加載tl-srio-fft.out文件到DSP端。將tl-srio-fft.out下載到C6678 Core0 ~ Core7核中,在tl-srio-fft.c窗口中紅色框標(biāo)注的地方創(chuàng)建breakpoint,使DSP程序運(yùn)行后能暫停,如下圖所示: 因?yàn)镃ore0負(fù)責(zé)系統(tǒng)初始化,為確保其他核跟Core0是同步開始傳輸,所以Core0核最后運(yùn)行(Core0核可查看原始波形以及振幅波形,其他核僅可查看原始波形)。運(yùn)行程序,DSP程序正常暫停,可通過圖像波形形式查看數(shù)據(jù),使用Graph工具,輸入下述配置,查看Channel A波形數(shù)據(jù)。 輸入下圖配置,查看Channel A經(jīng)過FFT振幅波形。 若出現(xiàn)波形顯示不正;驔]有波形產(chǎn)生,請參考以下操作: 1.請確保已正常加載GEL文件。 2.請確保Breakpoint設(shè)置成功,DSP程序能夠暫停。 3.請硬件斷電重啟后重新燒寫FPGA和DSP程序。 頻率計(jì)算: FFT變換點(diǎn)數(shù)N=512,AD采樣率Fs為250MSPS。某點(diǎn)n所表示的頻率為:Fn=n*(Fs/N) (n >=0)。當(dāng)n=0時(shí),F(xiàn)n為0,因?yàn)榈谝稽c(diǎn)表示的是直流分量,所以頻率為0,幅值也為0,因?yàn)樵撜也]有直流分量。 從上面的FFT振幅波形圖中可以看出,Channel A在第6個(gè)點(diǎn)處有信號,所以對應(yīng)的頻率為Fn = 6 * (Fs/N) = 6 * 250MHz / 512 = 2.9296875 MHz。對應(yīng)原始信號3MHz。 此處存在誤差,目前采樣點(diǎn)為512個(gè),一個(gè)點(diǎn)表示Fs/N= 488.281KHZ,所以如果需要提高精度,用戶可以提高采樣點(diǎn)。 通過查看串口輸入數(shù)據(jù),也可查看處理結(jié)果。其中peak point代表振幅圖峰值點(diǎn)橫坐標(biāo);amplitude代表振幅圖幅值;input frequency根據(jù)振幅圖計(jì)算的輸入頻率。 四、關(guān)鍵代碼說明 例程管腳約束文件位于TL6678F-EasyEVM評估板光盤Vivado工程“src\constraints”目錄下。 2.​​​​​​​​​​​​​​​​​​​​​​​​​​​ FPGA端的代碼
頂層文件tl_fmc_ad9613_srio.v的主要功能: - 使用STARTUPE2原語提供的EOS作為系統(tǒng)復(fù)位信號,使用STARTUPE2原語提供的內(nèi)部65MHz時(shí)鐘CFGMCLK作為系統(tǒng)時(shí)鐘。
​​​​​​​
- 配置時(shí)鐘芯片,輸出125MHz的參考時(shí)鐘為SRIO IP核。
​​​​​​​
​​​​​​​
可以查看生成的RTL原理圖:
​​​​​​​ 3. DSP端的代碼
(1)main函數(shù)初始化srio子系統(tǒng),hwi中斷注冊。 (2)srio_db_isr響應(yīng)srio doorbell中斷,以郵箱方式通知Core0 ~ Core7核同時(shí)進(jìn)行FFT運(yùn)算。 (3)tl_srio_fft任務(wù)等待郵箱信號,Core0 ~ Core7核同時(shí)進(jìn)行FFT運(yùn)算。 (4)tl_fft_amplitude任務(wù)等待信號量置位,Core0核進(jìn)行FFT振幅運(yùn)算,通過串口打印數(shù)據(jù)處理結(jié)果。 五、Block Design說明 Block Design如下:
1. Select IO IP核配置說明
參考TL6678F-EasyEVM評估板光盤tl-fmc-ad9613例程的IP核與模塊介紹章節(jié)。
2. SRIO IP配置說明
SRIO鏈路寬度設(shè)置為4個(gè)lane,通信頻率為5Gbps(即每個(gè)lane均為5Gbps),參考時(shí)鐘為125MHz;設(shè)置8bit位寬的ID,且ID=0xFF。 Port I/O Style選擇為Initiator/Target模式,其中Condensed I/O接收和發(fā)送均使用一個(gè)AXI4-Stream通道,Initiator/Target接收和發(fā)送采用不同的AXI4-Stream通道。 I/O Format:I/O端口配置使用HELLO格式包。 其他參數(shù)保持保持默認(rèn)值即可。 更詳細(xì)說明請查閱IP核手冊:《pg007_srio_gen2.pdf》。
3. data_to_srio RTL模塊功能
- 連續(xù)不停地將AD9613采集的數(shù)據(jù)寫入FPGA FIFO。
- 控制FIFO讀操作,每次從FIFO讀取完指定的數(shù)據(jù)并通過AXI4-stream接口傳輸?shù)絊RIO IP。其中本例程每發(fā)送16KByte的數(shù)據(jù)就發(fā)送一個(gè)DOORBELL信息,通知DSP(Target)對數(shù)據(jù)進(jìn)行處理。
​​​​​​​
雙擊block degin中的模塊,可配置:
Doorb Triger Threshold:門鈴觸發(fā)閾值,本例設(shè)置為16384Bytes = 16KB,即通過SRIO發(fā)送16KB的數(shù)據(jù)后就發(fā)送一個(gè)DOORBELL信息。
SrioDoorb info1:發(fā)送完Doorb Triger Threshold個(gè)字節(jié)的數(shù)據(jù)之后發(fā)送的門鈴信息。
Srio Doorb info2:發(fā)送完2倍的Doorb Triger Threshold個(gè)數(shù)據(jù)之后發(fā)送的門鈴信息。
Srio Target Addr:SRIO Target的內(nèi)存地址。(本例設(shè)置的為DSP的MSMC地址0x0C3F0000)
Srio Target Id:SRIO Target的ID。
Srio Local Id:SRIO Iitiator的ID。 代碼解釋:
​​​​​​​​​​​​​​
配置FIFO大小為36 Byte,讀寫數(shù)據(jù)的位寬為64bit(FIFO深度為512)。ALMOST_EMPTY_OFFSET和ALMOST_FULL_OFFSET配置為0x20,即32;即當(dāng)FIFO寫入數(shù)據(jù)個(gè)數(shù)大于32個(gè),ALMOST_FULL輸出高電平。
本例FIFO設(shè)置位寬為64bit,所以64bit * 32 / 8 = 256 Byte,即當(dāng)FIFO寫入數(shù)據(jù)大于256 Byte,ALMOST_FULL會輸出高電平。
因?yàn)镾RIO的package最大有效數(shù)據(jù)為256 Byte,為了確保SRIO能傳輸完整的數(shù)據(jù)包,所以設(shè)置FIFO的門限值為256Byte.
FIFO原語詳細(xì)說明請查閱:《ug473_7Series_Memory_Resources.pdf》。
- 因?yàn)锳D9613輸出的AD數(shù)據(jù)為雙通道的24bit,所以分別將兩個(gè)通道的數(shù)據(jù)補(bǔ)成16bit。然后保存到data_in_store中。
- 因?yàn)镕IFO的位寬64bit,而上個(gè)步驟將AD的雙通道數(shù)據(jù)補(bǔ)成了32bit,所以每存夠兩個(gè)32bit的AD數(shù)據(jù),湊成64bit的data_in_store,再使能fifo_wr_en信號,把64bit的數(shù)據(jù)寫入FIFO。
- 后寫入的數(shù)據(jù)存在高32位,發(fā)送到SRIO Target端(DSP),方便其按順序處理數(shù)據(jù)。
​​​​​​​
其中wr_cnt為一個(gè)1bit,計(jì)數(shù)只有0和1兩個(gè)值。
- 讀取FIFO數(shù)據(jù)并打包HELLO格式發(fā)送數(shù)據(jù)。
HELLO包頭拼接: ​​​​​​​
​​​​​​​
本例設(shè)置的TOTAL_DATA_SIZE為32KByte,即每發(fā)送16KByte的數(shù)據(jù)包之后發(fā)送一個(gè)門鈴信息。
|