fir滤波器设计fpga_第1页
fir滤波器设计fpga_第2页
fir滤波器设计fpga_第3页
fir滤波器设计fpga_第4页
fir滤波器设计fpga_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Lab24 基于FPGA的FIR数字滤波器设计一、 实验目的(1) 掌握滤波器的基本原理和数字滤波器的设计技术。(2) 了解FPGA在数字信号处理方面的应用。二、 实验任务(1) 采用分布算法设计16阶FIR低通滤波器,设计参数如表所示。参数名参数值参数名参数值采样频率Fs8.6kHz截止频率Fc3.4kHz最小组带衰减As-50dB通带允许起伏-1dB输入数据宽度8位补码输出数据宽度8位补码利用MATLAB FDA Tool进行数字滤波器设计,算法采用Hamming窗,阶数15,Beta 0.5,Fs 8.6kHz,Fc 3.4kHz。导出滤波器系数为:h(0)=h(15)=-0.0007;

2、 h(1)=h(14)=-0.0025; h(2)=h(13)=0.012; h(3)=h(12)=-0.0277;h(4)=h(11)=0.0357; h(5)=h(10)=-0.0072; h(6)=h(9)=-0.1068; h(7)=h(8)=0.5965;(2) 本实验要求采用ChipScope Pro内核逻辑分析仪观察信号波形,验证实验结果。三、 实验原理目前FIR滤波器的实现方法有三种:单片通用数字滤波器集成电路、DSP器件和可编程逻辑器件。单片通用数字滤波使用方便,但由于字长和阶数的规格较少,不能完全满足实际需要。是用DSP器件实现虽然简单,但由于程序顺序执行,执行速度必然不快

3、。FPGA有着规整的内部逻辑阵列和丰富的连线资源,特别适合于数字信号处理任务,相对于串行运算为主导的通用DSP芯片来说,FPGA的并行性和可扩展性更好。但长期以来,FPGA一直被用于系统逻辑或时需控制,很少有信号处理方面的应用,主要是因为FPGA缺乏实现乘法运算的有效结构。不过现在这个问题已得到解决,FPGA在数字信号处理方面有了长足的发展。1、 FIR滤波器与分布式算法的基本原理一个N阶FIR滤波器的输出可表示为y=i=0N-1hix(N-1-i) 式中,x(n)是N个输入数据,h(n)是滤波器的冲激响应。当N为偶数时,根据线性相位FIR数字滤波器冲激响应的对称性,可将式变换成:y=n=0N

4、2-1xn+xN-1-nhi2、 并行方式设计原理采用Wallace树加法算法,可以使处理速度得到提高,但代价是硬件规模的扩大。3、 乘累加方式设计原理因为本实验对FIR算法速度要求不高,所以采用“乘累加”工作方式以减少硬件规模,其原理框图如下图所示:由于本实验对速度要求不高,所以对输入的100MHz时钟由DCM内核进行16分频,得到的6.25MHz的sys_clk 信号作为系统主时钟。较低的系统时钟可降低加法器、乘法器的设计难度。取样脉冲缠身电路与实际所采用的A/D转换器芯片有关,实验采用ROM来代替ADC。根据实验要求和ROM接口要求,取样脉冲sample影视宽度为一个sys_clk 周期

5、、频率大于8.6kHz的周期信号。因此,sample信号可由sys_clk 进行512分频获得,sample信号的频率约12.2kHz。控制器是电路的核心,控制FIR进行8次乘累加,下图为算法流程图。模块h_rom存放冲激响应系数h(n)。由于FIR滤波器冲激响应是一系列的浮点数,但FPGA不支持浮点数的运算,所以浮点数需转换成定点数。设计可采用Q值量化法,将系数同时扩大27倍,然后转化为8位二进制数补码。数据选择器MUX选出两个数据进行相加。为了防止溢出,保证电路的正常工作,应采用9位加法器。注意,两个加数采用符号位扩展方法,扩展成9位输入。乘法器采用实验7介绍的booth乘法器。乘累加输出

