Verilog4行为描述高级语句_第1页
Verilog4行为描述高级语句_第2页
Verilog4行为描述高级语句_第3页
Verilog4行为描述高级语句_第4页
Verilog4行为描述高级语句_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、类别类别语句语句可综合性可综合性过程语句过程语句initialalways块语句块语句串行块串行块begin-end并行块并行块fork-join赋值语句赋值语句持续赋值持续赋值assign过程赋过程赋值值=、=条件语句条件语句if-elsecase循环语句循环语句forrepeatwhileforever编译向导语句编译向导语句defineincludeifdef,else,endif initial alwayso 在一个模块(在一个模块(module)中,使用中,使用initial和和always语句的次数是不受限制的。语句的次数是不受限制的。initial语句常用于仿语句常用于仿真中的

2、初始化真中的初始化,initial过程块中的语句仅执行一过程块中的语句仅执行一次次; always块内的语句则是不断重复执行的,块内的语句则是不断重复执行的,always结构在仿真过程中是时刻活动的结构在仿真过程中是时刻活动的 。 always()begin/过程赋值过程赋值/if-else,case,casex,casez选择语句选择语句/while,repeat,for循环循环/task,function调用调用end “always”过程语句通常是带有过程语句通常是带有触发条件触发条件的,触发条件写的,触发条件写在敏感信号表达式中,只有当在敏感信号表达式中,只有当触发条件满足时触发条件满

3、足时,其后的,其后的“begin-end”块语句块语句才能被执行才能被执行。 敏感信号表达式又称事件表达式或敏感信号列表,即当该敏感信号表达式又称事件表达式或敏感信号列表,即当该表达式中变量的值改变时,就会引发块内语句的执行。因表达式中变量的值改变时,就会引发块内语句的执行。因此此敏感信号表达式中应列出影响块内取值的所有信号敏感信号表达式中应列出影响块内取值的所有信号。若。若有两个或两个以上信号时,它们之间用有两个或两个以上信号时,它们之间用“or”连接。连接。 alwaysalways ( (a)a) /当信号当信号a a的值发生改变的值发生改变 alwaysalways ( (a or b

4、)a or b) /当信号当信号a a或信号或信号b b的值发生改变的值发生改变 alwaysalways ( (posedgeposedge clock) / clock) /当当clock clock 的上升沿到来时的上升沿到来时 alwaysalways ( (negedgenegedge clock) / clock) /当当clock clock 的下降沿到来时的下降沿到来时 alwaysalways ( (posedgeposedge clkclk or or negedgenegedge reset) reset) /当当clkclk的上升沿到来或的上升沿到来或resetrese

5、t信号的下降沿到来信号的下降沿到来 电平敏感电平敏感,组合逻辑电路采用,组合逻辑电路采用 边沿敏感边沿敏感,时序逻辑用。,时序逻辑用。不要混用不要混用module mux4_1(out,in0,in1,in2,in3,sel);output out;input in0,in1,in2,in3;input1:0 sel; reg out;always (in0,in1,in2 ,in3 ,sel) /敏感信号列表敏感信号列表case(sel) 2b00: out=in0; 2b01: out=in1; 2b10: out=in2; 2b11: out=in3; default: out=2bx;

6、endcaseendmodule4选选1数据选择器数据选择器 对于时序电路,事件通常是由时钟边沿触发的,为表达边对于时序电路,事件通常是由时钟边沿触发的,为表达边沿这个概念,沿这个概念,Verilog提供了提供了posedge和和negedge关键字来描关键字来描述。比如:述。比如: 【例】同步置数、同步清零的计数器【例】同步置数、同步清零的计数器module count(out,data,load,reset,clk);output7:0 out; input7:0 data;input load,clk,reset; reg7:0 out;always (posedge clk) /clk

7、上升沿触发上升沿触发 begin if(!reset) out=8h00; /同步清同步清0,低电平有效,低电平有效 else if(load) out=data; /同步预置同步预置 else out=out+1; /计数计数 endendmoduleo 块语句是由块标志符块语句是由块标志符begin-end或或fork-join界定的一组语句,界定的一组语句,当块语句只包含一条语句时,块标志符可以缺省。当块语句只包含一条语句时,块标志符可以缺省。n 顺序块顺序块,以关键字,以关键字beginend将多条语句封装成块。将多条语句封装成块。 按顺序执行按顺序执行 。beginregb=rega

8、;regc=regb;end 由于由于begin-end块内的语句顺序执行,在最后,将块内的语句顺序执行,在最后,将regb、regc的值都更新为的值都更新为rega的值,该的值,该begin-end块执行完后,块执行完后,regb、regc的值是相同的。的值是相同的。n并行块 (了解即可)o 以关键字以关键字fork join将多条语句封装成块将多条语句封装成块 o 所有语句并行执行所有语句并行执行initial fork a=0; #5 b=1; #10 c=a,b; #15 d=b,a;join并行块容易引起竞争并行块容易引起竞争适用于绝对时间的控制适用于绝对时间的控制实际建模时,并行块

9、不可综合。用于仿真。实际建模时,并行块不可综合。用于仿真。仅用顺序块即可仅用顺序块即可 o 行为级的赋值语句行为级的赋值语句o 必须出现在必须出现在initial和和always结构中结构中o 过程赋值语句的左端都必须是过程赋值语句的左端都必须是reg类型类型o 分为阻塞性赋值和非阻塞性赋值分为阻塞性赋值和非阻塞性赋值 非阻塞(非阻塞(non_blocking)赋值方式赋值方式赋值符号为赋值符号为“=”,如:如:b=a;非阻塞赋值在整个过程块结束时才完成赋值操作,即非阻塞赋值在整个过程块结束时才完成赋值操作,即b的的值并不是立刻就改变的。值并不是立刻就改变的。实际并行实际并行。阻塞(阻塞(bl

10、ocking)赋值方式赋值方式赋值符号为赋值符号为“=”,如:如:b=a;阻塞赋值在该语句结束时就立即完成赋值操作阻塞赋值在该语句结束时就立即完成赋值操作,即,即b的值的值在该条语句结束后立刻改变。在该条语句结束后立刻改变。如果在一个块语句中,有多条如果在一个块语句中,有多条阻塞赋值语句,那么在前面的赋值语句没有完成之前,后面阻塞赋值语句,那么在前面的赋值语句没有完成之前,后面的语句就不能被执行,仿佛被阻塞了(的语句就不能被执行,仿佛被阻塞了(blocking)一样,因一样,因此称为阻塞赋值方式。此称为阻塞赋值方式。实际顺序执行。实际顺序执行。非阻塞赋值非阻塞赋值module non_bloc

11、k(c,b,a,clk);output c,b; input clk,a;reg c,b;always (posedge clk) begin b=a; c=b; endendmodule阻塞赋值阻塞赋值module block(c,b,a,clk);output c,b;input clk,a;reg c,b;always (posedge clk) begin b=a; c=b; endendmodule非阻塞赋值综合结果:非阻塞赋值综合结果:阻塞赋值综合结果阻塞赋值综合结果非阻塞赋值仿真波形图非阻塞赋值仿真波形图 阻塞赋值仿真波形图阻塞赋值仿真波形图 o( if-else语句)语句)if

12、-else语句使用方法有以下语句使用方法有以下3种:种:(1)if(表达式)表达式) 语句语句1;else ;/建议建议添加一个空添加一个空else语句防止出现锁存器语句防止出现锁存器(2)if(表达式)表达式) 语句语句1; else 语句语句2;(3)if(表达式表达式1) 语句语句1; else if(表达式表达式2) 语句语句2; else if(表达式表达式3) 语句语句3; else if(表达式表达式n) 语句语句n; else 语句语句n+1;o 关键字为关键字为case、default、endcaseo case语句的结构如下。语句的结构如下。 case (敏感表达式)敏感表

13、达式) 值值1: 语句语句1;/case分支项分支项 值值2: 语句语句2; 值值n: 语句语句n; default:语句语句n+1; endcase注意事项l case语句中的每个分支条件必须不同,语句中的每个分支条件必须不同,变量的位宽要严格变量的位宽要严格相等,还要使用明确指定宽度的方式,相等,还要使用明确指定宽度的方式,避免使用避免使用“d”等不等不指明宽度的分支条件。指明宽度的分支条件。l case语句中的每个分支可以接多条待执行语句,只需要使语句中的每个分支可以接多条待执行语句,只需要使用用beginend即可即可l case语句中只能有一个语句中只能有一个default语句,而且

