科技信息 计算机与网络 基于VHDL语言硇 滤波器软件设计 淮安信息职业技术学院信息与通信工程系 蔡楠 [摘要]本文以一个具体指标参数的fir滤波器为例,详细介绍了基于VHDL语言设计fir滤波器的软件设计流程,从最初的方案确 定、并利用madab对滤波器参数的计算、VHDL代码的编写并最终通过madab的cony函数可以验证FIR滤波器卷积的结果。 [关键词]VHDL fir滤波器一matlab 1、基于matlab工具的滤波器系数计算 maflab中有专用的滤波器设计和分析工具,在matlab命令编辑窗 、前言 对于有限长脉冲响应(FJR)滤波器而言,他它的系统函数只有零 点,除原点外,没有极点,因而FIR滤波器总是稳定的。如果他的单位脉 冲响应是非因果的,总能够方便的通过适当的移位得到因果的单位脉 冲响应,所以FIR滤波器不存在稳定性和是否可实现的问题。它的另一 个突出的优点是在满足一定的对称条件时,可以实现严格的线性相位。 由于线性相位滤波器不会改变输入信号的形状,而只是在时域上使信 号延时,因此线性相位特性在工程实际中具有非常重要的意义,如在数 据通信、图像处理等应用领域,往往要求信号在传输和处理过程中不能 有明显的相位失真,因而线性相位FIR滤波器得到了广泛的应用。 二、设计指标 设计一个l6阶低通线性相位FIR滤波器; 要求采样频率Fs为80KHz; 截止频率 为IOKHz; 采用函数窗法设计,且窗口类型为Kaiser,Beta为0.5; 输入序列位宽为1O位的有符号数(最高位为符号位); 输出序列位宽为10位的有符号数(最高位为符号位)。 三、设计思路 首先通过matlab计算出符合设计要求的滤波器冲激响应系数。为 了简便代码编写过程,将整个电路规划为语言编辑和原理图编辑两个 单元,其中语言编辑部分负责编辑整个滤波器电路中所需用的单元器 件,包括寄存器、加法器、减法器以及乘法器几个单元器件;原理图编辑 部分完成单元器件的电气连接工作。整个电路的原理图设置方案如图 1所示: 图1滤波器整体设计思路 图2 Filter Design&Analysis Tool窗口 四、设计过程 口输入Fdatool指令,敲击回车即可打开FilterDesing&AnalysisTool窗 口(如图2所示),在该工具的帮助下,我们可以完成n r.滤波器系数的 计算工作。 按设计指标参数要求,输入相关需要参数,然后单击Desing Fiher 按钮,开始进行相关参数计算。在计算结果中我们可以看到该滤波器的 一些相关曲线,如幅频响应(如图3)、相频响应(如图4)、冲激响应(如 图5)等以及具体的系数值(如图6)。 图3幅频特性 图4相频响应 图5冲激响应 图6具体参数值 计算的结果可通过File下拉菜单中的Export命令取出,点击Ex— porl打开Export对话框,点击OK按钮可将滤波器系数数据存放到当前 工作空间,并以Num命名。 对FIR滤波器的系数进行调整,做整数化操作。可得到滤波器整数 化的系数为[-31-88-106-54 70 239 401 499 499 401 239 70—54—106—88—31]。 2、单元器件的语言编辑 需要用VHDL编译的单元器件包括: 寄存器模块,寄存器用于寄存一组二值代码,只要求它们具有置1、 置0的功能即可。在本设计中用D触发器组成寄存器,实现寄存功能。 本设计中使用带异步复位rst端的D触发器,当rst=1时,输出信号 q=0,当rst=O且上升沿脉冲到达时q=d。 加法器模块,实现两个有符号数的相加运算。即将输入的两数,在 时钟脉冲到来时相加运算,输出结果。在本设计有8个两个1O位 有符号数相加产生一个11位有符号数的加法器、一个18位和l9位有 符号数相加产生20位有符号数的加法器、一个两个20位有符号数相 加产生一个21位有符号数的加法器、一个两个19位有符号数相加产 生一个2O位有符号位数的加法器、一个20位和21位有符号数相加产 生22位有符号数的加法器以及一个2O位和22位有符号数相加产生 23位有符号数的加法器电路。其中一个2O位和22位有符号数相加产 生23位有符号数的加法器电路为最后一级,所以在加法器电路中在引 入低位舍去功能只保留最终lO位输出,最终保留10位输出采用了直 接取输出23位数的高十位的方法,因此在输出中近似等于除掉了2 13 即8192以后的结果。 减法器模块:实现零值减去两个有符号数的减法运算。即用零值减 去输入的两数,在时钟脉冲到来时做减法运算,输出结果。一31和一88 的乘结果都只包含了乘系数31和88的数值,并没有将两个负号代入, 所以两乘法器后面的加法器运算改为减法器模块,采用0—31 累加结 果一88*累加结果的方法,实现(一31) 累加结果+(一88) 累加结果的 计算。一106和一54后面的加法器采用同样的方式处理。 乘法器模块:从资源和速度考虑,常系数乘法运算可用移位相加来 实现。将常系数分解成几个2的幂的和形式。滤波器系数分别为一31、 一88 —106 —54 70 239 401 499、499、40,、239 70 —54、一106、一88, 一3l。算法:其中带负号数先乘去负号的整数部分,在后面的求和中做减 法运算。编码方式如下:3l被编码为2^5—2^0、88被编码为2^6+2^4+2 3、 106被编码为2^6+2 5+2^3+2 1、54被编码为2"6—2 3—2^l、7O被编码为 2^6+2-'2+2^l、239被编码为2 8一T4—2"0、401被编码为2"9—2^7+2^4+2"0、 ...——237—--—— 科技信息 计算机与网络 4、仿真结果验证: 499被编码为2"9—2 3—2"2—2"0。实现输入带符号数据与固定数据两个二 进制数的乘法运算。当到达时钟上升沿时,将两数输入,运算并输出结 果。 因篇幅,此处仅给出一乘499乘法器模块电路代码: sIONAL s3:sIGNED n2 O"-( 0D00ooO0o”& f】O LIBRARY iccc,D0wNT0 01: DO ̄FNTO0)); USEieee std_logic一1164 alk SIGNAL s4:SIGNED(10 l E USEie ̄e stdlogicanm DO' ̄JNTO0), s5<- ̄1’&sl(18 do ̄lto ……………一…- SIGNAL :sIONED(19 O"-(1111111”&s2(13 DOWNTO ENT1TYmuir499 Is DOWNTO0、: O"・ 1111111”&s302 DOWICrO pol ̄r(elk IN STD L0aIc, BEGIN 0))- 111111111”&s4(10 Din:IN sIaNED(10 DOWNTO0"; D0wNT0O A1:PROCESS(DIn,s1.s2,s3,s4) ENDIF; Dout o【,r S 0NED BEGIN END PROCE,SS; (19 DO' ̄rrO 0】); sl<=Dm&'00O000000。; A2:PROCESS(c ̄,s5) END nmlt499; s2<=Din&'000-. BE ・・・・・--・-・・・・---・・・・・・・ s3<=Din&'00 IF cⅡ‘’Ev目盯^ND ARulttte.CTUREtm ̄t499 OF s4<=Din; elk-’I’TH muh499IS IF0D (1O -o’)TⅢN Dout<=sS; SIGNAL sl:SIGNED(19 s5<= &s10s downto ENDIF; DOWNTO0), 0))-(-oooooo。&s2(13 DOWNTO ENDPROCESS; SIGNAL s2:sIaNED(13 0】 - 啪。000 (I2 ENDmuir499; DOWNTO0);DOWNy0 其仿真结果如图7所示,符合预期效果。 1—-O 图7乘499仿真结果 3、原理图编辑 将语言编辑的单元器件分 ̄UC'J建元件,将元器件按设计思路中的 图i连接搭建成整体的滤波器电路。其中clk和rst信号采用了总线名 称的连接方式。 原理图电路编辑结果如图8所示: 图8滤波器原理图编辑结果 为了与matlab的cony函数结果做比对在输出端额外引入了S输出 端口,用来显示无截短的滤波器输出结果f23位)。 J ll 【I II {I I l I 『 I lI 『 0 X T x 0 X 口 工 5 I 1 x 0 x 1 !§ 墼 x ! 工 】( 翌! !!!曼 X 型 X 唑 ! ——— 墅 2^ 2气m 2巨u, 2. - 图9滤波器仿真结果 ....——238..—.— 利用matlab的cony函数可以验证FIR滤波器卷积的结果,在表1 中通过比对来进行对结果的说明。随机输入序列【_454,一39,55,463,一33 1. 一52,128,261。 表1仿真结果验证 滤波器仿真无截 短输出23位 conv函数输出 滤波器仿真截 断输出lO位 cony函数除 2 13(8196) 14074 14074 l 1.7l8O 4ll6l 4l161 5 5.0245 49851 4985l 6 6.0853 9457 9457 l 1.1544 -65987 -65987 -9 -8.O55l 一132544 —132544 -17 -16.1797 -176833 -176833 —22 —21.586l -185314 -185314 -23 -226213 -1495l3 -149513 -19 一l8.25l1 -80824 —80824 一l0 -9.8662 -3266 -3266 一I -0.3987 58382 58382 7 7.1267 87019 87019 10 10.6224 80356 80356 9 9.8O91 5O41l 5O411 6 6.1537 l5378 15378 l 1.8772 2543 2543 0 O.3104 lO6l9 10619 1 1.2963 15195 15195 1 1.8549 -135 -135 -1 -0.Ol65 一l24O8 —12408 —2 -1.5146 -6256 -6256 一l -0.7637 —8()6 -806 一l -0.0984 经仿真结果对比可知。在截短前的滤波器输出和matlab卷积乘结 果完全一致,滤波器功能完好。由于在本设计中为节约硬件资源,故在 最后一位输出前进行截短操作,导致在截短后个别数据引入的误差。 五、总结 在电子系统中,具有良好的线性特性的FIR数字滤波器被广泛使 用,属于信号处理的基本构成之一。在本次的设计过程中采用了层次 化、模块化的设计思想,将整个电路设计划分为多个功能模块,利用 VHDL语言分别对每一个模块编写代码,简化了代码编写的复杂 性,每个代码编写完先仿真,确保功能准确,从而有效的提高了每 个对立模块的可靠性。经代码编写出的相应功能部件再经过原理图输 入技术,电气连接成最后的FIR数字滤波器的结构,并最终完成系统设 计。经最后验证,该设计符合预期设计要求。在实际应用中,只需按要求 修改滤波器参数,并对程序作较少的改动,即可实现不同截止频率的 nR滤波器,实用性较强。 参考文献 [1儿巴西]VolneiA.Pedroni著,乔庐峰等译.VHDL数字电路设计 教程.北京:电子工业出版社.2005 [2][美]Sanjit K.Mitra著,孙洪等译.数字信号处理.北京:电子工业 科学出版社,2005 [3]郑阿奇.MATLAB实用教程.北京:电子工业出版社,2004 [4]楼顺天,李博菡.基于MATLAB的系统分析与设计.西安:西安 电子科技大学出版社.1998