要点回顾1组合电路实现(半加器)2元件例化(全加器)3时序电路实现(触发器)4信号与变量5VHDL语法EDA技术实用教程第5章VHDL设计进阶5.1数据对象DATAOBJECTS5.1.1常数(CONSTANT)常数定义的一般表述:CONSTANT常数名:数据类型:=表达式;5.1.2变量(VARIABLE)定义变量的一般表述:VARIABLE变量名:数据类型:=初始值;5.1.3信号(SIGNAL)定义格式:SIGNAL信号名:数据类型:=初始值;5.1数据对象DATAOBJECTS5.1.4进程中的信号与变量赋值语句信号SIGNAL变量VARIABLE基本用法用于作为电路中的信号连线用于作为进程中局部数据存储单元适用范围在整个结构体内的任何地方都能适用只能在所定义的进程中使用行为特性在进程的最后才对信号赋值立即赋值表5-1信号与变量赋值语句功能的比较5.1.4进程中的信号与变量赋值语句【例5-1】使用变量赋值的时序模块设计LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYDFF3ISPORT(CLK,D1:INSTD_LOGIC;Q1:OUTSTD_LOGIC);END;ARCHITECTUREbhvOFDFF3ISBEGINPROCESS(CLK)VARIABLEQQ:STD_LOGIC;BEGINIFCLK'EVENTANDCLK='1'THENQQ:=D1;ENDIF;Q1=QQ;ENDPROCESS;END;5.1.4进程中的信号与变量赋值语句【例5-2】】使用信号赋值的时序模块设计...ARCHITECTUREbhvOFDFF3ISSIGNALQQ:STD_LOGIC;BEGINPROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THENQQ=D1;ENDIF;ENDPROCESS;Q1=QQ;END;【例5-3】使用信号赋值的时序模块设计LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYDFF3ISPORT(CLK,D1:INSTD_LOGIC;Q1:OUTSTD_LOGIC);END;ARCHITECTUREbhvOFDFF3ISSIGNALA,B:STD_LOGIC;BEGINPROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THENA=D1;B=A;Q1=B;ENDIF;ENDPROCESS;END;5.1.4进程中的信号与变量赋值语句【例5-4】使用变量赋值的时序模块设计LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYDFF3ISPORT(CLK,D1:INSTD_LOGIC;Q1:OUTSTD_LOGIC);END;ARCHITECTUREbhvOFDFF3ISBEGINPROCESS(CLK)VARIABLEA,B:STD_LOGIC;BEGINIFCLK'EVENTANDCLK='1'THENA:=D1;B:=A;Q1=B;ENDIF;ENDPROCESS;END;5.1.4进程中的信号与变量赋值语句5.1.4进程中的信号与变量赋值语句DQDQDQDQD1Q1D1Q1CLKCLK图5-2例5-3的RTL电路图5-1D触发器电路【例5-5】SIGNALin1,in2,e1,...:STD_LOGIC;...PROCESS(in1,in2,...)VARIABLEc1,...:STD_LOGIC_VECTOR(3DOWNTO0);BEGINIFin1='1'THEN...–-第1行e1=1010;–-第2行...IFin2='0'THEN...–-第15+n行...c1:=0011;–-第30+m行...ENDIF;ENDPROCESS;【例5-6】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux4ISPORT(i0,i1,i2,i3,a,b:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDmux4;ARCHITECTUREbody_mux4OFmux4ISsignalmuxval:integerrange7downto0;BEGINprocess(i0,i1,i2,i3,a,b)beginmuxval=0;if(a='1')thenmuxval=muxval+1;endif;if(b='1')thenmuxval=muxval+2;endif;casemuxvaliswhen0=q=i0;when1=q=i1;when2=q=i2;when3=q=i3;whenothers=null;endcase;endprocess;ENDbody_mux4;【例5-7】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux4ISPORT(i0,i1,i2,i3,a,b:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDmux4;ARCHITECTUREbody_mux4OFmux4ISBEGINprocess(i0,i1,i2,i3,a,b)variablemuxval:integerrange7downto0;beginmuxval:=0;if(a='1')thenmuxval:=muxval+1;endif;if(b='1')thenmuxval:=muxval+2;endif;casemuxvaliswhen0=q=i0;when1=q=i1;when2=q=i2;when3=q=i3;whenothers=null;endcase;endprocess;ENDbody_mux4;图5-3例5-6的错误的工作时序图5-4例5-7的正确工作时序5.2.1含同步并行预置功能的8位移位寄存器设计LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYSHFTISPORT(CLK,LOAD:INSTD_LOGIC;DIN:INSTD_LOGIC_VECTOR(7DOWNTO0);DOUT:OUTSTD_LOGIC_VECTOR(7DOWNTO0);QB:OUTSTD_LOGIC);ENDSHFT;ARCHITECTUREbehavOFSHFRTISSIGNALREG8:STD_LOGIC_VECTOR(7DOWNTO0);BEGINPROCESS(CLK,LOAD)BEGINIFCLK'EVENTANDCLK='1'THENIFLOAD='1'THENREG8=DIN;--装载新数据ELSEREG8(6DOWNTO0)=REG8(7DOWNTO1);ENDIF;ENDIF;ENDPROCESS;QB=REG8(0);DOUT=REG8;ENDbehav;【例5-8】5.2VHDL设计实例(1)单个LOOP语句,其语法格式如下:[LOOP标号:]LOOP顺序语句ENDLOOP[LOOP标号];(2)FOR_LOOP语句,语法格式如下:[LOOP标号:]FOR循环变量,IN循环次数范围LOOP顺序语句ENDLOOP[LOOP标号];用法示例如下:...L2:LOOPa:=a+1;EXITL2WHENa10;--当a大于10时跳出循环ENDLOOPL2;...5.2.3位矢中‘1’码个数统计电路设计5.2VHDL设计实例5.2.4三态门设计【例5-12】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYtri_sISport(enable:INSTD_LOGIC;datain:INSTD_LOGIC_VECTOR(7DOWNTO0);dataout:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDtri_s;ARCHITECTUREbhvOFtri_sISBEGINPROCESS(enable,datain)BEGINIFenable='1'THENdataout=datain;ELSEdataout=ZZZZZZZZ;ENDIF;ENDPROCESS;ENDbhv;图5-88位3态控制门电路5.2.5双向端口设计【例5-13】libraryieee;useieee.std_logic_1164.all;entitytri_stateisport(control:instd_logic;in1:instd_logic_vector(7downto0);q:inoutstd_logic_vector(7downto0);x:outstd_logic_vector(7downto0));endtri_state;architecturebody_trioftri_stateisbeginprocess(control,q,in1)beginif(control='0')thenx=q;elseq=in1;x=ZZZZZZZZ;endif;endprocess;endbody_tri;5.2.5双向端口设计图5-9例5-13的综合结果5.2.5双向端口设计图5-10例5-13的仿真波形图5.2.5双向端口设计【例5-14】(以上部分同上例)process(control,q,in1)beginif(control='0')thenx=q;q=ZZZZZZZZ;elseq=in1;x=ZZZZZZZZ;endif;endprocess;endbody_tri;图5-12例5-14的仿真波形图5.2.5双向端口设计图5-11例5-14的综合结果5.2.6三态总线电路设计LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYtristate2ISport(input3,input2,input1,input0:INSTD_LOGIC_VECTOR(7DOWNTO0);enable:INSTD_LOGIC_VECTOR(1DOWNTO0);output:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDtristate2;ARCHITECTUREmultiple_driversOFtristate2ISBEGINPROCESS(enable,input3,input2,input1,input0)BEGINIFenable=00THENoutput=input3;ELSEoutput=(OTHERS='Z');ENDIF;IFenable=01THENoutput=input2;ELSEoutput=(OTHERS='Z');ENDIF;IFenable=10THENoutput=input1;ELSEoutput=(OTHERS='Z');ENDIF;IFenable=11THENoutput=input0;ELSEoutput=(OTHERS='Z');ENDIF;ENDPROCESS;ENDmultiple_drivers;【例5-15】5.2.6三态总线电路设计图5-13例5-15错误的综合结果5.2.6三态总线电路设计libraryieee;useieee.std_logic_1164.all;entitytriisport(ctl:instd_logic_vector(1downto0);datain1,datain2,datain3,datain4:instd_logic_vector(7downto0);q:outstd_logic_vector(7downto0));endtri;architecturebody_trioftriisbeginq=datain1whenctl=00else(others='Z');q=datain2whenctl=01else(others='Z');q=datain3whenctl=10else(others='