插值滤波器设计Word文件下载.docx

上传人:b****3 文档编号:16651344 上传时间:2022-11-25 格式:DOCX 页数:34 大小:1.08MB
下载 相关 举报
插值滤波器设计Word文件下载.docx_第1页
第1页 / 共34页
插值滤波器设计Word文件下载.docx_第2页
第2页 / 共34页
插值滤波器设计Word文件下载.docx_第3页
第3页 / 共34页
插值滤波器设计Word文件下载.docx_第4页
第4页 / 共34页
插值滤波器设计Word文件下载.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

插值滤波器设计Word文件下载.docx

《插值滤波器设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《插值滤波器设计Word文件下载.docx(34页珍藏版)》请在冰豆网上搜索。

插值滤波器设计Word文件下载.docx

1.3 

内插

抽取的过程是降低采样率的过程,那么插值的过程当然就是提高采样率的过程。

大体的思路可以这么理解,我们将经f1抽样下得到的数字信号的每两个点之间进行插值,插入的值是0,插值之后,信号在单位时间内的采样点数增多,当然也就是采样速率的提升,采样速率提升后我们知道,那么信号的频谱的周期就会增加

需要注意的一点就是,插值前后,我们只是在时域信号中间插入了D-1个零值,仅仅是改变了采样率,并没有改变信号的信息,因此,在频域,信号频谱的形状是不会改变的,改变的仅仅是周期,如上图,F1是插值之前信号的周期,插值之后,信号频谱的形状不变,周期成了F1*D,D是插值倍数。

如果我们直接用F1*D倍的采样率采信号,得到的频谱会发现,就不会有中间两个波形,因此,这两个波形是多余的,书上叫做是镜像频谱。

既然是多余的,我们就可以将它用一个低通滤波器滤掉,这样的低通滤波器,就叫做镜像低通滤波器。

这样我们来计算一下镜像低通滤波器的截止频率

根据上面这张图我们可以求出镜像低通滤波器的截止频率,可以看到,fc=1/2*F1,这里我们假设,内插之后的采样频率为F2=F1*D,那么,fc=1/2*(F2/D),而1/2*F2对应的是π,注意,这里是1/2*F2对应π,不是1/2*F1了,因为这已经是插值之后采样率增加之后的频谱了,所以我们得出:

镜像低通滤波器的截止频率为:

π/D

1设计目标

本次案例将使用到采样率大于100M的双通道的示波器。

将示波器的两个通道,分别与FPGA的DA通道1和DA通道2相连,观察两路DA的输出。

其连接示意如下图所示:

本案例是FPGA内部产生正弦信号,这个正弦信号一路输出给DA通道A,另一路经过插值滤波器后,输出给DA通道B。

正弦信号产生电路产生频率为62.5KHz的正弦信号,该正弦信号由8个点组成。

插值滤波器是4倍的插值,也就是说进来是8个点的正弦波,输出将是32个的正弦波。

仿真效果,上面的波形为插值前,下面的为插值后可以明显看出下面的波形更为圆滑。

下面是示波器的显示效果

设计实现

3.1 

顶层信号

新建目录:

D:

\mdy_book\cic_prj。

在该目录中,新建一个名为cic_prj.v的文件,并用GVIM打开,开始编写代码。

我们要实现的功能,概括起来就是FPGA产生控制AD9709,让其中的通道A未滤波的正弦信号,让通道B输出滤波后的正弦信号。

为了控制AD9709的工作模式,就要控制AD9709的MODE、SLEEP管脚;

为了控制通道A,就需要控制AD9729的CLK1、WRT1、DB7~0P1管脚;

为了控制通道B,就需要控制AD9729的CLK2、WRT2、DB7~0P2管脚。

根据设计目标的要求,整个工程需要以下信号:

1. 

使用clk连接到晶振,表示50M时钟的输入。

2. 

使用rst_n连接到按键,表示复位信号。

3. 

使用dac_mode信号连接到AD9709的MODE管脚,用来控制其工作模式。

4. 

使用dac_sleep信号连接到AD9709的SLEEP管脚,用来控制其睡眠模式。

5. 

使用dac_clka信号连接到AD9709的CLK1管脚,用来控制通道A的时钟。

6. 

使用dac_wra信号连接到AD9709的WRT1管脚,用来控制通道A的写使能。

7. 

使用8位信号dac_da连接到AD9709的DB7~0P1管脚,用来控制通道A的写数据。

8. 

使用dac_clkb号连接到AD9709的CLK2脚,用来控制通道B时钟。

9. 

使用dac_wrb号连接到AD9709的WRT2脚,用来控制通道B使能。

10. 

使用8位信号dac_db接到AD9709的DB7~0P2脚,用来控制通道B写数据。

