1 項(xiàng)目背景 (源碼下載 交流輔導(dǎo)群:544453837)1.1 多采樣率數(shù)字濾波器 多采樣率就是有多個(gè)采樣率的意思。前面所說的FIR,IIR濾波器都是只有一個(gè)采樣頻率,是固定不變的采樣率,然而有些情況下需要不同采樣頻率下的信號(hào)。 按照傳統(tǒng)的速率轉(zhuǎn)換理論,我們要實(shí)現(xiàn)采樣速率的轉(zhuǎn)換,可以這樣做,假如有一個(gè)有用的正弦波模擬信號(hào),AD采樣速率是f1,現(xiàn)在我需要用到的是采樣頻率是f2的信號(hào),傳統(tǒng)做法是將這個(gè)經(jīng)過f1采樣后的信號(hào)進(jìn)行DA轉(zhuǎn)換,再將轉(zhuǎn)換后的模擬信號(hào)進(jìn)行以f2采樣頻率的抽樣,得到采樣率為f2的數(shù)字信號(hào),至此完成采樣頻率的轉(zhuǎn)換 但是這樣的做法不僅麻煩,而且處理不好的話會(huì)使信號(hào)受到損傷,所以這種思想就被淘汰了,現(xiàn)在我們用到的采樣率轉(zhuǎn)換的方法就是抽取與內(nèi)插的思想。 1.2 抽取 先來總體來解釋一下抽取的含義:前面不是說,一個(gè)有用的正弦波模擬信號(hào)經(jīng)采樣頻率為f1的抽樣信號(hào)抽樣后得到了數(shù)字信號(hào),很明顯這個(gè)數(shù)字信號(hào)序列是在f1頻率下得到的,現(xiàn)在,假如我隔幾個(gè)點(diǎn)抽取一個(gè)信號(hào),比如就是5吧,我隔5個(gè)點(diǎn)抽取一個(gè)信號(hào),是不是就是相當(dāng)于我采用了1/5倍f1的采樣頻率對模擬信號(hào)進(jìn)行采樣了?所以,抽取的過程就是降低抽樣率的過程,但是我們知道,這是在時(shí)域的抽樣,時(shí)域的抽樣等于信號(hào)在頻域波形的周期延拓,周期就是采樣頻率,所以,為了避免在頻域發(fā)生頻譜混疊,抽樣定理也是我們要考慮的因素 下面來具體來介紹 如上圖所示,假如上面就是某一有用信號(hào)經(jīng)采樣頻率f1抽樣得到的頻譜,假設(shè)這時(shí)候的采樣頻率為8Khz,可以通過數(shù)格子得到,從0到F1處有8個(gè)空格,每個(gè)空格代表1Khz,有些朋友可能會(huì)問,這不是在數(shù)字頻域嗎,單位不是π嗎,哪來的hz?是的,這里是數(shù)字頻域,采樣頻率F1處對應(yīng)的是2π,這里只是為了好解釋,我們用模擬頻率來對應(yīng)數(shù)字頻率。 上面是采樣頻率為8K的數(shù)字信號(hào)頻域圖,現(xiàn)在我要對這個(gè)數(shù)字信號(hào)進(jìn)行時(shí)域抽取,從而來降低信號(hào)的采樣率,我們知道,一旦我們對數(shù)字信號(hào)進(jìn)行時(shí)域抽取,那么采樣率下降,而采樣率就是數(shù)字信號(hào)頻域的波形周期,那么也就是周期下降,所以,我們對信號(hào)進(jìn)行抽取要有個(gè)度,要在滿足抽樣定理的條件下對信號(hào)進(jìn)行抽取,否則就會(huì)發(fā)生頻譜混疊。 上圖就是對信號(hào)進(jìn)行了1/5倍的F1采樣頻率抽取,可見,由于發(fā)生了頻譜混疊現(xiàn)象,因?yàn)?/5倍的F1是1600hz,而信號(hào)的頻帶是1000hz,不滿足抽樣定理,導(dǎo)致發(fā)生了頻譜混疊,所以,為了避免發(fā)生這種情況,除了要滿足抽樣定理之外,即抽樣倍數(shù)不能太高,我們還需要把信號(hào)的頻帶設(shè)置在F1/2以下,才能確保信號(hào)不發(fā)生頻譜混疊,因此,我們需要在抽取之前加一個(gè)低通濾波器,書上叫做抗混疊低通濾波器,用來限制信號(hào)的頻帶,然后再進(jìn)行抽取,這樣的話我們來算一下 低通濾波器的截止頻率就是1/2倍的經(jīng)抽取后的采樣速率,即fc = 1/2 * (F1/M) ,M是抽取倍數(shù)。而1/2*F1對應(yīng)的數(shù)域頻率是π,因此我們得出, 抗混疊低通濾波器的截止頻率是π/M 1.3 內(nèi)插 抽取的過程是降低采樣率的過程,那么插值的過程當(dāng)然就是提高采樣率的過程。大體的思路可以這么理解,我們將經(jīng)f1抽樣下得到的數(shù)字信號(hào)的每兩個(gè)點(diǎn)之間進(jìn)行插值,插入的值是0,插值之后,信號(hào)在單位時(shí)間內(nèi)的采樣點(diǎn)數(shù)增多,當(dāng)然也就是采樣速率的提升,采樣速率提升后我們知道,那么信號(hào)的頻譜的周期就會(huì)增加 需要注意的一點(diǎn)就是,插值前后,我們只是在時(shí)域信號(hào)中間插入了D-1個(gè)零值,僅僅是改變了采樣率,并沒有改變信號(hào)的信息,因此,在頻域,信號(hào)頻譜的形狀是不會(huì)改變的,改變的僅僅是周期,如上圖,F(xiàn)1是插值之前信號(hào)的周期,插值之后,信號(hào)頻譜的形狀不變,周期成了F1*D,D是插值倍數(shù)。如果我們直接用F1*D倍的采樣率采信號(hào),得到的頻譜會(huì)發(fā)現(xiàn),就不會(huì)有中間兩個(gè)波形,因此,這兩個(gè)波形是多余的,書上叫做是鏡像頻譜。既然是多余的,我們就可以將它用一個(gè)低通濾波器濾掉,這樣的低通濾波器,就叫做鏡像低通濾波器。這樣我們來計(jì)算一下鏡像低通濾波器的截止頻率 根據(jù)上面這張圖我們可以求出鏡像低通濾波器的截止頻率,可以看到,fc = 1/2 *F1,這里我們假設(shè),內(nèi)插之后的采樣頻率為F2=F1*D,那么,fc =1/2*(F2/D),而1/2*F2對應(yīng)的是π,注意,這里是1/2*F2對應(yīng)π,不是1/2*F1了,因?yàn)檫@已經(jīng)是插值之后采樣率增加之后的頻譜了,所以我們得出: 鏡像低通濾波器的截止頻率為:π/D 1設(shè)計(jì)目標(biāo) 本案例是FPGA內(nèi)部產(chǎn)生正弦信號(hào),這個(gè)正弦信號(hào)一路輸出給DA通道A,另一路經(jīng)過插值濾波器后,輸出給DA通道B。 正弦信號(hào)產(chǎn)生電路產(chǎn)生頻率為62.5KHz的正弦信號(hào),該正弦信號(hào)由8個(gè)點(diǎn)組成。 插值濾波器是4倍的插值,也就是說進(jìn)來是8個(gè)點(diǎn)的正弦波,輸出將是32個(gè)的正弦波。 仿真效果,上面的波形為插值前,下面的為插值后可以明顯看出下面的波形更為圓滑。 下面是示波器的顯示效果 3 設(shè)計(jì)實(shí)現(xiàn)3.1 頂層信號(hào) 新建目錄:D:\mdy_book\cic_prj。在該目錄中,新建一個(gè)名為cic_prj.v的文件,并用GVIM打開,開始編寫代碼。 我們要實(shí)現(xiàn)的功能,概括起來就是FPGA產(chǎn)生控制AD9709,讓其中的通道A未濾波的正弦信號(hào),讓通道B輸出濾波后的正弦信號(hào)。為了控制AD9709的工作模式,就要控制AD9709的MODE、SLEEP管腳;為了控制通道A,就需要控制AD9729的CLK1、WRT1、DB7~0P1管腳;為了控制通道B,就需要控制AD9729的CLK2、WRT2、DB7~0P2管腳。根據(jù)設(shè)計(jì)目標(biāo)的要求,整個(gè)工程需要以下信號(hào): 1. 使用clk連接到晶振,表示50M時(shí)鐘的輸入。 2. 使用rst_n連接到按鍵,表示復(fù)位信號(hào)。 3. 使用dac_mode信號(hào)連接到AD9709的MODE管腳,用來控制其工作模式。 4. 使用dac_sleep信號(hào)連接到AD9709的SLEEP管腳,用來控制其睡眠模式。 5. 使用dac_clka信號(hào)連接到AD9709的CLK1管腳,用來控制通道A的時(shí)鐘。 6. 使用dac_wra信號(hào)連接到AD9709的WRT1管腳,用來控制通道A的寫使能。 7. 使用8位信號(hào)dac_da連接到AD9709的DB7~0P1管腳,用來控制通道A的寫數(shù)據(jù)。 8. 使用dac_clkb號(hào)連接到AD9709的CLK2腳,用來控制通道B時(shí)鐘。 9. 使用dac_wrb號(hào)連接到AD9709的WRT2腳,用來控制通道B使能。 10. 使用8位信號(hào)dac_db接到AD9709的DB7~0P2腳,用來控制通道B寫數(shù)據(jù)。 綜上所述,我們這個(gè)工程需要10個(gè)信號(hào),時(shí)鐘clk,復(fù)位rst_n,dac_mode、dac_sleep、dac_clka、dac_wra、dac_da、dac_clkb、dac_wrb和dac_db信號(hào),其中dac_da和dac_db是8位信號(hào),其他都是1位信號(hào)。下面表格表示了硬件電路圖的連接關(guān)系。 將module的名稱定義為cic_prj,代碼如下: 其中clk、rst_n是1位的輸入信號(hào),dac_da和dac_db是8位的輸出信號(hào),dac_mode,dac_clka,dac_wra,dac_sleep,dac_clkb,dac_wrb是一位輸出信號(hào)。 3.2 正弦信號(hào)設(shè)計(jì) 假設(shè)產(chǎn)生的正弦信號(hào)命名為sin_data信號(hào)。sin_data一共有8個(gè)值,是從一個(gè)正弦信號(hào)中,按(2*pi/8)的間隔采樣到的,可列出下表。 很自然地定義一個(gè)7位的選擇信號(hào)addr。我們只要控制好addr,就能方便得到sin_data。因此可以寫出下面代碼。 接下來是設(shè)計(jì)信號(hào)addr。 addr是用來控制選擇數(shù)據(jù)的地址,通過控制addr的增加值,就能產(chǎn)生所需要的正弦波。 本案例要求產(chǎn)生62.5KHz的正弦信號(hào)。該正弦信號(hào)的周期是16000ns。本工程的工作時(shí)鐘是20ns,也就是16000/20 = 800個(gè)時(shí)鐘輸出一個(gè)正弦信號(hào),也就是800個(gè)時(shí)鐘將上表的8個(gè)值輸出一遍,即每100個(gè)時(shí)鐘輸出addr加1。 每100個(gè)時(shí)鐘輸出一個(gè)值,那意味著我們需要一個(gè)計(jì)數(shù)器cnt0,該計(jì)數(shù)器用來對這100進(jìn)行計(jì)數(shù)。計(jì)數(shù)器的加1條件是“1”,結(jié)束條件是“數(shù)到100個(gè)”。因此可寫出cnt0的代碼。 每100個(gè)時(shí)鐘后,addr就加1。說明這個(gè)addr也是一個(gè)計(jì)數(shù)器,該計(jì)數(shù)器的加1條件是“數(shù)到100個(gè)時(shí)鐘”,即end_cnt0,結(jié)束條件是“數(shù)到8個(gè)”。 3.3 CIC 濾波器設(shè)計(jì)3.3.1 新建FPGA工程 1.)打開quartus,點(diǎn)擊File 在File菜單中選擇New ProjectWizard.... 。 2.彈出Introduction界面選擇Next。 (3)設(shè)置工程目錄,工程名,頂層模塊名 工程目錄設(shè)置為:D:\mdy_book\cic_prj 工程名:cic_prj 頂層模塊名:cic_prj 填寫完畢后,點(diǎn)擊next之后進(jìn)入下一界面。 (3.)在文件添加界面,不選擇任何文件。點(diǎn)擊Next,進(jìn)入下一個(gè)界面。工程類型界面,Project Type選擇Empty project,選擇空白工程。點(diǎn)Next進(jìn)入下一個(gè)界面。 (3.)在文件添加界面,不選擇任何文件。點(diǎn)擊Next,進(jìn)入下一個(gè)界面。 (4.)器件選擇界面。在Device family這一項(xiàng)之中選擇 Cyclone IV E;在下部的Available device 選擇EP4CE6F23C8。完成后直接點(diǎn)擊Finish。 3.3.2FPGA生成CIC IP核 建立工程后,在quartus中IP catalog這一界面中選擇DSP下一目錄中選擇Filter 再選擇 CIC。 點(diǎn)擊后進(jìn)入此界面給新生成的fir濾波器ip核選擇如下路徑:D:\mdy_book\cic_prj,entityname填寫:my_cic。點(diǎn)擊OK后,進(jìn)入FIR濾波器設(shè)置界面。 按如下設(shè)置: Filter Type:要選擇Interpolator,表示是插值濾波器。 Rate change factor:填上4,表示是4倍插值。 output Rounding Method:選擇Truncation,表示輸出的結(jié)果要截?cái)唷?/font> Output data width:選擇8。表示輸出結(jié)果要截?cái)酁?位。 其他選項(xiàng)默認(rèn),點(diǎn)擊窗口右下角的Generate Hdl,會(huì)彈出下面的窗口。 注意選擇文件是Verilog文件,其他都不用勾選。點(diǎn)擊Generate,就會(huì)生成y_cic的verilog文件。 出現(xiàn)上面的提示,就是生成成功了。 點(diǎn)Finish關(guān)閉CIC濾波器生成窗口。 如果出現(xiàn)上面的提示,就是表示要手動(dòng)將剛才生成的IP核加到本工程。 在Project菜單中選擇Add/Remove File to Project,彈出文件窗口。 點(diǎn)擊右上角的,在彈出來的窗口中,雙擊選擇D:\mdy_book\cic_prj\my_cic\synthesis目錄下的my_cic.qip文件(注意不要搞錯(cuò)文件類型)。然后記得要點(diǎn)Add,才算正式加到工程。 點(diǎn)OK關(guān)閉本窗口。 IP核生成后彈出此對話框點(diǎn)擊yes 將此IP核添加進(jìn)工程。 3.3.3 例化CIC IP核 用GVIM打開D:\mdy_book\cic_prj\my_cic\synthesis\my_cic.v文件,該文件就是生成的CIC IP核文件 特別注意的是,濾波器的輸入數(shù)據(jù)和輸出數(shù)據(jù)都是有符號(hào)數(shù)(補(bǔ)碼的形式,-128~127)。而我們知道,正弦信sin_data是無符號(hào)數(shù)(0~255)。所以要將sin_data變成有符號(hào)數(shù),再送給FIR進(jìn)行濾波。假設(shè)轉(zhuǎn)換后的信號(hào)為cic_din,該信號(hào)位寬為8位。 無符號(hào)數(shù)轉(zhuǎn)成有符號(hào)數(shù)的方法很簡單:cic_din = sin_data - 128。讀者有興趣可以驗(yàn)證一下。 生成CIC IP核后,我們要對其進(jìn)行例化,才行使用上這個(gè)IP核,例化名起名u_my_cic,cic的輸出數(shù)據(jù)信號(hào)命名為cic_dout。 我們要控制CIC IP核的輸出,使每個(gè)數(shù)據(jù)都能等間隔輸出數(shù)據(jù)。由于CIC濾波器的輸入是100個(gè)時(shí)鐘一個(gè)數(shù)據(jù),CIC是4倍速率,因此輸出是25個(gè)時(shí)鐘一個(gè)數(shù)據(jù)。所以我們每25個(gè)時(shí)鐘給一個(gè)有效信號(hào)連到out_ready接口上。這時(shí)需要一個(gè)計(jì)數(shù)器cnt1來計(jì)時(shí)25個(gè)時(shí)鐘,該計(jì)數(shù)器加1條件是“1”,結(jié)束條件是“數(shù)到25個(gè)”。 |