目的:进一步学习VHDL的语法重点:1、CASE语句的用法2、标准逻辑矢量数据类型3、例化语句3.3全加器的VHDL描述半加器和全加器是算术运算电路中的基本单元,它们是完成1位二进制数相加的一种组合逻辑电路。半加器只考虑两个加数本身,而没有考虑由低位进来的进位。全加器能进行加数、被加数和低位来的进位信号相加,并根据求和结果给出该位的进位信号。3.3全加器的VHDL描述3.3全加器的VHDL描述3.3.1半加器描述I113aincoutcoutainbinsumcinbinsumcinf_adderor2afedu3u2u1baccosoBcosoBh_adderAh_adderA图3-9全加器f_adder电路图及其实体模块全加器电路图图3-10半加器h_adder电路图及其真值表I113coasob1001010110001100cosobanotxnor2and23.3全加器的VHDL描述3.3.1半加器描述【例3-15】LIBRARYIEEE;--半加器描述(1):布尔方程描述方法USEIEEE.STD_LOGIC_1164.ALL;ENTITYh_adderISPORT(a,b:INSTD_LOGIC;co,so:OUTSTD_LOGIC);ENDENTITYh_adder;ARCHITECTUREfh1OFh_adderisBEGINso=NOT(aXOR(NOTb));co=aANDb;ENDARCHITECTUREfh1;3.3全加器的VHDL描述【例3-16】LIBRARYIEEE;--半加器描述(2):真值表描述方法USEIEEE.STD_LOGIC_1164.ALL;ENTITYh_adderISPORT(a,b:INSTD_LOGIC;co,so:OUTSTD_LOGIC);ENDENTITYh_adder;ARCHITECTUREfh1OFh_adderisSIGNALabc:STD_LOGIC_VECTOR(1DOWNTO0);--定义标准逻辑位矢量数据类型BEGINabc=a&b;--a相并b,即a与b并置操作PROCESS(abc)BEGINCASEabcIS--类似于真值表的CASE语句WHEN00=so='0';co='0';WHEN01=so='1';co='0';WHEN10=so='1';co='0';WHEN11=so='0';co='1';WHENOTHERS=NULL;ENDCASE;ENDPROCESS;ENDARCHITECTUREfh1;3.3全加器的VHDL描述3.3.1半加器描述–真值表描述方法【例3-17】LIBRARYIEEE;--或门逻辑描述USEIEEE.STD_LOGIC_1164.ALL;ENTITYor2aISPORT(a,b:INSTD_LOGIC;c:OUTSTD_LOGIC);ENDENTITYor2a;ARCHITECTUREoneOFor2aISBEGINc=aORb;ENDARCHITECTUREone;3.3全加器的VHDL描述3.3全加器的VHDL描述【例3-18】LIBRARYIEEE;--1位二进制全加器顶层设计描述USEIEEE.STD_LOGIC_1164.ALL;ENTITYf_adderISPORT(ain,bin,cin:INSTD_LOGIC;cout,sum:OUTSTD_LOGIC);ENDENTITYf_adder;ARCHITECTUREfd1OFf_adderISCOMPONENTh_adder--调用半加器声明语句PORT(a,b:INSTD_LOGIC;co,so:OUTSTD_LOGIC);ENDCOMPONENT;COMPONENTor2aPORT(a,b:INSTD_LOGIC;c:OUTSTD_LOGIC);ENDCOMPONENT;SIGNALd,e,f:STD_LOGIC;--定义3个信号作为内部的连接线。BEGINu1:h_adderPORTMAP(a=ain,b=bin,co=d,so=e);--例化语句u2:h_adderPORTMAP(a=e,b=cin,co=f,so=sum);u3:or2aPORTMAP(a=d,b=f,c=cout);ENDARCHITECTUREfd1;双横线“--”是注释符,在VHDL程序的任何一行中,双横线“--”后的文字都不参加编译和综合。注:C语言的注释符是以“/*”开头并以“*/”结尾的串C++中,//为单行注释符,而/*......*/为多行注释符汇编语言:注释符用分号;与其它部分相隔3.3全加器的VHDL描述【例3-16】LIBRARYIEEE;--半加器描述(2):真值表描述方法USEIEEE.STD_LOGIC_1164.ALL;ENTITYh_adderISPORT(a,b:INSTD_LOGIC;co,so:OUTSTD_LOGIC);ENDENTITYh_adder;ARCHITECTUREfh1OFh_adderisSIGNALabc:STD_LOGIC_VECTOR(1DOWNTO0);--定义标准逻辑位矢量数据类型BEGINabc=a&b;--a相并b,即a与b并置操作PROCESS(abc)BEGINCASEabcIS--类似于真值表的CASE语句WHEN00=so='0';co='0';WHEN01=so='1';co='0';WHEN10=so='1';co='0';WHEN11=so='0';co='1';WHENOTHERS=NULL;ENDCASE;ENDPROCESS;ENDARCHITECTUREfh1;3.3全加器的VHDL描述3.3.1半加器描述–真值表描述方法3.3全加器的VHDL描述3.3.2CASE语句1.CASE语句CASE表达式ISWhen选择值或标识符=顺序语句;...;顺序语句;When选择值或标识符=顺序语句;...;顺序语句;...WHENOTHERS=顺序语句;ENDCASE;3.3全加器的VHDL描述3.3.2CASE语句1.CASE语句当执行到CASE语句时,首先计算表达式的值,然后根据WHEN条件句中与之相同的选择或标识符,执行对应的顺序语句,最后由ENDCASE语句结束。3.3全加器的VHDL描述3.3.2CASE语句1.CASE语句注:CASE语句至少包含一个条件句。条件句中的选择值必须在表达式的取值范围内。CASE语句中条件表达式的值必须列举穷尽,但不能重复;如果无法穷举表达式的值,则要用OTHERS来表达。此外,条件表达式还可有如下的表示形式:WHEN值=顺序处理语句;--单个值WHEN值|值|值|…|值=顺序处理语句;--多个值的“或”WHEN值TO值=顺序处理语句;--一个取值范围WHENOTHERS=顺序处理语句;--其它所有的缺省值3.3全加器的VHDL描述3.3.2CASE语句CASE语句的误用Signalvalue:integerrange0to15;Singnalout_1:bit;CasevalueisEndcase;--缺少when条件语句Casevalueiswhen0=out_1=‘1’;when1=out_1=‘0’;--分支条件不包含2到15Endcase;Casevalueiswhen0to10=out_1=‘1’;when5to15=out_1=‘0’;--在5到10上发生重叠Endcase;3.3全加器的VHDL描述3.3.2CASE语句例:实验一与实验二LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdecode38ISPORT(g1,g2a,g2b:INSTD_LOGIC;a,b,c:INSTD_LOGIC;y:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDdecode38;ARCHITECTUREbehaveOFdecode38ISSIGNALindata:STD_LOGIC_VECTOR(2DOWNTO0);BEGINindata=c&b&a;PROCESS(indata,g1,g2a,g2b)BEGINIF(g1=’1’andg2a=’0’ANDg2b=’0’)THENCASEindataISWHEN“000”=y=”11111110”;WHEN“001”=y=”11111101”;WHEN“010”=y=”11111011”;WHEN“011”=y=”11110111”;WHEN“100”=y=”11101111”;WHEN“101”=y=”11011111”;WHEN“110”=y=”10111111”;WHEN“111”=y=”01111111”;WHENothers=y=”XXXXXXXX”;ENDCASE;ELSEy=”11111111”;ENDIF;ENDPROCESS;ENDbehave;例:实验一与实验二3.3全加器的VHDL描述2.标准逻辑矢量数据类型3.3全加器的VHDL描述标准逻辑矢量类型(STD_LOGIC_VECTOR):STD_LOGIC_VECTOR是定义在STD_LOGIC_1164程序包(此包由IEEE定义)中的标准一维数组,数组中的每一个元素的数据类型都是上述定义的标准逻辑位STD_LOGIC。在使用中,向标准逻辑矢量STD_LOGIC_VECTOR数据类型的数据对象赋值的方式与普通的一维数组ARRAY是一样的,即必须严格考虑位矢的宽度。同位宽和数据类型的矢量间才能进行赋值。描述总线信号,使用STD_LOGIC_VECTOR是最方便的,但须注意总线中的每一根信号线都必须定义为相同的数据类型STD_LOGIC。2.标准逻辑矢量数据类型3.3全加器的VHDL描述B:OUTSTD_LOGIC_VECTOR(7DOWNTO0);或SIGNALA:STD_LOGIC_VECTOR(1TO4)B=01100010;--B(7)为'0'B(4DOWNTO1)=1101;--B(4)为'1'B(7DOWNTO4)=A;--B(6)等于A(2)SIGNALC:BIT_VECTOR(3DOWNTO0);3.3全加器的VHDL描述3.并置操作符并置运算符(&)可以利用并置运算符将普通操作数或数组组合起来形成各种新的数组,例如a&b的结果为ab。连接操作常用于字符串。在运算过程中,要注意并置操作的前后数组长度一致。3.3全加器的VHDL描述3.并置操作符SIGNALa:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALd:STD_LOGIC_VECTOR(1DOWNTO0);...a='1''0'd(1)'1';--元素与元素并置,并置后的数组长度为4...IFad=101011THEN...–-在IF条件句中可以使用并置符3.3全加器的VHDL描述【例3-18】LIBRARYIEEE;--1位二进制全加器顶层设计描述USEIEEE.STD_LOGIC_1164.ALL;ENTITYf_adderISPORT(ain,bin,cin:INSTD_LOGIC;cout,sum:OUTSTD_LOGIC);ENDENTITYf_adder;ARCHITECTUREfd1OFf_adderISCOMPONENTh_adder--调用半加器声明语句PORT(a,b:INSTD_LOGIC;co,so:OUTSTD_LOGIC);ENDCOMPONENT;COMPONENTor2aPORT(a,b:INSTD_LOGIC;c:OUTSTD_LOGIC);ENDCOMPONENT;SIGNALd,e,f:STD_LOGIC;--定义3个信号作为内部的连接线。BEGINu1:h_add