ImageVerifierCode 换一换
格式:DOC , 页数:11 ,大小:106.50KB ,
资源ID:1032954      下载积分:15 积分
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 微信支付   
验证码:   换一换

加入VIP,免费下载资源
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【http://www.wodocx.com/d-1032954.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(分布式FIR数字滤波器设计.doc)为本站会员(精***)主动上传,沃文网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知沃文网(发送邮件至2622162128@qq.com或直接QQ联系客服),我们立即给予删除!

分布式FIR数字滤波器设计.doc

1、VLSI结课设计报告分布式算法FIR滤波器 学院:班级:姓名:学号:指导老师:一、设计目的1熟悉FPGA设计基本方法2掌握用Verilog语言设计一个数字滤波器二、设计原理与方法 目前FIR滤波器的实现方法有三种:利用单片通用数字滤波器集成电路、DSP器件和可编程逻辑器件实现。单片通用数字滤波器使用方便,但由于字长和阶数的规格较少,不能完全满足实际需要。使用DSP器件实现虽然简单,但由于程序顺序执行,执行速度必然不快。FPGA有着规整的内部逻辑阵列和丰富的连线资源,特别适合于数字信号处理任务,相对于串行运算为主导的通用DSP芯片来说,其并行性和可扩展性更好。但长期以来,FPGA一直被用于系统逻

2、辑或时序控制上,很少有信号处理方面的应用,其原因主要是因为在FPGA中缺乏实现乘法运算的有效结构。现在这个问题得到了解决,使FPGA在数字信号处理方面有了长足的发展。分布式算法(Distributed Arithmetic,DA)是一种已实现乘加运算为目的的运算方法。它与传统实现乘加运算算法的不同之处在于:执行部分积运算的先后顺序不同。简单地说,分布式算法在完成乘加功能时是通过将各输入数据每一对应位产生的部分积预先进行相加形成相应部分积,然后再对各部分积进行累加形成最终结果;而传统算法是等到所有乘积产生之后再进行相加来完成乘加运算的。与传统算法相比,分布式算法可极大地减少硬件电路规模,很容易实

3、现流水线处理,提高电路的执行速度。在实际中,不仅是对于滤波器方面,在卷积、相关、DFT等有乘累加运算的地方,都可以使用这种方法实现。DA设计的先决条件是滤波器的系数hi可以通过运算得到,那么在技术部分乘积项hi*xn-1就变成了一个常数乘法(也就是缩放)。DA算法的主要特点是,巧妙地利用查找表将固定系数的MAC运算转化为查表操作,其运算速度不随系数和输入数据位数的增加而降低,而且相对直接实现乘法器而言,在硬件规模上得到了极大的改善。分布式FIR算法原理分布式算法是在30年前被首次提出的,但直到Xilinx公司发明FPGA的查找表结构以后,DA算法才广泛应用在计算乘积和之中。对于FIR(有限长单

4、位冲激响应)滤波器,其基本结构是一个分节的延时线,每一节的输出加权累加,得到滤波器的输出。其输出y就是输入x和系数h的内积: (1)输入数据xn可以采用B+1位补码来表示,即 (2)因为系数h为已知常数,则内积y可以写成: (3)将式(3)中的第二部分展开,重新分别求和,这也是“分布式算法”名称的由来,可以得到:(4) 这样就可以将式(3)化简为 (5)计算hnxbn,就是用查找表实现一个映射,然后再将此映射经过相应的二次幂加权,最后即可得到滤波器的输出。分布式FIR的实现结构 图1给出了分布式FIR滤波器最直接的实现结构,虚线为流水线寄存器。对于小位宽的数据来讲,Da算法不仅速度快,而且所占

5、用的芯片资源也很少。XB-10 X10 X00XB-11 X11 X01XB-1N-1 X1N-1 X0N-1LUT+/-寄存器Z-1图1 移位加法DA结构对于式(4)括号中的每一个乘积项都代表了输入变量的某一位与常量的二进制“与”操作,加号代表了算术和操作,指数因子对括号中的值加权。如果事先构造一个查找表,该表储存了括号中所有可能的组合值,就可以通过所有输入变量相对应的组合向量(xbN-1, xbN-2, ,xb0)对该表进行寻址。该表结构如表1所示。表1 构造规则 在LUT实现分布式算法是,由于LUT的规模随着N的增加而呈指数增加,如果滤波器系数N过多,则查表的规模十分庞大。为了减小规模,

