
图图bt
-
2023年3月17日发(作者:甲醇毒性)赤峰学院
毕业论文(设计)
题目基于FPGA的IIR数字低通滤波器设计
学生姓名
学号
院系物理与电子信息工程系
专业电子信息工程
指导教师
二O一一年六月一日
基于FPGA的IIR数字低通滤波器的设计与实现
XXX
赤峰学院物理与电子信息工程系,赤峰024000
摘要:本文介绍了基于FPGA的IIR数字低通滤波器的设计与实现,首先介绍了IIR数字低通滤波器的原
理和分类。接着介绍了IIR数字低通滤波器的设计方法,有用脉冲响应不变法和双线性变换法。又介绍了
用VHDL语言在QuartusII软件上生成IIR数字滤波器的各模块(时序控制模块、延时模块、顶层模块、乘
法累加模块),并用各个模块构建一个IIR的二阶节。最后通过实例阐明了基于FPGA的四阶IIR数字低通
滤波器的设计,在QuartusII软件上仿真,并得到仿真图。
关键词:FPGA;MATLAB;QuartusII;IIR数字低通滤波器;设计;实现
1引言
在当今数字技术发展的时代,数字滤波器被广泛应用于频谱分析,模式识别,语言与图
像处理等领域,数字滤波器有着精度高、实时性高、处理速度快等特点。数字滤波器根据单
位脉冲响应的不同,可以分为有限长脉冲响应(FIR)滤波器和无限长脉冲响应(IIR)滤波
器。FIR具有良好的相位特性,而IIR滤波器具有很好的幅频特性。IIR滤波器所要求的阶
数不仅比FIR滤波器低,而且可以利用模拟滤波器的设计成果,设计工作量相对较小,采用
FPGA实现的IIR滤波器同样具有多种优越性。再者按信号通过数字滤波器的特性(主要是
幅频特性)来分类:有低通数字滤波器、高通数字滤波器、带通数字滤波器和带阻数字滤波
器。为了更好的了解数字滤波器,我们用FieldProgrammableGateArray(现场可编程门阵
列)即FPGA来实现。FPGA以其优越的实时性和设计的灵活性,成了控制系统中重要的一
部分,并直接采用VHDL编程简化设计步骤。可以在QuartusII、MAX+plusII等软件上作仿
真。从而使得FPGA在当今通信、自动控制以及信号处理等方面得到很广泛的应用。在本
文设计中提出了基于现场可编程门阵列器件(FPGA)实现IIR数字低通滤波器。并在
QuartusII上做仿真。
2IIR数字滤波器的基本结构及类型.
2.1直接型IIR数字滤波器的结构
IIR数字滤波器传输函数的标准表达式:
0
1
()
1
M
r
r
r
N
k
k
k
bz
Hz
az
其对应的差分方程为:
10
()()()
NM
kk
kk
ynaynkaxnk
图2-1直接I型
图2-2直接II型
2.2级联型IIR数字滤波器的结构
将系统函数H(Z)因式分解为较低的二阶型的乘积,每个双二阶用一个直接型实现,
整个系统用双二阶的级联实现,每一个二阶型传递函数为:
12
,1,2
12
,1,2
1
();k=1,
1
kk
k
kk
BzBz
HZ
AzAz
…k
图2-3级联型
2.3并联型IIR数字滤波器的结构
将系统函数H(Z)因式分解为双二阶之和,每个双二阶用一个直接型实现,整个系统
函数作为二阶节的并联网络实现[2]。每一个二阶型传递函数为:
1
,0,1
12
,1,2
();k=1,
1
kk
k
kk
BBz
Hz
AzAz
…k
图2-4并联型
2.4IIR数字滤波器的类型
IIR滤波器主要有巴特沃斯滤波器、切比雪夫滤波器和椭圆滤波器几种。给出了以上三
种滤波器实现同样性能指标所需的阶数和阻带衰减的比较,如表1所示
表1三种滤波器性能比较
原型阶数阻带衰减/dB
巴特沃斯
615
切比雪夫I型
425
椭圆函数
327
3IIR数字低通滤波器的设计
低通滤波器让某一频率以下的信号分量通过,而对该频率以上的信号分量大大抑制的电
容、电感与电阻等器件的组合装置。所以低通滤波是一种可以通过低频信号而且衰减和抑制
高频信号的方式,所以其频率响应函数
()
()
0
j
c
j
c
He
He
由此可以看出低通滤波器的同频带位于2的整数倍。用FPGA实现滤波器的基本思想就是
基于
10
()()()
NM
kk
kk
ynaynkaxnk
来实现的
3.1用脉冲响应不变法设计IIR数字低通滤波器
设模拟滤波器的系统函数为
()
a
Hs,相应的单位冲激响应是()
a
ht,()
a
Hs=[()]
a
LTht.
[]LT代表拉氏变换,对()
a
ht进行等间隔采样,采样间隔为T,得到()
a
hnT,将
()hn=()
a
hnT作为数字滤波器的单位脉冲响应,那么数字滤波器的系统函数()Hz便是
()hn的Z变换。因此脉冲响应不变法是一种时域逼近法,它使()hn在采样点上等于()
a
ht。
但是,模拟滤波器的设计结果是
()
a
Hs,所以下面基于脉冲响应不变法的思路,退出直接从
()
a
Hs到()Hz的转换公式。
设模拟滤波器
()
a
Hs只有单阶极点,且分母多项式的阶次高于分子多项式的阶次,将
()
a
Hs用部分分式表示
1
()
N
i
a
i
i
A
Hs
ss
…………式1
式1中,
i
s
为()
a
Hs的单阶极点。将()
a
Hs进行逆拉氏变换,得到
1
()()i
N
st
ai
i
htAeut
…………式2
式2中,()ut是单位阶跃函数。对
()
a
ht进行等间隔采样,采样间隔为T,得到
1
()()()i
N
snT
ai
i
hnhnTAeunt
…………式3
对式3进行Z变换,得到数字滤波器的系统函数()Hz,即
1
1
()
1i
N
i
sT
i
A
Hz
ez
…………式4
对比式1和式4,()
a
Hs的极点
i
s映射到Z平面的极点i
sTe,系数
i
A不变。
如果原
()
a
ht的频谱不是限于2T之间,则会在奇数T附近产生频谱混叠,对应
数字频率在附近产生频谱混叠。
为了避免这一现象,令
()()
a
hnThnT那么
1
1
()
1i
N
i
sT
i
TA
Hz
ez
………………式5
式5称为实用公式,此时
()()j
a
HeHj
T
3.2用双线性变换法设计IIR数字低通滤波器
脉冲不变法的主要缺点是会产生频谱混叠现象,使数字滤波器的频响偏离模拟滤波器的
频响特向。产生的原因是模拟低通滤波器不是带限于折叠频率T,在离散化(采样)后
产生了频谱混叠,在通过映射关系sTze,使数字滤波器在
附近形成频谱混叠。为了
使这一缺点消除,我们使用非线性频率压缩方法,将整个模拟频率轴压缩到T之间,再
用sTze转换到Z平面上。设()
a
Hs,sj,经过非线性频率压缩后用()
a
Hs,sj
表示,这里用正切变换频率压缩:
1
21
tan()
2
T
T
………………式6
式6中,T为采样间隔。当
1
从T经过0变化到T时,则由经过0变化到
,
实现了s平面上整个虚轴完全压缩到
1
s
平面上虚轴的T之间的转换。由式6得
111
111
22
22
221
1
jTjTjT
jTjTjT
eee
j
TeeTe
代入sj,
11
sj,得到:
1
1
21
1
sT
sT
e
s
Te
在通过1
sTze从
1
s平面转换z平面上,得到:
1
1
21
1
z
s
Tz
………………式7
2
2
s
T
z
s
T
………………式8
式7和式8成为双线性变换。从
s
平面到
1
s平面的非线性频率压缩,使
1
()
a
Hs带限于
rads
T
,因此再用脉冲不变法从
1
s平面转换到z平面不可能产生频谱混叠现象。这就是
双线性变换法的优点,另外,从
1
s平面转换到z平面仍然采用转换关系1
sTze,
1
s平面
的T之间水平带的左半部分映射到z平面单位圆内部,虚轴映射为单位圆,这样
()
a
Hs
因果稳定,转换的()Hz也是因果稳定的。双线性变换法设计的IIR数字低通滤波器的缺点
是
和之间成非线性关系,使得数字滤波器频响曲线不能保真地模仿模拟滤波器的频响
曲线形状。
4IIR数字低通滤波器各模块的设计
IIR数字滤波器包括以下几个模块:时序控制模块、延时模块、顶层模块、乘法累加模
块。时序控制模块主要产生两个信号,一个是时延信号加到延时模块,实现时延功能;另一
个是计算处理信号,加到乘法累加模块,实现先加后乘的功能。延时模块主要作用是对数据
进行时延,使前一个数据赋给后一个数据,然后将数据输入到乘法累加模块。乘法累加模块
主要在时钟的作用下实现加法和乘法的功能,最后输出滤波器数据。
4.1时序控制模块的设计
时序控制模块主要用来产生对其它模块的时序控制信号。首先对系统进行初始化处理,
当RES信号为”1”时,对整个系统进行清零[11]。当RES信号为“0”时,时序控制模块在时
钟CLK上升沿的作用下产生两个信号CLK_REG及CLK_REGBT。其中,CLK_REG信号
用来作为延时模块、乘法累加模块的输入时钟,CLK_REGBT每隔6个时钟产生一个高电平
作为这三个模块的复位信号。
图4-1时序控制模块图
图4-2时序控制模块时序仿真图
图4-3时序控制模块功能仿真图
时序控制模块仿真如图4-2和图4-3所示,在clk的上升延到来时,counter以6个时钟
为周期开始进行计数,clk_regbt每隔6个时钟输出一个低电平,clk_reg则每隔6个时钟后
输出一个高电平。输出的两个时钟信号正好控制延时模块、乘法累加模块的运行,符合设计
要求。
程序编写说明:首先在实体中定义输入信号res,clk,输出信号reg,regbt,在结构体中定义
信号参量counter,clk_en,en;然后确定输出信号与输入信号的关系,编写算法clk_regbt<=not
clkandclk_enanden和clk_reg<=notclkandnotclk_enanden产生输出信号;最后以counter
为0到5为一个周期循环计算以上输出信号。程序见附图。
4.2延时模块的设计
其主要作用是在时钟作用下将差分方程的各x、y值依次逐位延迟一个时钟,实现延时
运算,即当输入为x(n)和y(n)时,经过一次延时后其输出分别为x(n-1)和y(n-1)。
图4-4延时模块图
图4-5延时模块时序仿真图
图4-6延时模块时序功能仿真图
延时模块仿真图如上图4-5和图4-6所示,由图可以看出当输入的xn、yout都为
5,4,3,2,1,0时,在时钟信号上升沿的作用下产生延时,经第一个时钟后x0、x1、x2、y0、
y1的值分别为1,0,0,1,0。经第二个时钟后x0、x1、x2、y0、y1的值分别为1,1,0,
1,1。经第三个时钟后x0、x1、x2、y0、y1的值分别为2,1,1,2,1。经第四个时钟后......由
此可见该模块仿真值正确。
程序编写说明:首先在实体中定义输入信号res,clk,xn,yout,输出信号x0、x1、x2、y1、
y2,在实体中定义延迟信号reg_x0,reg_x1,reg_x2,reg_y1,reg_y2;然后把依次定义好的延迟信
号送给x0、x1、x2、y1、y2;最后在时钟CLK上升沿到来时,用算法reg_x2<=reg_x1;
reg_x1<=reg_x0;reg_x0<=xn;reg_y2<=reg_y1;reg_y1<=yout实现延时。程序见附录。
4.3乘法累加模块的设计
乘法累加模块用来实现输入数据与系数ai、bi分别相乘后再相加的运算。即实现
011221122nnnnnn
ybxbxbxayay
的算法。乘法累加模块输出的信号送入累加器
后,与寄存于累加器中的中问结果相加。
图4-7乘法累加模块图
图4-8第一级乘法累加模块时序仿真图
图4-9第一级乘法累加模块功能仿真图
乘法累加模块仿真图如上图4-8和图4-9所示,clk_regbt及clk_reg为输入时钟,由时
序控制模块提供。x0、x1、x2、y1、y2为输入信号,yout为输出信号,图4-8和图4-9中
yout的值3为x0、x1、x2、y1、y2的值1、2、3、4、5和系数
i
a、bj相乘后再相加的结果,
完成了乘法累加的功能。
程序编写说明:首先在实体中定义输入信号clk_regbt、clk_reg、res、x0、x1、x2、y1、
y2,输出信号yout,在结构体中定义信号参量cnt、tmpa、tmpb、ytmp、p,将MATLAB中
设计出来的IIR数字滤波器系数A,B写入滤波器程序中;然后用cnt<=cnt+1命令使cnt依次
增加,用tmpa<=b0,b1,b2,a0,a1,tmpb<=x0,x1,x2,y1,y2,p<=tmpa*tmpb,ytmp<=ytmp+p命令实
现乘法累加运算。同理可得到第二级乘法累加仿真图:
图4-10第二级乘法累加模块时序仿真图
图4-11第二级乘法累加模块功能仿真图
4.4顶层模块的设计
顶层模块设计采用了原理图输入方法,原理图输入方式非常直观,便于信号观察和电路
的调节。
图4-12顶层模块图
图4-13顶层模块时序仿真图
图4-14顶层模块功能仿真图
4.5IIR数字低通滤波器的系统仿真结果分析。
系统先开始处于初始状态,当RES信号为“1”时,对整个系统进行清零。在RES为
“0”的前提,时序控制模块在时钟clk上升沿的作用下产生两个信号CLK_REG及
CLK_REGBT,其中CLK_REG信号用来作为延时模块、补码乘加模块和累加模块的输入时
钟,CLK_REGBT每隔6个时钟产生一个高电平作为这三个模块的复位信号。延时模块在接
收到CLK_REG高电平信号时清零输出端,接收到低电平时,在CLK_REGBT上升沿的作
用下对输入信号进行延时,以实现一次延时运算,而后将延时信号输出,送给乘法累加模块。
乘法累加模块在接收延时信号的同时也接收输入的系数信号,在CLK_REGBT上升沿的作
用下实现系数和延时信号的乘法累加运算,而此步骤需要6个时钟来完成,正好与时序控制
模块的输出信号CLK_REGBT相一致。乘法累加模块的输出一部分送入延时模块以实现信
号的反馈,另一部分则送入到累加模块,在累加模块中进行结果累加后输出,得到最终结果。
4.6高阶IIR数字低通滤波器的FPGA实现
要实现一个高阶IIR数字低通滤波器,如果采用直接型结构实现,需要的乘法器和延
迟单元相对较多,而且分子和分母的系数相差很大,因此需要较多的二进制位数才能实现
相应的精度要求。而采用二阶节级联实现,一方面各基本节的零极点可以很方便地单独进行
调整,另一方面可以降低对二进制位数的要求,因此选用级联结构。下面以四阶IIR数字
低通滤波器为例来说明高阶滤波器的实现。
5IIR数字低通滤波器的FPGA实现
5.1原理分析
由表1可见,椭圆滤波器给出的设计阶数比前两种低,且频率特性较好,过渡带较窄,所以
耗费的硬件资源少。本系统选用椭圆函数滤波器进行设计。
数字滤波器实际上是一个采用有限精度算法实现的线性非时变离散系统,它的设计步骤为:首
先根据实际需要确定其性能指标,再求得系统函数H(z),最后采用有限精度算法实现。
根据实际需,要设计一低通滤波器,本系统以设计一个4阶低通滤波器为例,通频带衰减
不得低于3dB,阻频带衰减最少低于50dB,上限阻带频率为300Hz,采样频率为1000Hz。
系统函数H(z)的计算采用Matlab软件比较方便,在MATLAB中调用ellip()函数计算,[b,a]
=ellip(4,3,50,300/500),可以求得直接型椭圆IIR滤波器的各个系数,如图5-1
图5-1MATLAB计算结果
有图5-1可知H(z)为:
0
0
()
1
N
k
k
k
N
k
k
k
bz
Hz
bz
1234
1234
0.11160.36740.52010.36740.1116
10.02621.00950.25490.3596
zzzz
zzzz
由上试可知,这是一个四阶IIR系统。利用Matlab频率响应函数freqz(b,a)可得出出该
系统的幅频特性和相频特性如图5-2所示,可见满足设计要求。
图5-2系统的幅频特性和相频特性
这是一个四阶的IIR数字低通滤波器,要想实现最好采用二阶节级联实现,本例为四阶,
需要二个二阶节,所以我把H(z)的直接型结构转换为级联型结构。利用MATLAB把直接型
结构转化为级联型结构。结果如下:
12
()()()HzHzHz
1212
1212
0.11160.20860.11161.01.40391.0
10.53610.413810.50990.869
zzzz
zzzz
由上式可以看出,每个二阶节的分子、分母系数差异减少了。并且可看出要实现这一性能,需要
四阶椭圆滤波器,用二个基本二阶节级联来实现,其具体级联形式如图5-3所示。
图5-3二个二节阶级联的流程图
本例的数字低通滤波器采用二节级联实现,一方面各基本节的零点、极点可以很方便地单
独进行调整,另一方面可以降低对二进制数位数的要求,所需的存储单元较少,在硬件实现
时甚至还可以用一个二阶节进行时分复用,进一步降低对FPGA硬件资源的要求。将
1
()Hz
的二阶节系统函数进行逆Z变换,得到其差分方程为:
101201
()()(1)()(1)(2)ynaxnaxnaxnbynbyn
0.1116()0.2086(1)0.1116()0.5361(1)0.4138(2)xnxnxnynyn
为了使得设计简便及资源的充分利用,我们应该对系数进一步量化,把这些系数转化为整数,
这里,将二阶网络的的系数扩大102倍,然后再将输出网络的系数缩小102倍,这样的话,会
大大减少FPGA硬件资源的利用率,经过扩大后的式子如下:
1
()114()214(1)114()549(1)424(2)ynxnxnxnynyn
可以看出,一个基本的二阶节的实现需要五次乘法运算和四次加法运算(采用二进制补码将
减法运算变为加法运算)。两个二阶节共需要十次乘法运算。虽然现在已有上千万门的FPGA
产品可供选用,但是一般应用时全部采用硬件阵列乘法器毕竟不太合适,而如果采用串行乘法
器进行分时复用,其工作速度也不太理想。本文采用一个折中的方法实现,即乘加单元(MAC)
的乘法器采用阵列乘法器,而不使用串行乘法器,以提高运算速度。
5.2顶层IIR模块
IIR滤波器要正常工作,就必须要有对外接口,其中包括时钟,复位,输入输出数据等,
本设计的顶层模块主要由二个IIR二阶节子模块和输入输出寄存器构成,输入口包括复位输
入、时钟、使能和输入数据信号,输出为经过IIR滤波器后的输出数据信号。顶层模块原
理框图如图5-4所示
图5-4顶层模块原理图
5.3IIR数字滤波器的仿真方法介绍
首先新建工程文件,然后新建VHDL程序保存在新建的工程中,接着将要仿真的IIR
数字滤波器的VHDL程序设为顶层模块,进行全编译,看看有没错误,直到仿真到没有错
误为止;然后新建波形文件,定义输入信号波形,设置仿真周期,时钟周期;最后在settings
中设置为时序或功能仿真,加入波形文件,注意的是在功能仿真时要加入功能网表然后在仿
真,否则或出现错误。
6仿真结果
利用QuartusII编译仿真,经过编译综合完之后,加入冲激激励信号,仿真后的结果如
图6-1所示,从图分析可得知,经过5个单位的时钟周期后出现的仿真结果与之前在
MATLAB软件中仿真得出的冲激响应图相符合。
图6-1仿真结果
在上述设计中只需要加入A/D、D/A转换器及相应的信号输入输出接口电路,就可以完
成一个完整IIR数字低通滤波器的设计。
7结束语
本文介绍了IIR数字低通滤波器的原理、设计以及在FPGA上实现的方法。在实际使
用中,可以根据不同精度要求,方便地对该IIR数字低通滤波器参数等进行修改以满足不同
的指标要求,灵活地组成任意阶不同类型的滤波器。使用乘加块实现数学运算,可进一步节
省硬件资源和缩短运行周期。IIR数字滤波器良好的幅频特性使其广泛应用于实时、高速场
合,设计出稳定可靠的高速IIR滤波器有着显而易见的意义。本文以FPGA为载体、以四阶
IIR数字低通滤波器的设计为例提出一种快捷设计高速IIR数字低通滤波器的方法,并在理
论上对所设计的滤波器稳定性进行了分析。首先利用Matlab得到滤波器的传输函数,然后
采用取整的方法,对传输函数系数量化处理,以充分发挥FPGA的高速性能,最后使用VHDL
硬件描述语言编程实现IIR数字低通滤波器。仿真表明,该设计法快捷、高效,能在一个时
钟周期内完成滤波处理,设计的滤波器能应用于高速场合。根据该方法,经过测试,性能满
足要求。
8参考文献
[1]丁玉美,高西全.《数字信号处理(第二版)》[M].西安:西安电子科技大学出版社,2002.
[2]陈亚勇《MATLAB信号处理详解》[M].北京:人民邮电出版社,2001
[3]曾繁泰,陈美金《VHDL程序设计》[M].北京:清华大学出版社,2004
[4]王诚,薛小刚,钟信潮《FPGA/CPLD设计工具——XilinxISE使用详解》[M].北京:人
民邮电出版社,2005
[5]屈星严舒杨白《基于FPGA的IIR数字滤波器的设计与仿真》。2008
[6]李良钰。《FPGA四阶IIR数字滤波器实现》。2008.
[7]李登峰《基于FPGA和DSP的数字滤波器设计》[D]南京理工大学2004.6
[8]梁二虎刘文怡张文栋《基于FPGA的IIR数字滤波器硬件模块的设计》[J]微计算机
信息2008.02
[9]朱幼莲陶为戈《IIR数字滤波器的FPGA实现》[J]电气电子教学学报2007.02
[10]罗军益成彬彬陈泉根李磊明《用MATLAB设计及FPGA实现IIR滤波器的方法》内
江科技[J]内江科技2006.06
[11]杨晓慧杨勇健《基于FPGA的EDA/SOPC技术与VHDL》[M]国防工业出版社2007.07
[12]王开军姜宇柏《面向CPLD/FPGA的VHDL设计》[M]机械工业出版社2006.10
[13]罗朝霞高书莉《CPLD/FPGA设计及应用》[M]人民邮电出版社2007.07
[14]王华李有军刘建存《MATLAB电子仿真及应用教程》[M]国防工业出版社2007.04
[15]童位理《基于FPGA的IIR滤波器的快捷设计》[J]电子元器件应用2007.05
[16]赵亚梅杜红棉张志杰《基于MATLAB一种IIR数字带通滤波器的设计与仿真》[J]
微计算机信息2007.05
[17]孙福玉《MATLAB程序设计教程[M]》[M]呼和浩特远方出版社.2006.5:117-129
FPGA-basedIIRdigitallowpassfilterdesignand
implementation
XXX
ChifengCollegeofPhysicsandElectronicInformationEngineering,Chifeng024000
Abstract:ThispaperdescribestheFPGA-basedIIRdigitalfilterdesignandimplementation,firstintroducedthe
digitalfilter,troducedthelow-passIIRdigital
filterdesignmethods,usefulforthesameimpulseresponsemethodandbilineartransformationmethodintwo
y,toclarifytheIIRdigitallowpassfilterFPGAimplementation
Keywords:FPGA;MATLAB;QuartusII;IIRdigitallow-passfilter;Design;Toachieve
致谢
在即将毕业的最后一段日子里,我非常感谢我的指导老师张立萍对我毕业设计的帮助,没有
她的帮助,我真不知道我的论文能不能顺利的完成。张老师人真的很好,我知道她工作很忙,
但她还是抽出很多时间辅导我的毕业设计。有时候,我工作很忙,她就主动帮我找相关的材
料;我程序编完之后,她很仔细的看了又看,给我提了很多宝贵的意见。她是一个很善良又
热心的人。同时我要感谢孙福玉老师对我毕业设计上的帮助;一路走来,父母始终无私的付
出着对我的爱,是我强大的精神支柱,不用言语,我会用行动证明我也爱他们。
附录
个模块的VHDL程序
1时序控制模块程序
libraryieee;
_logic_;
_logic_;
_logic_;
entitytime_controlis
port(clk,res:instd_logic;
clk_reg,clk_regbt:outstd_logic);
endtime_control;
architecturebhvoftime_controlis
signalcounter:integer;
signalclk_en:std_logic;
signalen:std_logic;
begin
clk_regbt<=notclkandclk_enanden;
clk_reg<=notclkandnotclk_enanden;
process(clk,res)
begin
if(res='1')then
counter<=0;
clk_en<='0';
en<='0';
elsif(clk'eventandclk='1')then
if(counter<6)then
clk_en<='1';
en<='1';
counter<=counter+1;
elsecounter<=0;
clk_en<='0';
en<='1';
endif;
endif;
endprocess;
endbhv;
2延时模块程序
libraryieee;
_logic_;
_logic_;
_logic_;
entitytime_delayis
port(clk:instd_logic;
res:instd_logic;
xn:instd_logic_vector(11downto0);
yout:instd_logic_vector(11downto0);
x0,x1,x2:outstd_logic_vector(11downto0);
y1,y2:outstd_logic_vector(11downto0));
endtime_delay;
architecturebhvoftime_delayis
signalreg_x0,reg_x1,reg_x2:std_logic_vector(11downto0);
signalreg_y1,reg_y2:std_logic_vector(11downto0);
begin
x0<=reg_x0;
x1<=reg_x1;
x2<=reg_x2;
y1<=reg_y1;
y2<=reg_y2
process(res,clk)
begin
if(res='1')then
reg_x0<="";
reg_x1<="";
reg_x2<="";
reg_y1<="";
reg_y2<="";
elsif(clk'eventandclk='1')then
reg_x2<=reg_x1;
reg_x1<=reg_x0;
reg_x0<=xn;
reg_y2<=reg_y1;
reg_y1<=yout;
endif;
endprocess;
endbhv;
3一阶乘法累加模块程序
libraryieee;
_logic_;
_logic_;
_logic_;
_logic_;
entitymult_add1is
port(clk_regbt,clk_reg,res:instd_logic;
x0,x1,x2,y1,y2:instd_logic_vector(11downto0);
yout:outstd_logic_vector(11downto0));
endmult_add1;
architecturebehavofmult_add1is
signalcnt:integerrange0to5;
signaltmpa,tmpb:std_logic_vector(11downto0);
signalytmp,p:std_logic_vector(23downto0);
constantb0:std_logic_vector(11downto0):="";
constantb1:std_logic_vector(11downto0):="";
constantb2:std_logic_vector(11downto0):="";
constanta1:std_logic_vector(11downto0):="";
constanta2:std_logic_vector(11downto0):="11";
begin
tmpa<=b0whencnt=0else
b1whencnt=1else
b2whencnt=2else
a1whencnt=3else
a2whencnt=4else(others=>'0')
tmpb<=x0whencnt=0else
x1whencnt=1else
x2whencnt=2else
y1whencnt=3else
y2whencnt=4else(others=>'0')
p<=tmpa*tmpb;
process(clk_reg,clk_regbt,res);
begin
ifres='1'then
cnt<=0;
ytmp'0');
yout'0');
elsifclk_reg='1'then
cnt<=0;
ytmp'0');
elsif(clk_regbt'eventandclk_regbt='1')then
ifcnt<5then
ytmp<=ytmp+p;
cnt<=cnt+1;
elsif(cnt=5)then
yout(11downto0)<=ytmp(21downto10);
endif;
endif;
endprocess;
endbehave;
4二阶乘法累加程序
libraryieee;
_logic_;
_logic_;
_logic_;
_logic_;
entitymult_add2is
port(clk_regbt,clk_reg,res:instd_logic;
x0,x1,x2,y1,y2:instd_logic_vector(11downto0);
yout:outstd_logic_vector(11downto0));
endmult_add2;
architecturebehavofmult_add2is
signalcnt:integerrange0to5;
signaltmpa,tmpb:std_logic_vector(11downto0);
signalytmp,p:std_logic_vector(23downto0);
constantd0:std_logic_vector(11downto0):="";
constantd1:std_logic_vector(11downto0):="";
constantd2:std_logic_vector(11downto0):="";
constantc1:std_logic_vector(11downto0):="";
constantc2:std_logic_vector(11downto0):="11";
begin
tmpa<=d0whencnt=0else
d1whencnt=1else
d2whencnt=2else
c1whencnt=3else
c2whencnt=4else
(others=>'0');
tmpb<=x0whencnt=0else
x1whencnt=1else
x2whencnt=2else
y1whencnt=3else
y2whencnt=4else
(others=>'0');
p<=tmpa*tmpb;
process(clk_reg,clk_regbt,res)
begin
ifres='1'then
cnt<=0;
ytmp'0');
yout'0');
elsifclk_reg='1'then
cnt<=0;
ytmp'0');
elsif(clk_regbt'eventandclk_regbt='1')then
ifcnt<5thenytmp<=ytmp+p;
cnt<=cnt+1;
elsif(cnt=5)then
yout(11downto0)<=ytmp(21downto10);
endif;
endif;
endprocess;
endbehav;