6、17位原始数据y_raw16:0,其中次高位y_raw15为进位。当高两位y_raw16、y_raw15不相同时,表示溢出。数据截短方法如表所示。y_raw16:15数据输出说明00y_raw16:15018b01111111上溢出,取最大127108b10000000下溢出,取最小-12811y_raw16:154、信号ROM读写模块实验采用ROM来代替ADC,ROM读写模块data_in的功能是,每输入一个取样脉冲,模块输出一个信号样品,其工作原理如图:四、 实验设备(1) 装有ISE、ModelSim SE和ChipScope Pro的计算机。(2) XUP Virtex-Pro开发系统

7、一套五、 实验内容1、 编写FIR模块(包括子模块)的verilog HDL代码及其测试代码,并用ModelSim仿真,做这一歩时可暂时不插入DCM模块。2、 建立ISE工程文件,并对工程进行综合。3、 利用ChipScope Pro的核插入器ICON、ILA核分析FIR的输出信号y_out,本例触发信号和数据信号均采用y_out。4、 对工程进行约束、实现,并下载工程文件到XUP Virtex-II Pro开发实验板中。5、 启动ChipScope分析器对设计进行分析。六、 设计代码说明与分析1、 设计图中的8位并入并出寄存器(实际采用7位,配合7位修改data_in)时,采用了如下代码:a

8、lways(posedge clk) beginif(en)beginx0<=x; x1<=x0; x2<=x1; x3<=x2; x4<=x3; x5<=x4; x6<=x5; x7<=x6; x8<=x7; x9<=x8; x10<=x9; x11<=x10; x12<=x11; x13<=x12; x14<=x13; x15<=x14;end代码利用非阻塞赋值的特点,简洁地完成了所需功能,比起结构描述精简了代码结构和可读性。2、 设计数据选择器时,在always触发信号设置时如下:always

9、(*)即对所有触发信号敏感。3、 设计16位累加器时,加法器采用的是超前进位加法器,实际上本实验中所有加法器均采用超前进位,有利于减小时延,增大时钟频率。其中的累加器模块dffr.v,通过定义参数N,采用了参数传递,具有很好的扩展性,这是编写底层模块文件时增强模块扩展性的一个好的做法。module dffr(d, r,clk,q);parameter N = 1;input r,clk;input N-1:0 d;output N-1:0 q;reg N-1:0 q;always (posedge clk)if ( r ) q <= N1'b0; elseq <= d;en