6、可以利用部分表计算。由于FIR滤波器是线性滤波器,因此低阶滤波器输出可以相加,由此定义一个高阶滤波器的输出。例如,可以把16输入的查找表分割成4个并行的查找表,如图2所示。依次类推,可以将更大的LUT分割成多个小LUT。如果加上流水线,这一结构的改变并不会降低速度,却可以大大减小设计规模。XB-10 X10 X00XB-13 X13 X03LUT+/-寄存器Z-1XB-10 X10 X00XB-13 X13 X03XB-10 X10 X00XB-13 X13 X03XB-10 X10 X00XB-13 X13 X03LUTLUTLUT+图2 简化规模的DA结构三、FIR滤波器的具体设计方法本设

7、计是使用Verilog实现一个8阶对称系数的FIR滤波器,其系数分别是41,132,341,510,341,132,41。该本滤波器的输入为12比特,先把相同系数对应的数据相加,输入到滤波器的数据经过符号位的扩展后变成13比特。这样可以看成是一个阶的FIR滤波器,减小了构造表的复杂度。 设计程序:module fir1(clk,reset,fir_in,fir_in_reg,fir_out,divfre_count_4b,divfre13_clk);parameter S0=1d0; /初始状态parameter S1=1d1; /处理状态input clk;input reset;input

8、11:0fir_in;output12:0fir_out;output11:0fir_in_reg;output3:0divfre_count_4b;output divfre13_clk;reg12:0fir_out;reg11:0fir_in_reg;reg12:0shift_buf7:0;reg12:0add_buf3:0;/reg12:0state_shift_buf4-1:0; reg12:0state_shift_buf0;reg12:0state_shift_buf1;reg12:0state_shift_buf2;reg12:0state_shift_buf3;wire3:0t

9、able_4b;wire11:0table_out_12b;reg12:0sum;reg STATE;reg3:0divfre_count_4b;reg divfre13_clk;integer i,j,k,l,m,n,p;always(posedge clk or negedge reset)begin if(!reset) begin divfre13_clk=1b0; divfre_count_4b=4b0000; /14分频 end else begin if(divfre_count_4b=13) begin divfre_count_4b=4b0000; divfre13_clk=

10、1b1; end else begin divfre_count_4b=divfre_count_4b+1b1; /计数 divfre13_clk=1b0; end endendalways (posedge clk or negedge reset) /数据输入begin if(!reset) fir_in_reg=12b0000_0000_0000; else if(divfre13_clk) fir_in_reg=fir_in;end always (posedge clk or negedge reset)begin if(!reset) for(i=0;i=7;i=i+1) shif

11、t_bufi=13b0000_0000_00000; else if(divfre13_clk) beginfor(j=0;j8-1;j=j+1)shift_bufj+1= shift_bufj;shift_buf0=fir_in_reg11,fir_in_reg; endendalways (posedge clk or negedge reset)begin if(!reset) for(k=0;k=4-1;k=k+1) add_bufk=13b0000_0000_00000; else if(divfre13_clk) for(l=0;l=3;l=l+1) add_bufl=shift_

12、bufl+shift_buf7-1;endalways (posedge clk or negedge reset) /有限状态机初始化,比特移位begin if(!reset) begin /for(m=0;m=4-1;m=m+1) /state_shift_bufm=13b0000_0000_00000;state_shift_buf0=13b0000_0000_00000;state_shift_buf1=13b0000_0000_00000;state_shift_buf2=13b0000_0000_00000;state_shift_buf3=13b0000_0000_00000;