综上所述,我们这个工程需要10个信号,时钟clk,复位rst_n,dac_mode、dac_sleep、dac_clka、dac_wra、dac_da、dac_clkb、dac_wrb和dac_db信号,其中dac_da和dac_db是8位信号,其他都是1位信号。

下面表格表示了硬件电路图的连接关系。

将module的名称定义为cic_prj,代码如下:

其中clk、rst_n是1位的输入信号,dac_da和dac_db是8位的输出信号,dac_mode,dac_clka,dac_wra,dac_sleep,dac_clkb,dac_wrb是一位输出信号。

3.2 

正弦信号设计

假设产生的正弦信号命名为sin_data信号。

sin_data一共有8个值,是从一个正弦信号中,按(2*pi/8)的间隔采样到的,可列出下表。

很自然地定义一个7位的选择信号addr。

我们只要控制好addr,就能方便得到sin_data。

因此可以写出下面代码。

接下来是设计信号addr。

addr是用来控制选择数据的地址,通过控制addr的增加值,就能产生所需要的正弦波。

本案例要求产生62.5KHz的正弦信号。

该正弦信号的周期是16000ns。

本工程的工作时钟是20ns,也就是16000/20=800个时钟输出一个正弦信号,也就是800个时钟将上表的8个值输出一遍,即每100个时钟输出addr加1。

每100个时钟输出一个值,那意味着我们需要一个计数器cnt0,该计数器用来对这100进行计数。

计数器的加1条件是“1”,结束条件是“数到100个”。

因此可写出cnt0的代码。

每100个时钟后,addr就加1。

说明这个addr也是一个计数器,该计数器的加1条件是“数到100个时钟”,即end_cnt0,结束条件是“数到8个”。

3.3 

CIC 

滤波器设计

3.3.1 

新建FPGA工程

1.)打开quartus,点击File 

在File菜单中选择NewProjectWizard.... 

2.弹出Introduction界面选择Next。

(3)设置工程目录,工程名,顶层模块名

工程目录设置为:

\mdy_book\cic_prj

工程名:

cic_prj

顶层模块名:

填写完毕后,点击next之后进入下一界面。

(3.)在文件添加界面,不选择任何文件。

点击Next,进入下一个界面。

工程类型界面,ProjectType选择Emptyproject,选择空白工程。

点Next进入下一个界面。

(4.)器件选择界面。

在Devicefamily这一项之中选择 

CycloneIVE;

在下部的Availabledevice 

选择EP4CE6F23C8。

完成后直接点击Finish。

3.3.2FPGA生成CICIP核

建立工程后,在quartus中IPcatalog这一界面中选择DSP下一目录中选择Filter 

再选择 

CIC。

点击后进入此界面给新生成的fir滤波器ip核选择如下路径:

\mdy_book\cic_prj,entityname填写:

my_cic。

点击OK后,进入FIR滤波器设置界面。

按如下设置:

FilterType:

要选择Interpolator,表示是插值滤波器。

Ratechangefactor:

填上4,表示是4倍插值。

outputRoundingMethod:

选择Truncation,表示输出的结果要截断。

Outputdatawidth:

选择8。

表示输出结果要截断为8位。

其他选项默认,点击窗口右下角的GenerateHdl,会弹出下面的窗口。

注意选择文件是Verilog文件,其他都不用勾选。

点击Generate,就会生成y_cic的verilog文件。

出现上面的提示,就是生成成功了。

点Finish关闭CIC滤波器生成窗口。

如果出现上面的提示,就是表示要手动将刚才生成的IP核加到本工程。

在Project菜单中选择Add/RemoveFiletoProject,弹出文件窗口。

点击右上角的,在弹出来的窗口中,双击选择D:

\mdy_book\cic_prj\my_cic\synthesis目录下的my_cic.qip文件(注意不要搞错文件类型)。

然后记得要点Add,才算正式加到工程。

点OK关闭本窗口。

IP核生成后弹出此对话框点击yes 

将此IP核添加进工程。

3.3.3 

例化CICIP核

用GVIM打开D:

\mdy_book\cic_prj\my_cic\synthesis\my_cic.v文件,该文件就是生成的CICIP核文件

特别注意的是,滤波器的输入数据和输出数据都是有符号数(补码的形式,-128~127)。

而我们知道,正弦信sin_data是无符号数(0~255)。

所以要将sin_data变成有符号数,再送给FIR进行滤波。

假设转换后的信号为cic_din,该信号位宽为8位。

无符号数转成有符号数的方法很简单:

cic_din=sin_data-128。

读者有兴趣可以验证一下。

生成CICIP核后,我们要对其进行例化,才行使用上这个IP核,例化名起名u_my_cic,cic的输出数据信号命名为cic_dout。

我们要控制CICIP核的输出,使每个数据都能等间隔输出数据。

