VHDL设计应用实例_第1页
VHDL设计应用实例_第2页
VHDL设计应用实例_第3页
VHDL设计应用实例_第4页
VHDL设计应用实例_第5页
已阅读5页,还剩168页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VHDL设计应用实例7.1移位相加8位硬件乘法器电路设计7.1.1设计原理图7.18位乘法器原理图7.1.2硬件乘法器的设计1.选通与门模块源程序例【7-1】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYANDARITHIS --选通与门模块

PORT( ABIN :IN STD_LOGIC; DIN :IN STD_LOGIC_VECTOR(7DOWNTO0); DOUT :OUT STD_LOGIC_VECTOR(7DOWNTO0));ENDANDARITH;ARCHITECTUREbehaveOFANDARITHISBEGINPROCESS(ABIN,DIN)BEGIN FORIIN0TO7LOOP --循环,完成8位与1位运算

DOUT(I)<=DIN(I)ANDABIN;ENDLOOP;ENDPROCESS;ENDbehave;2.8位加法器源程序例【7-2】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYADDER8BIS PORT( CIN :INSTD_LOGIC;A,B:INSTD_LOGIC_VECTOR(7DOWNTO0);S:OUTSTD_LOGIC_VECTOR(7DOWNTO0);COUT:OUTSTD_LOGIC);ENDADDER8B;ARCHITECTUREbehaveOFADDER8BIS SIGNALSINT,AA,BB:STD_LOGIC_VECTOR(8DOWNTO0);BEGIN AA <= '0'&A;BB<= '0'&B;SINT<=AA+BB+CIN;S<=SINT(7DOWNTO0); COUT<=SINT(8);ENDbehave;3.8位右移寄存器源程序例【7-3】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYSREG8BIS --8位右移寄存器

PORT(CLK:INSTD_LOGIC; LOAD:INSTD_LOGIC;DIN:INSTD_LOGIC_VECTOR(7DOWNTO0); QB:OUTSTD_LOGIC);ENDSREG8B;ARCHITECTUREbehaveOFSREG8BISSIGNALREG8: STD_LOGIC_VECTOR(7DOWNTO0);BEGINPROCESS(CLK,LOAD)BEGIN IFCLK'EVENTANDCLK='1'THEN IFLOAD='1'THEN --装载新数据

REG8<=DIN; ELSE --数据右移

REG8(6DOWNTO0)<=REG8(7DOWNTO1);ENDIF;ENDIF;ENDPROCESS;QB<=REG8(0); --输出最低位ENDbehave;4.16位锁存器源程序例【7-4】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYREG16BIS--16位锁存器

PORT( CLK:INSTD_LOGIC; CLR :INSTD_LOGIC; D:INSTD_LOGIC_VECTOR(8DOWNTO0);Q:OUTSTD_LOGIC_VECTOR(15DOWNTO0));ENDREG16B;ARCHITECTUREbehaveOFREG16BIS SIGNALR16S: STD_LOGIC_VECTOR(15DOWNTO0);BEGINPROCESS(CLK,CLR)BEGIN IFCLR='1'THEN --清零信号

R16S<="0000000000000000"; ELSIFCLK'EVENTANDCLK='1'THEN--时钟到来时,锁存输入值,并右移低8位

R16S(6DOWNTO0) <=R16S(7DOWNTO1);--右移低8位

R16S(15DOWNTO7)<=D;--将输入锁到高8位

ENDIF;ENDPROCESS;Q<=R16S;ENDbehave;5.运算控制模块源程序例【7-5】LIBRARYIEEE;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;ARCHITECTUREbehaveOFARICTLIS

SIGNALCNT4B : STD_LOGIC_VECTOR(3DOWNTO0);BEGINPROCESS(CLK,START)BEGIN RSTALL<=START;IFSTART='1'THEN CNT4B<="0000";ELSIFCLK'EVENTANDCLK='1'THENIFCNT4B<8THENCNT4B<=CNT4B+1;ENDIF;ENDIF;ENDPROCESS;PROCESS(CLK,CNT4B,START)BEGIN IFSTART='0'THENIFCNT4B<8THENCLKOUT<=CLK;ARIEND<='0';ELSECLKOUT<='0';ARIEND<='1';ENDIF;ELSECLKOUT<=CLK;ARIEND<='0';ENDIF;ENDPROCESS;ENDbehave;6.8位乘法器的源程序例【7-6】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYMULTI8X8IS--8位乘法器顶层设计

