第4章本章内容4.1多路选择器VHDL描述(简单组合电路)4.2寄存器描述及其VHDL语言现象(简单时序电路)4.31为二进制全加器的VHDL设计(实例)4.4VHDL文本输入设计方法(工具使用,通过上机操作掌握)本章重点掌握内容1、实体及端口的定义。2、结构体和信号的定义。3、基本逻辑操作符和信号赋值操作符。4、IF-THEN-ELSE(顺序)、WHEN-ELSE(并行)语句。5、进程语句。6、信号的上升沿表示方法。7、元件例化方法。是什么是VHDL?VeryhighspeedintegratedHardwareDescriptionLanguage(VHDL)是IEEE、工业标准硬件描述语言用语言的方式而非图形等方式描述硬件电路容易修改容易保存特别适合于电路的设计VHDL的功能和标准VHDL描述输入端口输出端口电路的行为和功能VHDL有过两个标准:IEEEStd1076-1987(calledVHDL1987)IEEEStd1076-1993(calledVHDL1993)【例4-1】ENTITYmux21aISPORT(a,b:INBIT;s:INBIT;y:OUTBIT);ENDENTITYmux21a;ARCHITECTUREoneOFmux21aISBEGINy=aWHENs='0'ELSEb;ENDARCHITECTUREone;实体结构体4.1多路选择器VHDL描述图4-1mux21a实体图4-2mux21a结构体4.1.12选1多路选择器的VHDL描述4.1.12选1多路选择器的VHDL描述【例4-2】ENTITYmux21aISPORT(a,b:INBIT;s:INBIT;y:OUTBIT);ENDENTITYmux21a;ARCHITECTUREoneOFmux21aISSIGNALd,e:BIT;BEGINd=aAND(NOTS);e=bANDs;y=dORe;ENDARCHITECTUREone;【例4-3】...ARCHITECTUREoneOFmux21aISBEGINy=(aAND(NOTs))OR(bANDs);ENDARCHITECTUREone;4.1.12选1多路选择器的VHDL描述【例4-4】ENTITYmux21aISPORT(a,b,s:INBIT;y:OUTBIT);ENDENTITYmux21a;ARCHITECTUREoneOFmux21aISBEGINPROCESS(a,b,s)BEGINIFs='0'THENy=a;ELSEy=b;ENDIF;ENDPROCESS;ENDARCHITECTUREone;4.1.12选1多路选择器的VHDL描述图4-3mux21a功能时序波形4.1.2VHDL相关语句说明1.实体表达【例4-5】ENTITYe_nameISPORT(p_name:port_mdata_type;...p_namei:port_midata_type);ENDENTITYe_name;或:【例4-6】ENTITYe_nameISPORT(p_name:port_mdata_type;...p_namei:port_midata_type);ENDe_name;4.1.2VHDL相关语句说明2.实体名3.PORT语句和端口信号名4.端口模式INOUTINOUTBUFFER5.数据类型BIT4.1.2VHDL相关语句说明6.结构体表达【例4-7】ARCHITECTUREarch_nameOFe_nameIS(说明语句)BEGIN(功能描述语句)ENDARCHITECTUREarch_name;或:【例4-8】ARCHITECTUREarch_nameOFe_nameIS(说明语句)BEGIN(功能描述语句)ENDarch_name;7.信号传输(赋值)符号和数据比较符号4.1.2VHDL相关语句说明8.逻辑操作符AND、OR、NOT9.IF_THEN条件语句10.WHEN_ELSE条件信号赋值语句赋值目标=表达式WHEN赋值条件ELSE表达式WHEN赋值条件ELSE...表达式;11.PROCESS进程语句和顺序语句12.文件取名和存盘4.1.3VHDL设计的基本概念和语句小节数据类型信号赋值符条件比较符延时实体结构体端口定义端口模式逻辑操作符IF条件语句并行条件语句进程语句顺序语句并行语句文件取名文件存盘4.2寄存器描述及其VHDL语言现象4.2.1D触发器的VHDL描述【例4-9】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYDFF1ISPORT(CLK:INSTD_LOGIC;D:INSTD_LOGIC;Q:OUTSTD_LOGIC);END;ARCHITECTUREbhvOFDFF1ISSIGNALQ1:STD_LOGIC;--类似于在芯片内部定义一个数据的暂存节点BEGINPROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THENQ1=D;ENDIF;Q=Q1;--将内部的暂存数据向端口输出ENDPROCESS;ENDbhv;D触发器比较用5种不同语句的D触发器VHDL程序Entitytest1isport(clk,d:inbit;q:outbit);endtest1;architecturebodyoftest1issignalq1:bit;beginprocess(clk)beginifclk='1'ANDclk’last_value='0'thenq1=d;endif;q=q1;endprocess;endtest1_body;LIBRARYIEEE;USEIEEE.std_logic_1164.all;Entitytest1isport(clk,d:inbit;q:outbit);endtest1;architecturebodyoftest1isbeginprocess(clk,d)beginifrising_edge(clk)thenq=d;endif;endprocess;endtest1_body;Entitytest1isport(clk:inbit;d:inbit;q:outbit);endtest1;architecturebodyoftest1issignalq1:bit;beginprocess(clk,d)beginif(clk=‘1’)thenq1=d;endif;q=q1;endprocess;endbody;Entitytest1isport(clk:inbit;d:inbit;q:outbit);endtest1;architecturebodyoftest1issignalq1:bit;beginprocess(clk)beginif(clk=‘1’)thenq1=d;endif;q=q1;endprocess;endbody;4.2.2D触发器VHDL描述的语言现象说明1.标准逻辑位数据类型STD_LOGICBIT数据类型定义:TYPEBITIS('0','1');STD_LOGIC数据类型定义:TYPESTD_LOGICIS('U','X','0','1','Z','W','L','H','-');STD_LOGIC所定义的9种数据的含义是:‘U’表示未初始化的;‘X’表示强未知的;‘0’表示强逻辑0;‘1’表示强逻辑1;‘Z’表示高阻态;‘W’表示弱未知的;‘L’表示弱逻辑0;‘H’表示弱逻辑1;‘-’表示忽略。4.2.2D触发器VHDL描述的语言现象说明2.设计库和标准程序包3.SIGNAL信号定义和数据对象【例4-10】ARCHITECTUREbhvOFDFF1ISBEGINPROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THENQ=D;ENDIF;ENDPROCESS;END;使用库和程序包的一般定义表式是:LIBRARY设计库名;USE设计库名.程序包名.ALL;4.2.2D触发器VHDL描述的语言现象说明4.上升沿检测表式和信号属性函数EVENT关键词EVENT是信号属性,VHDL通过以下表式来测定某信号的跳变边沿:信号名'EVENT5.不完整条件语句与时序电路【例4-11】ENTITYCOMP_BADISPORT(a1:INBIT;b1:INBIT;q1:OUTBIT);END;ARCHITECTUREoneOFCOMP_BADISBEGINPROCESS(a1,b1)BEGINIFa1b1THENq1='1';ELSIFa1b1THENq1='0';--未提及当a1=b1时,q1作何操作ENDIF;ENDPROCESS;END;4.2.2D触发器VHDL描述的语言现象说明5.不完整条件语句与时序电路图4-5例4-11的电路图5.不完整条件语句与时序电路【例4-12】ENTITYCOMP_GOODISPORT(a1:INBIT;b1:INBIT;q1:OUTBIT);END;ARCHITECTUREoneOFCOMP_GOODISBEGINPROCESS(a1,b1)BEGINIFa1b1THENq1='1';ELSEq1='0';ENDIF;ENDPROCESS;END图4-6例4-12的电路图4.2.5VHDL设计基本概念和语言现象小节数据类型数据对象信号属性时钟检测VHDL库程序包时序电路异步时序4.31位二进制全加器的VHDL设计图4-10半加器h_adder电路图图4-11全加器f_adder电路图4.3.1半加器描述和CASE语句absoco0000011010101101表5-1半加器h_adder逻辑功能真值表1.CASE语句CASE语句的一般表式是:CASE表达式ISWhen选择值或标识符=顺序语句;...;顺序语句;When选择值或标识符=顺序语句;...;顺序语句;...ENDCASE;2.标准逻辑矢量数据类型STD_LOGIC_VECTOR3.并置操作符以下是一些并置操作示例:SIGNALa:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALd:STD_LOGIC_VECTOR(1DOWNTO0);...a='1''0'd(1)'1';--元素与元素并置,并置后的数组长度为4...IFad=101011THEN...–-在IF条件句中可以使用并置符4.3.1半加器描述和CASE语句在使用STD_LOGIC_VECTOR中,必须注明其数组宽度,即位宽,如:B:OUTSTD_LOGIC_VECTOR(7DOWNTO0);或SIGNALA:STD_LOGIC_VECTOR(1TO4)4.3.1半加器描述和CASE语句【例4-20】LIBRARYIEEE;--或门逻辑描述USEIEEE.STD_LOGIC_1164.ALL;ENTITYor2aISPORT(a,b:INSTD_LOGIC;c:OUTSTD_LOGIC);ENDENTITYor2a;ARCHITECTUREoneOFor2aISBEGINc=aORb;ENDARCHITECTUREfu1;【例4-21】LIBRARYIEEE;--半加器描述(1)USEIEEE.STD_LOGIC_1164.ALL;ENTITYadderISPORT(a,b:INSTD_LOGIC;co,so:OUTSTD_LOGIC);ENDENTITYadder;ARCHITECTUREfh1OFadderisBEGINso=NOT(aXOR(NOTb));co=aANDb;ENDARCHITECTUREfh1;【例4-22】LIBRARYIEEE;--半加器描述(2)USEIEEE.STD_LOGIC_1164.ALL;ENTITYh_adderISPORT(a,b:INSTD_LOGIC;co,so:OUTSTD_LOGIC);ENDENTITYh_ad