您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 第四章_Verilog_HDL行为语句
芜湖职业技术学院第4章VerilogHDL行为语句赋值语句(assign、=、=)条件语句(if-else、case)循环语句(for、forever、repeat、while)过程语句(initial、always)块语句(begin-end、fork-join)芜湖职业技术学院本章介绍VerilogHDL的行为语句,要充分理解硬件描述语言和硬件电路的关系,熟练掌握常用的行为语句,基本的行为语句就可以完成绝大多数电路与系统设计,要对常用语句用心专研、深入理解,对完成硬件电路设计将是非常有用的。本章概述芜湖职业技术学院4.1赋值语句VerilogHDL赋值语句包括连续赋值语句和过程赋值语句两种。1.连续赋值语句数据流的描述是采用连续赋值语句(assign)语句来实现的,语法如下:assignnet_type=表达式;连续赋值语句用于组合逻辑的建模。等式左边是wire类型的变量,等式右边可以是常量,或是由运算符如逻辑运算符、算术运算符参与的表达。例如,wire[3:0]Z,Preset,Clear;//线网说明assignZ=Preset&Clear;//连续赋值语句芜湖职业技术学院注意两个方面的问题:(1)连续赋值语句的执行是:只要右边表达式任一个变量有变化,表达式立即被计算,计算的结果立即赋给左边信号。(2)连续赋值语句之间是并行语句,因此与位置顺序无关。2.过程赋值语句过程赋值语句多用于对reg型变量进行赋值。过程赋值有阻塞赋值和非阻塞赋值两种方式。阻塞语句是顺序执行的,在该语句结束时就立即完成赋值,那么在前面的语句没有完成之前,后面的就不能被执行,仿佛被阻塞了一样,常用于组合逻辑电路设计中;而非阻塞语句是同时执行的,在整个过程块结束时才完成赋值操作,即被赋值的变量的值不是立刻就改变的,常用于时序逻辑电路设计中。芜湖职业技术学院阻塞赋值语句,从字面上理解,该条语句阻塞了下面语句的执行,“=”用于阻塞的赋值,凡是在组合逻辑(如在assign语句中)赋值的请用阻塞赋值。非阻塞赋值操作符用小于等于号(即=)表示,只能用于对寄存器类型变量进行赋值,因此只能用在“initial”和“always”等过程块中,不能用在assign语句中。阻塞赋值非阻塞赋值注:在同一个进程块中,最好不要同时用阻塞赋值和非阻塞赋值语句。芜湖职业技术学院4.2条件语句条件语句有if-else语句和case语句两种,它们都是顺序语句,应放在always块内。1.if-else语句格式与C语言中的if-else语句类似,使用方法有三种:(1)If(表达式)语句1;(2)If(表达式)语句1;else语句2;(3)if(条件表达式1)语句1;elseif(条件表达式2)语句2;elseif(条件表达式3)语句3;……else语句n;芜湖职业技术学院例如if(Sum60)beginGrade=C;Total_C=Total_c+1;endelseif(Sum75)beginGrade=B;Total_B=Total_B+1;endelsebeginGrade=A;Total_A=Total_A+1;end“表达式”一般为逻辑表达式或关系表达式,也可能是一位的变量。条件表达式必须总是被括起来的。对表达式的值进行判断,若为0,x或z,按“假”处理;若为1,按“真”处理,执行指定语句。芜湖职业技术学院2.case语句相对于if语句只有两个分支而言,case语句是一种多分支语句,故case语句可用于多条件译码电路,如:描述译码器、数据选择器、状态机及微处理器的指令译码等。case语句的使用格式:case(敏感表达式)值1:语句1;值2:语句2;……值n:语句n;default:语句n+1;endcase当敏感表达式的值为值1时,执行语句1;为n时执行语句n;如果敏感表达式的值与列出的值都不相同的话,则执行default后面的语句。建议:case的默认项必须写,防止产生锁存器。芜湖职业技术学院例如begincase(HEX)4'b0001:LED=7'b1111001;//14'b0010:LED=7'b0100100;//24'b0011:LED=7'b0110000;//34'b0100:LED=7'b0011001;//44'b0101:LED=7'b0010010;//54'b0110:LED=7'b0000010;//64'b0111:LED=7'b1111000;//74'b1000:LED=7'b0000000;//84'b1001:LED=7'b0010000;//94'b1010:LED=7'b0001000;//A4'b1011:LED=7'b0000011;//B4'b1100:LED=7'b1000110;//C4'b1101:LED=7'b0100001;//D4'b1110:LED=7'b0000110;//E4'b1111:LED=7'b0001110;//Fdefault:LED=7'b1000000;//0Endcase芜湖职业技术学院3.条件语句使用要点在使用条件语句时,应注意列出所有条件分支,否则,编译器认为条件不满足时,会引起一个触发器保持原值。这一点可用于设计时序电路,例如在计数器设计中,条件满足则加1,否则保持不变;而在组合电路设计中,应避免这种隐含触发器的存在。当然,一般不可能列出所有分支,因为每一变量至少有4种取值0、1、z、x。为包含所有分支,可在if语句最后加上else;在case语句的最后加上default语句。设计者原意是设计一个二输入与门,但因if语句中无else语句,在逻辑综合时会认为else语句为:“c=c”,即保持不变,形成了一个隐含锁存器。因此需要加一条语句:elsec=0;芜湖职业技术学院4.3循环语句在VerilogHDL中存在4种类型的循环语句,可用来控制语句执行次数。这4种语句分别为:(1)forever:连续地执行语句,多用在“initial”块中,以生成时钟等周期性波形。(2)repeat:连续执行一条语句n次;(3)while:执行一条语句,直到某个条件不满足;(4)for:有条件的循环语句芜湖职业技术学院1.for语句for语句使用格式:for(表达式1;表达式2;表达式3)语句;即:for(循环变量赋初值;循环结束条件;循环变量增值)执行语句;2.repeat语句repeat语句的使用格式为:repeat(循环次数表达式)语句;或repeat(循环次数表达式)begin……end芜湖职业技术学院3.while和forever语句While语句while语句的使用格式如下:while(循环执行条件表达式)语句;或while(循环执行条件表达式)begin……endwhile语句在执行时,首先判断循环执行条件表达式是否为真,若为真,执行后面的语句或语句块,然后再回头判断循环执行条件表达式是否为真,为真的话,再执行一遍后面的语句,如此不断,直到条件表达式不为真。因此,在执行语句中,必须有一条改变循环执行条件表达式的值的语句。芜湖职业技术学院forever语句forever语句的使用格式如下:forever语句;或foreverbegin……endforever循环语句连续不断地执行后面的语句或语句块,常用来产生周期性的波形,作为仿真激励信号for语句一般用在initial过程语句中,若要用它来进行模块描述,可用disable语句进行中断。芜湖职业技术学院举例:3个分别用for、repeat、while语句实现的同一个循环芜湖职业技术学院应用举例:采用for循环语句设计一个“七人表决器”,通过一个for循环语句统计赞成人数,若超过4人赞成则通过。芜湖职业技术学院用vote[6:0]表示7个人的投票情况,“1”代表赞成,即vote[i]为第“1”代表第i个赞成,pass=“1”表示表决通过芜湖职业技术学院4.4过程语句VerilogHDL中的多数过程模块都从属于以下2种过程语句:initialalways在一个模块中,使用always和initial语句的次数是不受限制的。Initial语句常用于仿真中的初始化,initial过程块中的语句仅执行一次;always块内的语句则是不断重复执行的。Always过程语句是可综合的,在综合的电路设计中广泛采用。芜湖职业技术学院1.always过程语句always过程语句使用模板如下:always@(敏感信号表达式event-expression)begin//过程赋值//if-else,case选择语句//while,repeat,for循环//task,function调用end芜湖职业技术学院“always”过程语句通常是带有触发条件的,触发条件写在敏感信号表达式中,只有当触发条件满足时,其后的“begin-end”块语句才能被执行。下面讨论敏感信号表达式“event-expression”的含义以及如何写敏感信号表达式。敏感信号表达式所谓敏感信号表达式,又称事件表达式或敏感信号列表,即当该表达式中变量的值改变时,就会引发块内语句的执行。因此,敏感信号表达式中应列出影响块内取值的所有信号。若有两个或两个以上信号,它们之间用“or”连接。芜湖职业技术学院例如:@(a)//当信号a值发生改变时@(aorb)//当信号a或信号b的值发生改变时@(posedgeclock)//当clock的上升沿到来时@(negedgeclock)//当clock的下降沿到来时@(posedgeclkornegedgereset)//当clk的上升沿到来或//reset信号的下降沿到来时敏感信号可以分为两种类型:一种为边沿敏感型,一种为电平敏感型。每一个always过程最好只由一种类型的敏感信号来触发,而不要将边沿敏感型和电平敏感型列在一起。芜湖职业技术学院例如:always@(posedgeclkorposedgeclr)//两个敏感信号都是边沿敏感型always@(aorb)//两个敏感信号都是电平敏感型always@(posedgeclkorclr)//不建议这样用,最好不要将边沿敏感型和电平//敏感型列在一起芜湖职业技术学院同步和异步操作对于时序电路,事件通常是由时钟边沿触发的。为表达边沿这个概念,VerilogHDL提供了posedge和negedge两个关键字来进行描述。根据过程语句中表述方式不同,可实现信号的同步操作和异步操作。此为同步置数,同步清零的例子芜湖职业技术学院对于上例中的load、reset信号没有写在敏感信号表达式当中,他们是同步置数、同步清零,这些信号要起作用,必须有时钟的上升沿到来。对于异步的清零/置数,应按以下格式书写敏感信号表达式。always@(posedgeclkorposedgeclear)//clear信号上升沿到来时清零,故高电平清零有效always@(posedgeclkornegedgeclear)//clear信号下降沿到来时清零,故低电平清零有效注:块内的逻辑描述要与敏感信号表达式中信号的有效电平一致。例如:芜湖职业技术学院用always过程块实现较复杂的组合逻辑电路always过程语句通常用来对寄存器类型的数据进行赋值,但always过程语句也可以用来设计组合逻辑。在有的情况下,使用assign来实现组合逻辑电路,很多地方会显得冗长且效率低下,而适当地采用always过程语句来设计组合逻辑,能收到更好的效果。下面是一个简单的指令译码电路设计示例。该电路通过对指令的判断,对输入数据执行相应的操作,包括加、减、求与、求或、求反,并且无论是指令作用的数据还是指令本身发生变化,结果都应做出及时的反应。显然,这是一个较为复杂的组合逻辑电路,如果采用assign语句描述,表达起来非常复杂。本例中采用电平敏感的always块,并运用case结构来进行分析判断,使设计思想得到直观体现,代码整齐有序,便于理解。芜湖职业技术学院2.initial过程语句initial语句的使用格式如下:
本文标题:第四章_Verilog_HDL行为语句
链接地址:https://www.777doc.com/doc-3230115 .html