预览加载中,请您耐心等待几秒...
1/7
2/7
3/7
4/7
5/7
6/7
7/7

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

基于FPGA的FIR滤波器设计周剑敏+谢文雷+葛斌+陈虞苏摘要介绍了基于FPGA芯片进行FIR滤波器的设计过程,具体涉及到MATLAB对FIR滤波器的仿真、数据的量化和生成;FPGA对FIR滤波器的设计、仿真和数据生成,最后形成FPGA和MATLAB联合设计FIR滤波器。关键词FGPA;FIR;MATLAB中图分类号:TN911文献标识码:A文章编号:1671-7597(2014)03-0034-01滤波器在信息领域应用非常广泛。随着现代技术的发展,如何在FPGA上进行滤波器设计是非常迫切的。FPGA是通过硬件描述语言进行程序设计的,要把基于数学基础的滤波器在FPGA上设计出来还是有一定难度的。而用MATLAB进行滤波器设计又显的非常简单。因此需要把MATLAB和FPGA技术结合起来,进行滤波器设计,这样就能事半功倍。本文将以一个简单的FIR滤波器为例,用MATLAB和FPGA进行联合设计滤波器。1基本流程一般采用MATLAB和FPGA联合设计有多种方法。一种是由MATLAB软件设计出滤波器系统,并在MATLAB中利用工具直接转换成VHDL代码;一种是由MATLBA软件设计出FIR关键系数和测试文件,然后在FPGA中使用系数设计滤波器,使用测试文件形成测试结果,最后再由MATLAB把测试结果验证,证明FPGA设计滤波器的正确性。第一种方法在滤波器系统较为复杂的时候,很难满足设计要求,调试时反而显得复杂。本文采用第二种方法进行滤波器的联合设计。2MATLAB的FIR系数和测试文件生成在设计时,使用MATLAB产生滤波器系数和测试文件。MATLAB里有各种专门的FIR滤波器系数生成函数,如B=fir1(N,Wn,'high')函数。B:表示返回的FIR滤波器的单位脉冲响应,长度为N+1。N:表示滤波器的阶数。Wn:表示滤波器的截至频率。High:表示是高通滤波器。用户只要按滤波器设计要求,获取B系数就能得到浮点数表示的FIR滤波器系数。滤波器系数生成后,需要有测试文件测试滤波器的特性。用户可以根据滤波器的特性,利用MATLAB自动生成测试文件。如利用MATLAB程序:sin_t=0:1/fs:0.1;sin_c1=2*pi*f_1*sin_t;sin_c2=2*pi*f_2*sin_t;sj=1/3*sin(sin_c1)+sin(sin_c2);自动就生产了含有2个频率成份的浮点数表示的sj信号。若仅仅是检测MATLAB设计的FIR滤波器是否正确,可以把sj输入到FIR滤波器中,观察滤波器输出就可以判断。目前是要在FPGA中设计并验证滤波器。所以需要把MATLAB生成的滤波器系数和测试文件量化成符合FPGA需要的二进制表示的整数。使用MATLAB,对sj信号进行12位量化过程如下:bin_long=12;sj_quan_12=round(sj/max(sj))*(2^(bin_long-1)-1));量化完成后,还需要把参数写成文件,等待FPGA的调用。MATLAB中把测试文件写成文件如下:fidout=fopen('result.txt','w');%openresultfileandwaitforwritefori=1:length(sj_quan_12)forj=1:bin_longfprintf(fidout,'%s',sj_quan_12(i,j));ifmod(j,bin_long)==0fprintf(fidout,'\r\n');endendendfclose(fidout);3FPGA程序设计本文利用XILINX公司的FPGA芯片XC6SLX45作为硬件载体,使用VHDL语言进行FIR程序编写。具体元件说明如下:COMPONENTfir_bookPORT(rst:INstd_logic;--复位信号输入clk:INstd_logic;--时钟输入xin:INstd_logic_vector(11downto0);--测试文件/实际信号输入yout:OUTstd_logic_vector(28downto0)—FIR滤波输出);ENDCOMPONENT;xin为FIR滤波器的输入端,同时也是仿真时,MATLAB生成的测试文件输入端。yin是xin经过FPGA内部设计的FIR滤波器滤波后的输出信号。在FPGA中输入MATLAB的测试文件的程序如下:fileinvect:textis"e:\\matlab_study\result.txt";ifnot(endfile(invect))thenreadline(invect,vline);read(vline,v);xin<=v;endif;在FPGA中输出仿真给MATLAB测试的程序如下:fileoutvect:textopenwrite_modeis"e:\\ma