10、dmodule4、 在设计控制器时,采用了状态机的双过程设计方法。always (posedge clk or posedge reset) begin if(reset) state<=RESET; else case(state) RESET:begin addr=0; if(sample) state<=MAC; else state<=RESET; end MAC:begin addr<=addr+1; if(addr2:0=3'b111) state<=DATAOUT; else state<=MAC; end DATAOUT:begin

11、if(sample) state<=WAIT; else state<=RESET; end WAIT:begin if(sample) state<=WAIT; else state<=RESET; end default: state<=RESET; endcase end always (state) begin case(state) RESET:begin clr=1; oe=0; en=0; end MAC:begin clr=0; oe=0; en=0; end DATAOUT:begin clr=0; oe=1; en=1; end WAIT:be

12、gin oe=0 ;en=0; end default:begin clr=1; oe=1; en=0; end endcaseend对于本实验中部分部分编码采用格雷编码,这有助于消除电路的毛刺,例如状态机的状态编码(如下),同样有助于消除电路毛刺的还有sample、en等信号的同步触发方式。parameter RESET=2'b00; parameter MAC=2'b01; parameter DATAOUT=2'b11; parameter WAIT=2'b10;七、 ModelSim仿真波形记录与分析1、控制器(controller.v)仿真波形:对比实

13、验原理的流程图进行分析,结果完全符合预期要求。2、8位并入并出移位寄存器仿真波形由初始时传递态可以直观地看出移位寄存的工作方式,并且经数据验证工作正常。3、滤波输出y_out仿真波形滤波输出的数值输出结果,观察特点,具有对称、周期的特点。截取一段y_out用于绘图: y_out: -17, -47, -83, -82, -70, -47, -17, 16, 46, 69, 81, 82, 69, 81, 82, 69, 46, 16.4、 输入x_in波形图(根据数值Matlab绘制)5、 输出y_out波形图(根据ModelSim仿真数值,Matlab绘制)滤波输出的波形基本为平滑的正弦波,

14、说明本实验所设计的数字滤波器达到了预期的设计效果。(图中与输入的对比采集数据时相位不同)八、 实验总结通过本次实验,我对verilog的编写与应用有了深一步的理解和掌握,也对FPGA在数字信号处理上的应拥有了一定认识。在编写代码与调试过程中,具体地掌握了时序电路的编写方法,testbench的编写方法,进一步掌握了状态机ASM图的编写方法。在不断的调试过程中,对软件的使用和错误检查调试能力有很大的提高。而且值得一提的是,对于如此一个子模块数目比较多的工程,合理的进行文件管理是必须而且有效的。我采用的是顶层、上层、底层三层模块分布,方便查找和管理。另外,在实验中遇到了很多的设计问题,我最终解决了

15、它们,一些设计问题和解决方法列举如下:1、教材流程图中有部分控制信号在我的设计中具体实现时与预期不符,我做了些许改动以适应自己的设计。 RESET状态中oe=1改为oe=0,添加en=0; DATAOUT状态中加入en=1。2、乘累加原理框图中部分修改: 累加器模块的中的寄存器清零信号接口en改为clr。3、根据乘累加原理,若8位输入经数据选择器选择后相加,则必须将输入扩展为9位后进行相加以避免溢出。然而接下来与h_rom中输出的8位信号相乘时,我所采用的lab 11中的8*8 booth multiplier就不适用了,需要修改编码。由于时间原因我没有采用将乘法器扩展为9*8的方法,而是选择

16、将data_in模块中signal_rom中存取输入信号的幅度最大值由27改为26,相应得到7位输入。这样加法符号位扩展后得到8*8数据。4、初始设计时对于累加器部分有疑惑,因为涉及到带符号位数的累加的溢出问题不知道如何解决,后来发现本实验数据不会产生溢出。九、 思考题1、 与DSP的顺序执行相比,FPGA具有很好的并行性,而且算法流程非常灵活,如实验中Wallace树算法对普通算法的改善。FPGA有很多自由的门,通过将这些门连接起来形成乘法器、寄存器、地址发生器等等。这些只要在框图级完成,许多块可以从简单的门到FIR(Finite Impulse Response 有限冲激响应)或FFT(F

17、ast Fourier Transform 快速傅里叶变换)在很高的级别完成。但它的性能受到它所有的门数及时钟速度的限制。例如,一个具有20万门的Virtex 器件可以实现200MHz时钟的10个16位的乘法器。FPGA包含有大量实现组合逻辑的资源,可以完成较大规模的组合逻辑电路设计;与此同时,它还包含有相当数量的触发器,借助这些触发器,FPGA又能完成复杂的时序逻辑功能。通过使用各种EDA (Electronic Design Automatic 电子设计自动化)工具,设计人员可以很方便地将复杂的电路在FPGA中实现。象微处理器一样,许多FPGA可以无限的重新编程,加载一个新的设计方案只需要

18、几百毫秒。甚至现场产品可以很简单而且快速的实现。这样,利用重配置可以减少硬件的开销。2、流水线技术即在图中每一级输出后加一级锁存器,这样时钟频率就只取决于每一级的时延,而非各级时延的总和,于是提高了时钟频率。参考文献:数字系统设计实验教程 屈民军 唐奕 编著 2011 科学出版社 数字电路设计方案中DSP与FPGA的比较与选择 来自于(部分代码附于后页)module fir_top(sys_clk,reset_n, y_out); /顶层文件fir_top.v input sys_clk; input reset_n; output 7:0 y_out; wire 6:0 x_in; wire

19、 2:0 addr; wire clr,oe,en,sample; wire 7:0 dout; data_in data_in_inst1( .clk(sys_clk), .sample(sample), .dout(x_in), .reset(reset_n); h_rom h_rom_inst( .dout(dout), .addr(addr); sample sample_inst( .clk(sys_clk), .sample(sample); controller controller_inst( .clk(sys_clk), .sample(sample), .reset(res

20、et_n), .clr(clr), .oe(oe), .en(en), .addr(addr); fir fir_inst( .x(x_in), .dout(dout), .clk(sys_clk), .clr(clr), .oe(oe), .en(en), .addr(addr), .sample(sample), .reset(reset_n), .y(y_out); endmodulemodule fir(x,dout,clk,clr,oe,en,addr,sample,reset,y); /乘累加滤波算法模块fir.vinput 6:0 x;input 7:0 dout;input c

21、lk,clr,oe,en,sample,reset;input2:0 addr;output reg7:0 y;wire15:0 y_raw;reg6:0 x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15; reg6:0 out1,out2;wire7:0 s;wire15:0 pt; always(posedge clk) /7位并入并出移位寄存器if(en)beginx0<=x;x1<=x0;x2<=x1;x3<=x2;x4<=x3;x5<=x4;x6<=x5;x7<=x6;x8<

22、;=x7;x9<=x8;x10<=x9;x11<=x10;x12<=x11;x13<=x12;x14<=x13;x15<=x14;endendalways(*) /16位数据选择器begincase(addr)3'b000: begin out1=x0;out2=x15; end 3'b001: begin out1=x1;out2=x14; end3'b010: begin out1=x2;out2=x13; end3'b011: begin out1=x3;out2=x12; end3'b100: begin

23、 out1=x4;out2=x11; end3'b101: begin out1=x5;out2=x10; end3'b110: begin out1=x6;out2=x9; end3'b111: begin out1=x7;out2=x8; endendcaseendadder_8bits_ahead adder_1( /调用加法器.a(out16,out1),.b(out26,out2),.ci(1'b0),.s(s),.co();booth_multiplier multiplier1( /调用乘法器.a(s),.b(dout),.p(pt);acc ac

24、c1( /调用累加器.accout(y_raw),.cout(),.accin(pt),.cin(1'b0),.clk(clk),.clr(clr);always(posedge clk) /数据截短begin if(oe)case(y_raw15:14)2'b00:y=y_raw14:7;2'b01:y=8'b01111111;2'b10:y=8'b10000000;2'b11:y=y_raw14:7;endcaseendendmodulemodule controller(clk,sample,reset,clr,oe,en,addr

25、); /控制器模块controller.v input clk,sample,reset; output reg clr,oe,en; output reg 2:0 addr; reg1:0 state; parameter RESET=2'b00; parameter MAC=2'b01; parameter DATAOUT=2'b11; parameter WAIT=2'b10; always (posedge clk or posedge reset) begin if(reset) state<=RESET; else case(state) RE

26、SET:begin addr=0; if(sample) state<=MAC; else state<=RESET; end MAC:begin addr<=addr+1; if(addr2:0=3'b111) state<=DATAOUT; else state<=MAC; end DATAOUT:begin if(sample) state<=WAIT; else state<=RESET; end WAIT:begin if(sample) state<=WAIT; else state<=RESET; end defaul

27、t: state<=RESET; endcase end always (state) begin case(state) RESET:begin clr=1; oe=0; en=0; end MAC:begin clr=0; oe=0; en=0; end DATAOUT:begin clr=0; oe=1; en=1; end WAIT:begin oe=0 ;en=0; end default:begin clr=1; oe=1; en=0; end endcase end endmodule module acc(accout,cout,accin,cin,clk,clr); /

28、累加器模块 16bits_accadder.voutput15:0 accout;output cout;input15:0 accin;input cin,clk,clr;wire15:0 sum;wire co1,co2,co3,s;adder_4bits_ahead accadd1(.a(accin3:0),.b(accout3:0),.ci(cin),.s(sum3:0),.co(co1);adder_4bits_ahead accadd2(.a(accin7:4),.b(accout7:4),.ci(co1),.s(sum7:4),.co(co2);adder_4bits_ahead

29、 accadd3(.a(accin11:8),.b(accout11:8),.ci(co2),.s(sum11:8),.co(co3);adder_4bits_ahead accadd4(.a(accin15:12),.b(accout15:12),.ci(co3),.s(sum15:12),.co(cout);assign s=accin15&&accout15&&cout|!accin15&&accout15&&sum15&&!cout|accin15&&!accout15&&sum15&&!cout;dffr #(16) accreg17(.d(s,sum14:0),.r(clr),.clk(clk),.q(accout);endmodule module dffr(d, r,clk,q); /寄存器模块dffr.vparameter N = 1;input r,clk;input N-1:0 d;output N-1:0 q;reg N-1:0 q;always (posedge clk)if

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论