PORT( CLK,START:INSTD_LOGIC; A,B:IN STD_LOGIC_VECTOR(7DOWNTO0);ARIEND:OUTSTD_LOGIC; DOUT:OUTSTD_LOGIC_VECTOR(15DOWNTO0));ENDMULTI8X8;ARCHITECTUREbehaveOFMULTI8X8ISCOMPONENTARICTLPORT(CLK,START:INSTD_LOGIC;CLKOUT,RSTALL,ARIEND:OUTSTD_LOGIC);ENDCOMPONENT;COMPONENTANDARITHPORT(ABIN:INSTD_LOGIC;DIN:INSTD_LOGIC_VECTOR(7DOWNTO0);DOUT:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDCOMPONENT;COMPONENTADDER8BPORT(CIN:INSTD_LOGIC;A,B:INSTD_LOGIC_VECTOR(7DOWNTO0);S:OUTSTD_LOGIC_VECTOR(7DOWNTO0); COUT:OUTSTD_LOGIC);ENDCOMPONENT;COMPONENTSREG8BPORT(CLK,LOAD:INSTD_LOGIC; DIN:IN STD_LOGIC_VECTOR(7DOWNTO0); QB:OUT STD_LOGIC);ENDCOMPONENT;COMPONENTREG16BPORT(CLK,CLR:INSTD_LOGIC; D:INSTD_LOGIC_VECTOR(8DOWNTO0); Q:OUT STD_LOGIC_VECTOR(15DOWNTO0));ENDCOMPONENT; SIGNAL GNDINT,INTCLK,RSTALL,QB:STD_LOGIC;SIGNAL ANDSD :STD_LOGIC_VECTOR(7DOWNTO0);SIGNAL DTBIN :STD_LOGIC_VECTOR(8DOWNTO0);

SIGNAL DTBOUT :TD_LOGIC_VECTOR(15DOWNTO0);BEGINDOUT<=DTBOUT; GNDINT<='0'; U1:ARICTLPORTMAP(CLK=>CLK,START=>START, CLKOUT=>INTCLK,RSTALL=>RSTALL,ARIEND =>ARIEND); U2:SREG8BPORTMAP(CLK=> INTCLK,LOAD =>RSTALL, DIN=> B,QB=> QB); U3:ANDARITHPORT MAP(ABIN=>QB,DIN=> A, DOUT =>ANDSD); U4:ADDER8BPORT MAP(CIN=>GNDINT,A=>DTBOUT(15DOWNTO8),B =>ANDSD,S=> DTBIN(7DOWNTO0), COUT =>DTBIN(8)); U5:REG16BPORTMAP(CLK=> INTCLK,CLR=> RSTALL, D=>DTBIN,Q=> DTBOUT);ENDbehave;7.1.3系统仿真图7.28位乘法器的仿真波形7.2数字频率计设计7.2.1设计原理图7.38位十进制数字频率计的电路逻辑图7.2.2数字频率计设计1.测频控制信号发生器设计测频控制信号发生器的工作时序如图7.3所示。为了产生这个时序图,需首先建立一个由D触发器构成的二分频器,在每次时钟CLK上沿到来时其值翻转。其中控制信号时钟CLK的频率取1Hz,而信号TSTEN的脉宽恰好为1s,可以用作闸门信号。此时,根据测频的时序要求,可得出信号LOAD和CLR_CNT的逻辑描述。由图7.4可见,在计数完成后,即计数使能信号TSTEN在1s的高电平后,利用其反相值的上跳沿产生一个锁存信号LOAD,0.5s后,CLR_CNT产生一个清零信号上跳沿。图7.4频率计测频控制器TESTCTL测控时序图例【7-7】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL; ENTITYTESTCTLIS--测频控制信号发生器

PORT(CLK:INSTD_LOGIC;--1Hz测频控制时钟

TSTEN:OUTSTD_LOGIC;--计数器时钟使能

CLR_CNT:OUTSTD_LOGIC;--计数器清零

LOAD:OUTSTD_LOGIC);--输出锁存信号ENDTESTCTL;ARCHITECTUREbehaveOFTESTCTLISSIGNALDiv2CLK:STD_LOGIC;BEGINPROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THEN--1Hz时钟二分频Div2CLK<=NOTDiv2CLK;ENDIF;ENDPROCESS;PROCESS(CLK,Div2CLK)BEGINIFCLK='0'ANDDiv2CLK='0'THEN--产生计数器清零信号

CLR_CNT<='1';ELSECLR_CNT<='0';ENDIF;ENDPROCESS;LOAD<=NOTDiv2CLK;TSTEN<=Div2CLK;ENDbehave;2.十进制计数器设计例【7-8】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCNT10ISPORT(CLK,RST,EN:INSTD_LOGIC;CQ:OUTSTD_LOGIC_VECTOR(3DOWNTO0);COUT:OUTSTD_LOGIC);ENDCNT10;ARCHITECTUREbehaveOFCNT10ISBEGINPROCESS(CLK,RST,EN)VARIABLECQI:STD_LOGIC_VECTOR(3DOWNTO0);BEGINIFRST='1'THENCQI:=(OTHERS=>'0');--计数器复位

ELSIFCLK'EVENTANDCLK='1'THEN--检测时钟上升沿

IFEN='1'THEN--检测是否允许计数

IFCQI<"1001"THENCQI:=CQI+1;--允许计数

ELSECQI:=(OTHERS=>'0');--大于9,计数值清零

ENDIF;ENDIF;ENDIF;IFCQI="1001"THENCOUT<='1';--计数大于9,输出进位信号

ELSECOUT<='0';ENDIF;CQ<=CQI;--将计数值向端口输出

ENDPROCESS;ENDbehave;3.32位锁存器设计例【7-9】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYREG32BIS--32位锁存器

PORT(LOAD:INSTD_LOGIC;DIN:INSTD_LOGIC_VECTOR(31DOWNTO0);DOUT:OUTSTD_LOGIC_VECTOR(31DOWNTO0));ENDREG32B;ARCHITECTUREbehaveOFREG32BISBEGINPROCESS(LOAD,DIN)BEGINIFLOAD'EVENTANDLOAD='1'THENDOUT<=DIN;--锁存输入数据

ENDIF;ENDPROCESS;ENDbehave;4.数字频率计的源程序例【7-10】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYFREQISPORT(FSIN:INSTD_LOGIC;CLK:INSTD_LOGIC;DOUT:OUTSTD_LOGIC_VECTOR(31DOWNTO0));ENDFREQ;ARCHITECTUREbehaveOFFREQISCOMPONENTCNT10PORT(CLK,RST,EN:INSTD_LOGIC;CQ:OUTSTD_LOGIC_VECTOR(3DOWNTO0);COUT:OUTSTD_LOGIC);ENDCOMPONENT;COMPONENTTESTCTLPORT(CLK:INSTD_LOGIC; TSTEN:OUTSTD_LOGIC; CLR_CNT:OUTSTD_LOGIC; LOAD:OUTSTD_LOGIC);ENDCOMPONENT;COMPONENTREG32BPORT(LOAD:INSTD_LOGIC;DIN:INSTD_LOGIC_VECTOR(31DOWNTO0);DOUT:OUTSTD_LOGIEC_VECTOR(31DOWNTO0));ENDCOMPONENT;SIGNALTSTEN:STD_LOGIC;SIGNALCLR_CNT:STD_LOGIC;SIGNALLOAD:STD_LOGIC;SIGNALC1:STD_LOGIC;SIGNALC2:STD_LOGIC;SIGNALC3:STD_LOGIC;SIGNALC4:STD_LOGIC;SIGNALC5:STD_LOGIC;SIGNALC6:STD_LOGIC;SIGNALC7:STD_LOGIC;SIGNALC8:STD_LOGIC;SIGNALDIN:STD_LOGIC_VECTOR(31DOWNTO0);BEGINU0:TESTCTLPORTMAP(CLK=>CLK,TSTEN=>TSTEN,

CLR_CNT=>CLR_CNT,LOAD=>LOAD);U1:CNT10PORTMAP(CLK=>FSIN,RST=>CLR_CNT,EN=>TSTEN,CQ=>DIN(3DOWNTO0),COUT=>C1);U2:CNT10PORTMAP(CLK=>C1,RST=>CLR_CNT,EN=>TSTEN,CQ=>DIN(7DOWNTO4),COUT=>C2);U3:CNT10PORTMAP(CLK=>C2,RST=>CLR_CNT,EN=>TSTEN,CQ=>DIN(11DOWNTO8),COUT=>C3);U4:CNT10PORTMAP(CLK=>C3,RST=>CLR_CNT,EN=>TSTEN,CQ=>DIN(15DOWNTO12),COUT=>C4);U5:CNT10PORTMAP(CLK=>C4,RST=>CLR_CNT,EN=>TSTEN,CQ=>DIN(19DOWNTO16),COUT=>C5);U6:CNT10PORTMAP(CLK=>C5,RST=>CLR_CNT,EN=>TSTEN,CQ=>DIN(23DOWNTO20),COUT=>C6);U7:CNT10PORTMAP(CLK=>C6,RST=>CLR_CNT,EN=>TSTEN,CQ=>DIN(27DOWNTO24),COUT=>C7);U8:CNT10PORTMAP(CLK=>C7,RST=>CLR_CNT,EN=>TSTEN,CQ=>DIN(31DOWNTO28),COUT=>C8);U9:REG32BPORTMAP(LOAD=>LOAD,DIN=>DIN(31DOWNTO0),DOUT=>DOUT);ENDbehave;7.2.3系统仿真频率计设计的仿真波形如图7.5所示。在一个CLK时钟周期内,FISN有5个时钟周期,因此DOUT输出为00000005。图7.5频率计设计的仿真波形7.3电梯控制系统的设计7.3.1设计要求要求用FPGA设计实现一个3层电梯的控制系统。系统的要求如下:(1)电梯运行规则:当电梯处在上升模式时,只响应比电梯所在位置高的上楼请求,由下向上逐个执行,直到最后一个上楼请求执行完毕。如果高层有下楼请求,直接升到有下楼请求的最高楼层,然后进入下降模式。电梯处在下降模式时,工作方式与上升模式相反。设电梯共有3层,每秒上升或下降一层。(2)电梯初始状态为一层,处在开门状态,开门指示灯亮。(3)每层电梯入口处均设有上下请求开关,电梯内部设有乘客到达楼层的停站请求开关及其显示。(4)设置电梯所处位置的指示及电梯上升或下降的指示。(5)电梯到达有停站请求的楼层后,电梯门打开,开门指示灯亮。开门4秒后,电梯门关闭,开门指示灯灭,电梯继续运行,直至执行完最后一个请求信号后停在当前层。(6)电梯控制系统能记忆电梯内外的请求信号,并按照电梯运行规则工作,每个请求信号执行完毕后清除。7.3.2设计思路根据电梯控制系统的设计要求,除了具备系统时钟信号CLK以外,还应该定义输入信号和输出信号。(1)输入信号定义如下:

系统复位信号:RESET,高电平有效;

电梯入口处一层、二层的上楼请求开关:UP1、UP2;

电梯入口处二层、三层的下楼请求开关:DOWN2、DOWN3;电梯内部到达楼层的停站请求开关:STOP1、STOP2、STOP3。

所有输入信号的规定为:输入信号等于1,表示有请求,信号等于0,表示无请求。(2)输出信号定义如下:电梯外部上升和下降请求指示灯:UPLIGHT和DOWNLIGHT,这些信号与UPl、UP2、DOWN2和DOWN3信号相对应;

电梯内部乘客到达楼层的停站请求灯:STOPLIGHT,该信号与STOP1、STOP2和STOP3信号相对应;

电梯运行模式指示:UDSIG,1代表下降模式,0代表上升模式;

电梯所在楼层指示:POSITION,表示电梯在对应楼层;电梯门状态指示:DOORLIGHT,1表示开门,0表示关门。7.3.3设计实现图7.6状态机设计流程例【7-11】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYFLIFTISPORT(CLK,RESET,UP1,UP2,DOWN2,DOWN3,STOP1,STOP2,STOP3:INSTD_LOGIC;UPLIGHT,DOWNLIGHT,STOPLIGHT:BUFFERSTD_LOGIC_VECTOR(3DOWNTO1);UDSIG:BUFFERSTD_LOGIC;POSITION:BUFFERINTEGERRANGE1TO3;DOORLIGHT:OUTSTD_LOGIC);ENDFLIFT;ARCHITECTUREBEHAVOFFLIFTISTYPESTATE_TYPEIS(STOPONL,DOOROPEN,DOORCLOSE,WAITL,WAIT2,WAIT3,WAIT4,UP,DOWN,STOP);SIGNALSTATE:STATE_TYPE:=STOPONL;SIGNALCLEARUP,CLEARDN,BUTTCLK,FLICLK:STD_LOGIC;SIGNALQ:STD_LOGIC_VECTOR(3DOWNTO0);BEGINPROCESS(CLK)--分频进程,产生电梯控制时钟FLIFTCLK和按键控制时钟BUFFCLK;BEGINIFRESET='1'THENQ<="0000";ELSIFRISING_EDGE(CLK)THENQ<=Q+1;ENDIF;BUTTCLK<=Q(0);FLICLK<=Q(3);ENDPROCESS;CONT:PROCESS(RESET,FLICLK)--状态机进程VARIABLEPOS:INTEGERRANGE3DOWNTO1;BEGINIFRESET='1'THENSTATE<=STOPONL;CLEARUP<='0';CLEARDN<='0';ELSIFRISING_EDGE(FLICLK)THENCASESTATEISWHENSTOPONL=>DOORLIGHT<='1';POSITION<=1;POS:=1;STATE<=WAITL;--电梯在1层WHENWAITL=>STATE<=WAIT2;WHENWAIT2=>CLEARUP<='0';CLEARDN<='0';STATE<=WAIT3;WHENWAIT3=>STATE<=WAIT4;WHENWAIT4=>STATE<=DOORCLOSE;WHENDOORCLOSE=>DOORLIGHT<='0';IFUDSIG='0'THEN--上升情况

IFPOSITION=3THEN--电梯在3层

IFSTOPLIGHT="000"ANDUPLIGHT="000"ANDDOWNLIGHT="000"THENUDSIG<='1';STATE<=DOORCLOSE;ELSEUDSIG<='1';STATE<=DOWN;ENDIF;ELSIFPOSITION=2THEN--电梯在2层IFSTOPLIGHT="000"ANDUPLIGHT="000"ANDDOWNLIGHT="000"THENUDSIG<='0';STATE<=DOORCLOSE;ELSIFSTOPLIGHT(3)='1'ORDOWNLIGHT(3)='1'THENUDSIG<='0';STATE<=UP;ELSEUDSIG<='1';STATE<=DOWN;ENDIF;ELSIFPOSITION=1THEN--电梯在1层

IFSTOPLIGHT="000"ANDUPLIGHT="000"ANDDOWNLIGHT="000"THENUDSIG<='0';STATE<=DOORCLOSE;ELSEUDSIG<='0';STATE<=UP;ENDIF;ENDIF;ELSIFUDSIG='1'THEN--下降情况

IFPOSITION=1THEN--电梯在1层

IFSTOPLIGHT="000"ANDUPLIGHT="000"ANDDOWNLIGHT="000"THENUDSIG<='0';STATE<=DOORCLOSE;ELSEUDSIG<='0';STATE<=UP;ENDIF;ELSIFPOSITION=2THEN--电梯在2层IFSTOPLIGHT="000"ANDUPLIGHT="000"ANDDOWNLIGHT="000"THENUDSIG<='1';STATE<=DOORCLOSE;ELSIFSTOPLIGHT(1)='1'ORUPLIGHT(1)='1'THENUDSIG<='1';STATE<=DOWN;ELSEUDSIG<='0';STATE<=UP;ENDIF;ELSIFPOSITION=3THEN--电梯在3层IFSTOPLIGHT="000"ANDUPLIGHT="000"ANDDOWNLIGHT="000"THENUDSIG<='1';STATE<=DOORCLOSE;ELSEUDSIG<='1';STATE<=DOWN;ENDIF;ENDIF;ENDIF;WHENUP=>POSITION<=POSITION+1;POS:=POS+1;--电梯上一层

IFPOS=2AND(STOPLIGHT(3)='1'ORDOWNLIGHT(3)='1')THENSTATE<=UP;ELSESTATE<=STOP;ENDIF;WHENDOWN=>POSITION<=POSITION-1;POS:=POS-1;--电梯下一层

IFPOS=2AND(STOPLIGHT(1)='1'ORUPLIGHT(1)='1')THENSTATE<=DOWN;ELSESTATE<=STOP;ENDIF;WHENSTOP=>STATE<=DOOROPEN;--电梯停止

WHENDOOROPEN=>DOORLIGHT<='1';CLEARUP<='1';CLEARDN<='1';STATE<=WAITL;--电梯开门

WHENOTHERS=>STATE<=STOPONL;ENDCASE;ENDIF;ENDPROCESSCONT;BUTT:PROCESS(RESET,BUTTCLK)--读按键、控制指示灯进程BEGINIFRESET='1'THENSTOPLIGHT<="000";UPLIGHT=<"000";DOWNLIGHT<="000";ELSEIFRISING_EDGE(BUTTCLK)THENIFCLEARUP='1'THENSTOPLIGHT(POSITION)<='0';UPLIGHT(POSITION)<='0';ELSEIFUP1='1'THENUPLIGHT(1)<='1';ELSIFUP2='1'THENUPLIGHT(2)<='1';ENDIF;ENDIF;IFCLEARDN='1'THENSTOPLIGHT(POSITION)<='0';DOWNLIGHT(POSITION)<='0';ELSEIFDOWN2='1'THENDOWNLIGHT(2)<='1';ELSIFDOWN3='1'THENDOWNLIGHT(3)<='1';ENDIF;ENDIF;IFSTOP1='1'THENSTOPLIGHT(1)<='1';ELSIFSTOP2='1'THENSTOPLIGHT(2)<='1';ELSIFSTOP3='1'THENSTOPLIGHT(3)<='1';ENDIF;ENDIF;ENDIF;ENDPROCESSBUTT;ENDBEHAV;7.3.4系统仿真图7.7电梯控制系统的仿真波形一图7.8电梯控制系统的仿真波形二7.4多功能信号发生器的设计7.4.1设计思路用FPGA设计一个多功能信号发生器,根据输入信号的选择可以输出递增锯齿波、递减锯齿波、三角波、阶梯波和方波等5种信号。信号发生器的控制模块可以用数据选择器实现,用5选1数据选择器实现对5种信号的选择。7.4.2多功能信号发生器的设计实现1.递增锯齿波的设计例【7-12】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYsawtooth_adderIS--递增锯齿波sawtooth

PORT(clk,reset:INstd_logic;--复位信号reset,时钟信号clkq:OUTstd_logic_vector(7DOWNTO0));--输出信号qENDsawtooth_adder;ARCHITECTUREbehaveOFsawtooth_adderISBEGINPROCESS(clk,reset)VARIABLEtmp:std_logic_vector(7DOWNTO0);BEGINIFreset='0'THEN

tmp:="00000000";ELSIFrising_edge(clk)THENIFtmp="11111111"THEN

tmp:="00000000";ELSE

tmp:=tmp+1;--递增信号的变化

ENDIF;ENDIF;q<=tmp;ENDPROCESS;ENDbehave;2.递减锯齿波的设计例【7-13】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;entitysawtooth_minusIS--递减锯齿波sawtooth_minus

PORT(clk,reset:instd_logic;--复位信号reset,时钟信号clkq:outstd_logic_vector(7downto0));--输出信号q,8位数字信号ENDsawtooth_minus;ARCHITECTUREbehaveOFsawtooth_minusISBEGINPROCESS(clk,reset)VARIABLEtmp:std_logic_vector(7DOWNTO0);BEGINIFreset='0'then

tmp:="11111111";ELSIFrising_edge(clk)THENIFtmp="00000000"THEN

tmp:="11111111";ELSE

tmp:=tmp-1;--递减信号的变化

ENDIF;ENDIF;q<=tmp;ENDPROCESS;ENDbehave;3.三角波的设计例【7-14】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYtriangleIS--三角波triangle

PORT(clk,reset:instd_logic;--复位信号reset,时钟信号clkq:outstd_logic_vector(7DOWNTO0));--输出信号q,8位数字信号ENDtriangle;ARCHITECTUREbehaveOFtriangleISBEGINPROCESS(clk,reset)VARIABLEtmp:std_logic_vector(7DOWNTO0);VARIABLEa:std_logic;BEGINIFreset='0'THEN

tmp:="00000000";ELSIFrising_edge(clk)THENIFa='0'thenIFtmp="11111110"TEEN

tmp:="11111111";a:='1';ELSE

tmp:=tmp+1;ENDIF;ELSEIFtmp="00000001"THEN

tmp:="00000000";a:='0';ELSE

tmp:=tmp-1;ENDIF;ENDIF;ENDIF;q<=tmp;ENDPROCESS;ENDbehave;4.阶梯波的设计例【7-15】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYladderIS--阶梯波ladder

PORT(clk,reset:instd_logic;--复位信号reset,时钟信号clkq:outstd_logic_vector(7DOWNTO0));--输出信号q,8位数字信号ENDladder;ARCHITECTUREbehaveOFladderISBEGINPROCESS(clk,reset)VARIABLEtmp:std_logic_vector(7DOWNTO0);BEGINIFreset='0'THEN

tmp:="00000000";ELSIFrising_edge(clk)THENIFtmp="11111111"THEN

tmp:="00000000";ELSE

tmp:=tmp+16;--阶梯信号的产生

ENDIF;ENDIF;q<=tmp;ENDPROCESS;ENDbehave;5.方波的设计例【7-16】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYsquareis--方波square

PORT(clk,reset:instd_logic;--复位信号reset,时钟信号clkq:outstd_logic_vector(7DOWNTO0));--输出信号q,8位数字信号ENDsquare;ARCHITECTUREbehaveOFsquareISSIGNALa:std_logic;BEGINPROCESS(clk,eset)VARIABLEtmp:std_logic_vector(7downto0);BEGINIFreset='0'thena<='0';ELSIFrising_edge(clk)THENIFtmp="11111111"THEN

tmp:="00000000";ELSEtmp:=tmp+1;ENDIF;IFtmp<="10000000"thena<='1';ELSEa<='0';ENDIF;ENDIF;ENDPROCESS;PROCESS(clk,a)BEGINIFrising_edge(clk)THENIFa='1'THENq<="11111111";ELSEq<="00000000";ENDIF;ENDIF;ENDPROCESS;ENDbehave;6.数据选择器的设计例【7-17】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYmux51IS--选择信号sel

PORT(sel:instd_logic_vector(2downto0);--5路输入信号

d1,d2,d3,d4,d5:instd_logic_vector(7downto0);--被选择的信号输出

q:outstd_logic_vector(7downto0));ENDmux51;ARCHITECTUREbehaveOFmux51ISBEGINPROCESS(sel)BEGINCASEselisWHEN"001"=>q<=d1;--选择信号sel=001,选择第1路信号输出

WHEN"010"=>q<=d2;--选择信号sel=010,选择第2路信号输出

WHEN"011"=>q<=d3;--选择信号sel=011,选择第3路信号输出

WHEN"100"=>q<=d4;--选择信号sel=100,选择第4路信号输出

WHEN"101"=>q<=d5;--选择信号sel=101,选择第5路信号输出

WHENothers=>null;ENDCASE;ENDPROCESS;ENDbehave;7.顶层电路的设计图7.9信号发生器顶层电路7.4.3系统仿真图7.10递增斜波仿真波形图7.11递减斜波仿真波形图7.12三角波仿真波形图7.13阶梯波仿真波形图7.14方波仿真波形7.5数字闹钟系统设计7.5.1闹钟系统的设计要求及设计思路要求设计一个24小时的数字闹钟,该数字闹钟的面板如图7.15所示,它包括以下几个组成部分:(1)显示屏,由7个七段数码管组成,其中6个用于显示当前时间(时:分:秒)或设置的闹钟时间,而另一个则用于显示系统内部产生的周期性循环变化的待选预置数字;(2)YES(确认)键:用于输入新的时间或新的闹钟时间时,对每位待选预置数字输入的确认;图7.15数字闹钟面板图(3)TIME(时间)键:用于确定新的时间设置;(4)ALARM(闹钟)键:用于确定新的闹钟时间设置,或显示已设置的闹钟时间;(5)扬声器,在当前时钟时间与闹钟时间相同时,发出蜂鸣声。7.5.2闹钟系统的总体设计思路图7.16计时器的外部端口7.5.3闹钟系统的控制器的设计图7.17闹钟控制器的外部端口表7.1控制器状态转换及控制输出表由于在整个系统中有多个模块需要用到自行设计的数据类型,并且这些数据类型大部分相同,因此我们为了使用上的方便,可设计一个程序包P_ALARM,该程序既可加在调用该程序包的程序前面,也可加在整个系统的顶层设计程序的前面。但是对于一个比较复杂系统的设计,一般是分模块进行设计和调试,所以加在各个调用该程序包的程序前面会比较方便写。程序包P_ALARM的具体设计如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;PACKAGEP_ALARMISSUBTYPET_DIGITALISINTEGERRANGE0TO9;SUBTYPET_SHORTISINTEGERRANGE0TO65535;TYPET_CLOCK_TIMEISARRAY(5DOWNTO0)OFT_DIGITAL;TYPET_DISPLAYISARRAY(5DOWNTO0)OFT_DIGITAL;ENDPACKAGEP_ALARM;例【7-18】--控制器源程序CONTROL.VHDLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEWORK.P_ALARM.ALL;ENTITYCONTROLISPORT(KEY:INSTD_LOGIC;ALARM_BUTTON:INSTD_LOGIC;TIME_BUTTON:INSTD_LOGIC;CLK:INSTD_LOGIC;RESET:INSTD_LOGIC;LOAD_NEW_A:OUTSTD_LOGIC;LOAD_NEW_C:OUTSTD_LOGIC;SHOW_NEW_TIME:OUTSTD_LOGIC;SHOW_A:OUTSTD_LOGIC);ENDENTITYCONTROL;ARCHITECTUREBEHAVEOFCONTROLISTYPET_STATEIS(S0,S1,S2,S3,S4);CONSTANTKEY_TIMEOUT:T_SHORT:=500;CONSTANTSHOW_ALARM_TIMEOUT:T_SHORT:=500;SIGNALCURR_STATE:T_STATE;SIGNALNEXT_STATE:T_STATE;SIGNALCOUNTER_K:T_SHORT;SIGNALENABLE_COUNT_K:STD_LOGIC;SIGNALCOUNT_K_END:STD_LOGIC;SIGNALCOUNTER_A:T_SHORT;SIGNALENABLE_COUNT_A:STD_LOGIC;SIGNALCOUNT_A_END:STD_LOGIC;BEGINPROCESS(CLK,RESET)ISBEGINIFRESET='1'THENCURR_STATE<=S0;ELSIFRISING_EDGE(CLK)THENCURR_STATE<=NEXT_STATE;ENDIF;ENDPROCESS;PROCESS(KEY,ALARM_BUTTON,TIME_BUTTON,CURR_STATE,COUNT_A_END,COUNT_K_END)BEGINNEXT_STATE<=CURR_STATE;LOAD_NEW_A<='0';LOAD_NEW_C<='0';SHOW_A<='0';SHOW_NEW_TIME<='0';ENABLE_COUNT_K<='0';ENABLE_COUNT_A<='0';CASECURR_STATEISWHENS0=>IF(KEY='0')THENNEXT_STATE<=S1;SHOW_NEW_TIME<='1';ELSIF(ALARM_BUTTON='1')THENNEXT_STATE<=S4;SHOW_A<='1';ELSENEXT_STATE<=S0;ENDIF;WHENS1=>IF(KEY='1')THENNEXT_STATE<=S1;ELSIF(ALARM_BUTTON='1')THENNEXT_STATE<=S2;LOAD_NEW_A<='1';ELSIF(TIME_BUTTON='1')THENNEXT_STATE<=S3;LOAD_NEW_C<='1';ELSEIF(COUNT_K_END='1')THENNEXT_STATE<=S0;ELSENEXT_STATE<=S1;ENDIF;ENABLE_COUNT_K<='1';ENDIF;SHOW_NEW_TIME<='1';WHENS2=>IF(ALARM_BUTTON='1')THENNEXT_STATE<=S2;LOAD_NEW_A<='1';ELSENEXT_STATE<=S0;ENDIF;WHENS3=>IF(TIME_BUTTON='1')THENNEXT_STATE<=S3;LOAD_NEW_C<='1';ELSENEXT_STATE<=S0;--ENDIF;WHENS4=>IF(KEY='1')THENNEXT_STATE<=S1;ELSENEXT_STATE<=S4;IF(COUNT_A_END='1')THENNEXT_STATE<=S0;ELSENEXT_STATE<=S4;SHOW_A<='1';ENDIF;ENABLE_COUNT_A<='1';ENDIF;WHENOTHERS=>NULL;ENDCASE;ENDPROCESS;COUNT_KEY:PROCESS(ENABLE_COUNT_K,CLK)ISBEGINIF(ENABLE_COUNT_K='0')THENCOUNTER_K<=0;COUNT_K_END<='0';ELSIF(RISING_EDGE(CLK))THENIF(COUNTER_K>=KEY_TIMEOUT)THENCOUNT_K_END<='1';ELSECOUNTER_K<=COUNTER_K+1;ENDIF;ENDIF;ENDPROCESS;COUNT_ALARM:PROCESS(ENABLE_COUNT_A,CLK)ISBEGINIF(ENABLE_COUNT_A='0')THENCOUNTER_A<=0;COUNT_A_END<='0';ELSIFRISING_EDGE(CLK)THENIF(COUNTER_A>=SHOW_ALARM_TIMEOUT)THENCOUNT_A_END<='1';ELSECOUNTER_A<=COUNTER_A+1;ENDIF;ENDIF;ENDPROCESS;ENDARCHITECTUREBEHAVE;7.5.4闹钟系统的预置寄存器的设计图7.18预置寄存器示意图例【7-19】--预置寄存器的VHDL源程序KEYBUFFER.VHDLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USEWORK.P_ALARM.ALL;ENTITYKEYBUFFERISPORT(KEY:INSTD_LOGIC;CLK:INSTD_LOGIC;RESET:INSTD_LOGIC;KEYNUM:OUTSTD_LOGIC_VECTOR(3DOWNTO0);NEW_TIME:OUTT_CLOCK_TIME);ENDENTITYKEYBUFFER;ARCHITECTUREBEHAVEOFKEYBUFFERISSIGNALN_T:T_CLOCK_TIME;SIGNALCNT:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALTEMP:T_DIGITAL;BEGINPROCESS(CLK)ISBEGINIF(CLK'EVENTANDCLK='1')THENIFCNT=9THENCNT<="0000";ELSE

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论