您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > 第6章 Verilog语句
第6章Verilog行为语句主要内容◆过程语句(initial、always)◆块语句(begin-end、fork-join)◆赋值语句(assign、=、=)◆条件语句(if-else、case、casez、casex)◆循环语句(for、forever、repeat、while)◆编译指示语句(`define、`include、`ifdef、`else、`endif)◆任务(task)与函数(function)◆顺序执行与并发执行VerilogHDL行为语句类别语句可综合性过程语句initialalways√块语句串行块begin-end√并行块fork-join赋值语句持续赋值assign√过程赋值=、=√条件语句if-else√case√循环语句for√repeatwhileforever编译向导语句`define√`include`ifdef,`else,`endif√6.1过程语句initialalways在一个模块(module)中,使用initial和always语句的次数是不受限制的。initial语句常用于仿真中的初始化,initial过程块中的语句仅执行一次;always块内的语句则是不断重复执行的。always过程语句使用模板always@(敏感信号表达式event-expression)begin//过程赋值//if-else,case,casex,casez选择语句//while,repeat,for循环//task,function调用end“always”过程语句通常是带有触发条件的,触发条件写在敏感信号表达式中,只有当触发条件满足时,其后的“begin-end”块语句才能被执行。敏感信号表达式敏感信号表达式又称事件表达式或敏感信号列表,即当该表达式中变量的值改变时,就会引发块内语句的执行。因此敏感信号表达式中应列出影响块内取值的所有信号。若有两个或两个以上信号时,它们之间用“or”连接。例如:@(a)//当信号a的值发生改变@(aorb)//当信号a或信号b的值发生改变@(posedgeclock)//当clock的上升沿到来时@(negedgeclock)//当clock的下降沿到来时@(posedgeclkornegedgereset)//当clk的上升沿到来或reset信号的下降沿到来敏感信号列表举例modulemux4_1(out,in0,in1,in2,in3,sel);outputout;inputin0,in1,in2,in3;input[1:0]sel;regout;always@(in0orin1orin2orin3orsel)//敏感信号列表case(sel)2'b00:out=in0;2'b01:out=in1;2'b10:out=in2;2'b11:out=in3;default:out=2'bx;endcaseendmodule4选1数据选择器posedge和negedge关键字对于时序电路,事件通常是由时钟边沿触发的,为表达边沿这个概念,Verilog提供了posedge和negedge关键字来描述。比如:【例】同步置数、同步清零的计数器modulecount(out,data,load,reset,clk);output[7:0]out;input[7:0]data;inputload,clk,reset;reg[7:0]out;always@(posedgeclk)//clk上升沿触发beginif(!reset)out=8'h00;//同步清0,低电平有效elseif(load)out=data;//同步预置elseout=out+1;//计数endendmodule6.2块语句块语句是由块标志符begin-end或fork-join界定的一组语句,当块语句只包含一条语句时,块标志符可以缺省。begin-end串行块中的语句按串行方式顺序执行。比如:beginregb=rega;regc=regb;end由于begin-end块内的语句顺序执行,在最后,将regb、regc的值都更新为rega的值,该begin-end块执行完后,regb、regc的值是相同的。6.3赋值语句持续赋值语句(ContinuousAssignments)assign为持续赋值语句,主要用于对wire型变量的赋值。比如:assignc=a&b;在上面的赋值中,a、b、c三个变量皆为wire型变量,a和b信号的任何变化,都将随时反映到c上来。过程赋值语句多用于对reg型变量进行赋值。(1)非阻塞(non_blocking)赋值方式赋值符号为“=”,如:b=a;非阻塞赋值在整个过程块结束时才完成赋值操作,即b的值并不是立刻就改变的。(2)阻塞(blocking)赋值方式赋值符号为“=”,如:b=a;阻塞赋值在该语句结束时就立即完成赋值操作,即b的值在该条语句结束后立刻改变。如果在一个块语句中,有多条阻塞赋值语句,那么在前面的赋值语句没有完成之前,后面的语句就不能被执行,仿佛被阻塞了(blocking)一样,因此称为阻塞赋值方式。过程赋值语句阻塞赋值与非阻塞赋值非阻塞赋值modulenon_block(c,b,a,clk);outputc,b;inputclk,a;regc,b;always@(posedgeclk)beginb=a;c=b;endendmodule阻塞赋值moduleblock(c,b,a,clk);outputc,b;inputclk,a;regc,b;always@(posedgeclk)beginb=a;c=b;endendmodule阻塞赋值与非阻塞赋值非阻塞赋值仿真波形图阻塞赋值仿真波形图阻塞赋值与非阻塞赋值非阻塞赋值综合结果阻塞赋值综合结果6.4条件语句(if-else语句)if-else语句使用方法有以下3种:(1)if(表达式)语句1;(2)if(表达式)语句1;else语句2;(3)if(表达式1)语句1;elseif(表达式2)语句2;elseif(表达式3)语句3;……elseif(表达式n)语句n;else语句n+1;case语句的使用格式如下。case(敏感表达式)值1:语句1;//case分支项值2:语句2;……值n:语句n;default:语句n+1;endcasecase语句BCD码—七段数码管显示译码器moduledecode4_7(decodeout,indec);output[6:0]decodeout;input[3:0]indec;reg[6:0]decodeout;always@(indec)begincase(indec)//用case语句进行译码4'd0:decodeout=7'b1111110;4'd1:decodeout=7'b0110000;4'd2:decodeout=7'b1101101;4'd3:decodeout=7'b1111001;4'd4:decodeout=7'b0110011;4'd5:decodeout=7'b1011011;4'd6:decodeout=7'b1011111;4'd7:decodeout=7'b1110000;4'd8:decodeout=7'b1111111;4'd9:decodeout=7'b1111011;default:decodeout=7'bx;endcaseendendmodule6.5循环语句repeatloopinitialbeginfor(i=0;i4;i=i+1)out=out+1;endinitialbeginrepeat(5)out=out+1;endinitialbegini=0;while(i0)i=i+1;endforloopwhileloop在Verilog中存在四种类型的循环语句,用来控制语句的执行次数。这四种语句分别为:(1)forever:连续地执行语句;多用在“initial”块中,以生成时钟等周期性波形。(2)repeat:连续执行一条语句n次。(3)while:执行一条语句直到某个条件不满足。(4)for:有条件的循环语句。for语句for语句的使用格式如下(同C语言):for(表达式1;表达式2;表达式3)语句;即:for(循环变量赋初值;循环结束条件;循环变量增值)执行语句;用for语句描述七人投票表决器modulevoter7(pass,vote);outputpass;input[6:0]vote;reg[2:0]sum;integeri;regpass;always@(vote)beginsum=0;for(i=0;i=6;i=i+1)//for语句if(vote[i])sum=sum+1;if(sum[2])pass=1;//超过4人赞成,则通过elsepass=0;endendmodulerepeat语句repeat语句的使用格式为:repeat(循环次数表达式)语句;或repeat(循环次数表达式)begin……end用repeat实现8位二进制数乘法modulemult_repeat(outcome,a,b);parametersize=8;input[size:1]a,b;output[2*size:1]outcome;reg[2*size:1]temp_a,outcome;reg[size:1]temp_b;always@(aorb)beginoutcome=0;temp_a=a;temp_b=b;repeat(size)//repeat语句,size为循环次数beginif(temp_b[1])//如果temp_b的最低位为1,就执行下面的加法outcome=outcome+temp_a;temp_a=temp_a1;//操作数a左移一位temp_b=temp_b1;//操作数b右移一位endendendmodule6.6编译指示语句Verilog允许在程序中使用特殊的编译向导(CompilerDirectives)语句,在编译时,通常先对这些向导语句进行“预处理”,然后再将预处理的结果和源程序一起进行编译。向导语句以符号“`”开头,以区别于其它语句。Verilog提供了十几条编译向导语句,如:`define、`ifdef、`else、`endif、`restall等。比较常用的有`define,`include和`ifdef、`else、`endif等。宏替换`define`define语句用于将一个简单的名字或标志符(或称为宏名)来代替一个复杂的名字或字符串,其使用格式为:`define宏名(标志符)字符串如:`definesumina+inb+inc+ind在上面的语句中,用简单的宏名sum来代替了一个复杂的表达式ina+inb+inc+ind,采用了这样的定义形式后,在后面的程序中,就可以直接用sum来代表表达式ina+inb+inc+ind了。文件包含`include`include是文件包含语句,它可将一个文件全部包含到另一个文件中。其格式为:`include“文件名”使用`include语句时应注意以下几点:(1)一个`include语句只能指定一个被包含的文件。(2)`include语句可以出现在源程序的任何地方。被包含的文件若与包含文件不在同一个子目录下,必须指明其路径名。(3)文件包含允许多重包含,比如文件1包含文件2,文件2又包含文件3等。6.7任务与函数任务(task)任务定义格式:task任务名;//注意无端口列表端口及数据类型声明语句;其它语句;endtask任务调用的格式为:任务名(端口1,端口2,……);需要注意的是:任务调用时和定义时的端口变量应是一一对应的。使用任务时,需注意任务的定义与调用须在一个module模块内。定义任务时,没有端口名列表,但需要紧接着进行输入输出端口和数据类型的说明。当任务被调用时,任务被激活。任务的调用与模块调用一样通过任务名调
本文标题:第6章 Verilog语句
链接地址:https://www.777doc.com/doc-3404596 .html