基于FPGA的FIR滤波器设计

时间:2022-10-12 08:32:43

基于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设计滤波器的正确性。第一种方法在滤波器系统较为复杂的时候,很难满足设计要求,调试时反而显得复杂。本文采用第二种方法进行滤波器的联合设计。

2 MATLAB的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'); %open result file and wait for write

for i=1:length(sj_quan_12)

for j=1:bin_long

fprintf(fidout,'%s',sj_quan_12(i,j));

if mod(j,bin_long)==0

fprintf(fidout,'\r\n');

end

end

end

fclose(fidout);

3 FPGA程序设计

本文利用XILINX公司的FPGA芯片XC6SLX45作为硬件载体,使用VHDL语言进行FIR程序编写。具体元件说明如下:

COMPONENT fir_book

PORT(

rst : IN std_logic;--复位信号输入

clk : IN std_logic;--时钟输入

xin : IN std_logic_vector(11 downto 0);--测试文件/实际信号输入

yout : OUT std_logic_vector(28 downto 0)―FIR滤波输出

);

END COMPONENT;

xin为FIR滤波器的输入端,同时也是仿真时,MATLAB生成的测试文件输入端。yin是xin经过FPGA内部设计的FIR滤波器滤波后的输出信号。

在FPGA中输入MATLAB的测试文件的程序如下:

file invect:text is "e:\\matlab_study \result.txt";

if not(endfile(invect)) then

readline(invect,vline);

read(vline,v);

xin

end if;

在FPGA中输出仿真给MATLAB测试的程序如下:

file outvect:text open write_mode is "e:\\matlab_study \result_out.txt";

write(lineout,viout,right,10);

writeline(outvect,lineout);

4 结论

在不需要经过硬件环境实际测试情况下,可以通过MATLAB生成滤波器系数和测试文件,再由FGPA按生成的滤波器系数和测试文件仿真生成结果文件,最后MATLAB测试结果文件,验证FPGA滤波器设计的正确性。基于FPGA和MATLAB的滤波器设计具有很强的实用性和参考意义。

参考文献

[1]任志健,万智萍,朱俊南,朱柏辉.ARM嵌入式远程视频监控数据采集系统设计[J].计算技术与自动化,2013(2):100-1104.

[2]Lattice Semiconductor Corporation. Lattice ECP3 Family Data Sheet[EB/OL].2010.http://.

[3]Elpida Memory Inc. 1G bits DDR2 SDRAM [EB/OL].2009. http://.

[4]Winbond Inc. 3V 64M-BIT SERIAL FLASH MEMEORY WITH DUAL/QUAD SPI&QPI[EB/OL].2009.http://.

[5]ATMEL Corporation . 3-Wire Serial EEPROs [EB/OL].2009. http://.

[6]Aptina Imaging Corporation . 1/2.5-Inch 5Mp CMOS Digital Image Sensor [EB/OL].2005.http://www.aptina. com.

[7]MARVELL Corporation . Alaska 88e1118r Technical Product Brief[EB/OL].2011.http://www.marvell. com.

上一篇:测绘新技术在房地产测绘中的应用 下一篇:刍议加强水利水电工程施工管理