基于FPGA的四阶IIR数字滤波器
算速度。需要注意的是,MAX+plusⅡ的LPM库中乘法运算为无符号数的阵列乘法,所以使用时需要先将两个补码乘数转换为无符号数相乘后,再将乘积转换为补码乘积输出。每个二阶节完成一次运算共需要6个时钟周期,而且需采用各自独立的MAC实现两级流水线结构,即每个数据经过两个二阶节输出只需要6个时钟周期。
2.1系统原理框图
系统原理框图如图2所示,模拟信号经过TLC5510转换为00H~FFH的二进制数后,送入四阶IIR低通滤波器,处理后输出10位二进制数送AD7520得到双极性的模拟电压输出。
图3四阶IIR滤波器的顶层原理图
2.2顶层IIR模块
顶层IIR模块如图3所示。主要由一个时序控制模块IIRC、两个IIR二阶节模块(IIR1和IIR2)构成。IIR模块设计为10位二进制补码输入,最高位ad9为补码符号位,次高位ad8用于防止运算时的溢出。可见该IIR模块实际可以输入9位二进制补码数,但TLC5510的输出数据为8位,输入到IIR模块时,将ad9和ad8引脚均接地,即输入为正极性电压。
clr输入端为异步清零端,高电平有效。当输入时钟clk为12MHz时,IIR模块产生一个频率为2MHz的clk_ad输出时钟提供给TLC5510。输出数据dout为10位二进制补码。IIR1和IIR2模块构成级联结构。
2.3IIR1和IIR2模块
IIR1、IIR2模块主要由两个模块构成,一个是数据移位模块,在CLK_R时钟作用下将差分方程的各x、y值延迟一个时钟;另一个模块是补码乘加单元,用VHDL语言编写,两个乘数先取补后再进行阵列乘法,在CLK_B时钟控制下完成一次乘加运算,乘积取补后输出,共需要6个时钟。
差分方程的各系数如表2所示,采用10位定点纯小数补码表示。
表2二阶差分方程的系数
系数a0a1a2b0b1IIR101CH3E6H01CH194H35BHIIR203FH393H03FH1C6H31CH
另外?熏模块中的五个系数定义为常数,以节省硬件资源,并且采用0舍1入法进行数据处理,尽量提高数据运算精度。VHDL程序如下:
entitysmultadd1is
port(clk_regbt,clk_reg:instd_logic:
x0,x1,x2,y0,y1:instd_logic_vector(9downto0);
yout:outstd_logic_vector(9downto0));
endsmultadd1;
architecturebehavofsmultadd1is
signaltan,tbn,tp2n:std_logic;
signalcnt:std_logic_vector(2downto0);
signalta,tb,taa,tbb:std_logic_vector(8downto0);
signaltmpa,tmpb:std_logic_vector(9downto0);
signaltp:std_logic_vector(18downto0);
signaltpp:std_logic_vector,22downto0);
signalytmp,p:std_logic_vector(23downto0);
constanta0:std_logic_vector(9downto0:=“0000011100”
(其余常数说明略)
begin
tp2n<=tanxortbn;--求补后送阵列乘法器
taa<=notta+‘1’when(tan=‘1’)elseta;
tbb<=nottb+‘1’when(tbn=‘1’)elsetb;
tpp<=‘1’&‘1’&‘1’&‘1’&nottp+‘1’when(tp2n=‘1’)elsetp;
tmpa<=a0whencnt=0else
a1whencnt=1else
a2whencnt=2else
《基于FPGA的四阶IIR数字滤波器(第2页)》
本文链接地址:http://www.oyaya.net/fanwen/view/166451.html
2.1系统原理框图
系统原理框图如图2所示,模拟信号经过TLC5510转换为00H~FFH的二进制数后,送入四阶IIR低通滤波器,处理后输出10位二进制数送AD7520得到双极性的模拟电压输出。
图3四阶IIR滤波器的顶层原理图
2.2顶层IIR模块
顶层IIR模块如图3所示。主要由一个时序控制模块IIRC、两个IIR二阶节模块(IIR1和IIR2)构成。IIR模块设计为10位二进制补码输入,最高位ad9为补码符号位,次高位ad8用于防止运算时的溢出。可见该IIR模块实际可以输入9位二进制补码数,但TLC5510的输出数据为8位,输入到IIR模块时,将ad9和ad8引脚均接地,即输入为正极性电压。
clr输入端为异步清零端,高电平有效。当输入时钟clk为12MHz时,IIR模块产生一个频率为2MHz的clk_ad输出时钟提供给TLC5510。输出数据dout为10位二进制补码。IIR1和IIR2模块构成级联结构。
2.3IIR1和IIR2模块
IIR1、IIR2模块主要由两个模块构成,一个是数据移位模块,在CLK_R时钟作用下将差分方程的各x、y值延迟一个时钟;另一个模块是补码乘加单元,用VHDL语言编写,两个乘数先取补后再进行阵列乘法,在CLK_B时钟控制下完成一次乘加运算,乘积取补后输出,共需要6个时钟。
差分方程的各系数如表2所示,采用10位定点纯小数补码表示。
表2二阶差分方程的系数
系数a0a1a2b0b1IIR101CH3E6H01CH194H35BHIIR203FH393H03FH1C6H31CH
另外?熏模块中的五个系数定义为常数,以节省硬件资源,并且采用0舍1入法进行数据处理,尽量提高数据运算精度。VHDL程序如下:
entitysmultadd1is
port(clk_regbt,clk_reg:instd_logic:
x0,x1,x2,y0,y1:instd_logic_vector(9downto0);
yout:outstd_logic_vector(9downto0));
endsmultadd1;
architecturebehavofsmultadd1is
signaltan,tbn,tp2n:std_logic;
signalcnt:std_logic_vector(2downto0);
signalta,tb,taa,tbb:std_logic_vector(8downto0);
signaltmpa,tmpb:std_logic_vector(9downto0);
signaltp:std_logic_vector(18downto0);
signaltpp:std_logic_vector,22downto0);
signalytmp,p:std_logic_vector(23downto0);
constanta0:std_logic_vector(9downto0:=“0000011100”
(其余常数说明略)
begin
tp2n<=tanxortbn;--求补后送阵列乘法器
taa<=notta+‘1’when(tan=‘1’)elseta;
tbb<=nottb+‘1’when(tbn=‘1’)elsetb;
tpp<=‘1’&‘1’&‘1’&‘1’&nottp+‘1’when(tp2n=‘1’)elsetp;
tmpa<=a0whencnt=0else
a1whencnt=1else
a2whencnt=2else
《基于FPGA的四阶IIR数字滤波器(第2页)》