原创 数字中频处理FPGA实现

2010-7-6 18:31 4928 0 分类: FPGA/CPLD

4通道数字下变频-> CIC抽取滤波器-> FIR滤波器-> CIC插值滤波器->数字上变频<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


 


 


   


1.数字下变频


NCO采用ALTERAIP核,NCO的设置如下:


点击看大图


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />


NCO IPcore设置


 


NCO IPcoreModelSim中仿真如下:

点击看大图



ModelSim中进行NCO IPcore仿真


 


2.数字下变频+CIC 64倍抽取模块


通道1 NCO中频设为28.8MHz,通道2 NCO中频设为26.88MHzNCO输出位宽16bit,通道信号输入ch_in位宽16bitI&Q信号按如下公式产生:


I = ch_in * cos(wt)


Q = ch_in * sin(wt)


       乘法器位宽为32bitI&Q信号为16bit,截取乘法器输出的[30:15]


为仿真方便,输入设为一常量:32767


主时钟频率为122.88MHzCIC滤波抽取后数据速率为1.92MHz,抽取倍数为64,级数4,每级延迟1。输入数据位宽16bit,内部位宽为[40 40 40 40 40 40 40 40],输出位宽为16bit,截取[39:24]CIC抽取在QUARUTS中的仿真图如下:

点击看大图



CIC抽取滤波器QUARTUS仿真图


 


    CIC抽取滤波器在MATLAB中仿真如下:




点击看大图


点击看大图


点击看大图


通道1 CIC抽取滤波器MATLAB仿真图


 



点击看大图点击看大图点击看大图


通道2 CIC抽取滤波器MATLAB仿真图


 


    结论:经数据对比,结果正确。


 


3.FIR滤波器


主时钟频率122.88MHz,每通道采样频率为1.92MHz,滤波器阶数为16阶,如果采用串行累加结构实现FIR滤波器,则每通道完成一次滤波需要16个时钟,122.88/1.92=64,因此可以4通道分时复用1乘法器。FIR滤波器一般先在MATLAB FDATool中进行设计,然后从MATLAB中导出FIR滤波器的系数,再在FPGA中实现。


MATLAB FDATool中设置FIR滤波器参数如下图所示:


 点击看大图


                      图 在MATLAB中设置FIR滤波器的参数


 


    4通道FIR滤波器在FPGA中的仿真如下:


点击看大图


                      图 4通道FIR滤波器 FPGA仿真


 


    4通道FIR滤波器在MATLAB中的仿真如下: 


 


b4d5fd04-d1b7-4230-b9f5-2a3b1852fd65.jpg adc1787e-ef36-44ef-af92-98525f9848f8.jpg


                 通道1 I&Q信号 FIR滤波后输出MATLAB仿真图


 

 d881c4ac-34dc-46b8-b075-d521c6525d73.jpg 7bc749dd-2cbe-43e1-94a7-c884b11eb4cb.jpg


                

通道2 I&Q信号 FIR滤波后输出MATLAB仿真图


 


4.CIC插值滤波器


CIC插值前数据速率为1.92MHz,插值后速率为122.88MHz,插值倍数为64,级数4,每级延迟1。输入数据位宽16,内部位宽[17 18 19 19 19 24 29 34],最后输出位宽为16,截取高16[33:18]


CIC插值滤波器在QUARTUS中的仿真如下:

点击看大图


               图 CIC插值滤波器QUARTUS仿真图


 


产生相同的输入数据,在MATLAB中的仿真如下(2I&Q信号输出都相同):


 点击看大图


                    图 CIC插值滤波器MATLAB计算结果


 


数据对比:


QUARTUS     MATLAB


0                                                   0


0              0


0              0


0              0


-1             -1


-4             -4


-10            -10


-20            -20


-35             -35


……           ……


 


结论:结果正确。


 


5.数字上变频


每路I&Q信号,上变频都要做复数乘法,公式为:


Real = I*cos(wt) + Q*sin(wt)


Imag = Q*cos(wt) - I*sin(wt)


cos(wt)sin(wt)共用数字下变频时的NCOIQ信号输入为16bit,正余弦信号16bit,则每进行一次复数乘法需要4个乘法器。乘法器输出为32bit,进行加减法后位宽取32bit,输出位宽取16bit,截取[30:15]


数字上变频在QUARTUS中的仿真图如下:点击看大图



数字上变频QUARTUS仿真图


 


 


 


 

文章评论0条评论)

登录后参与讨论
相关推荐阅读
spirit.link 2011-07-30 01:27
QUARTUS综合后仿真复位值和代码不一致的思考
        在用ModelSIM做post-synthesis仿真时遇到一个问题,一个计数器明明复位时给它赋值为20,可是仿真时却显示复位值为0,如图1,refresh_counter计数器。当时...
spirit.link 2011-07-29 22:25
SignalTap II逻辑分析仪的使用(包括简单的触发和一些高级触发)
原文:ALTERA官方英文版。需要的点下载SignalTap.pdf。 本文由本人原创翻译,水平有限,仅学习所用,有错误请指正。   一、例子        我们使用如图1所示的verilog代码所实...
spirit.link 2011-05-05 01:33
基本时序分析方法
        本文由本人原创翻译于ALTERA的官网上Educational_Materials->Digital_Logic->Tutorials->Timing_Analysi...
spirit.link 2011-05-03 15:00
使用TimeQuest时序分析器
        本文由本人原创翻译于ALTERA的官网上Educational_Materials->Digital_Logic->Tutorials->Timing_Analysi...
spirit.link 2011-05-02 23:18
用MATLAB生成FFT旋转因子,并输出到外部文件
 说明:用MATLAB生成FFT的旋转因子,在完成FFT算法中肯定会用到的。N为FFT的精度,A为放大倍数,也就是小数位数的精度。计算好的FFT余弦因子输出到当前MATLAB目录下的cos_data....
spirit.link 2010-08-24 01:17
初学TestBench
 2009.5.23 初学TestBench `timescale 1ns/10ps //单位时间/精度`include "adder.v" module adder_testbench;    re...
广告
我要评论
0
0
1
2
3
4
5
6
7
8
9
0
广告
关闭 热点推荐上一条 /4 下一条