您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > 第4章VHDL主要描述语句
1第四章:VHDL的主要描述语句★顺序描述语句★并发描述语句★其他语句§4.1顺序描述语句·特点:①语句的执行(仿真)顺序与它们的书写顺序基本一致;②顺序语句只能出现在进程或子程序中;③VHDL语言的软件行为和综合后的硬件行为之间是有差异的。·种类:赋值语句;等待语句;转向控制语句;循环语句;过程调用语句;断言/空操作语句。1.赋值语句·功能:将一个值或表达式的运算结果传递给某一数据对象。如:变量、信号或由此组成的数组。VHDL设计实体内的数据传递以及端口数据的读写都是通过它的运行实现的。·语句格式(1)变量赋值语句目的变量:=表达式;如:a:=3;b:=c+d;(2)信号赋值语句(信号代入)目的信号量=信号表达式;如:y=aANDb;小结:(变量与信号赋值语句比较)①从语句格式看:“:=”“=”。②从有效的范围看:变量值是一个局部的、暂时性的数据对象;信号具有全局性特性,它不但可作为一个设计实体内部各单元之间数据传送的载体,而且可通过信号与其它实体进行通信。③从有效的时间看:变量赋值是立即发生的(假设进程已启动),即是一种时间延迟为0的赋值行为;信号赋值通常不是立即发生的,而是发生在一个进程结束时,赋值过程总是有某延时的,它反映了硬件系统的重要性,综合后可以找到与信号对应的硬件结构(如:一个I/O口,一个D触发器等)。2.等待语句·功能:控制进程状态的变化(即执行挂起)。·语句格式(1)无限等待语句WAIT;未设置停止挂起条件的表达式,表示永远挂起;2(2)敏感信号等待语句WAITON信号[,信号];如:WAITONa,b;表明等待信号量a或b任一发生变化,进程将结束挂起状态,继续执行WAITON后的语句。(3)条件等待语句WAITUNTIL条件表达式;该语句将把进程挂起,直到条件表达式中所含信号发生变化,且条件表达式为TURE时,进程才能脱离挂起状态,恢复执行WAIT后的语句。如:WAITUNTILclock=’1’ANDCLOCK’EVENT;等待时钟信号上升沿到来。(4)超时等待语句WAITFOR时间表达式;从执行到当前的WAIT语句开始计时,进程处于挂起状态,当时间超过这一“时间表达式”后,进程自动恢复执行下面的语句。如:WAITFOR10ns;3.转向控制语句·功能:通过条件控制开关,决定是否执行一条或几条语句,或重复执行一或几条语句或跳过一条或几条语句。·语句格式(1)IF语句;根据所指定的条件来有选择地执行指定的顺序语句。//---------------------------------IF条件THEN顺序处理语句;{ELSIF条件THEN顺序处理语句;…ELSIF条件THEN顺序处理语句};[ELSIF顺序处理语句];ENDIF;---------------------------------//[例4-1]LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux4ISPROT(input:INSTD_LOGIC_VECTOR(3DOWNTO0);Sel:INSTD_LOGIC_VECTOR(1DOWNTO0;Output:OUTSTD_LOGIC);ENDmux4;ARCHITECTURErtlOFmux4IS3BEGINPROCESS(input,sel)BEGINIF(sel=”00”)THENOutput=input(0);ELSIF(sel=”01”)THENOutput=input(1);ELSIF(sel=”10”)THENOutput=input(2);ELSEOutput=input(3);ENDIF;ENDPROCESS;ENDrtl;上述是一个“四选一”电路。注:①IF语句的条件判断是布尔量,即“TRUE/FALSE”;②IF_THEN_ELSIF语句中顺序语句的执行条件具有向上相与的功能;③IF语句不仅可用于选择器设计,而且用于比较器、译码器等也是相当方便的。(2)CASE语句;根据满足的条件,直接从多项顺序语句中选择其中的一项执行之。//-----------------------------------------------------CASE表达式ISWHEN条件表达式=顺序处理语句;WHEN条件表达式=顺序处理语句;…[WHENOTHERS=顺序处理语句;]ENDCASE;-----------------------------------------------------//当“表达式”取值满足指定的“条件表达式”值时,程序将执行后跟的、由“=”指定的顺序处理语句,最后结束CASE语句。[例4-2]试用VHDL设计一3~8译码器电路LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdecode_3to8ISPROT(a,b,c,G1,G2A,G2B:INSTD_LOGIC;y:OUTSTD_LOGIC_VECTOR(7DOWNTO0);ENDdecode_3to8;ARCHITECTURErtlOFdecode_3to8ISSINGALindata:STD_LOGIC_VECTOR(2DOWNTO0)BEGINIndata=c&b&a;PROCESS(indata,G1,G2A,G2B)BEGIN4IF(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;ENDrtl;注:①“条件表达式”的值必须在“表达式”的取值范围内;②通常最后一个条件句中的“条件表达式”必须用“OTHERS”表示,它代表已给的所有条件句中未能列出的其它可能的取值,这样可避免综合器插入不必要的寄存器;③CASEF语句中每一条件句的“条件表达式”只能出现一次,不能有相同的出现;④CASE语句执行中必须选中,且只能选中所列条件中的一条,表明CASE语句中至少要包含一个条件语句;⑤WHEN后跟的“=”符号不是关系运算符,只描述“条件表达式”值与执行语句的对应关系;⑥CASE语句中,WHEN语句可以颠倒次序而不影响语句功能,但IF却不能(IF隐含有优先级判别)。4.循环/循环控制语句·功能:通过条件控制开关,使程序能进行有规则的循环,循环次数可以是已知的或是迭代算法控制·语句格式(1)循环语句(LOOP语句)①循环次数已知----次数控制//--------------------------------------------------------------------[标号:]FOR循环变量IN离散范围LOOP顺序处理语句;ENDLOOP[标号];---------------------------------------------------------------------//注:a)离散范围是循环变量的可能取值。b)循环变量在每次循环中都将发生变化。[例4-3]试用VHDL设计一8位奇偶校验电路。5LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYparity_checkISPROT(x:INSTD_LOGIC_VECTOR(7DOWNTO0);y:OUTSTD_LOGIC);ENDparity_check;ARCHITECTURErtlOFparity_checkISBEGINPROCESS(x)VARIABLEtmp:STD_LOGIC;BEGINTmp:=’0’;FORIIN0to7LOOPTmp:=tmpXORx(i);ENDLOOP;y=tmp;ENDPROCESS;ENDrtl;说明:a)循环变量I是整数变量,不需要说明;b)变量tmp是进程中的局部变量,要在进程中说明,且作用范围是进程内部;c)信号量y是该设计单元的全局变量,可以将值带出进程。②循环次数未知----条件控制//-------------------------------------------------[标号:]WHILE条件LOOP顺序处理语句;ENDLOOP[标号];---------------------------------------------------//注:a)用条件控制循环,当条件为“真”时,进行循环;当条件为“假”时,结束循环;b)“条件”的变化,要用显式实现,如:I0。[例4-4]试用VHDL设计一8位奇偶校验电路。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYparity_checkISPROT(x:INSTD_LOGIC_VECTOR(7DOWNTO0);y:OUTSTD_LOGIC);ENDparity_check;ARCHITECTURErtlOFparity_checkISBEGINPROCESS(x)VARIABLEtmp:STD_LOGIC;BEGIN6Tmp:=’0’;WHILE(I8)LOOPTmp:=tmpXORx(i);I:=I+1;ENDLOOP;y=tmp;ENDPROCESS;ENDrtl;(2)循环控制语句①NEXT语句·语句格式://------------------------------------------------NEXT[标号][WHILE条件];------------------------------------------------//注:a)无“标号”和WHILE时,立即无条件跳出当前循环,回到本次循环LOOP语句的开始处,开始下一次循环;b)有“标号”时,立即无条件跳到“标号”指定的LOOP语句开始处,进行下一次迭代;c)有“标号”、有“WHILE条件”,条件为TRUE,操作同b)。[例4-5]PROCESS(x)CONSTANTmax_limit:INTEGER:=255;BEGINFORIIN0tomax_limitLOOPIF(done(i)=TRUE)THENNEXT;ELSEdone(i):=TRUE;ENDIF;q(i)=a(i)ANDb(i);ENDLOOP;ENDPROCESS;说明:a)若done(i)=TRUE,无条件跳出循环,回到FOR_LOOP继续执行下一次循环;b)若done(i)=FLASE,则done(i):=TRUE,并将a(i)·b(i)赋给q(i)。②EXIT语句·语句格式://------------------------------------------EXIT[标号][WHILE条件];------------------------------------------//·与NEXT异同点①相同点:格式与NEXT完全相同,操作非常相似,都是LOOP语句的内部循环控制语句;②不同点:跳转的方向不同NEXT语句是跳向LOOP语句的起始点;7EXIT语句是跳向LOOP语句的终止点(即完全跳出指定的循环,并开始执行此循环外的语句)。[例4-6]分析下述VHDL程序SIGNALa,b:STD_LOGIC_VECTOR(1TO0);SIGNALa_less_b:BOOLEAN;…a_less_b=FALSE;----设初值FORiIN1DOWNTO0LOOPIF(a(i)=‘1’ANDb(i)=‘0’)THENa_less_b=FALSE;----abEXIT;ELSEIF(a(i)=‘0’
本文标题:第4章VHDL主要描述语句
链接地址:https://www.777doc.com/doc-2194579 .html