VHDL设计应用实例VHDL设计应用实例18位加法器的设计28位乘法器的设计3序列检测器的设计4正负脉宽数控调制信号发生器的设计5数字频率计的设计6秒表的设计7MCS–51单片机与FPGA/CPLD总线接口逻辑设计8交通灯信号控制器的设计9语音信箱控制系统的设计10PID控制器的设计11空调系统有限状态自动机的设计12闹钟系统的设计VHDL设计应用实例18位加法器的设计1.设计思路加法器是数字系统中的基本逻辑器件,减法器和硬件乘法器都可由加法器来构成。多位加法器的构成有两种方式:并行进位和串行进位方式。并行进位加法器设有进位产生逻辑,运算速度较快;串行进位方式是将全加器级联构成多位加法器。并行进位加法器通常比串行级联加法器占用更多的资源。随着位数的增加,相同位数的并行加法器与串行加法器的资源占用差距也越来越大。因此,在工程中使用加法器时,要在速度和容量之间寻找平衡点。VHDL设计应用实例实践证明,4位二进制并行加法器和串行级联加法器占用几乎相同的资源。这样,多位加法器由4位二进制并行加法器级联构成是较好的折中选择。本设计中的8位二进制并行加法器即是由两个4位二进制并行加法器级联而成的,其电路原理图如图6.1所示。VHDL设计应用实例图6.18位加法器电路原理图VHDL设计应用实例2.VHDL源程序1)4位二进制并行加法器的源程序ADDER4B.VHDLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYADDER4BIS--4位二进制并行加法器PORT(CIN:INSTD_LOGIC;--低位进位A:INSTD_LOGIC_VECTOR(3DOWNTO0);--4位加数B:INSTD_LOGIC_VECTOR(3DOWNTO0);--4位被加数S:OUTSTD_LOGIC_VECTOR(3DOWNTO0);--4位和CONT:OUTSTD_LOGIC);--进位输出VHDL设计应用实例ENDADDER4B;ARCHITECTUREARTOFADDER4BISSIGNALSINT:STD_LOGIC_VECTOR(4DOWNTO0);SIGNALAA,BB:STD_LOGIC_VECTOR(4DOWNTO0);BEGINAA='0'&A;--将4位加数矢量扩为5位,为进位提供空间BB='0'&B;--将4位被加数矢量扩为5位,为进位提供空间SINT=AA+BB+CIN;S=SINT(3DOWNTO0);CONT=SINT(4);ENDART;VHDL设计应用实例2)8位二进制加法器的源程序ADDER8B.VHDLIBRARYIEEE;USEIEEE_STD.LOGIC_1164.ALL;USEIEEE_STD.LOGIC_UNSIGNED.ALL:ENTITYADDER8BIS--由4位二进制并行加法器级联而成的8位二进制加法器PORT(CIN:INSTD_LOGIC;A:INSTD_LOGIC_VECTOR(7DOWNTO0);B:INSTD_LOGIC_VECTOR(7DOWNTO0);S:OUTSTD_LOGIC_VECTOR(7DOWNTO0);COUT:OUTSTD_LOGIC);ENDADDER8B;ARCHICTUREARTOFADDER8BISVHDL设计应用实例COMPONENETADDER4B--对要调用的元件ADDER4B的界面端口进行定义PORT(CIN:INSTD_LOGIC;A:INSTD_LOGIC_VECTOR(3DOWNTO0);B:INSTD_LOGIC_VECTOR(3DOWNTO0);S:OUTSTD_LOGIC_VECTOR(3DOWNTO0);CONT:OUTSTD_LOGIC);ENDCOMPONENT;SIGNALCARRY_OUT:STD_LOGIC;--4位加法器的进位标志BEGINU1:ADDER4B--例化(安装)一个4位二进制加法器U1VHDL设计应用实例PORTMAP(CIN=CIN,A=A(3DOWNTO0),B=B(3DOWNTO0),S=S(3DOWNTO0),COUT=CARRY_OUT);U2:ADDER4B--例化(安装)一个4位二进制加法器U2PORTMAP(CIN=CARRY_OUT,A=A(7DOWNTO4),B=B(7DOWNTO4),S=S(7DOWNTO4);CONT=CONT);ENDART;VHDL设计应用实例3.硬件逻辑验证选择实验电路结构图NO.1,由5.2的实验电路结构图NO.1和图6.1确定引脚的锁定。如可取实验电路结构图的PIO3~PIO0接A[3..0],PIO7~PIO4接A[7..4],PIO11~PIO8接B[3..0],PIO15~PIO12接B[7..4],PIO49接CIN。此加法器的被加数A和加数B分别由键2与键1、键4与键3输入,加法器的最低位进位CIN由键8输入,计算结果将分别通过PIO23~PIO20,PIO19~PIO16输出并显示于数码管6(高4位)和数码管5(低4位),溢出进位由PIO39输出,当有进位时,结果显示于发光管D8。VHDL设计应用实例28位乘法器的设计1.设计思路纯组合逻辑构成的乘法器虽然工作速度比较快,但占用硬件资源多,难以实现宽位乘法器,而基于PLD器件外接ROM九九表的乘法器则无法构成单片系统,也不实用。这里介绍由8位加法器构成的以时序逻辑方式设计的8位乘法器,此乘法器具有一定的实用价值。其乘法原理是:乘法通过逐项位移相加原理来实现,从被乘数的最低位开始,若为1,则乘数左移后与上一次和相加;若为0,左移后以全零相加,直至被乘数的最高位。从图6.2的逻辑图上可以清楚地看出此乘法器的工作原理。VHDL设计应用实例图6.28×8位乘法器电路原理图S7[7..0]S6[7..0]S6(8)ARIENDREG16BADDER8BARICTLSREG8BANDARITHOUT[15..0]B[7..0]A[7..0]STARTCLKQ[15..0]D[8..0]CLRCLKGNDS5[7..0]S6[8..0]RSTALLCLKOUTS5[7..0]S7[15..8]B[7..0]A[7..0]COUTS[7..0]CINDOUT[7..0]DIN[7..0]ABINQBDIN[7..0]LOADCLKARIENDCLKSTARTU1U2U3U4U5S2S3S4S7[15..0]S7[15..8]S1VHDL设计应用实例图6.2中,ARICTL是乘法运算控制电路,它的START(可锁定于引脚I/O49)信号的上跳沿与高电平有两个功能,即16位寄存器清零和被乘数A[7..0]向移位寄存器SREG8B加载;它的低电平则作为乘法使能信号。乘法时钟信号从ARICTL的CLK输入。当被乘数加载于8位右移寄存器SREG8B后,随着每一时钟节拍,最低位在前,由低位至高位逐位移出。当为1时,与门ANDARITH打开,8位乘数B[7..0]在同一节拍进入8位加法器,与上一次锁存在16位锁存器REG16B中的高8位进行相加,其和在下一时钟节拍的上升沿被锁进此锁存器。而当被乘数移出位为0时,与门全零输出。如此往复,直至8个时钟脉冲后,由ARICTL的控制,乘法运算过程自动中止。ARIEND输出高电平,以此可点亮一发光管,以示乘法结束。此时REG16B的输出值即为最后乘积。VHDL设计应用实例此乘法器的优点是节省芯片资源,它的核心元件只是一个8位加法器,其运算速度取决于输入的时钟频率。若时钟频率为100MHz,则每一运算周期仅需80ns。而若利用备用最高时钟,即12MHz晶振的MCS-51单片机的乘法指令,进行8位乘法运算,仅单指令的运算周期就长达4μs。因此,可以利用此乘法器或相同原理构成的更高位乘法器完成一些数字信号处理方面的运算。VHDL设计应用实例2.VHDL源程序1)选通与门模块的源程序ANDARITH.VHDLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYANDARITHIS--选通与门模块PORT(ABIN:INSTD_LOGIC;--与门开关DIN:INSTD_LOGIC_VECTOR(7DOWNTO0)--8位输入DOUT:OUTSTD_LOGIC_VECTOR(7DOWNTO0));--8位输出ENDANDARITH;ARCHITECTUREARTOFANDARITHISVHDL设计应用实例BEGINPROCESS(ABIN,DIN)BEGINFORIIN0TO7LOOP--循环,分别完成8位数据与一位DOUT(I)=DIN(I)ANDABIN;--控制位的与操作ENDLOOP;ENDPROCESS;ENDART;VHDL设计应用实例2)16位锁存器的源程序REG16B.VHDLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYREG16BIS--16位锁存器PORT(CLK:INSTD_LOGIC;--锁存信号CLR:INSTD_LOGIC;--清零信号D:INSTD_LOGIC_VECTOR(8DOWNTO0)--8位数据输入Q:OUTSTD_LOGIC_VECTOR(15DOWNTO0));--16位数据输出ENDREG16B;ARCHITECTUREARTOFREG16BISSIGNALR16S:STD_LOGIC_VECTOR(15DOWNTO0);--16位寄存器设置VHDL设计应用实例BEGINPROCESS(CLK,CLR)BEGINIFCLR='1'THENR16S=0000000000000000;--异步复位信号ELSIFCLK'EVENTANDCLK='1'THEN--时钟到来时,锁存输入值R16S(6DOWNTO0)=R16S(7DOWNTO1);--右移低8位R16S(15DOWNTO7)=D;--将输入锁到高能位ENDIF;ENDPROCESS;Q=R16S;ENDART;VHDL设计应用实例3)8位右移寄存器的源程序SREG8B.VHDLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;--8位右移寄存器ENTITYSREG8BISPORT(CLK:INSTD_LOGIC;LOAD:INSTD_LOGIC;BIN:INSTD_LOGIC_VECTOR(7DOWNTO0);QB:OUTSTD_LOGIC);ENDSREG8B;ARCHITECTUREARTOFSREG8BISSIGNALREG8B:STD_LOGIC_VECTOR(7DOWNTO0);BEGINPROCESS(CLK,LOAD)VHDL设计应用实例BEGINIFCLK'EVENTANDCLK='1'THENIFLOAD='1'THENREG8=DIN;--装载新数据ELSEREG8(6DOWNTO0)=REG8(7DOWNTO1);--数据右移ENDIF;ENDIF;ENDPROCESS;QB=REG8(0);--输出最低位ENDART;VHDL设计应用实例4)乘法运算控制器的源程序ARICTL.VHDLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYARICTLIS--乘法运算控制器PORT(CLK:INSTD_LOGIC;START:INSTD_LOGIC;CLKOUT:OUTSTD_LOGIC;RSTALL:OUTSTD_LOGIC;ARIEND:OUTSTD_LOGIC);ENDARICTL;ARCHITECTUREARTOFARICTLISSIGNALCNT4B:STD_LOGIC_VECTOR(3DOWNTO0);BEGINVHDL设计应用实例RSTALL=START;PROCESS(CLK,START)BEGINIFSTART