以下文章來源于CSDN技術(shù)社區(qū),作者開放原子開發(fā)者工作坊
多速率信號(hào)處理
這個(gè)概念是相對(duì)于單速率(Single Rate)信號(hào)處理而言的。單速率 是指整個(gè)信號(hào)處理流程中只有一種數(shù)據(jù)速率;多速率 是指系統(tǒng)中存在多個(gè)數(shù)據(jù)速率。使用多速率信號(hào)處理可以節(jié)省存儲(chǔ)空間、減少通信數(shù)據(jù)量、減少運(yùn)算量、減輕設(shè)計(jì)難度。
很明顯從字面意思上可以理解,多采樣率嘛,就是有多個(gè)采樣率唄。前面所說的FIR,IIR濾波器都是只有一個(gè)采樣頻率,是固定不變的采樣率,然而有些情況下需要不同采樣頻率下的信號(hào),具體例子我們將以數(shù)字下變頻(DDC)為例來進(jìn)行講解。
按照傳統(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)換。所以我們引入了更好的抽取與內(nèi)插方法。
比如在DDC(數(shù)字下變頻)系統(tǒng)中,前級(jí)需要很高的采樣率fs確保ADC采集到信號(hào)的信噪比;而在去載波并提取出低頻的基帶信號(hào)后,信號(hào)有效帶寬已經(jīng)很小,此時(shí)可以滿足要求的采樣率也遠(yuǎn)遠(yuǎn)低于fs,如果不進(jìn)行數(shù)據(jù)速率轉(zhuǎn)換的處理,會(huì)造成許多資源的浪費(fèi)和設(shè)計(jì)上的困難:
多速率信號(hào)處理 主要包括 數(shù)據(jù)速率的轉(zhuǎn)換 和 LPF的設(shè)計(jì) 兩個(gè)過程。數(shù)據(jù)速率的轉(zhuǎn)換包括 抽取(Decimation,降低采樣率) 和 內(nèi)插(interpolation,提高采樣率) 。抽取/內(nèi)插時(shí)應(yīng)保證信號(hào)的有效頻帶內(nèi)沒有頻譜混疊,因此需要完成LPF的設(shè)計(jì),常用的有 多速率FIR濾波器、CIC濾波器、HB濾波器。
從上面的文章中,我們可以看出多速率濾波器最重要的也就是抽取與內(nèi)插兩個(gè)操作。
抽取
當(dāng)需要降低采樣率時(shí),輸入信號(hào)數(shù)據(jù)每隔D-1個(gè)取一個(gè),取出的數(shù)據(jù)依次排序,這個(gè)過程稱作D倍抽取,采樣率變?yōu)樵瓉淼?/D。但是我們需要確保抽取之后的采樣率仍然可以滿足Nyquist采樣定理,否則會(huì)造成頻譜的混疊。當(dāng)然由于ADC的轉(zhuǎn)換也會(huì)在整個(gè)頻段內(nèi)引入白噪聲,因此在抽取前還是需要加入抗混疊濾波器。如下圖所示:
上面是抽取的主要操作,也是絕大多數(shù)FPGA工程師進(jìn)行的操作,但是卻不明白其中的原理。接下來我們將從信號(hào)處理的角度解釋上面兩點(diǎn):
1、為什么一定要保證抽取后滿足奈奎斯特抽樣定理。
2、為什么要先經(jīng)過抗混疊濾波器。
先來總體來解釋一下抽取的含義:前面不是說,一個(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的采樣頻率對(duì)模擬信號(hào)進(jìn)行采樣了?所以,抽取的過程就是降低抽樣率的過程,但是我們知道,這是在時(shí)域的抽樣,時(shí)域的抽樣等于信號(hào)在頻域波形的周期延拓(信號(hào)系統(tǒng)中的公式),周期就是采樣頻率,所以,為了避免在頻域發(fā)生頻譜混疊,抽樣定理也是我們要考慮的因素
下面來具體來介紹:
如上圖所示,假如上面就是某一有用信號(hào)經(jīng)采樣頻率f1抽樣得到的頻譜,假設(shè)這時(shí)候的采樣頻率為8Khz,可以通過數(shù)格子得到,從0到F1處有8個(gè)空格,每個(gè)空格代表1Khz,有些朋友可能會(huì)問,這不是在數(shù)字頻域嗎,單位不是π嗎,哪來的hz?是的,這里是數(shù)字頻域,采樣頻率F1處對(duì)應(yīng)的是2π,這里只是為了好解釋,我們用模擬頻率來對(duì)應(yīng)數(shù)字頻率(如果這里不懂的話需要惡補(bǔ)信號(hào)系統(tǒng)與數(shù)字信號(hào)處理的知識(shí))。
下圖就是對(duì)信號(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對(duì)應(yīng)的數(shù)域頻率是π,因此我們得出,抗混疊低通濾波器的截止頻率是π/M。
內(nèi)插
當(dāng)需要提高采樣率時(shí),在兩個(gè)相鄰的數(shù)據(jù)之間插入I-1個(gè)零值,再進(jìn)行低通濾波,這個(gè)過程稱作 I倍內(nèi)插 ,采樣率變?yōu)樵瓉淼腎倍。只要LPF的通帶為信號(hào)的有效帶寬,即使插值時(shí)只插入零值點(diǎn)(沒有插入采樣值的點(diǎn)),也可以達(dá)到I倍內(nèi)插的效果。經(jīng)過插值后的信號(hào)由DAC輸出會(huì)引入更小的高頻噪聲。如下圖所示:
抽取的過程是降低采樣率的過程,那么插值的過程當(dāng)然就是提高采樣率的過程。大體的思路可以這么理解,我們將經(jīng)f1抽樣下得到的數(shù)字信號(hào)的每?jī)蓚€(gè)點(diǎn)之間進(jìn)行插值,插入的值是0,插值之后,信號(hào)在單位時(shí)間內(nèi)的采樣點(diǎn)數(shù)增多,當(dāng)然也就是采樣速率的提升,采樣速率提升后我們知道,那么信 號(hào)的頻譜的周期數(shù)就會(huì)增加:
信號(hào)系統(tǒng)學(xué)的好的同學(xué)可以試著推導(dǎo)一下上面的頻譜變化,相信不是太難。
需要注意的一點(diǎn)就是,插值前后,我們只是在時(shí)域信號(hào)中間插入了D-1個(gè)零值,僅僅是改變了采樣率,并沒有改變信號(hào)的信息,因此,在頻域,信號(hào)頻譜的形狀是不會(huì)改變的,改變的僅僅是模擬頻率與數(shù)字頻率的對(duì)應(yīng),如上圖,F(xiàn)1是插值之前信號(hào)的抽樣頻率,插值之后,信號(hào)頻譜的形狀不變,抽樣頻率成了F1D,D是插值倍數(shù)。如果我們直接用F1D倍的采樣率采信號(hào),得到的頻譜會(huì)發(fā)現(xiàn),就不會(huì)有中間兩個(gè)波形,因此,這兩個(gè)波形是多余的,書上叫做是鏡像頻譜*。既然是多余的,我們就可以將它用一個(gè)低通濾波器濾掉,這樣的低通濾波器,就叫做鏡像低通濾波器。這樣我們來計(jì)算一下鏡像低通濾波器的截止頻率
根據(jù)上面這張圖我們可以求出鏡像低通濾波器的截止頻率,可以看到,fc = 1/2 F1,這里我們假設(shè),內(nèi)插之后的采樣頻率為F2 =F1D,那么,fc =1/2*(F2/D),而1/2F2對(duì)應(yīng)的是π,注意,這里是1/2F2對(duì)應(yīng)π,不是1/2*F1了,因?yàn)檫@已經(jīng)是插值之后采樣率增加之后的頻譜了,所以我們得出,鏡像低通濾波器的截止頻率為:π/D
分?jǐn)?shù)倍抽取與內(nèi)插
上面抽取和內(nèi)插實(shí)現(xiàn)的都是整數(shù)倍數(shù)據(jù)速率的轉(zhuǎn)換。而實(shí)際設(shè)計(jì)中遇到的更多不會(huì)是整數(shù)倍關(guān)系??梢允褂孟葍?nèi)插、再抽取的方式完成采樣率為有理數(shù)比值的數(shù)據(jù)速率轉(zhuǎn)換,且可以共用一個(gè)LPF,截止頻率選取二者的最小帶寬即可。如下圖所示:
根據(jù)前面抽取與內(nèi)插的介紹我們知道了,內(nèi)插的過程是先進(jìn)行內(nèi)插處理,再通過鏡像低通濾波器,抽取的過程就是先進(jìn)行抗混疊低通濾波,再進(jìn)行抽取,我們可以看出來,假如我們想進(jìn)行分?jǐn)?shù)倍抽取,比如我要進(jìn)行3/5倍抽取,就可以先進(jìn)行3倍內(nèi)插,再進(jìn)行5倍抽取,這樣就可以實(shí)現(xiàn)分?jǐn)?shù)倍抽取。
再來看一下,當(dāng)進(jìn)行分?jǐn)?shù)倍抽取與內(nèi)插的時(shí)候,鏡像低通濾波器和抗混疊低通濾波器是連在一起的,因此,我們可以將這兩個(gè)濾波器合二為一,截止頻率取兩個(gè)濾波器截止頻率的最小值就可以了。
上面關(guān)于數(shù)據(jù)的抽取與內(nèi)插的知識(shí)已經(jīng)介紹完畢,如果有哪里不懂,可以查閱書本知識(shí)。從這篇文章我們也可以看出來數(shù)字信號(hào)處理理論知識(shí)的重要性。如果上大學(xué)的同學(xué)看到這篇文章,這里勸誡一定學(xué)好基礎(chǔ)理論,否則只能做個(gè)調(diào)參俠。
CIC濾波器
CIC濾波器 是無線通信的常用模塊,一般用于 數(shù)字下變頻(DDC)和數(shù)字上變頻(DUC)系統(tǒng)。CIC濾波器結(jié)構(gòu)簡(jiǎn)單,沒有乘法器,只有加法器、積分器和寄存器,可以實(shí)現(xiàn)高速濾波,常用在輸入采樣率最高的第一級(jí)。從上面可以看出來CIC濾波器的優(yōu)點(diǎn):CIC(Cascaded Integrator Comb)積分梳狀與其他多速率FIR濾波器濾波器運(yùn)算速度快、占用資源少C、工作頻率高(因?yàn)镃IC只使用加法器、減法器和寄存器),在多速率信號(hào)處理系統(tǒng)中應(yīng)用更廣泛。
CIC濾波器理論推導(dǎo)
單級(jí)CICI濾波器
CIC濾波器包括兩個(gè)基本組成部分:積分部分和梳妝部分,如圖所示:
積分部分的積分器是單極點(diǎn)的IIR濾波器,并且反饋系數(shù)為1,狀態(tài)方程為:
y(n)=y(n?1)+x(n)
上述的積分器也可以看做是累加器。根據(jù)Z變換,積分器的傳輸函數(shù)為:
H1(z)=1?z?11
梳妝器是一份FIR濾波器,其狀態(tài)方程為:
y(n)=x(n?1)?x(n?DM)
式中,D是設(shè)計(jì)參數(shù),稱為微分延遲,其傳輸函數(shù)為:
Hc(z)=1?z?DM
那么:?jiǎn)渭?jí)CIC濾波器的傳遞函數(shù)為:
H(z)=1?z?11(1?zDM)
令 z=ejw,帶入上式,可以得到傳遞函數(shù)的幅頻響應(yīng)為:
CIC濾波器的幅頻響應(yīng)特性如圖所示,其中[0,2π/DM]為主瓣,其他的區(qū)間稱為旁瓣。
從幅頻響應(yīng)特性可以看到,主瓣的最大值為DM(在w=0時(shí)),旁瓣的最大值在 w=3π/DM處 取得
它與主瓣電平的比值為:
根據(jù)在θ在0~45°時(shí),θ≈sinθ,可得:
α=20lg(23π)=13.36dB
可見單級(jí)CIC濾波器的旁瓣電平較大,阻帶衰減較差。為降低旁瓣電平,可以采用多級(jí)CIC濾波器級(jí)聯(lián)辦法來實(shí)現(xiàn)。
多級(jí)CICI濾波器
根據(jù)前面可知,單級(jí)CIC濾波器的第一旁瓣電平衰減固定為13.46dB,且與濾波器的階數(shù)無關(guān)。這個(gè)值不滿足通常的阻帶衰減要求,解決方法就是通過級(jí)聯(lián)CIC濾波器來達(dá)到更大的阻帶衰減。事實(shí)上實(shí)際應(yīng)用中采用的都是多級(jí)CIC濾波器。
一個(gè)N級(jí)CIC抽取濾波器系統(tǒng)傳遞函數(shù)為:
H(z)=(1?z?11?z?DM)N
在N級(jí)級(jí)聯(lián)時(shí),阻帶衰減為單級(jí)衰減的N倍,即13.46×N(dB)。
但是在阻帶衰減的情況下也帶來一系列的問題:
1、要同時(shí)滿足通帶容限跟阻帶容限的誤差的CIC濾波器實(shí)現(xiàn)起來比較困難,因?yàn)橐胱鑾p大,就要增大濾波器級(jí)數(shù),但是會(huì)導(dǎo)致通帶容限增大。
2、如果要實(shí)現(xiàn)這樣的濾波器,只有當(dāng)有用信號(hào)的頻帶相對(duì)于采樣信號(hào)的速率很小時(shí)才能設(shè)計(jì)出符合要求的濾波器,這樣的話通帶衰減較大的情況下也對(duì)有用信號(hào)影響較小。
3、有用信號(hào)的頻帶相對(duì)于采樣信號(hào)的速率很小也就是意味著信號(hào)的采樣率很高,所以,CIC濾波器適合應(yīng)用在多速率信號(hào)處理的前端,作為抗混疊濾波器來用,或者是作為后端的抗混疊插值濾波器。
CIC濾波器的FPGA實(shí)現(xiàn)
上面我們已經(jīng)對(duì)CIC的主要原理進(jìn)行了講述。其實(shí)CIC濾波器本質(zhì)上就是一個(gè)簡(jiǎn)單的低通濾波器,只是方便與抽取與內(nèi)插聯(lián)系起來,下面我們將給出源代碼供大家學(xué)習(xí):
CIC抽取濾波器代碼
使用50MHz采樣率對(duì)0.25MHz的信號(hào)進(jìn)行采樣,由五階CIC濾波器進(jìn)行5倍抽取,將采樣率降至10MHz。這里我們直接給出CIC抽取濾波器代碼,
cic模塊:
`timescale 1ns / 1ps // ********************************************************************************* // Project Name : OSXXXX // Author : zhangningning // Email : nnzhang1996@foxmail.com // Website : // Module Name : cic.v // Create Time : 2020-04-24 1516 // Editor : sublime text3, tab size (4) // CopyRight(c) : All Rights Reserved // // ********************************************************************************* // Modification History: // Date By Version Change Description // ----------------------------------------------------------------------- // XXXX zhangningning 1.0 Original // // ********************************************************************************* module cic( //System Interfaces input sclk , input rst_n , //Communication Interfaces input rvalid , input [ 9:0] din , output reg tvalid , output reg [12:0] dout ); //======================================================================================== //**************Define Parameter and Internal Signals********************************** //========================================================================================/ reg [ 2:0] cnt ; reg [12:0] sum ; wire [12:0] din_x ; //======================================================================================== //************** Main Code ********************************** //========================================================================================/ assign din_x = {{3{din[9]}},din}; always @(posedge sclk or negedge rst_n) if(rst_n == 1'b0) cnt <= 3'd0; else if(rvalid == 1'b1 && cnt == 'd4) cnt <= 3'd0; else if(rvalid == 1'b1) cnt <= cnt + 1'b1; else cnt <= cnt; always @(posedge sclk or negedge rst_n) if(rst_n == 1'b0) sum <= 13'd0; else if(rvalid == 1'b1 && cnt == 'd4) sum <= din_x; else if(rvalid == 1'b1) sum <= sum + din_x; else sum <= sum; always @(posedge sclk or negedge rst_n) if(rst_n == 1'b0) dout <= 13'd0; else if(rvalid == 1'b1 && cnt == 'd4) dout <= sum; else dout <= dout; always @(posedge sclk or negedge rst_n) if(rst_n == 1'b0) tvalid <= 1'b0; else if(rvalid == 1'b1 && cnt == 'd4) tvalid <= 1'b1; else tvalid <= 1'b0; endmodule
有不少同學(xué)會(huì)問嗎,這不就是對(duì)輸出的5個(gè)數(shù)據(jù)求了一次平均,咋么能說是CIC抽取濾波器呢。因?yàn)楫?dāng)梳狀濾波器的階數(shù)與抽取的的數(shù)目相同時(shí),可以在積分器之后先抽取再經(jīng)過梳狀濾波器。然后經(jīng)過稍微化簡(jiǎn)便可以成為上述形式。這也原理被稱為Noble恒等式。
在抽取的過程中,一般是信號(hào)先經(jīng)過抗混疊低通濾波器進(jìn)行濾波,來避免頻譜混疊現(xiàn)象的發(fā)生,然后再進(jìn)行抽取處理,但是我們可以利用Noble恒等式,先對(duì)信號(hào)進(jìn)行抽取,再對(duì)其進(jìn)行濾波。這些知識(shí)再多級(jí)CIC濾波器應(yīng)用中尤其明顯,我們將在下一篇文章中進(jìn)行進(jìn)一步的講解
CIC抽取濾波器測(cè)試代碼
關(guān)于CIC抽取濾波器的代碼,我們使用了DDS來產(chǎn)生采樣率50MHz、頻率0.25MHz的正弦波。代碼如下:
tb模塊:
`timescale 1ns / 1ps // ********************************************************************************* // Project Name : OSXXXX // Author : zhangningning // Email : nnzhang1996@foxmail.com // Website : // Module Name : tb.v // Create Time : 2020-04-24 1612 // Editor : sublime text3, tab size (4) // CopyRight(c) : All Rights Reserved // // ********************************************************************************* // Modification History: // Date By Version Change Description // ----------------------------------------------------------------------- // XXXX zhangningning 1.0 Original // // ********************************************************************************* module tb(); reg sclk ; reg rst_n ; wire rvalid ; wire [ 7:0] din ; wire tvalid ; wire [12:0] dout ; initial begin sclk = 1'b0; rst_n <= 1'b0; #(1000); rst_n <= 1'b1; end always #(10) sclk = ~sclk; dds_compiler_0 dds_compiler_0_inst ( .aclk (sclk ), // input wire aclk .m_axis_data_tvalid (rvalid ), // output wire m_axis_data_tvalid .m_axis_data_tdata (din ) // output wire [7 : 0] m_axis_data_tdata ); cic cic_inst( //System Interfaces .sclk (sclk ), .rst_n (rst_n ), //Communication Interfaces .rvalid (rvalid ), .din ({{2{din[7]}},din} ), .tvalid (tvalid ), .dout (dout ) ); endmodule
CIC抽取濾波器仿真結(jié)果
上述的仿真結(jié)果如下:
從上面我們很明顯看出我們成功實(shí)現(xiàn)了正弦波的抽取。從而驗(yàn)證了我們實(shí)驗(yàn)的正確性。
CIC內(nèi)插濾波器代碼
關(guān)于CIC抽取濾波器的代碼,我們使用了DDS來產(chǎn)生采樣率50MHz、頻率0.25MHz的正弦波,然后經(jīng)過10倍抽取使得采樣率降為5MHz;再經(jīng)過10倍插值,最后經(jīng)過100階的CIC濾波器檢驗(yàn)其內(nèi)插效果。代碼如下:
CIC_inter模塊:
`timescale 1ns / 1ps // ********************************************************************************* // Project Name : OSXXXX // Author : zhangningning // Email : nnzhang1996@foxmail.com // Website : // Module Name : CIC_inter.v // Create Time : 2020-04-24 2056 // Editor : sublime text3, tab size (4) // CopyRight(c) : All Rights Reserved // // ********************************************************************************* // Modification History: // Date By Version Change Description // ----------------------------------------------------------------------- // XXXX zhangningning 1.0 Original // // ********************************************************************************* module CIC_inter( //System Interfaces input sclk , input rst_n , //Communication Interfaces input rvalid , input [12:0] din , output reg tvalid , output wire [19:0] dout ); //======================================================================================== //**************Define Parameter and Internal Signals********************************** //========================================================================================/ reg [ 9:0] cnt ; wire [19:0] din_x ; wire [19:0] data ; reg data_valid ; reg [ 9:0] cnt_cic ; reg [19:0] sum ; //======================================================================================== //************** Main Code ********************************** //========================================================================================/ assign din_x = {{7{din[12]}},din}; assign data = din_x; assign dout = sum; always @(posedge sclk or negedge rst_n) if(rst_n == 1'b0) cnt <= 10'd0; else if(cnt == 10'd0 && rvalid == 1'b1) cnt <= cnt + 1'b1; else if(cnt > 0 && cnt == 'd9) cnt <= 10'd0; else if(cnt > 0) cnt <= cnt + 1'b1; else cnt <= 10'd0; always @(posedge sclk or negedge rst_n) if(rst_n == 1'b0) data_valid <= 1'b0; else if(cnt == 10'd0 && rvalid == 1'b1) data_valid <= 1'b1; else if(cnt > 0) data_valid <= 1'b1; else data_valid <= 1'b0; always @(posedge sclk or negedge rst_n) if(rst_n == 1'b0) cnt_cic <= 10'd0; else if(data_valid == 1'b1 && cnt_cic == 'd99) cnt_cic <= 10'd0; else if(data_valid == 1'b1) cnt_cic <= cnt_cic + 1'b1; else cnt_cic <= cnt_cic; always @(posedge sclk or negedge rst_n) if(rst_n == 1'b0) sum <= 16'd0; else if(data_valid == 1'b1 && cnt_cic == 'd99) sum <= data; else if(data_valid == 1'b1) sum <= sum + data; else sum <= sum; always @(posedge sclk or negedge rst_n) if(rst_n == 1'b0) tvalid <= 1'b0; else if(data_valid == 1'b1) tvalid <= 1'b1; else tvalid <= 1'b0; endmodule
cic模塊:
`timescale 1ns / 1ps // ********************************************************************************* // Project Name : OSXXXX // Author : zhangningning // Email : nnzhang1996@foxmail.com // Website : // Module Name : cic.v // Create Time : 2020-04-24 1516 // Editor : sublime text3, tab size (4) // CopyRight(c) : All Rights Reserved // // ********************************************************************************* // Modification History: // Date By Version Change Description // ----------------------------------------------------------------------- // XXXX zhangningning 1.0 Original // // ********************************************************************************* module cic( //System Interfaces input sclk , input rst_n , //Communication Interfaces input rvalid , input [ 9:0] din , output reg tvalid , output reg [12:0] dout ); //======================================================================================== //**************Define Parameter and Internal Signals********************************** //========================================================================================/ reg [ 9:0] cnt ; reg [12:0] sum ; wire [12:0] din_x ; //======================================================================================== //************** Main Code ********************************** //========================================================================================/ assign din_x = {{3{din[9]}},din}; always @(posedge sclk or negedge rst_n) if(rst_n == 1'b0) cnt <= 10'd0; else if(rvalid == 1'b1 && cnt == 'd9) cnt <= 10'd0; else if(rvalid == 1'b1) cnt <= cnt + 1'b1; else cnt <= cnt; always @(posedge sclk or negedge rst_n) if(rst_n == 1'b0) sum <= 13'd0; else if(rvalid == 1'b1 && cnt == 'd9) sum <= din_x; else if(rvalid == 1'b1) sum <= sum + din_x; else sum <= sum; always @(posedge sclk or negedge rst_n) if(rst_n == 1'b0) dout <= 13'd0; else if(rvalid == 1'b1 && cnt == 'd9) dout <= sum; else dout <= dout; always @(posedge sclk or negedge rst_n) if(rst_n == 1'b0) tvalid <= 1'b0; else if(rvalid == 1'b1 && cnt == 'd9) tvalid <= 1'b1; else tvalid <= 1'b0; endmodule
CIC內(nèi)插濾波器測(cè)試代碼
tb模塊:
`timescale 1ns / 1ps // ********************************************************************************* // Project Name : OSXXXX // Author : zhangningning // Email : nnzhang1996@foxmail.com // Website : // Module Name : tb.v // Create Time : 2020-04-24 1612 // Editor : sublime text3, tab size (4) // CopyRight(c) : All Rights Reserved // // ********************************************************************************* // Modification History: // Date By Version Change Description // ----------------------------------------------------------------------- // XXXX zhangningning 1.0 Original // // ********************************************************************************* module tb(); reg sclk ; reg rst_n ; wire rvalid ; wire [ 7:0] din ; wire tvalid ; wire [12:0] dout ; wire [15:0] CIC_inter_data ; wire CIC_inter_tvalid; initial begin sclk = 1'b0; rst_n <= 1'b0; #(1000); rst_n <= 1'b1; end always #(10) sclk = ~sclk; dds_compiler_0 dds_compiler_0_inst ( .aclk (sclk ), // input wire aclk .m_axis_data_tvalid (rvalid ), // output wire m_axis_data_tvalid .m_axis_data_tdata (din ) // output wire [7 : 0] m_axis_data_tdata ); cic cic_inst( //System Interfaces .sclk (sclk ), .rst_n (rst_n ), //Communication Interfaces .rvalid (rvalid ), .din ({{2{din[7]}},din} ), .tvalid (tvalid ), .dout (dout ) ); CIC_inter CIC_inter_inst( //System Interfaces .sclk (sclk ), .rst_n (rst_n ), //Communication Interfaces .rvalid (tvalid ), .din (dout ), .tvalid (CIC_inter_tvalid ), .dout (CIC_inter_data ) ); endmodule
CIC內(nèi)插濾波器仿真結(jié)果
將工程進(jìn)行Modelsim仿真,結(jié)果如下:
從上面的結(jié)果可以看出內(nèi)插結(jié)果正確,但是由于單級(jí)CIC濾波器的阻帶衰減太低,所以在實(shí)際工程中一般都是使用多級(jí)CIC濾波器進(jìn)行濾波
原文鏈接:
https://openatomworkshop.csdn.net/674576e63a01316874d897d6.html
-
FPGA
+關(guān)注
關(guān)注
1645文章
22050瀏覽量
618662 -
濾波器
+關(guān)注
關(guān)注
162文章
8138瀏覽量
182115 -
adc
+關(guān)注
關(guān)注
99文章
6709瀏覽量
549275 -
CIC濾波器
+關(guān)注
關(guān)注
0文章
16瀏覽量
10751
原文標(biāo)題:基于FPGA的CIC濾波器設(shè)計(jì)
文章出處:【微信號(hào):gh_9d70b445f494,微信公眾號(hào):FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
基于FPGA的單級(jí)cic濾波器設(shè)計(jì)方案
基于DSP Builder的CIC梳狀濾波器該怎么設(shè)計(jì)?
單級(jí)CIC濾波器Verilog設(shè)計(jì)
CIC抽取濾波器MATLAB仿真和FPGA實(shí)現(xiàn)
CIC濾波器的優(yōu)化設(shè)計(jì)及FPGA實(shí)現(xiàn)
CIC抽取濾波器的改進(jìn)及其FPGA的實(shí)現(xiàn)
基于MATLAB和FPGA的CIC濾波器的設(shè)計(jì)

多速率采樣中的CIC濾波器設(shè)計(jì)與分析

基于fpga的cic濾波器的設(shè)計(jì)
基于FPGA的DDC中CIC濾波器的設(shè)計(jì)
采用FPGA實(shí)現(xiàn)多級(jí)CIC濾波器的四倍抽取一

Verilog CIC濾波器設(shè)計(jì)

Verilog CIC濾波器設(shè)計(jì)

評(píng)論