14、建议使用语句,而且建议使用default,也是为了得到最后综合的电路不会生成锁存器。,也是为了得到最后综合的电路不会生成锁存器。如如2b01:begin out=a-b; sum=a+b; endmodule decode4_7(decodeout,indec);output6:0 decodeout;input3:0 indec; reg6:0 decodeout;always (indec) begin case(indec) /用用case语句进行译码语句进行译码 4d0:decodeout=7b1111110; 4d1:decodeout=7b0110000; 4d2:decodeou

15、t=7b1101101; 4d3:decodeout=7b1111001; 4d4:decodeout=7b0110011; 4d5:decodeout=7b1011011; 4d6:decodeout=7b1011111; 4d7:decodeout=7b1110000; 4d8:decodeout=7b1111111; 4d9:decodeout=7b1111011; default: decodeout=7bx; endcase endendmodule简易ALU电路的行为级建模 module my_ALU(out,a,b,select);output 4:0 out;input 3:0

16、 a,b;input 2:0 select;reg 4:0 out;always (*)case(select) 3b000: out=a; 3b001: out=a+b; 3b010: out=a-b; 3b011: out=a/b; 3b100: out=a%b; 3b101: out=a1; 3b111: out=ab; default: out=5b00000;endcaseendmodule repeatinitialbeginfor(i=0;i4;i=i+1)out=out+1;endinitialbeginrepeat(5)out=out+1;endinitialbegini=0

