您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > 61VHDL设计实例
第6章VHDL设计应用实例第6章VHDL设计应用实例6.18位加法器的设计6.3序列检测器的设计6.4正负脉宽数控调制信号发生器的设计6.5数字频率计的设计6.6数字秒表的设计第6章VHDL设计应用实例6.18位加法器的设计1.设计思路多位加法器由4位二进制并行加法器级联构成是较好选择。本设计中的8位二进制并行加法器即是由两个4位二进制并行加法器级联而成的,其电路原理图如图6.1所示。第6章VHDL设计应用实例图6.18位加法器电路原理图A8[7..0]B8[3..0]A8[3..0]B8[7..0]B8[7..0]A8[7..0]B8[7..4]A8[7..4]S8[7..4]S8[3..0]S8[7..0]CO8S8[7..0]C8ADDER4BCO4S4[3..0]B4[3..0]A4[3..0]C4ADDER4BCO4S4[3..0]B4[3..0]A4[3..0]C4U2U1SC第6章VHDL设计应用实例2.VHDL源程序1)4位二进制并行加法器的源程序ADDER4B.VHDLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYADDER4BIS--4位二进制并行加法器PORT(C4:INSTD_LOGIC;--低位来的进位第6章VHDL设计应用实例A4:INSTD_LOGIC_VECTOR(3DOWNTO0);--4位加数B4:INSTD_LOGIC_VECTOR(3DOWNTO0);--4位被加数S4:OUTSTD_LOGIC_VECTOR(3DOWNTO0);--4位和CO4:OUTSTD_LOGIC);--进位输出ENDENTITYADDER4B;ARCHITECTUREARTOFADDER4BISSIGNALS5:STD_LOGIC_VECTOR(4DOWNTO0);--中间结果SIGNALA5,B5:STD_LOGIC_VECTOR(4DOWNTO0);--扩展加数以及被加数位第6章VHDL设计应用实例BEGINA5='0'&A4;--将4位加数矢量扩为5位,为进位提供空间B5='0'&B4;--将4位被加数矢量扩为5位,为进位提供空间S5=A5+B5+C4;S4=S5(3DOWNTO0);--四位和给S4CO4=S5(4);--进位给CO4ENDARCHITECTUREART;第6章VHDL设计应用实例2)8位二进制加法器的源程序ADDER8B.VHDLIBRARYIEEE;USEIEEE.STE_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL:ENTITYADDER8BIS--由4位二进制并行加法器级联而成的8位二进制加法器PORT(C8:INSTD_LOGIC;A8:INSTD_LOGIC_VECTOR(7DOWNTO0);B8:INSTD_LOGIC_VECTOR(7DOWNTO0);第6章VHDL设计应用实例S8:OUTSTD_LOGIC_VECTOR(7DOWNTO0);CO8:OUTSTD_LOGIC);ENDENTITYADDER8B;ARCHITECTUREARTOFADDER8BISCOMPONENTADDER4BIS--对要调用的元件ADDER4B的界面端口进行定义PORT(C4:INSTD_LOGIC;A4:INSTD_LOGIC_VECTOR(3DOWNTO0);第6章VHDL设计应用实例B4:INSTD_LOGIC_VECTOR(3DOWNTO0);S4:OUTSTD_LOGIC_VECTOR(3DOWNTO0);CO4:OUTSTD_LOGIC);ENDCOMPONENTADDER4B;SIGNALSC:STD_LOGIC;--4位加法器的进位标志BEGINU1:ADDER4B--例化(安装)一个4位二进制加法器U1PORTMAP(C4=C8,A4=A8(3DOWNTO0),B4=B8(3DOWNTO0),S4=S8(3DOWNTO0),CO4=SC);第6章VHDL设计应用实例U2:ADDER4B--例化(安装)一个4位二进制加法器U2PORTMAP(C4=SC,A4=A8(7DOWNTO4),B4=B8(7DOWNTO4),S4=S8(7DOWNTO4),CO4=CO8);ENDARCHITECTUREART;第6章VHDL设计应用实例6.3序列检测器的设计1.设计思路序列检测器可用于检测一组或多组由二进制码组成的脉冲序列信号。当序列检测器连续收到一组串行二进制码后,如果这组码与检测器中预先设置的码相同,则输出1,否则输出0。如图6.3所示,当一串待检测的串行数据进入检测器后,若此数在每一位的连续检测中都与预置的密码数相同,则输出“A”,否则仍然输出“B”。第6章VHDL设计应用实例图6.38位序列检测器逻辑图CHKAB[3..0]D[7..0]CLRCLKDINCLKDINCLRD[7..0]AB[3..0]第6章VHDL设计应用实例2.VHDL源程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYCHKISPORT(DIN:INSTD_LOGIC;--串行输入数据位CLK,CLR:INSTD_LOGIC;--工作时钟/复位信号D:INSTD_LOGIC_VECTOR(7DOWNTO0);--8位待检测预置数AB:OUTSTD_LOGIC_VECTOR(3DOWNTO0));--检测结果输出第6章VHDL设计应用实例ENDENTITYCHK;ARCHITECTUREARTOFCHKISSIGNALQ:INTEGERRANGE0TO8;--作为标志位BEGINPROCESS(CLK,CLR)ISBEGINIFCLR='1'THENQ=0;ELSIFCLK'EVENTANDCLK='1'THEN--时钟到来时,判断并处理当前输入的位第6章VHDL设计应用实例CASEQISWHEN0=IFDIN=D(7)THENQ=1;ELSEQ=0;ENDIF;WHEN1=IFDIN=D(6)THENQ=2;ELSEQ=0;ENDIF;WHEN2=IFDIN=D(5)THENQ=3;ELSEQ=0;ENDIF;WHEN3=IFDIN=D(4)THENQ=4;ELSEQ=0;ENDIF;WHEN4=IFDIN=D(3)THENQ=5;ELSEQ=0;ENDIF;WHEN5=IFDIN=D(2)THENQ=6;ELSEQ=0;ENDIF;WHEN6=IFDIN=D(1)THENQ=7;ELSEQ=0;ENDIF;WHEN7=IFDIN=D(0)THENQ=8;ELSEQ=0;ENDIF;WHENOTHERS=Q=0;ENDCASE;ENDIF;ENDPROCESS;第6章VHDL设计应用实例PROCESS(Q)IS--检测结果判断输出BEGINIFQ=8THENAB=1010;--序列数检测正确,输出“A”ELSEAB=1011;--序列数检测错误,输出“B”ENDIF;ENDPROCESS;ENDARCHITECTUREART;第6章VHDL设计应用实例6.4正负脉宽数控调制信号发生器的设计1.设计思路图6.4是脉宽数控调制信号发生器逻辑图,此信号发生器是由两个完全相同的可自加载加法计数器LCNT8组成的,它的输出信号的高低电平脉宽可分别由两组8位预置数进行控制。第6章VHDL设计应用实例图6.4脉宽数控调制信号发生器逻辑图I2DQCLRNPRNVCCPSOUTLCNT8CAOD[7..0]LDCLKBACLKLCNT8CAOD[7..0]LDCLKU1U2LD1CAO1LD2CAO2PSINT第6章VHDL设计应用实例2.VHDL源程序1)8位可自加载加法计数器的源程序LCNT8.VHDLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYLCNT8IS--8位可自加载加法计数器PORT(CLK,LD:INSTD_LOGIC;--工作时钟/预置值加载信号D:ININTEGERRANGE0TO255--8位分频预置数CAO:OUTSTD_LOGIC);--计数溢出输出ENDENTITYLCNT8;第6章VHDL设计应用实例ARCHITECTUREARTOFLCNT8ISSIGNALCOUNT:INTEGERRANGE0TO255;--8位计数器设置BEGINPROCESS(CLK)ISBEGINIFCLK'EVENTANDCLK='1'THENIFLD='1'THENCOUNT=D;--LD为高电平时加载预置数第6章VHDL设计应用实例ELSECOUNT=COUNT+1;--否则继续计数ENDIF;ENDIF;ENDPROCESS;第6章VHDL设计应用实例PROCESS(CLK,COUNT)ISBEGINIFCLK'EVENTANDCLK='1'THENIFCOUNT=255THENCAO='1';ELSECAO='0';ENDIF;ENDIF;ENDPROCESS;ENDARCHITECTUREART;第6章VHDL设计应用实例2)正负脉宽数控调制信号发生器的源程序LIBRARYIEEE--正负脉宽数控调制信号发生器顶层文件USEIEEE.STD_LOGIC_1164.ALL;ENTITYPULSEISPORT(CLK:INSTD_LOGIC;--计数时钟A,B:INSTD_LOGIC_VECTOR(7DOWNTO0);--8位计数预置数PSOUT:OUTSTD_LOGIC);--计数溢出并分频输出ENDENTITYPULSE;第6章VHDL设计应用实例ARCHITECTUREARTOFPULSEISCOMPONENTLCNT8ISPORT(CLK,LD:INSTD_LOGIC;D:INSTD_LOGIC_VECTOR(7DOWNTO0);CAO:OUTSTD_LOGIC);ENDCOMPONENTLCNT8;SIGNALCAO1,CAO2:STD_LOGIC;SIGNALLD1,LD2:STD_LOGIC;--计数加载信号中间量第6章VHDL设计应用实例SIGNALPSINT:STD_LOGIC;BEGINU1:LCNT8PORTMAP(CLK=CLK,LD=LD1,D=A,CAO=CAO1);U2:LCNT8PORTMAP(CLK=CLK,LD=LD2,D=B,CAO=CAO2);PROCESS(CAO1,CAO2)ISBEGINIFCAO1=‘1’THENPSINT=‘0’;--计数溢出信号清0第6章VHDL设计应用实例ELSIFCAO2'EVENTANDCAO2='1'THENPSINT='1';ENDIF;ENDPROCESS;LD1=NOTPSINT;LD2=PSINT;PSOUT=PSINT;ENDARCHITECTUREART;第6章VHDL设计应用实例6.5数字频率计的设计1.设计思路图6.5是8位十进制数字频率计的电路逻辑图,它由一个测频控制信号发生器TESTCTL、八个有时钟使能的十进制计数器CNT10、一个32位锁存器REG32B组成。第6章VHDL设计应用实例图6.58位十进制数字频率计逻辑图SD[31..0]REG32BTESTCTLGNDFSINCLKDOUT[31..0]SD[31..28]SD[27..24]SD[23..20]SD[19..16]SD[15..12]SD[11..8]SD[7..4]SD[3..0]DOUT[31..0]DIN[31..0]LOADCLKCQ[3..0]CARRY_OUTENACLRCNT10CNT10CLKCQ[3..0]CARRY_OUTENACLRCNT10CNT10CLKCQ[3..0]CARRY_OUTENACLRCNT10CNT10CLKCQ[3..0]C
本文标题:61VHDL设计实例
链接地址:https://www.777doc.com/doc-3603745 .html