13、STATE=S0; end else case(STATE) S0:begin /初始状态 / for(n=0;n=4-1;n=n+1) /state_shift_bufn= add_bufn;state_shift_buf0=add_buf0;state_shift_buf1=add_buf1;state_shift_buf2=add_buf2;state_shift_buf3=add_buf3; STATE=S1; end S1:begin /处理状态 if(divfre_count_4b=4b1101) STATE=S0; else begin for(p=0;p=11;p=p+1) b

14、egin state_shift_buf0p=state_shift_buf0p+1; state_shift_buf1p=state_shift_buf1p+1; state_shift_buf2p=state_shift_buf2p+1; state_shift_buf3p=state_shift_buf3p+1; end STATE=S1; end end endcaseend assign table_4b0=state_shift_buf00;assign table_4b1=state_shift_buf10;assign table_4b2=state_shift_buf20;a

15、ssign table_4b3=state_shift_buf30;DA_table U_DA( .table_in_4b(table_4b), .table_out_12b(table_out_12b) ); wire26:0sign_ex=table_out_12b11,table_out_12b11,table_out_12b11, table_out_12b11,table_out_12b11,table_out_12b11, table_out_12b11,table_out_12b11,table_out_12b11, table_out_12b11,table_out_12b11

16、,table_out_12b11, table_out_12b11,table_out_12b11,table_out_12b11, table_out_12b; always (posedge clk or negedge reset)begin if(!reset) sum=27b0; else if(divfre_count_4b=4b0000) sum=27b0; else if(divfre_count_4b=4b1101) sum=sum-delta(sign_ex,divfre_count_4b-4b0001); else sum=sum+delta(sign_ex,divfre

17、_count_4b-4b0001); endalways (posedge clk or negedge reset)begin if(!reset) fir_out=27b0; else if(divfre_count_4b=4b0000) fir_out=sum; /滤波器输出endfunction13-1:0delta; /定义移位寄存器左移 input13-1:0IQ; input3:0pipe; begin case(pipe) 4b0000:delta=IQ; 4b0001:delta=IQ13-2:0,1b0; 4b0010:delta=IQ13-3:0,2b00; 4b0011

18、:delta=IQ13-4:0,3b000; 4b0100:delta=IQ13-5:0,4b0000; 4b0101:delta=IQ13-6:0,5b00000; 4b0110:delta=IQ13-7:0,6b000000; 4b0111:delta=IQ13-8:0,7b0000000; 4b1000:delta=IQ13-9:0,8b00000000; 4b1001:delta=IQ13-10:0,9b000000000; 4b1010:delta=IQ13-11:0,10b0000000000; 4b1011:delta=IQ13-12:0,11b00000000000; 4b11

19、00:delta=IQ13-13:0,12b000000000000; /4b1101:delta=IQ13-14:0,13b0000000000000; /4b1110:delta=IQ13-15:0,14b00000000000000; /4b1111:delta=IQ13-16:0,15b000000000000000; default:delta=IQ; endcase endendfunctionendmodulemodule DA_table(table_in_4b,table_out_12b);input 3:0 table_in_4b;output 11:0 table_out

20、_12b;reg11:0 table_out_12b; always (table_in_4b) begin case(table_in_4b) 4b0000:table_out_12b=0; 4b0001:table_out_12b=41; 4b0010:table_out_12b=132; 4b0011:table_out_12b=173; 4b0100:table_out_12b=341; 4b0101:table_out_12b=382; 4b0110:table_out_12b=473; 4b0111:table_out_12b=514; 4b1000:table_out_12b=5

21、10; 4b1001:table_out_12b=551; 4b1010:table_out_12b=642; 4b0011:table_out_12b=683; 4b1100:table_out_12b=851; 4b1101:table_out_12b=892; 4b1110:table_out_12b=983; 4b1111:table_out_12b=1024; default:table_out_12b=0; endcaseendendmodule 为了可以方便的判断程序输出结果的正确性,我们在仿真时采用了几个简单的数据作为采样后的数据输入。分别采用:1,2,3作为输入,则经过三次计算对应的输出应为41,241,728,十六进制数为29h,D6h,28Dh。与乘累加方式FIR滤波算法得出的结果完全一致。输入后的波形如下图:本文来自网络,版权归原作者所有,请下载后,尽快删除。11

版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1 

陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922