由于CIC滤波器的输入是100个时钟一个数据,CIC是4倍速率,因此输出是25个时钟一个数据。

所以我们每25个时钟给一个有效信号连到out_ready接口上。

这时需要一个计数器cnt1来计时25个时钟,该计数器加1条件是“1”,结束条件是“数到25个”。

有了这些信号后,就可以例化CICIP核了。

3.4 

DA接口信号设计

接下来是设计信号dac_da。

dac_da是直接输出正弦信号,但由于DA的输出电压与dac_da是成反比例线性关系,所以dac_da都是按(255-sin_data)得到。

那么可以写出dac_da的代码。

接下来是设计信号dac_sleep,AD是一直工作的,所以要让dac_sleep一直为0。

dac_clka为了满足tS的时间要求,可以让dac_clka=~clk。

dac_wra可以与dac_clka相同。

接下来是设计信号dac_db。

dac_db是直接输出滤波后的信号cic_dout。

但要注意的是cic_dout是有符号数(范围是-128~127),所以要转有无符号数(0~255)。

假设转换后的信号为cic_dout2,则cic_dout2=cic_dout+128。

另外,由于DA的通道2的输出电压与dac_db是成反比例线性关系,所以dac_db都是按(255-cic_dout2)得到。

那么可以写出dac_db的代码。

dac_clkb为了满足tS的时间要求,可以让dac_clkb=~clk。

dac_wrb可以与dac_clkb相同。

3.5 

信号定义

至此,模块主体已经完成。

接下来是将module补充完整。

cnt0是用always产生的信号,因此类型为reg。

cnt0计数的最大值为99,需要用7根线表示,即位宽是7位。

add_cnt0和end_cnt0都是用assign方式设计的,因此类型为wire。

并且其值是0或者1,1个线表示即可。

因此代码如下:

cnt1是用always产生的信号,因此类型为reg。

cnt1计数的最大值为24,需要用5根线表示,即位宽是5位。

add_cnt1和end_cnt1都是用assign方式设计的,因此类型为wire。

并且其值是0或者1,1根线表示即可。

addr是用assign设计的,因此类型为wire。

其值最大为7,一共有3根线,位宽为3;

add_addr和end_addr都是用assign方式设计的,因此类型为wire。

故而代码如下

sin_data是用always设计的,因此类型为reg。

其最大值为255,要有8根线表示,位宽为8,故而代码如下

cic_din是用assign设计的,因此类型为wire。

其位宽为8,故而代码如下

cic_dout是例化模块的输出,非always设计的,因此类型为wire。

cic_dout2是用assign设计的,非always设计的,因此类型为wire。

dac_da是用always设计的,因此类型为reg。

其位宽为8;

dac_sleep是用assign设计的,因此类型为wire,位宽为1;

dac_wra是用assign设计的,因此类型为wire,位宽为1;

dac_clka是用assign设计的,因此类型为wire,位宽为1;

dac_mode是用assign设计的,因此类型为wire,位宽为1。

dac_db是用always设计的,因此类型为reg。

dac_wrb是用assign设计的,因此类型为wire,位宽为1;

dac_clkb是用assign设计的,因此类型为wire,位宽为1。

故而代码如下。

在代码的最后一行写下endmodule

至此,整个代码的设计工作已经完成。

下一步是新建工程和上板查看现象

综合与上板

4.1 

添加文件到工程

1.)前面已经介绍了新建工程。

现在打开quartus,在Project菜单中选择Add/RemoveFiletoProject,弹出文件窗口。

\mdy_book\fir_prj目录下的fir_prj.v文件。

4.2 

综合

在菜单栏中,选中Processing,然后选择StartCompilation,开始对整个工程进行编译和综合。

出现上面的界面,就说明编译综合成功。

4.3 

配置管脚

在菜单栏中,选中Assignments,然后选择PinPlanner,就会弹出配置管脚的窗口。

在配置窗口中的location一列,可以填写每个管脚所对应的FPGA管脚号。

按上面配置好每个信号的管脚,其最终效果如下图。

关闭PinPlanner,软件自动会保存管脚配置信息。

4.4 

再次综合

4.5 

连接开发板

连接示意如上图所示。

将电源接上开发板;

USBBLASTER一端连接到JTAG插口,另一端连到PC的USB接口;

将开发板上的P7接口和P11与示波器的两个通道相连。

最后再将电源打开。

4.6 

上板

在quartus的Task窗口中,右键ProgramDevice 

选择Open 

进入烧录界面。

在上面的界面中,默认会选中文件output/fir_prj.sof,如果没有生成请看XXXX。

在上面的界面中,HardwareSetup的旁边会显示:

USB-Blaster。

如果不是,请看XXXX。

点击statr,在progress这一条显示100%即表示成功,此时可以看FPGA输出效果了。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 广告传媒

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1