您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > 第五章_VHDL语言的主要描述语句.
VHDL语言的描述语句集锦——vermouthysVHDL语言描述系统硬件行为时,按语句执行顺序可以分为顺序(Sequential)描述语句和并发(Concurrent)描述语句。灵活运用这两类语句就可以正确地描述系统的并发行为和顺序行为。例如,进程语句(ProcessStatement)是一个并发语句。在一个构造体内可以有几个进程语句同时存在,各进程语句是并发执行的。但是,在进程内部所有语句应是顺序描述语句,也就是说,是按书写的顺序自上至下,一个语句一个语句地执行的。例如,IF语句、LOOP语句等都属于此类顺序描述语句。5.1顺序描述语句执行顺序与书写顺序一致,与传统软件设计语言的特点相似。顺序语句只能用在进程与子程序中。语句中所涉及到的系统行为有时序流、控制、条件和迭代等;语句的功能操作有算术、逻辑运算,信号和变量的赋值,子程序调用等。在VHDL语言中顺序描述语句有以下几种:*WAIT语句;*断言语句;*信号代入语句;*变量赋值语句;*IF语句;*CASE语句;*LOOP语句;*NEXT语句;*EXIT语句;*过程调用语句;*NULL语句5.1.1WAIT语句进程在仿真时的两个状态:执行或挂起。进程状态的变化受WAIT语句的控制。当进程执行到WAIT语句时,就将被挂起,并设置好再次执行的条件。WAIT语句可以设置4种不同的条件:无限等待、时间到、条件满足以及敏感信号量变化。这几类条件可以混用,其书写格式为:WAIT:无限等待WAITON:敏感信号量变化WAITUNTIL:条件满足WAITFOR:时间到1、WAITONWAITON语句的完整书写格式为:WAITON信号[,信号];WAITON后面跟着的是一个或多个信号量,例如:WAITONa,b;该语句表明,等待信号量a或b中只要有一个发生变化,进程将结束挂起状态,而继续执行WAITON语句的后继语句,从而再次启动进程的执行。从这一点来看,与进程指定的敏感信号量有新的变化时,也会启动进程的情况相类似。举例1PROCESS(a,b)BEGINy=aANDb;ENDPROCESS;PROCESSBEGINy=aANDb;WAITONa,b;ENDPROCESS;上面两个进程的描述是完全等价的,只是WAITON和PROCESS中所使用的敏感信号量的书写方法有区别。在使用WAITON语句的进程中,敏感信号量应写在进程中的WAITON语句后面;而在不使用WAITON语句的进程中,敏感信号量只应在进程开头的PROCESS后跟的括号中说明。敏感信号量列表和waiton语句只能选其一,两者不能同时使用。注意举例2如果PROCESS语句已有敏感信号量说明,那么在进程中再不能使用WAITON语句。例如,下面的描述是非法的。PROCESS(a,b)BEGINy=aANDb;WAITONa,b;错误语句ENDPROCESS;2、WAITUNTILWAITUNTIL语句的完整书写格式为:WAITUNTIL表达式;当表达式的值为“真”时,进程被启动,否则进程被挂起。该语句在表达式中将建立一个隐式的敏感信号量表,当表中的任何一个信号量发生变化时,就立即对表达式进行一次评估。如果评估结果使表达式返回一个“真”值,则进程脱离等待状态,继续执行下一个语句。例如:WAITUNTIL((X*10)100);在这个例子中,当信号量X的值大于或等于10时,进程执行到该语句将被挂起;当X的值小于10时进程再次被启动,继续执行WAIT语句的后继语句。例:用waituntil语句描述时钟沿,实现D触发器architecturertlofdisbeginprocessbeginwaituntilclk'eventandclk='1';q=d;endprocess;endrtl;举例3、WAITFORWAITFOR语句的完整书写格式为:WAITFOR时间表达式;WAITFOR语句后面跟着的是时间表达式,当进程执行到该语句时将被挂起,直到指定的等待时间到时,进程再开始执行WAITFOR语句后继的语句。例如:WAITFOR20ns;这个语句中时间表达式是一个常数值20ns,当进程执行到该语句时将等待20ns。一旦20ns时间到,进程将执行WAITFOR语句的后继语句。例如:WAITFOR(a*(b+c));此语句中,FOR后面是一个时间表达式,a*(b+c)是时间量。WAITFOR语句在等待过程中,要对表达式进行一次计算,计算结果返回的值就作为该语句的等待时间。例如,a=2,b=50ns,c=70ns。那么WAITFOR(a*(b+c))这个语句将等待240ns,也就是说该语句和WAITFOR240ns是等价的。4、多条件WAIT语句在前面已叙述的3个WAIT语句中,等待的条件都是单一的,要么是信号量,要么是布尔量,要么是时间量。实际上WAIT语句还可以同时使用多个等待条件。例如:WAITONnmi,interruptUNTIL((nmi=TRUE)OR(interrupt=TRUE))FOR5us;上述语句等待的是3个条件:第一,信号量nmi和interrupt任何一个有一次新的变化;第二,信号量nmi或interrupt任何一个取值为“真”;第三,该语句已等待5us。只要上述3个条件中一个或多个条件满足,进程将再次启动,继续执行WAIT语句的后继语句。应该注意的是,在多条件等待时,表达式的值至少应包含一个信号量的值,例如:WAITUNTIL(interrupt=TRUE)OR(old_clk=‘1’);如果该语句的interrupt和old_clk两个都是变量,而不是信号量,那么,即使两个变量的值有新的改变,该语句也不会对表达式进行评估和计算(事实上,在挂起的进程中变量的值是不可能改变的)。这样,该等待语句将变成无限的等待语句,包含该等待语句的进程就不能再启动。在多种等待条件中,只有信号量变化才能引起等待语句表达式的一次新的评价和计算。5、超时等待往往在所设计的程序模块中,等待语句所等待的条件,在实际执行时不一定会碰到。这时,等待语句通常要加一项超时等待项,以防止该等待语句进入无限期的等待状态。但是,如果采用这种方法,应作适当的处理,否则就会产生错误的行为。超时等待举例ARCHITECTUREwait_exampleOFwait_exampleISSINGALsendB,sendA:STD_LOGIC;BEGINsendA='0';A:PROCESSBEGINWAITUNTILsendB='1';sendA='1'AFTER10ns;WAITUNTILsendB='0';sendA='0'AFTER10ns;ENDPTROCESSA;B:PROCESSBEGINWAITUNTILsendA='0';sendB='0'AFTER10ns;WAITUNTILsendA='1';sendB='1'AFTER10ns;ENDPTROCESSB;ENDwait_example;进程A执行到第一条wait语句时处于无限期等待状态,进程B执行到第二条wait语句时处于无限期等待状态。两个进程处于相互等待状态,每个进程的等待条件都需要对方继续执行。这种情况我们称为“死锁”状态。为了能够避免这种无限等待状态,我们可以加入超时等待语句,同时用ASSERT语句进行提示。加入超时等待的语句ARCHITECTUREwait_exampleOFwait_exampleISSINGALsendB,sendA:STD_LOGIC;BEGINsendA='0';A:PROCESSBEGINWAITUNTIL(sendB='1‘)FOR1us;ASSERT(sendB=‘1‘)REPORT”sendBtimedoutat‘1’“SEVERITYERROR;sendA='1'AFTER10ns;WAITUNTIL(sendB='0‘)FOR1us;ASSERT(sendB=‘0‘)REPORT”sendBtimedoutat‘0’“SEVERITYERRORsendA='0'AFTER10ns;ENDPTROCESSA;B:PROCESSBEGINWAITUNTIL(sendA='0‘)FOR1us;ASSERT(sendA=‘0‘)REPORT”sendAtimedoutat‘1’“SEVERITYERROR;sendB='0'AFTER10ns;WAITUNTIL(sendA='1‘)FOR1us;ASSERT(sendA=‘0‘)REPORT”sendAtimedoutat‘0’“SEVERITYERRORsendB='1'AFTER10ns;ENDPTROCESSB;ENDwait_example;如果条件不满足则等待1us之后执行后续的程序,而不会无限期等待。5.1.2断言语句(ASSERT)ASSERT语句主要用于程序仿真、调试中的人机对话,它可以给出一个文字串作为警告和错误信息。ASSERT语句的书写格式为:ASSERT条件[REPORT输出信息][SEVERITY级别];如果条件为真则向下执行另一个语句,如果条件为假,则输出错误信息和错误级别。REPORT后面的错误信息应用双引号括起来。ASSERT语句给程序的调试和仿真带来极大的方便,这样的语句一般只用于行为级仿真中,而不能进行逻辑综合。例:ASSERT(sendB=‘1‘)REPORT“sendBtimedoutat‘1’”SEVERITYERROR;该断言语句的条件信号量是sendB=‘1’。如果执行到该语句时,信号量sendB=‘0’,说明条件不满足,就会输出REPORT后跟的文字串。该文字串说明,出现了超时等待错误。SEVERITY后跟的错误等级告诉操作人员,其出错等级为ERROR。5.1.3信号代入语句书写格式:目的信号量=信号量表达式;意义:将右边信号量表达式的值赋给左边的目的信号量。1)代入符号与小于等于的区别;2)代入符号两边信号量的类型和长度应一致;3)信号一般使用的场合及与变量的区别。注意5.1.4变量赋值语句书写格式:目的变量:=表达式;意义:表达式的值替代目的变量的值,立即有效。1)两边的数据类型必须相同;2)目的变量的类型和范围及初值应事先给出;3)右边的表达式可以是变量,信号或字符;4)变量只在进程或子程序中使用,它无法传递到进程之外。注意1)赋值方式的不同:变量:=表达式;信号=表达式;2)硬件实现的功能不同:信号代表电路单元、功能模块间的互联,代表实际的硬件连线;变量代表电路单元内部的操作,代表暂存的临时数据。3)有效范围的不同:信号:程序包、实体、结构体;全局量。变量:进程、子程序;局部量。4)赋值行为的不同:信号赋值延迟更新数值;变量赋值立即更新数值;补充:变量与信号的差异信号赋值:architecturertlofsigissignala,b:std_logic;--定义信号beginprocess(a,b)begina=b;b=a;endprocess;endrtl;--结果是a和b的值互换补充举例:信号赋值与变量赋值的比较在进程内部信号是延时更新,信号只有在整个过程执行完毕后(endprocess)才更新完成。此例中,a=b先是b的初值赋给a,但a的值并不是立即更新;所以在执行b=a时,a是先前的a,即是要将a的初始值赋给b;当程序执行到endprocess时,a和b才更新完成,最终a和b值互换。--变量赋值:architecturertlofvarisbeginprocessvariablea,b:std_logic;--定义变量begina:=b;b:=a;endprocess;endrtl;--结果是a和b的值都等于b的初值补充举例:信号赋值与变量赋值的比较变量的赋值立即生效,a的值立即更新为b的初始值此时的a已经变为b的初值,于是就是将b的初值代入ba.一个进程:最后一次赋值有效补充:信号的多次赋值architecturertlofexissignala:std_logic;beginpro
本文标题:第五章_VHDL语言的主要描述语句.
链接地址:https://www.777doc.com/doc-2083468 .html