17、;while(i0)i=i+1;end for while在在Verilog中存在四种类型的循环语句,用来控制语句的执行次数。这四种中存在四种类型的循环语句,用来控制语句的执行次数。这四种语句分别为语句分别为:(1)forever:连续地执行语句;多用在连续地执行语句;多用在“initial”块中,以生成时钟等周块中,以生成时钟等周期性波形。期性波形。(2)repeat:连续执行一条语句连续执行一条语句n次。次。(3)while:执行一条语句直到某个条件不满足。执行一条语句直到某个条件不满足。(4)for:有条件的循环语句。有条件的循环语句。forever循环循环 o 没有条件,永远循环没有条

18、件,永远循环o 类似类似always,但使用在,但使用在initial里里o 比较如下两例比较如下两例Initial begin clock=0; forever #10 clock=clock;endinitial clock=0;always #10 clock=clock;module voter7(pass,vote);output pass;input6:0 vote;reg2:0 sum; integer i; reg pass;always (vote) begin sum=0;for(i=0;i=6;i=i+1) if(votei) sum=sum+1; if(sum2) pa

19、ss=1; /超过超过4人赞成,则人赞成,则通过通过else pass=0; endendmodule用用repeatrepeat实现实现8 8位二进制数乘法位二进制数乘法 module mult_repeat(outcome, a, b);/无符号数串行乘法无符号数串行乘法parameter size=8; inputsize:1 a,b;output2*size:1 outcome;reg2*size:1 temp_a, outcome;regsize:1 temp_b;always (a or b)begin outcome=0; temp_a=a; temp_b=b;repeat(si

20、ze) /repeat语句,语句,size为循环次数为循环次数 beginif(temp_b1) /如果如果temp_b的最低位为的最低位为1,就执行下面的加法,就执行下面的加法outcome=outcome +temp_a;temp_a=temp_a1; /操作数操作数b右移一位右移一位 endendendmoduleo Verilog允许在程序中使用特殊的编译向导(允许在程序中使用特殊的编译向导(CompilerDirectives)语句,在编译时,通常先对这些向导语句进行语句,在编译时,通常先对这些向导语句进行“预处理预处理”,然后再将预处理的结果和源程序一起进行编,然后再将预处理的结果

21、和源程序一起进行编译。译。o 向导语句以符号向导语句以符号“”开头,以区别于其它语句。开头,以区别于其它语句。Verilog提供了十几条编译向导语句,如:提供了十几条编译向导语句,如:define、ifdef、else、endif、restall等。比较常用的有等。比较常用的有define,include和和ifdef、else、endif等。等。 define语句用于将一个简单的名字或标志符(或称语句用于将一个简单的名字或标志符(或称为宏名)来代替一个复杂的名字或字符串,其使为宏名)来代替一个复杂的名字或字符串,其使用格式为:用格式为:define宏名(标志符)宏名(标志符)字符串字符串 如

22、:如: define sum define sum ina+inb+inc+indina+inb+inc+ind 在上面的语句中,用简单的宏名在上面的语句中,用简单的宏名sum来代替了一个来代替了一个复杂的表达式复杂的表达式ina+inb+inc+ind,采用了这样的定采用了这样的定义形式后,在后面的程序中,就可以直接用义形式后,在后面的程序中,就可以直接用sum来来代表表达式代表表达式ina+inb+inc+ind了。了。 include是文件包含语句,它可将一个文件全部包含到另一是文件包含语句,它可将一个文件全部包含到另一个文件中。其格式为:个文件中。其格式为:include“文件名文件名

23、” 使用使用include语句时应注意以下几点:语句时应注意以下几点:l一个include语句只能指定一个被包含的文件。linclude语句可以出现在源程序的任何地方。被包含的文件若与包含文件不在同一个子目录下,必须指明其路径名。l文件包含允许多重包含,比如文件1包含文件2,文件2又包含文件3等。o 任务(任务(task) 任务定义格式:任务定义格式: task ; /注意无端口列表注意无端口列表 端口及数据类型声明语句;端口及数据类型声明语句; 其它语句;其它语句; endtask 任务调用的格式为:任务调用的格式为: (端口(端口1,端口,端口2,); 需要注意的是:任务调用时和定义时的端

24、口变量应是一需要注意的是:任务调用时和定义时的端口变量应是一一对应的。一对应的。 任务的任务的定义与调用须在一个定义与调用须在一个module模块内。模块内。 定义任务时,定义任务时,没有端口名列表没有端口名列表,但需要紧接着进行输入,但需要紧接着进行输入输出端口和数据类型的说明。输出端口和数据类型的说明。 当任务被调用时,任务被激活当任务被调用时,任务被激活。任务的调用与模块调用。任务的调用与模块调用一样通过任务名调用实现,调用时,需列出端口名列表,一样通过任务名调用实现,调用时,需列出端口名列表,端口名的排序和类型必须与任务定义中的相一致。端口名的排序和类型必须与任务定义中的相一致。 一个

25、任务可以调用别的任务和函数一个任务可以调用别的任务和函数,可以调用的任务和,可以调用的任务和函数个数不限。函数个数不限。 o 函数的目的是返回一个值,以用于表达式计算函数的目的是返回一个值,以用于表达式计算 函数的定义格式:函数的定义格式:function 函数名;函数名;端口声明;端口声明;局部变量定义;局部变量定义;其它语句;其它语句;endfunction 是一个可选项,如果是一个可选项,如果缺省,则返回值为缺省,则返回值为1位寄存器类型的数据。位寄存器类型的数据。function 7:0 get0;input7:0 x; reg7:0 count;integer i;begin cou

26、nt=0; for (i=0;i=7;i=i+1) if(xi=1b0) count=count+1; get0=count;endendfunction 上面的上面的get0函数循环核对输入数据函数循环核对输入数据x的每一位,计算出的每一位,计算出x中中0的个数,并返回一个适当的值。的个数,并返回一个适当的值。 函数的定义与调用须在一个函数的定义与调用须在一个module模块内模块内。 函数只允许有输入变量且必须至少有一个函数只允许有输入变量且必须至少有一个输入变量输入变量,输,输出变量由函数名本身担任,在定义函数时,需对函数名出变量由函数名本身担任,在定义函数时,需对函数名说明其类型和位宽

27、。说明其类型和位宽。 定义函数时,没有端口名列表,但调用函数时,需列出定义函数时,没有端口名列表,但调用函数时,需列出端口名列表,端口名的排序和类型必须与定义时的相一端口名列表,端口名的排序和类型必须与定义时的相一致。这一点与任务相同致。这一点与任务相同 函数可以出现在持续赋值函数可以出现在持续赋值assign的右端表达式中。的右端表达式中。 函数不能调用任务,而任务可以调用别的任务和函数,函数不能调用任务,而任务可以调用别的任务和函数,且调用任务和函数个数不受限制。且调用任务和函数个数不受限制。 两个或更多个两个或更多个“always”过程块、过程块、“assign”持续持续赋值语句、赋值语

28、句、实例元件调用实例元件调用等操作都是等操作都是同时执行的同时执行的。 在在“alwaysalways”模块内部,其语句如果模块内部,其语句如果是非阻塞赋是非阻塞赋值,也是并发执行的值,也是并发执行的;而如果是;而如果是阻塞赋值,则语阻塞赋值,则语句是按照指定的顺序执行的句是按照指定的顺序执行的,语句的书写顺序对,语句的书写顺序对程序的执行结果有着直接的影响。程序的执行结果有着直接的影响。顺序执行模块顺序执行模块1module serial1(q,a,clk);output q,a;input clk;reg q,a;always (posedge clk) begin q=q; a=q; e

29、ndendmodule顺序执行模块顺序执行模块2module serial2(q,a,clk);output q,a;input clk;reg q,a;always(posedge clk) begin a=q; q=q; endendmodule顺序执行模块顺序执行模块1 1仿真波形图仿真波形图 顺序执行模块顺序执行模块2 2仿真波形图仿真波形图 顺序执行模块顺序执行模块1 1综合结果综合结果顺序执行模块顺序执行模块2 2综合结果综合结果1 阻塞赋值和非阻塞赋值有什么本质的区别?阻塞赋值和非阻塞赋值有什么本质的区别?2 用持续赋值语句描述一个用持续赋值语句描述一个4选选1数据选择器。数据选择器。3 用行为语句设计一个用行为语句设计一个8位计数器,每次在时钟的上升沿,位计数器,每次在时钟的上升沿,计数器加计数器

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论