李新獻(xiàn)
基于SOPC的便攜式頻譜分析儀的研究
李新獻(xiàn)
李新獻(xiàn)1李偉勤2施岱松2
1. 南陽(yáng)醫(yī)學(xué)高等??茖W(xué)校;2.西南石油大學(xué)
李新獻(xiàn)(1974)男,河南南陽(yáng),碩士研究生,畢業(yè)于西南石油大學(xué)研究生院,專業(yè):計(jì)算機(jī)應(yīng)用技術(shù),方向:嵌入式系統(tǒng);李偉勤(1976-)男,西南石油大學(xué)電信學(xué)院 通信工程教研室 副教授,現(xiàn)主要從事陣列天線設(shè)計(jì)、數(shù)字系統(tǒng)及優(yōu)化算法等方面的研究工作。
本文采用可編程片上系統(tǒng)技術(shù)在FPGA中植入NIOSII軟核作為系統(tǒng)的控制中心,利用FPGA中豐富的可編程邏輯資源和IP核來(lái)構(gòu)成該嵌入式系統(tǒng)處理器的接口功能模塊,再借助于AVALON總線,實(shí)現(xiàn)對(duì)外圍模擬通道A/D轉(zhuǎn)換器,存儲(chǔ)器,LCD 顯示器,鍵盤(pán)等硬件的控制。頻譜分析核心算法是基于快速傅立葉變換(FFT)。通過(guò)傅立葉運(yùn)算將被測(cè)信號(hào)從時(shí)域轉(zhuǎn)換到頻域,并分解成分立的頻率分量,在頻域中觀測(cè)其頻譜圖,了解信號(hào)的特性,從而對(duì)信號(hào)進(jìn)行分析診斷,這種基于數(shù)字信號(hào)處理的頻譜分析已經(jīng)應(yīng)用于諸多領(lǐng)域并且發(fā)揮著重要作用。
SOPC(System On Programmable Chip,可編程的片上系統(tǒng)) 是Altera 公司提出的一種靈活、高效的SOC解決方案,首先,它是片上系統(tǒng)(SOC),即由單一芯片完成整個(gè)系統(tǒng)的主要邏輯功能。其次,它是可編程系統(tǒng),具有靈活的設(shè)計(jì)方式,可裁減,可擴(kuò)充,可升級(jí),并具備軟硬件在系統(tǒng)可編程能力。結(jié)合頻譜分析儀的原理,以ALTERA 公司提供的IP 核為基礎(chǔ),以分層次的硬件描述語(yǔ)言(VHDL) 作為系統(tǒng)功能和接口的主要描述手段,借助于 QUARTUSII 和 NIOSII ,MATLAB等EDA開(kāi)發(fā)工具進(jìn)行系統(tǒng)設(shè)計(jì)。根據(jù)實(shí)現(xiàn)的功能要求,用VHDL語(yǔ)言編寫(xiě)了整個(gè)系統(tǒng)的各個(gè)接口功能模塊,在頂層模塊中,對(duì)各個(gè)子模塊進(jìn)行了邏輯功能的連接,并對(duì)各個(gè)子模塊及整體模塊系統(tǒng)級(jí)的功能驗(yàn)證和仿真。最后生成系統(tǒng),下載到開(kāi)發(fā)板中,通過(guò)在NIOSII IDE環(huán)境中編寫(xiě)軟件進(jìn)行測(cè)試,并通過(guò)LCD顯示,顯示的結(jié)果與MATLAB中仿真的結(jié)果進(jìn)行比較,驗(yàn)證結(jié)果的正確性。
該系統(tǒng)從結(jié)構(gòu)上分為AD采樣單元,F(xiàn)FT運(yùn)算轉(zhuǎn)換單元,顯示單元。系統(tǒng)使用FPGA內(nèi)部實(shí)現(xiàn)的處理器NiosII作為系統(tǒng)嵌入式處理器,通過(guò)片上Avalon總線和高速A/ D采樣芯片,F(xiàn)FT處理轉(zhuǎn)換單元等相聯(lián)系。A/D采樣單元對(duì)外部的音頻模擬信號(hào)每周期采樣128點(diǎn),再變換為左右聲道分別是16位的數(shù)字量。FFT運(yùn)算處理單元包括數(shù)據(jù)經(jīng)FFT轉(zhuǎn)換,轉(zhuǎn)換后的復(fù)數(shù)經(jīng)CORDIC算法求模及相位,最后再經(jīng)過(guò)實(shí)數(shù)到整數(shù)的轉(zhuǎn)換。此部分是由HDL語(yǔ)言編寫(xiě)的純硬件電路來(lái)實(shí)現(xiàn)。它通過(guò)DMA方式將數(shù)據(jù)從TLV320AIC23接口中取出經(jīng)FIFO緩存送到FFT處理單元,進(jìn)行FFT變換,然后將轉(zhuǎn)換后的實(shí)部和虛部經(jīng)CORDIC算法求模,而指數(shù)保留,最后將求出的模和指數(shù)組成的實(shí)數(shù)再轉(zhuǎn)化為整數(shù),存到FIFO中,由DMA讀出,送到LCD上顯示,這樣對(duì)應(yīng)的音頻信號(hào)的幅度頻譜就可顯示出來(lái)。 整個(gè)過(guò)程大部分使用硬件電路實(shí)現(xiàn),CPU在其中的主要作用是任務(wù)調(diào)度,中斷響應(yīng)和啟動(dòng)DMA傳輸。
整個(gè)系統(tǒng)框圖如圖1。
圖1 系統(tǒng)整體框圖
圖2 sopc 結(jié)構(gòu)圖
本設(shè)計(jì)是基于SOPC的思想來(lái)實(shí)現(xiàn)我們系統(tǒng)所要求的基本功能,隨著可編程芯片的迅速發(fā)展,SOPC在數(shù)字信號(hào)處理方面的應(yīng)用也越來(lái)越明顯。其一般的結(jié)構(gòu)框圖如圖2。
根據(jù)本設(shè)計(jì)的要求,結(jié)合SOPC技術(shù)的強(qiáng)大功能,我們利用片上系統(tǒng)的設(shè)計(jì)理念,定義了以下用戶邏輯模塊。
NiosII以DMA方式讀取數(shù)據(jù)到FIFO中;其頂層模塊FIFO_DMA如圖3。
圖3 FIFO_DMA 模塊圖
fifo 到 fft的接口模塊fifo_fft
該接口模塊是將數(shù)據(jù)傳送到FFT運(yùn)算單元,供FFT進(jìn)行運(yùn)算,經(jīng)FFT轉(zhuǎn)換后,又將轉(zhuǎn)換后的數(shù)據(jù)取走,整個(gè)接口頂層模塊有INF_TO_FIFO .bdf ,fft_fifo.bdf,fifo_to_fft.bdf, fft_to_fifo.bdf幾個(gè)模塊構(gòu)成。因?yàn)镕FT IP CORE是要付費(fèi)的,因此不能將FFT IP CORE連同該接口模塊一起加入到SOPC BUILDER 中。只能將該接口模塊添加到SOPC BUILDER里面,而把FFT模塊單獨(dú)留在外面。這樣在生成的cpu 中就留出了FFT 模塊的接口,以便將FFT 模塊同該接口模塊相連。
FFT 模塊
在本設(shè)計(jì)中,為了縮短我們的開(kāi)發(fā)周期,充分發(fā)揮ALTERA 公司提供的MegaCore的優(yōu)勢(shì)。我們采用了MegaCore 中的FFT IP CORE ,盡管它是要付費(fèi)的,但是由于ALTERA的OpenCore Plus特性,即使不購(gòu)買IP,也可以生成具有時(shí)效性的編程文件,通常在JTAG線拔掉一小時(shí)后,編程文件才會(huì)消失,這對(duì)驗(yàn)證此模塊提供了很大的幫助,至少可以讓我們看到它在硬件中的運(yùn)行情況,其模塊圖如圖4。
圖4 FFT模塊圖
圖5 FIFO_ CORDIC模塊圖
取模及相位模塊
由于FFT轉(zhuǎn)換后的數(shù)據(jù)是復(fù)數(shù),我們要對(duì)其求模及相位,計(jì)算它的幅度頻譜和相位頻譜。在這里我們利用CORDIC算法 ,CORDIC(Coordinate Rotation Digital Computer)算法即坐標(biāo)旋轉(zhuǎn)數(shù)字計(jì)算方法,是J.D.Volder 于1959年首次提出,主要用于三角函數(shù),雙曲線,指數(shù),對(duì)數(shù)的計(jì)算。該算法通過(guò)基本的加和移位運(yùn)算代替乘法運(yùn)算,使得矢量的旋轉(zhuǎn)和定向的計(jì)算不再需要三角函數(shù),乘法,開(kāi)方,反三角,指數(shù)等函數(shù)。
其用硬件實(shí)現(xiàn)的模塊圖如圖5。
實(shí)數(shù)到整數(shù)轉(zhuǎn)換模塊
對(duì)于FFT轉(zhuǎn)換后的實(shí)部,虛部和指數(shù),其中實(shí)部和虛部在CORDIC模塊中進(jìn)行取模,指數(shù)部分保留起來(lái)。在這里我們通過(guò)該模塊將求出的幅度連同指數(shù)組成的浮點(diǎn)數(shù)轉(zhuǎn)化為整數(shù),其模塊圖如圖6。
圖6 FIFO_FIC 模塊圖
AD 接口模塊
此接口通過(guò)FIFO向上連接Avalon 總線并設(shè)為Slave模式,向下連接TLV320AIC23 數(shù)字音頻接口DSP模式數(shù)據(jù)格式 。采用DMA方式傳送數(shù)據(jù),即每發(fā)送或接收到一個(gè)單元,都會(huì)自動(dòng)觸發(fā)DMA將其搬送到一個(gè)內(nèi)部的Buffer,等FIFO半滿時(shí),再通過(guò)中斷方式告訴CPU,啟動(dòng)DMA進(jìn)行數(shù)據(jù)傳輸處理 。其頂層模塊圖FIFO_TLV320AIC23.bdf如圖7。
圖7 FIFO_TLV320AIC23 模塊圖
顯示模塊
本設(shè)計(jì)采用JDL 12864G型號(hào)液晶顯示器,根據(jù)我們的功能要求,我們用VHDL語(yǔ)言編寫(xiě)了其硬件顯示控制電路及接口模塊,其顯示接口模塊如圖8。
顯示RAM中數(shù)據(jù)的產(chǎn)生方式我們采用全硬件實(shí)現(xiàn),它以每8個(gè)數(shù)據(jù)為一組,為了循環(huán)利用輸入的數(shù)據(jù),我們?cè)谠O(shè)計(jì)時(shí),采用了一個(gè)選擇電路如圖9,當(dāng)一幀數(shù)據(jù)未完全進(jìn)入CFIFO 時(shí),通道選擇由CPU輸入數(shù)據(jù),并禁止CFIFO輸出數(shù)據(jù),當(dāng)一幀數(shù)據(jù)完全進(jìn)入時(shí),通道選擇CFIFO循環(huán)傳送數(shù)據(jù),并允許CFIFO輸出數(shù)據(jù)。
圖8 graphicLCD 模塊圖
圖9 選擇電路模塊圖
上面都是我們要用到的硬件電路模塊,在SOPC BUILDER中,把FIFO_FFT.bdf , FIFO_ TLV320AIC23.bdf, FIFO_FIC.bdf ,F(xiàn)IFO_DDC_ LCD.bdf和FIFO_CORDIC.bdf 以添加新組件的方式加入到系統(tǒng)中。同時(shí)還要加入freedev_i2c,系統(tǒng)時(shí)鐘,flash, sdram, dma等,并給它們分配基地址和中斷,如圖10所示。
圖10 系統(tǒng)基地址、中斷分配圖
最后點(diǎn)擊“generate”按鈕,生成系統(tǒng),生成的CPU頂層框圖如圖11。
上電自檢:系統(tǒng)上電后首先進(jìn)行系統(tǒng)自檢。查看設(shè)備是否正常。若有異常,通過(guò)LCD顯示或報(bào)警。
系統(tǒng)初始化:若自檢正常,檢測(cè)系統(tǒng)是否允許啟動(dòng),如允許啟動(dòng),則系統(tǒng)初始化,首先設(shè)置AD采樣芯片的工作參數(shù)為初始默認(rèn)參數(shù);清空FIFO保證不存在任何可能的錯(cuò)誤數(shù)據(jù);復(fù)位FFT;初始化LCD顯示屏顯示操作界面,然后系統(tǒng)處于接收命令狀態(tài),并且設(shè)置消息郵箱mbox1標(biāo)識(shí),它通知調(diào)度程序開(kāi)始執(zhí)行AD采樣。
采樣轉(zhuǎn)換分析:調(diào)度程序開(kāi)始等待消息mbox1,若一信號(hào)被置位,系統(tǒng)立即開(kāi)始進(jìn)行連續(xù)采樣,將AD芯片采樣的結(jié)果存放在FIFO中,當(dāng)采樣數(shù)據(jù)達(dá)到128個(gè)點(diǎn)后,F(xiàn)IFO發(fā)送HalfFULL信號(hào)給INF_TO_FIFO 接口單元,產(chǎn)生中斷,并設(shè)置消息郵箱mbox2標(biāo)識(shí),它通知調(diào)度程序開(kāi)始執(zhí)行FFT轉(zhuǎn)換,由CPU啟動(dòng)DMA傳輸,DMA將INF_TO_FIFO 接口單元的數(shù)據(jù)讀到FFT的FIFO接口里面,由FFT處理單元進(jìn)行數(shù)據(jù)轉(zhuǎn)換,轉(zhuǎn)換后的復(fù)數(shù)存到FFT的輸出FIFO里面,指數(shù)單獨(dú)存放在指定的寄存器里。當(dāng)FIFO滿時(shí),產(chǎn)生中斷,并設(shè)置消息郵箱mbox3標(biāo)識(shí),通知調(diào)度程序開(kāi)始執(zhí)行CORDIC模塊,再由DMA通過(guò)INF_TO_FIFO 接口將復(fù)數(shù)數(shù)據(jù)讀到CORDIC算法的FIFO里面,進(jìn)行CORDIC求模及相位,求模后的數(shù)據(jù)存到CORDIC的FIFO里面,當(dāng)FIFO滿時(shí),產(chǎn)生中斷,并設(shè)置消息郵箱mbox4標(biāo)識(shí),通知調(diào)度程序開(kāi)始執(zhí)行實(shí)數(shù)到整數(shù)轉(zhuǎn)換模塊,同樣,再由DMA通過(guò)INF_TO_FIFO 接口把幅度數(shù)據(jù)連同上面保留的指數(shù)送到實(shí)數(shù)到整數(shù)轉(zhuǎn)換模塊,轉(zhuǎn)換后存到該模塊的FIFO里面,當(dāng)FIFO滿時(shí),產(chǎn)生中斷,并設(shè)置mbox5標(biāo)識(shí),通知調(diào)度程序開(kāi)始執(zhí)行顯示模塊, 接著由DMA通過(guò)INF_ TO_FIFO 接口將轉(zhuǎn)換得到的整數(shù)送到LCD顯示控制器進(jìn)行顯示。顯示完成后,再設(shè)置消息郵箱mbox1標(biāo)識(shí),它通知調(diào)度程序開(kāi)始下一個(gè)循環(huán)調(diào)度。整個(gè)過(guò)程我們用統(tǒng)一的INF_TO_FIFO 接口,用DMA方式在兩個(gè)模塊之間進(jìn)行數(shù)據(jù)傳輸,為我們下一步軟件編程帶來(lái)了很大的方便。使整個(gè)結(jié)構(gòu)看上去也非常清晰。
圖11 系統(tǒng)CPU模塊圖
停止運(yùn)行:當(dāng)系統(tǒng)接收到從鍵盤(pán)發(fā)出的停止分析命令時(shí),系統(tǒng)首先停止AD采樣芯片的采樣工作,恢復(fù)為初始化參數(shù),然后清空FIFO中所有數(shù)據(jù),等FFT運(yùn)算單元結(jié)束當(dāng)前的FFT運(yùn)算后讀走數(shù)據(jù)。最后系統(tǒng)初始化等待下一個(gè)命令。
結(jié)合μc/os-II任務(wù)管理功能 ,在系統(tǒng)中創(chuàng)建了7個(gè)任務(wù),包括主控響應(yīng)任務(wù),鍵盤(pán)掃描任務(wù),AD采集任務(wù),F(xiàn)FT轉(zhuǎn)換任務(wù),CORDIC算法任務(wù),實(shí)數(shù)到整數(shù)轉(zhuǎn)換任務(wù),顯示控制任務(wù)。其中主控相應(yīng)進(jìn)程優(yōu)先級(jí)最高,它負(fù)責(zé)處理中斷響應(yīng)和中斷響應(yīng)進(jìn)程的調(diào)用。采樣控制進(jìn)程負(fù)責(zé)管理采樣控制。FFT管理進(jìn)程負(fù)責(zé)數(shù)據(jù)傳輸?shù)紽FT IP core,進(jìn)行FFT變換。CORDIC算法負(fù)責(zé)將復(fù)數(shù)求模及相位;實(shí)數(shù)到整數(shù)的轉(zhuǎn)換負(fù)責(zé)將幅度和指數(shù)組成的浮點(diǎn)數(shù)轉(zhuǎn)換為整數(shù),顯示控制進(jìn)程負(fù)責(zé)數(shù)據(jù)的顯示轉(zhuǎn)換,控制LCD的顯示。
為了驗(yàn)證系統(tǒng)的正確性,我們把CYCLONE II EP2C8Q208C8 開(kāi)發(fā)板上的LINE IN接口與我們PC機(jī)上的音頻輸出接口相連。通過(guò)PC機(jī)播放一段音樂(lè),采集一幀音頻數(shù)據(jù),在Nios II IDE環(huán)境下,按照功能要求,進(jìn)行編程,讓該程序運(yùn)行在我們?cè)O(shè)計(jì)的硬件基礎(chǔ)上,最后通過(guò)LCD顯示,可以看出采集信號(hào)的頻譜圖,如圖12顯示。為了驗(yàn)證顯示結(jié)果的正確性,我們?cè)贜ios II IDE的調(diào)試窗口下,觀察內(nèi)存緩沖區(qū)中的音頻數(shù)據(jù),取此音頻數(shù)據(jù)在MATLAB中進(jìn)行仿真,圖13是經(jīng)過(guò)FFT變換后的頻域仿真波形,即頻譜圖。與我們?cè)贚CD屏幕上看到的結(jié)果基本上是一致的,由此可見(jiàn),該系統(tǒng)設(shè)計(jì)是符合我們的要求、是正確的。
圖12 音頻信號(hào)幅度頻譜圖LCD顯示
圖13 音頻信號(hào)頻域波形仿真圖
10.3969/j.issn.1001-8972.2015.01.036