一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于FPGA的CIC濾波器設(shè)計(jì)

FPGA設(shè)計(jì)論壇 ? 來源:CSDN技術(shù)社區(qū) ? 2024-12-30 15:10 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

以下文章來源于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ì)上的困難:

c72d3f78-c664-11ef-9310-92fbcf53809c.png

多速率信號(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)引入白噪聲,因此在抽取前還是需要加入抗混疊濾波器。如下圖所示:

c74935d4-c664-11ef-9310-92fbcf53809c.png

上面是抽取的主要操作,也是絕大多數(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ā)生頻譜混疊,抽樣定理也是我們要考慮的因素

下面來具體來介紹:

c75230bc-c664-11ef-9310-92fbcf53809c.png

如上圖所示,假如上面就是某一有用信號(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)行抽取。

c76531da-c664-11ef-9310-92fbcf53809c.png

這樣的話我們來算一下,低通濾波器的截止頻率就是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ì)引入更小的高頻噪聲。如下圖所示:

c7816a62-c664-11ef-9310-92fbcf53809c.png

抽取的過程是降低采樣率的過程,那么插值的過程當(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ì)增加:

c794af32-c664-11ef-9310-92fbcf53809c.png

信號(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ì)算一下鏡像低通濾波器的截止頻率

c7af7a4c-c664-11ef-9310-92fbcf53809c.png

