




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数字滤波器在FPGA上的实现研究3.3.2 前期数据处理由于在Matlab软件中得到的系数h(n)为浮点数,并且是有正有负的浮点数,而FPGA则是采用定点运算的方式,所以要把得到的浮点系数h(n)转化为定点数,处理的做法是把h(n)统一乘以倍,然后取整,最后化为11位二进制补码来表示。最后得到的结果为h(0)=h(7)=0000_0011_011,h(1)=h(6)=1111_0000_010,h(2)=h(5)=0000_1000_010,h(3)=h(4)=0100_0001_110.最后的结果需要左移10位即可。3.3.3 程序及数据结果对比和分析在前期的准备过后,在ISE 10.1软件中输出程序,得到的结果为:图3.8 FIR滤波器仿真结果图下面对实验结果和计算结果进行了对比,对比图如下:表3.2 实验结果对比图12345678系数h0.0264-0.12340.06480.51440.51440.0648-0.12340.0264h*102427.0604-126.378766.4037526.7448526.744866.4037-126.378727.0604h取整27-1266652652666-12627输入x500000000输出y1.32-6.173.2425.7225.723.24-6.171.32y取整1-6325253-61输出yh0001h7FF9h0003h0019h0019h0003h7FF9h0001结果y1-7325253-71由表3.2结果可知,程序输出结果与正常输出结果相差无几,误差是由于小数部分乘法带来的误差,所以我们可以认为程序是正确的。主要程序见附录二。遇到的问题:在程序的设计过程中,我首先遇到的问题是不知道用什么来实现数据的存储合适,查找资料后运用了FIFO存储器,即就是图3.7中的RAM用的是FIFO(先进先出)存储器,它的作用是把所需要的数据一个一个输进去,再按顺序依次输出,这样数据的存储就解决了。这也是设计中与别人不同的一点,它的优点为可随意调控存储的数量,因为它有一个data_count的输出,可以计算存储的数量。第二个问题就是输出之后要运用它们进行运算,且要按顺序排列依次运算,因为是8阶的滤波器,但是FIFO存储器不能同时出现8个数,所以中间用了8个shift_buf的寄存器存储这些数据,然后计算后再输出。第三个问题是不知道这些系数h(n)从何而来,查阅资料说是在Matlab软件中根据指标生成的,所以从上面的fdatool工具箱获取了系数。这样可以保证程序的可移植性,根据不同的指标及阶数要求,就可以方便的变换系数,程序只需稍加变动。最后问题出在如何完成乘法运算,导师在指导时说能运用IP核解决的运算就尽量用到,因为在运算中调用了乘法器IP核,就节省了运算速度也增强了准确性,但是乘法器的输入是确定位数的2进制数,不能是十进制的数,所以再设计之前做了一步转换,最后再依次把它顺序输出,再转换回十进制数来做对比。第四章 IIR滤波器的简单设计与实现4.1 IIR滤波器的基本结构 IIR滤波器的系统函数为 (5) 由系统函数可得到输入与输出的关系为 (6)由公式(6)可知,IIR滤波器是递归滤波器,即存在着输出信号到输入信号的反馈。对于一个给定的线性时不变系统的系统函数,有着不同的网络结构。而IIR滤波器的网络结构有直接型结构、级联型结构和并联型结构。下面给出直接型结构的网络结构如图4.1,其中系数组b为H(z)的分子多项式,系数组a为H(z)的分母多项式,分析几种结构可知,直接型的结构比较容易实现,但是需要较大的储存空间。图4.1 直接型结构图74.2 IIR滤波器直接型结构实现得到的仿真结果如下图4.2所示图4.2 8阶IIR滤波器仿真图分析:根据直接型结构,可知有反馈结构,所以在程序中设置了两个方向数即data_feedforword前馈数和data_feedback后馈数,这样两项相加就是最后输出。其中就每一项输入输出怎么储存问题,分别定义输入输出寄存器(samples_in和samples_out)来依次存储,比如8阶IIR滤波器就需要8个寄存器即samples_in8,同理输出。还有怎样一步一步寄存和溢出,则采用移位来实现。x(n)序列依然用FIFO存储器输入。主要程序见附录三。附 录附录一:均值滤波器主要代码Module my_tbf1(din,wr_en,rd_en,clk,rst,jun_out,dout,sum,empty,full,data_count);reg 7:0 din_reg; /定义存储输入寄存器din_regreg 7:0 jun_out; /定义均值输出为jun_out reg 7:0 shift_buf0; /定义5个shift_buf用来存储连续5个数reg 7:0 shift_buf1;reg 7:0 shift_buf2;reg 7:0 shift_buf3;reg 7:0 shift_buf4;reg 7:0 x; /定义过渡寄存器x和yreg 7:0 y;wire 8:0 add_buf1,add_buf2,add_buf3,sum1; /定义中间变量 wire 9:0 sum2; wire 10:0 sum; /调用FIFO核tbf1 My_name(.clk(clk), .rst(rst), .din(din), /读入数据 .wr_en(wr_en), /写使能 .rd_en(rd_en), /读使能 .dout(dout), /读出数据 .full(full), /满 .empty(empty),.data_count(data_count); /计数 always(posedge clk or negedge rst) begin if(rst) din_reg=8b0000_0000; /当复位信号为1时,输入存储器赋0else din_reg=dout; /当复位信号为0时,就把FIFO中输出的数赋值给输入寄存器 endalways(posedge clk or negedge rst) begin if(rst) begin shift_buf0=8b0000_0000; /当rst=1时,5个寄存器赋初值0shift_buf1=8b0000_0000;shift_buf2=8b0000_0000;shift_buf3=8b0000_0000;shift_buf4=8b0000_0000;endelse begin shift_buf0=din_reg7,din_reg; /每当clk为上升沿且rst=0时把输入存储器的值赋给shift_buf0,然后把shift_buf0的值赋给shift_buf0,依次类推 shift_buf1=shift_buf0; shift_buf2=shift_buf1; shift_buf3=shift_buf2; shift_buf4=shift_buf3; end endassign add_buf1=shift_buf1,1b0; /根据1 2 2 2 1中有三个数乘以2 assign add_buf2=shift_buf2,1b0; assign add_buf3=shift_buf3,1b0; assign sum1=add_buf1+add_buf2+add_buf3; /把中间的3个乘2的数相加 assign sum2=shift_buf0+shift_buf4; /把第一个和第五个数相加 assign sum=sum1+sum2; /得到5个数的总和 always(posedge clk or negedge rst) begin if(rst) jun_out=8b0000_0000;else if(data_count=100) x=din_reg; /当计数为100时,x寄存器存储当时的输入else if(data_count=99) y=din_reg; /当计数为99时,y寄存器存储当时的输入else if(data_count=98) jun_out=8b0000_0000;else if(data_count=97&dout!=0) /第一个数和第二个数的均值输出为原数 jun_out=x;else if(data_count=96&dout!=0) jun_out=y;else if(data_count=11b11111111111) jun_out=shift_buf2;else jun_out=sum10:3; /输出为总和除以8,即左移3位 endendmodule附录二:FIR数字滤波器程序主要代码module fir1(din,wr_en,rd_en,clk,rst,dout,data_count,fir_out); parameter size_in = 12; /定义输入位数为12位parameter size_buf = 13; /定义存储器位数为13位/parameter FIR_TAP = 8; /parameter FIR_TAPHALF = 4; parameter size_coeff = 11; /定义系数位数为11位parameter size_out = 15; /定义输出位数为15位parameter cof1 = 11b0000_0011_011; /给8个系数赋值parameter cof2 = 11b1111_0000_010;parameter cof3 = 11b0000_1000_010;parameter cof4 = 11b0100_0001_110;/定义输入端口input 11:0 din; /输入的x(n)序列input wr_en; /写使能input rd_en; /读使能input rst;input clk;/定义输出端口output 11:0 dout;output 9:0 data_count; /计数/output empty;/output full;output size_out-1 : 0 fir_out; /FIR滤波器输出/定义存储器reg size_out-1 : 0 fir_out; reg size_in-1 : 0 fir_in_reg; /输入存储器reg size_buf-1 : 0 shift_buf0; /定义8个过渡存储器reg size_buf-1 : 0 shift_buf1; reg size_buf-1 : 0 shift_buf2; reg size_buf-1 : 0 shift_buf3;reg size_buf-1 : 0 shift_buf4; reg size_buf-1 : 0 shift_buf5; reg size_buf-1 : 0 shift_buf6; reg size_buf-1 : 0 shift_buf7; wire size_buf-1 : 0 add_buff_0_7; /对称数的和wire size_buf-1 : 0 add_buff_1_6;wire size_buf-1 : 0 add_buff_2_5;wire size_buf-1 : 0 add_buff_3_4;wire size_buf+size_coeff-1 : 0 mul1; /4个积wire size_buf+size_coeff-1 : 0 mul2;wire size_buf+size_coeff-1 : 0 mul3;wire size_buf+size_coeff-1 : 0 mul4;/调用FIFO存储器核fifo2 My_fifo2(.clk(clk), .rst(rst), .din(din), /读入数据 .wr_en(wr_en), /写使能 .rd_en(rd_en), /读使能 .dout(dout), /读出数据 .full(full), /满 .empty(empty),.data_count(data_count);/给输入存储器赋值always (posedge clk or negedge rst) begin if(rst) fir_in_reg = 12b0000_0000_0000; else fir_in_reg = dout; end/给过渡存储器赋值always (posedge clk or negedge rst) begin if(rst) begin shift_buf0 = 13b0000_0000_00000; /赋初值 shift_buf1 = 13b0000_0000_00000; shift_buf2 = 13b0000_0000_00000; shift_buf3 = 13b0000_0000_00000; shift_buf4 = 13b0000_0000_00000; shift_buf5 = 13b0000_0000_00000; shift_buf6 = 13b0000_0000_00000; shift_buf7 = 13b0000_0000_00000;end else begin shift_buf0 = fir_in_regsize_in-1,fir_in_reg;/输入的数依次进入存储器 shift_buf1 = shift_buf0; shift_buf2 = shift_buf1; shift_buf3 = shift_buf2; shift_buf4 = shift_buf3; shift_buf5 = shift_buf4; shift_buf6 = shift_buf5; shift_buf7 = shift_buf6; end end/把对称系数的数相加assign add_buff_0_7 = shift_buf0 + shift_buf7;assign add_buff_1_6 = shift_buf1 + shift_buf6;assign add_buff_2_5 = shift_buf2 + shift_buf5;assign add_buff_3_4 = shift_buf3 + shift_buf4;/分别把系数与x(n)相乘mult1 mult11(.a(cof1),.b(add_buff_0_7),.clk(clk),.p(mul1);mult1 mult12(.a(cof2),.b(add_buff_1_6),.clk(clk),.p(mul2);mult1 mult13(.a(cof3),.b(add_buff_2_5),.clk(clk),.p(mul3);mult1 mult14(.a(cof4),.b(add_buff_3_4),.clk(clk),.p(mul4);/把乘法得到的数相加wire 24 : 0 add_mult_1_2 = mul123,mul1+mul223,mul2;wire 24 : 0 add_mult_3_4 = mul323,mul3+mul423,mul4;always (posedge clk or negedge rst)begin if(rst) fir_out = 15b0; /给fir_out赋初值 else fir_out10;/把总和向左移10位赋值给fir_outendendmodule附录三:IIR数字滤波器直接型结构程序主要代码module iir_filter_8(din,wr_en,rd_en,clk,rst,data_out,dout,data_count );parameter order = 8; /定义阶数为8阶parameter word_size_in = 8; /输入位数为8位parameter word_size_out = 2*word_size_in + 2; /定义输出位数parameter b0 = 4; /前馈滤波器系数 parameter b1 = 22; parameter b2 = 65; parameter b3 = 110; parameter b4 = 110; parameter b5 = 65; parameter b6 = 22; parameter b7 = 6; parameter a1 = 25; /反馈滤波器系数 parameter a2 = -70; parameter a3 = 99; parameter a4 = -85; parameter a5 = 47; parameter a6 = -16; parameter a7 = 4; parameter a8 = 1;/定义输入端口input word_size_in-1:0 din;input wr_en;input rd_en;input rst;input clk;/定义输出端口output word_size_in-1:0 dout;output 9:0 data_count;/output empty;/output full; output word_size_out-1 : 0 data_out; reg word_size_in-1 : 0 samples_in1 : order; /定义输入存储器可以存数8个reg word_size_in-1 : 0 samples_out1 : order; /定义输出存储器可以存数8个wire word_size_out-1 : 0 data_feedforward; /定义前馈和wire word_size_out-1 : 0 data_feedback; /定义后馈和integer k; /定义移位次数 /调用FIFO核my_fifo My_fifo1(.clk(clk), .rst(rst), .din(din), /读入数据 .wr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 查询任务调度优化-洞察及研究
- 强电专业考试题及答案解析
- 电子类专业试题及答案
- 高一专业测试题及答案
- 一例癌痛患者的个案护理
- 2025至2030中国中性防锈汽轮机油行业项目调研及市场前景预测评估报告
- 母婴护理风险防控策略课件
- 颌面部多发性骨折护理
- 2025至2030中国MicroBulk交付系统行业项目调研及市场前景预测评估报告
- 生态修复项目树木种植与生态修复效果评估承包合同
- 市场监督管理局课件
- 《美术与生活》教学课件-2024-2025学年冀美版(2024)初中美术七年级上册
- 设备润滑技术教材
- 职业卫生模拟试题+答案
- DBJ50-T-200-2024 建筑桩基础技术标准
- 江苏连云港历年中考作文题与审题指导(2003-2021)
- 四川地区病历质量评分规范标准
- 手术室医院感染管理制度
- 《材料电学性能》课件
- 国家电网新员工入职培训
- 电梯维修改造施工方案大修
评论
0/150
提交评论