根據(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,截止頻率選取二者的最小帶寬即可。如下圖所示:

c7c1dfe8-c664-11ef-9310-92fbcf53809c.png

根據(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è)基本組成部分:積分部分和梳妝部分,如圖所示:

c7d483d2-c664-11ef-9310-92fbcf53809c.png

積分部分的積分器是單極點(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)為:

c7ef6472-c664-11ef-9310-92fbcf53809c.png

CIC濾波器的幅頻響應(yīng)特性如圖所示,其中[0,2π/DM]為主瓣,其他的區(qū)間稱為旁瓣。

c8030ac2-c664-11ef-9310-92fbcf53809c.png

從幅頻響應(yīng)特性可以看到,主瓣的最大值為DM(在w=0時(shí)),旁瓣的最大值在 w=3π/DM處 取得

c8195836-c664-11ef-9310-92fbcf53809c.png

它與主瓣電平的比值為:

c830f572-c664-11ef-9310-92fbcf53809c.png

根據(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é)果如下:

c838cf2c-c664-11ef-9310-92fbcf53809c.png


從上面我們很明顯看出我們成功實(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é)果如下:

c84eedb6-c664-11ef-9310-92fbcf53809c.png


從上面的結(jié)果可以看出內(nèi)插結(jié)果正確,但是由于單級(jí)CIC濾波器的阻帶衰減太低,所以在實(shí)際工程中一般都是使用多級(jí)CIC濾波器進(jìn)行濾波

原文鏈接:

https://openatomworkshop.csdn.net/674576e63a01316874d897d6.html

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1645

    文章

    22050

    瀏覽量

    618662
  • 濾波器
    +關(guān)注

    關(guān)注

    162

    文章

    8138

    瀏覽量

    182115
  • adc
    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)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    基于FPGA的多級(jí)CIC濾波器原理

    在實(shí)現(xiàn)多級(jí)CIC濾波器前我們先來了解滑動(dòng)平均濾波器、微分、積分以及梳狀濾波器原理。
    的頭像 發(fā)表于 12-03 11:55 ?6269次閱讀
    基于<b class='flag-5'>FPGA</b>的多級(jí)<b class='flag-5'>CIC</b><b class='flag-5'>濾波器</b>原理

    基于FPGA的單級(jí)cic濾波器設(shè)計(jì)方案

    作者: OpenSLee 1 概述 在數(shù)字信號(hào)處理中,CIC濾波器是FIR濾波器中最優(yōu)的一種,其使用了積分,梳狀濾波器級(jí)聯(lián)的方式。 CIC
    的頭像 發(fā)表于 12-05 10:21 ?3338次閱讀

    基于DSP Builder的CIC梳狀濾波器該怎么設(shè)計(jì)?

    成長(zhǎng),CIC低通濾波器得到了廣泛的應(yīng)用。長(zhǎng)期以來,CIC梳狀濾波器一般是在通用DSP處理上實(shí)現(xiàn)的,由于DSP處理
    發(fā)表于 09-23 07:22

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

    濾波器的階數(shù)與內(nèi)插/抽取的倍數(shù)相同時(shí),其結(jié)構(gòu)更利于FPGA實(shí)現(xiàn)。比如抽取時(shí),只需要將D個(gè)數(shù)據(jù)組成一組,相加作為一個(gè)輸出即可(即同時(shí)完成了濾波與抽?。?。結(jié)合下面的實(shí)例理解(設(shè)CIC
    發(fā)表于 09-28 09:36

    CIC抽取濾波器MATLAB仿真和FPGA實(shí)現(xiàn)

    CIC抽取濾波器MATLAB仿真和FPGA實(shí)現(xiàn)(1)設(shè)計(jì)理想濾波器目標(biāo):1、濾波器在有效頻段內(nèi)紋波滿足設(shè)計(jì)要求。2、抽取或內(nèi)插處理后在有效頻
    發(fā)表于 08-17 08:27

    CIC濾波器的優(yōu)化設(shè)計(jì)及FPGA實(shí)現(xiàn)

    CIC濾波器是一種結(jié)構(gòu)簡(jiǎn)單、規(guī)整,占用存儲(chǔ)量小的濾波器,不需要乘法器,非常適用于高速采樣和插值比很大的場(chǎng)合。本文介紹了一般CIC濾波器的結(jié)構(gòu)
    發(fā)表于 03-15 12:21 ?69次下載

    CIC抽取濾波器的改進(jìn)及其FPGA的實(shí)現(xiàn)

    為補(bǔ)償傳統(tǒng)CIC濾波器的通帶衰減,提出一種改進(jìn)型的CIC抽取濾波器,即在SCIC濾波器之后級(jí)聯(lián)一個(gè)二階多項(xiàng)式內(nèi)插
    發(fā)表于 03-15 14:06 ?52次下載

    基于MATLAB和FPGACIC濾波器的設(shè)計(jì)

    基于多速率信號(hào)處理原理,設(shè)計(jì)了用于下變頻的CIC抽取濾波器,由于CIC濾波器結(jié)構(gòu)只用到加法器和延遲,沒有乘法器,很適合用
    發(fā)表于 08-26 15:12 ?162次下載
    基于MATLAB和<b class='flag-5'>FPGA</b>的<b class='flag-5'>CIC</b><b class='flag-5'>濾波器</b>的設(shè)計(jì)

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

    CIC濾波器是常用于多速率采樣抽取或內(nèi)插過程中的高效濾波器,具有結(jié)構(gòu)簡(jiǎn)單,易于工程實(shí)現(xiàn)的特點(diǎn)。以提高采樣速率為例,首先介紹了內(nèi)插理論和CtC濾波器原理,重點(diǎn)給出了
    發(fā)表于 09-20 15:12 ?73次下載
    多速率采樣中的<b class='flag-5'>CIC</b><b class='flag-5'>濾波器</b>設(shè)計(jì)與分析

    基于fpgacic濾波器的設(shè)計(jì)

    發(fā)表于 09-06 10:56 ?11次下載

    基于FPGA的DDC中CIC濾波器的設(shè)計(jì)

    文中基于多速率數(shù)字信號(hào)處理原理,設(shè)計(jì)了用于數(shù)字下變頻技術(shù)的CIC抽取濾波器。通過分析CIC濾波器的原理及性能參數(shù),利用MATLAB設(shè)計(jì)了符合系統(tǒng)要求的
    發(fā)表于 04-15 19:29 ?71次下載

    采用FPGA實(shí)現(xiàn)多級(jí)CIC濾波器的四倍抽取一

    在實(shí)現(xiàn)多級(jí)CIC濾波器前我們先來了解滑動(dòng)平均濾波器、微分、積分以及梳狀濾波器原理。
    發(fā)表于 06-22 10:35 ?3208次閱讀
    采用<b class='flag-5'>FPGA</b>實(shí)現(xiàn)多級(jí)<b class='flag-5'>CIC</b><b class='flag-5'>濾波器</b>的四倍抽取一

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

    積分梳狀濾波器CIC,Cascaded Integrator Comb),一般用于數(shù)字下變頻(DDC)和數(shù)字上變頻(DUC)系統(tǒng)。CIC 濾波器結(jié)構(gòu)簡(jiǎn)單,沒有乘法器,只有加法器、積分
    的頭像 發(fā)表于 03-27 11:40 ?1912次閱讀
    Verilog <b class='flag-5'>CIC</b><b class='flag-5'>濾波器</b>設(shè)計(jì)

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

    積分梳狀濾波器CIC,Cascaded Integrator Comb),一般用于數(shù)字下變頻(DDC)和數(shù)字上變頻(DUC)系統(tǒng)。
    的頭像 發(fā)表于 06-01 11:05 ?1903次閱讀
    Verilog <b class='flag-5'>CIC</b><b class='flag-5'>濾波器</b>設(shè)計(jì)

    基于MATLAB和FPGACIC濾波器的設(shè)計(jì)

    發(fā)表于 11-03 08:31 ?0次下載
    基于MATLAB和<b class='flag-5'>FPGA</b>的<b class='flag-5'>CIC</b><b class='flag-5'>濾波器</b>的設(shè)計(jì)