EDA技术与Verilog设计王金明版第6章

上传人:hs****ma 文档编号:567963737 上传时间:2024-07-22 格式:PPT 页数:88 大小:600KB
返回 下载 相关 举报
EDA技术与Verilog设计王金明版第6章_第1页
第1页 / 共88页
EDA技术与Verilog设计王金明版第6章_第2页
第2页 / 共88页
EDA技术与Verilog设计王金明版第6章_第3页
第3页 / 共88页
EDA技术与Verilog设计王金明版第6章_第4页
第4页 / 共88页
EDA技术与Verilog设计王金明版第6章_第5页
第5页 / 共88页
点击查看更多>>
资源描述

《EDA技术与Verilog设计王金明版第6章》由会员分享,可在线阅读,更多相关《EDA技术与Verilog设计王金明版第6章(88页珍藏版)》请在金锄头文库上搜索。

1、第第6章章 Verilog设计进阶设计进阶 主要内容主要内容 过程语句(过程语句(过程语句(过程语句(initialinitial、alwaysalways) 块语句(块语句(块语句(块语句(begin-endbegin-end、fork-joinfork-join) 赋值语句(赋值语句(赋值语句(赋值语句(assignassign、= =、=) 条件语句(条件语句(条件语句(条件语句(if-elseif-else、casecase、casezcasez、casexcasex) 循环语句(循环语句(循环语句(循环语句(forfor、foreverforever、repeatrepeat、whi

2、lewhile) 编编编编译译译译指指指指示示示示语语语语句句句句( definedefine、includeinclude、ifdefifdef、elseelse、endifendif) 任务(任务(任务(任务(tasktask)与)与)与)与 函数(函数(函数(函数(functionfunction) 顺序执行与并发执行顺序执行与并发执行顺序执行与并发执行顺序执行与并发执行VerilogHDL行为语句行为语句类别类别语句语句可综合性可综合性过程语句过程语句initialalways块语句块语句串行块串行块begin-end并行块并行块fork-join赋值语句赋值语句持续赋值持续赋值ass

3、ign过程赋过程赋值值=、=条件语句条件语句if-elsecase循环语句循环语句forrepeatwhileforever编译向导语句编译向导语句defineincludeifdef,else,endif6.1过程语句过程语句一、一、initial和和always initial从从0时刻起,顺序执行其后的块语句一次;时刻起,顺序执行其后的块语句一次; always从从0时刻起时刻起(若带有触发条件的话,则从触发时刻起)若带有触发条件的话,则从触发时刻起),反复执行其后的块语句多次,仅当碰到诸如,反复执行其后的块语句多次,仅当碰到诸如$finish之类的之类的结束控制语句之后,才能停止循环过

4、程结束控制语句之后,才能停止循环过程initial过程块的使用主要是面向功能模拟的,通常用来描过程块的使用主要是面向功能模拟的,通常用来描述测试模块的初始化、监视、波形生成等功能;述测试模块的初始化、监视、波形生成等功能; always过程块的使用主要是对硬件功能模拟的行为进行描过程块的使用主要是对硬件功能模拟的行为进行描述,也可以在测试模块用来对时钟进行描述。利用述,也可以在测试模块用来对时钟进行描述。利用always过程块可以实现触发器、锁存器和组合电路。过程块可以实现触发器、锁存器和组合电路。一个模块中可有多个一个模块中可有多个initial和和always语句,代表多个过程块语句,代表

5、多个过程块的存在,它们之间相互独立,并行运行的存在,它们之间相互独立,并行运行过程语句使用模板过程语句使用模板always()begin/过程赋值过程赋值/if-else,case,casex,casez选择语句选择语句/while,repeat,for循环循环/task,function调用调用end“always”过程语句通常是带有触发条件的,触发条件写过程语句通常是带有触发条件的,触发条件写在敏感信号表达式中,只有当触发条件满足时,其后的在敏感信号表达式中,只有当触发条件满足时,其后的“begin-end”块语句才能被执行。块语句才能被执行。敏感信号表达式敏感信号表达式“event-ex

6、pression”敏敏感感信信号号表表达达式式又又称称事事件件表表达达式式或或敏敏感感信信号号列列表表,即即当当该该表表达达式式中中变变量量的的值值改改变变时时,就就会会引引发发块块内内语语句句的的执执行行。因因此此敏敏感感信信号号表表达达式式中中应应列列出出影影响响块块内内取取值值的的所所有有信信号号。若若有两个或两个以上信号时,它们之间用有两个或两个以上信号时,它们之间用“or”连接。连接。例如:例如:(a) a) / /当信号当信号a a的值发生改变的值发生改变(a or b) a or b) / /当信号当信号a a或信号或信号b b的值发生改变的值发生改变(posedge clock

7、) posedge clock) / /当当clock clock 的上升沿到来时的上升沿到来时(negedge clock) negedge clock) / /当当clock clock 的下降沿到来时的下降沿到来时(posedge clk or negedge reset) posedge clk or negedge reset) / /当当clkclk的上升沿到来或的上升沿到来或resetreset信号的下降沿到来信号的下降沿到来敏感信号列表举例(敏感信号列表举例(4选选1数据选择器)数据选择器)module mux4_1(out,in0,in1,in2,in3,sel);outpu

8、t out;input in0,in1,in2,in3;input1:0 sel;reg out;always (in0 or in1 or in2 or in3 or sel) /敏感信号列表敏感信号列表case(sel) 2b00: out=in0; 2b01: out=in1; 2b10: out=in2; 2b11: out=in3; default: out=2bx;endcaseendmodulel敏感信号分为两类:敏感信号分为两类:边沿敏感型边沿敏感型;电平敏感型电平敏感型,每一个,每一个always过程最好由一种类型的敏感信号来触发,而不要将过程最好由一种类型的敏感信号来触发,

9、而不要将边沿敏感型和电平敏感型信号列在一起,比如:边沿敏感型和电平敏感型信号列在一起,比如:always (posedge clk or posedge clr)/边沿型边沿型always (A or B)/两个敏感信号都是电平敏感型两个敏感信号都是电平敏感型always (posedge clk or clr)/不建议这样用,最不建议这样用,最好不要将边沿敏感型和电平敏感型信号列在一起好不要将边沿敏感型和电平敏感型信号列在一起posedge和和negedge关键字关键字对对于于时时序序电电路路,事事件件通通常常是是由由时时钟钟边边沿沿触触发发的的,为为表表达达边边沿沿这这个个概概念,念,Ve

10、rilog提供了提供了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上升沿触发上升沿触发 begin if(!reset) out=8h00; /同步清同步清0,低电平有效,低电平有效 else if(load) out=data; /同步预置同步预置 else

11、out=out+1; /计数计数 endendmoduleposedge和和negedge关键字关键字always(posedge clk or posedge clear) /clear信号上升沿到来时清零,故高电平清零有效信号上升沿到来时清零,故高电平清零有效always(posedge clk or negedge clear) /clear信号下降沿到来时清零,故低电平清零有效信号下降沿到来时清零,故低电平清零有效注注意意:块块内内的的逻逻辑辑描描述述要要与与敏敏感感信信号号表表达达式式中中信信号号的的有有效效电电平一致。下面描述错误:平一致。下面描述错误: always (posed

12、ge clk or negedge clear) begin if(clear) out=0; out=in; else end 2、always语语句句: 其其声声明格式如下:明格式如下: always always语语句句包包括括的的所所有有行行为为语语句句构构成成了了一一个个always块块。该该块块从从仿仿真真0时时刻刻开开始始顺顺序序执执行行其其中中的的语语句句。在在仿仿真真过过程程中中不不断断重重复复执执行的。行的。 always语语句句由由于于其其不不断断重重复复执执行行的的特特性性,只只有有和和一一定定的的时时序序控控制制结结合合在在一一起起才才有有用用。如如果果一一个个alw

13、ays语语句句没没有有时时序控制序控制,则这则这个个always语语句句将会将会成成为为一个仿真死锁一个仿真死锁。例例:always areg = areg;这这个个always语语句句将将会会生生成成一一个个0延延迟迟的的无无限限循循环环跳跳变变过过程程,这时这时会会发发生仿生仿真真死死锁锁。如如果果加加上上时时序序控控制制,则则这这个个always语语句句将将变变为为一一条条非常有用的描述语句。见下例:非常有用的描述语句。见下例:例例:always#half_periodareg=areg;这这 个个 例例 子子 生生 成成 了了 一一 个个 周周 期期 为为:period(=2*half

14、_period)的的无无限限延延续续的的信信号号波波形形,常常用用这这种种方方法法来来描描述述时时钟钟信信号号,作作为为激激励励信信号号来来测测试试所设计的电路。所设计的电路。VerilogVerilog提提供供三三种种时时序序控控制制方方法法:基基于于延延迟迟的的时时序控制、基于事件的时序控制和电平敏感的时序控制。序控制、基于事件的时序控制和电平敏感的时序控制。timescale1ns/1nsmoduleclk_gen_demo(clock1,clock2);outputclock1,clock2;regclock1,clock2;initial/完成时钟信号的初始化完成时钟信号的初始化be

15、ginclock1=0;clock2=1;#500$finish;endalways#50clock1=clock1;always#100clock2=clock2;endmodule用用always过程块实现复杂组合逻辑电路过程块实现复杂组合逻辑电路 例例:用用always过过程程语语句句描描述述简简单单算算术逻辑单元。术逻辑单元。define add 3d0define minus 3d1define band 3d2define bor 3d3define bnot 3d4module alu(out,opcode,a,b);input2:0 opcode;/操作码操作码input7:0

16、 a,b; /操作数操作数output7:0 out;reg7:0 out;always(opcode or a or b)begin case(opcode) add:out=a+b; minus: out=a-b; band: out=a&b; bor:out=a|b; bnot: out=a; default:out=8hx; endcaseendendmodule边沿触发的边沿触发的alwaysalways块常常描述时序逻辑块常常描述时序逻辑,如果符,如果符合可综合风格要求可用综合工具自动转换为表示合可综合风格要求可用综合工具自动转换为表示时序逻辑的寄存器组和门级逻辑,而时序逻辑的寄存

17、器组和门级逻辑,而电平触发的电平触发的alwaysalways块常常用来描述组合逻辑和锁存器块常常用来描述组合逻辑和锁存器,如果,如果符合可综合风格要求可转换为表示组合逻辑的门符合可综合风格要求可转换为表示组合逻辑的门级逻辑或锁存器。级逻辑或锁存器。一个模块中可以有多个一个模块中可以有多个alwaysalways块,它们都是并行运行的。块,它们都是并行运行的。过程语句过程语句initial语句使用格式语句使用格式initialbegin语句语句1;语句语句2;endinitial语语句句不不带带触触发发条条件件,initial过过程程中中的的语语句句块块沿沿时时间间轴轴只只执执行行一一次次。i

18、nitial语语句句通通常常用用于于仿仿真真模模块块中中对对激激励励向向量量的的描描述述,或或用用于于给给寄寄存存器器变变量量赋赋初初值值,它它是是面面向向模模拟拟仿仿真真的的过过程语句,通常不能被逻辑综合工具所接受。程语句,通常不能被逻辑综合工具所接受。用用initial过程语句对测试变量赋值过程语句对测试变量赋值 timescale 1ns/1nsmodule test;reg A,B,C;initial begin A=0;B=1;C=0; #50 A=1;B=0; #50 A=0;C=1; #50 B=1; #50 B=0;C=0; #50 finish;endendmodule 例例

19、11:initialinitial begin begin areg=0; areg=0;/初始化寄存器初始化寄存器aregareg memoryindex=0; memoryindex=0; end end在这个例子中用在这个例子中用initialinitial语句在仿真开始时对各变量进行语句在仿真开始时对各变量进行初始化。初始化。 6.2块语句块语句块块语语句句通通常常用用来来将将两两条条或或多多条条语语句句组组合合在在一一起起,使使其其在在格格式式上上看看更更象象一一条条语语句句。块块语语句句有有两两种种,一一种种是是begin_end语语句句,通通常常用用来来标标识识顺顺序序执执行行的

20、的语语句句,用用它它来来标标识识的的块块称称为为顺顺序序块块。一一种种是是fork_join语语句句,通通常常用用来来标标识识并并行行执执行行的的语语句句,用用它它来来标标识识的块称为并行块。下面进行详细的介绍。的块称为并行块。下面进行详细的介绍。6.2块语句块语句块块语语句句是是由由块块标标志志符符begin-end或或fork-join界界定定的的一一组组语语句句,当块语句只包含一条语句时,块标志符可以缺省。当块语句只包含一条语句时,块标志符可以缺省。begin-end串行块中的语句按串行方式顺序执行。串行块中的语句按串行方式顺序执行。比如:比如:beginregb=rega;regc=r

21、egb;end由由于于begin-end块块内内的的语语句句顺顺序序执执行行,在在最最后后,将将regb、regc的的值值都都更更新新为为rega的的值值,该该begin-end块块执执行行完完后后,regb、regc的值是相同的。的值是相同的。6.2块语句块语句并行块并行块fork-joinfork-joinfork-join块中的所有语句是并发执行的。块中的所有语句是并发执行的。比如:比如:forkregb=rega;regc=regb;join由由于于fork-join块块内内的的语语句句同同时时执执行行,在在上上面面的的块块语语句句执执行行完完后后,regbregb更更新新为为rega

22、rega的的值值,而而regcregc的的值值更更新新为为没没有有改改变变前前regbregb的值,故执行完成后,的值,故执行完成后,regbregb与与regcregc的值是不同的。的值是不同的。6.3赋值语句赋值语句1、持续赋值语句(、持续赋值语句(ContinuousAssignments)assign为持续赋值语句,主要用于对为持续赋值语句,主要用于对wire型变量的赋值。型变量的赋值。比如:比如:assignc=a&b;在上面的赋值中,在上面的赋值中,a、b、c三个变量皆为三个变量皆为wire型变量,型变量,a和和b信信号的任何变化,都将随时反映到号的任何变化,都将随时反映到c上来。

23、上来。例:二选一多路选择器例:二选一多路选择器moduleMUX2_1(out,a,b,sel);inputa,b,sel;outputout;assignout=(sel=0)?a:b;/持续赋值,如果持续赋值,如果sel为为0,则,则out=a;否则;否则out=bendmodule2 2、过程赋值语句、过程赋值语句: : 过过程程赋赋值值语语句句可可以以给给寄寄存存器器、整整数数、时时间间变变量量赋赋值值。连连续续赋赋值值语语句句总总是是处处于于活活动动状状态态,而而过过程赋值语句只有在执行到的时候才会起作用。程赋值语句只有在执行到的时候才会起作用。在在Verilog HDLVerilo

24、g HDL语言中,信号有两种赋值方式:语言中,信号有两种赋值方式:(1).(1).非阻塞非阻塞( (Non_Blocking)Non_Blocking)赋值方式赋值方式 ( ( 如如 b = a; )b = a; )1)它它不不会会阻阻塞塞位位于于同同一一个个顺顺序序块块中中其其后后语语句句的的执执行行。同同一顺序块中的语句并发执行。一顺序块中的语句并发执行。2)b的的值值并并不不是是立立刻刻就就改改变变的的,块块结结束束后后才才完完成成赋赋值值操作。操作。(2). 阻塞阻塞(Blocking)赋值方式赋值方式 ( 如如 b = a; ) 1) 顺序块中的阻塞赋值语句按顺序执行。顺序块中的阻塞

25、赋值语句按顺序执行。 2) b的值在赋值语句执行完后立刻就改变的值在赋值语句执行完后立刻就改变。 非非阻阻塞塞赋赋值值方方式式和和阻阻塞塞赋赋值值方方式式的的区区别别常常给给设设 计计 人人 员员 带带 来来 问问 题题 。 问问 题题 主主 要要 是是 给给“always”块块内内的的reg型型信信号号的的赋赋值值方方式式不不易易把把握握。一一般般情情况况下下,如如果果用用一一个个always块块来来描描述述时时序序电电路路,这这个个的的“always”模模块块内内的的reg型信号都是采用下面的非阻塞赋值方式型信号都是采用下面的非阻塞赋值方式:b=a;例例1:always(posedgecl

26、k)beginb=a;cb)out1=int1;elseout1=int2;说明说明(3)在在if和和else后面可以包含一个内嵌的操作语句,也可以有后面可以包含一个内嵌的操作语句,也可以有多个操作语句,此时用多个操作语句,此时用begin和和end这两个关键字将几个语句这两个关键字将几个语句包含起来成为一个复合块语句包含起来成为一个复合块语句例如:例如:if(ab)beginout1=int1;out2=int2;endelsebeginout1=int2;out2=int1;end说明说明(4)允许一定形式的表达式简写方式)允许一定形式的表达式简写方式例如:例如:if(expression

27、)等同与)等同与if(expression=1)if(!expression)等同与)等同与if(!expression=1)(5)if语句的嵌套。在语句的嵌套。在if语句中又包含一个或多个语句中又包含一个或多个if语句称为语句称为if语语句的嵌套。句的嵌套。例:模为例:模为60的的8421BCD码加法计数器码加法计数器module count60(qout, cout, data, load, cin, reset, clk);input load, cin, clk, reset;input 7:0 data;output 7:0 qout;output cout;reg7:0 qout;

28、always(posedge clk)/clk上升沿时刻计数上升沿时刻计数 begin if(reset) qout=0; /同步复位同步复位 else if(load) qout=data; /同步置数同步置数 else if (cin) begin if(qout3:0=9) /低位是否为低位是否为9,是则,是则 begin qout3:0=0; /回回0,并判断高位是否为,并判断高位是否为5 if(qout7:4=5)qout7:4=0; else qout7:4=qout7:4+1; /高位不为高位不为5,则加,则加1 end else qout3:0=qout3:0+1; /低位不为

29、低位不为9,则加,则加1endendassign cout=(qout=8h59)&cin)?1:0; /产生进位输出信号产生进位输出信号enmodulecase语语句句是是一一种种多多分分支支语语句句,故故case语语句句多多用用于于多多条条件件译译码码电电路路,如如描描述述译译码码器器、数数据据选选择择器器等等,case语语句有句有case、casez、casex三种表示方法。三种表示方法。case语句的使用格式如下。语句的使用格式如下。case(敏感表达式)(敏感表达式)值值1:语句语句1;/case分支项分支项值值2:语句语句2;值值n:语句语句n;default:语句:语句n+1;e

30、ndcasecase语句语句BCD码码七段数码管显示译码器七段数码管显示译码器module 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:decodeout=7b1101101; 4d3:decodeout=7b1111001; 4d4:decodeout=7b011001

31、1; 4d5:decodeout=7b1011011; 4d6:decodeout=7b1011111; 4d7:decodeout=7b1110000; 4d8:decodeout=7b1111111; 4d9:decodeout=7b1111011; default: decodeout=7bx; endcase endendmoduleVerilog HDLVerilog HDL针对电路的特性提供了针对电路的特性提供了casecase语句的语句的其它两种形式用来处理其它两种形式用来处理casecase语句比较过程中的不语句比较过程中的不必考虑的情况必考虑的情况( ( dont care

32、condition )dont care condition )。其。其中中casezcasez语句用来处理不考虑高阻值语句用来处理不考虑高阻值z z的比较过程,的比较过程,casexcasex语句则将高阻值语句则将高阻值z z和不定值都视为不必关心和不定值都视为不必关心的情况。的情况。所谓不必关心的情况,即在表达式进行所谓不必关心的情况,即在表达式进行比较时,比较时,不将条件表达式或分支表达式中的该位不将条件表达式或分支表达式中的该位的状态考虑在内的状态考虑在内。这样在这样在casecase语句表达式进行比语句表达式进行比较时,就可以灵活地设置以对信号的某些位进行较时,就可以灵活地设置以对信

33、号的某些位进行比较。比较。 casez语语句句中中,如如果果分分支支表表达达式式某某些些为为的的值值为为高高阻阻z,那那么么对对这这些些位位的的比比较较就不予考虑,因此只需关注其他位的比较结果。就不予考虑,因此只需关注其他位的比较结果。casex,如如果果比比较较的的双双方方有有一一方方的的某某些些位位的的值值是是x或或z,那那么么这这些些为为的的比比较较就就都不予考虑。都不予考虑。case(a)2b1x:out=1;/只有只有a=1x,才有才有out=1casez(a)2b1x:out=1;/如果如果a=1x,1z,则有,则有out=1casex(a)2b1x:out=1;/如果如果a=10

34、、11、1x、1z等,都有等,都有out=1casez(a)3b1?:out=1;/如果如果a=100、101、110、111或或1xx、1zz等,都有等,都有out=13b01?:out=1/如果如果a=010、011、01x、01z,都有,都有out=1case语句语句Verilog Verilog HDLHDL设设计计中中容容易易犯犯的的一一个个通通病病是是由由于于不不正正确确使使用用语语言言,生生成成了了并并不不想想要要的的锁锁存存器器。下下面面我我们们给给出出了了一一个个在在“alwaysalways块中不正确使用块中不正确使用ifif语句,造成这种错误的例子。语句,造成这种错误的例

35、子。 检检查查一一下下左左边边的的 alwaysalways块块,ifif语语句句保保证证了了只只有有当当al=1al=1时时,q q才才取取d d的的值值。这这段段程程序序没没有有写写出出 al al = = 0 0 时时的的结果结果, , 那么当那么当al=0al=0时会怎么样呢?时会怎么样呢? 在在 alwaysalways块块内内,如如果果在在给给定定的的条条件件下下变变量量没没有有赋赋值值,这个变量将保持原值,也就是说会生成一个锁存器!这个变量将保持原值,也就是说会生成一个锁存器! 如如果果设设计计人人员员希希望望当当 al al = = 0 0 时时q q的的值值为为0 0,els

36、eelse项项就就必必不不可可少少了了,请请注注意意看看右右边边的的 alwaysalways块块,整整个个VerilogVerilog程程序序模模块块综综合合出出来来后后, alwaysalways块块对对应应的的部部分分不不会会生生成成锁存器。锁存器。 Verilog Verilog HDLHDL程程序序另另一一种种偶偶然然生生成成锁锁存存器器是是在在使使用用casecase语句时缺少语句时缺少defaultdefault项的情况下发生的。项的情况下发生的。 casecase语句的功能是:在某个信号(本例中的语句的功能是:在某个信号(本例中的sel)sel)取不取不同的值时,给另一个信号(

37、本例中的同的值时,给另一个信号(本例中的q)q)赋不同的值。注赋不同的值。注意看下图左边的例子,如果意看下图左边的例子,如果sel=0,qsel=0,q取取a a值,而值,而sel=11,qsel=11,q取取b b的值。这个例子中不清楚的是:如果的值。这个例子中不清楚的是:如果selsel取取0000和和1111以以外的值时外的值时q q将被赋予什么值?在下面左边的这个例子中,将被赋予什么值?在下面左边的这个例子中,程序是用程序是用Verilog HDLVerilog HDL写的,即默认为写的,即默认为q q保持原值,这就保持原值,这就会自动生成锁存器。会自动生成锁存器。 右右边边的的例例子

38、子很很明明确确,程程序序中中的的casecase语语句句有有defaultdefault项项,指指明明了了如如果果selsel不不取取0000或或1111时时,编编译译器器或或仿仿真真器器应应赋赋给给q q的的值。程序所示情况下,值。程序所示情况下,q q赋为赋为0,0,因此不需要锁存器。因此不需要锁存器。 以上就是怎样来避免偶然生成锁存器的错误以上就是怎样来避免偶然生成锁存器的错误。如果用到。如果用到if语句,语句,最好写上最好写上else项。如果用项。如果用case语句,最好写上语句,最好写上default项。项。遵遵循上面两条原则,就可以避免发生这种错误,使设计者更加循上面两条原则,就可

39、以避免发生这种错误,使设计者更加明确设计目标,同时也增强了明确设计目标,同时也增强了Verilog程序的可读性程序的可读性。在在VerilogHDL中中存存在在着着四四种种类类型型的的循循环环语语句句,用用来来控控制制执行语句的执行次数。执行语句的执行次数。1)forever 连续的执行语句。连续的执行语句。2)repeat连续执行一条语句连续执行一条语句n次。次。3)while执执行行一一条条语语句句直直到到某某个个条条件件不不满满足足。如如果果一开始条件即不满足一开始条件即不满足(为假为假),则语句一次也不能被执行。,则语句一次也不能被执行。4)for通过三个步骤来决定语句的循环执行。通过

40、三个步骤来决定语句的循环执行。注意注意:循环语句只能在循环语句只能在always或或initial块中使用。块中使用。6.5循环语句循环语句for语句语句for语句的一般形式为:语句的一般形式为:for(表达式(表达式1;表达式;表达式2;表达式;表达式3)语句语句 通过以下三个步骤来决定语句的循环执行。通过以下三个步骤来决定语句的循环执行。a)先给确定循环次数的变量赋初值。先给确定循环次数的变量赋初值。b)判判定定控控制制循循环环的的表表达达式式的的值值,如如为为假假则则跳跳出出循循环环语句,如为真则执行指定的语句后,转到第三步。语句,如为真则执行指定的语句后,转到第三步。c)执执行行一一条

41、条赋赋值值语语句句来来修修正正控控制制循循环环变变量量次次数数的的变变量量的值,然后返回第二步。的值,然后返回第二步。它的执行过程如下:它的执行过程如下:1)1) 先求解表达式先求解表达式1 1;2)2) 求求解解表表达达式式2 2,若若其其值值为为真真(非非0)0),则则执执行行forfor语语句句中中指指定定的的内内嵌嵌语语句句,然然后后执执行行下下面面的的第第3 3步步。若若为为假假(0)(0),则结束循环,转到第则结束循环,转到第5 5步。步。3)3) 若若表表达达式式为为真真,在在执执行行指指定定的的语语句句后后,求求解解表表达达式式3 3。4)4) 转回上面的第转回上面的第2 2步

42、骤继续执行。步骤继续执行。5)5)执行执行forfor语句下面的语句。语句下面的语句。用用for语句描述的七人投票表决器语句描述的七人投票表决器module voter7(pass,vote);output pass;input6:0 vote;reg2:0 sum;integer i;reg pass;always (vote) beginsum=0;for(i=0;i=6;i=i+1) /for语句语句if(votei) sum=sum+1;if(sum2) pass=1; /若超过若超过4人赞成,则人赞成,则pass=1else pass=0; endendmodule用用for语句实现

43、两个语句实现两个8位二进制数的乘法位二进制数的乘法 module mult_for(outcome, a, b);parameter size=8;inputsize:1 a,b;output2*size:1 outcome;reg2*size:1 outcome;integer i;always (a or b)begin outcome=0;for(i=1;i=size;i=i+1)if(bi)outcome=outcome+(a(i-1);endendmodulerepeat语句语句 repeat语句的使用格式为:语句的使用格式为:repeat(循环次数表达式)(循环次数表达式)语句;语

44、句;或或repeat(循环次数表达式)(循环次数表达式)beginend用用repeat实现实现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(size) /repeat语句,语句,size为循环次数为循环次数beginif(te

45、mp_b1) /如果如果temp_b的最低位为的最低位为1,就执行下面的加法,就执行下面的加法outcome=outcome +temp_a;temp_a=temp_a1; /操作数操作数b右移一位右移一位endendendmodulewhile语句语句while语句的使用格式如下:语句的使用格式如下:while(循环执行条件表达式)语句;(循环执行条件表达式)语句;或或while(循环执行条件表达式)(循环执行条件表达式) begin begin end endwhile语语句句在在执执行行时时,首首先先判判断断循循环环执执行行条条件件表表达达式式是是否否为为真真,若若为为真真的的话话,执执

46、行行后后面面的的语语句句或或语语句句块块,然然后后再再回回头头判判断断循循环环执执行行条条件件表表达达式式是是否否为为真真,为为真真的的话话,再再执执行行一一遍遍后后面面的的语语句句,如如此此不不断断重重复复,知知道道表表达达式式不不为为真真,因因此此在在执执行行该该语语句句中中,必必须有一条改变循环执行条件表达式的值的语句。须有一条改变循环执行条件表达式的值的语句。例例1: integer count; initial begin count=0; while (count128) count =count + 1; endfor循环语句实际上相当于采用循环语句实际上相当于采用while循环

47、语循环语句建立以下的循环结构:句建立以下的循环结构:begin循环变量赋初值;循环变量赋初值;while(循环结束条件循环结束条件)begin执行语句执行语句循环变量增值循环变量增值;endend这这样样对对于于需需要要8 8条条语语句句才才能能完完成成的的一一个个循循环环控控制制,forfor循循环环语语句句只只需需两条即可。两条即可。forever语句语句forever语句的使用格式如下:语句的使用格式如下:forever语句;语句;或或forever begin begin end end forever forever循环语句不包含任何条件表达式,只执行无限循环,循环语句不包含任何条件

48、表达式,只执行无限循环,直到遇到系统任务直到遇到系统任务$finish$finish为止。常用于产生周期性的波形,为止。常用于产生周期性的波形,用来作为仿真测试信号。用来作为仿真测试信号。它与它与alwaysalways语句不同处在于不能独立语句不同处在于不能独立写在程序中,而必须写在写在程序中,而必须写在initialinitial块中。块中。例:例: reg clock; initial begin clock=1b0; forever #10 clock = clock; end6.6编译指示语句编译指示语句Verilog允允 许许 在在 程程 序序 中中 使使 用用 特特 殊殊 的的

49、编编 译译 向向 导导 ( CompilerDirectives)语语句句,在在编编译译时时,通通常常先先对对这这些些向向导导语语句句进进行行“预处理预处理”,然后再将预处理的结果和源程序一起进行编译。,然后再将预处理的结果和源程序一起进行编译。 向向导导语语句句以以符符号号“”开开头头,以以区区别别于于其其它它语语句句。Verilog提提供供了了十十几几条条编编译译向向导导语语句句,如如:define、ifdef、else、endif、restall等等。比比较较常常用用的的有有define,include和和ifdef、else、endif等。等。宏替换宏替换define define语语

50、句句用用于于将将一一个个简简单单的的名名字字或或标标志志符符(或或称称为为宏宏名名)来来代替一个复杂的名字或字符串,其使用格式为:代替一个复杂的名字或字符串,其使用格式为:define宏名(标志符)宏名(标志符)字符串字符串 如:如:define sum ina+inb+inc+inddefine sum ina+inb+inc+ind 在上面的语句中,用简单的宏名在上面的语句中,用简单的宏名sum来代替了一个复杂的表来代替了一个复杂的表达式达式ina+inb+inc+ind,采用了这样的定义形式后,在后面的程,采用了这样的定义形式后,在后面的程序中,就可以直接用序中,就可以直接用sum来代表

51、表达式来代表表达式ina+inb+inc+ind了。了。assignout=sum+ine;与与assignout=ina+inb+inc+ind+ine;是完全等价的。是完全等价的。宏替换宏替换define 特点:特点:define用用于于将将一一个个简简单单的的宏宏名名来来代代替替一一个个字字符符串串或或一一个个复复杂的表达式。杂的表达式。宏定义语句行末不加分号,这一点需要注意。宏定义语句行末不加分号,这一点需要注意。在在引引用用已已定定义义的的宏宏名名时时,不不要要忘忘了了在在宏宏名名的的前前面面加加上上符符号号“”,以表示该名字是一个宏定义的名字。,以表示该名字是一个宏定义的名字。采用

52、宏定义,可以简化程序的书写,也便于修改。采用宏定义,可以简化程序的书写,也便于修改。文件包含文件包含include include是是文文件件包包含含语语句句,它它可可将将一一个个文文件件全全部部包包含含到到另另一一个个文件中。其格式为:文件中。其格式为:include“文件名文件名”使用使用include语句时应注意以下几点:语句时应注意以下几点:(1)一个)一个include语句只能指定一个被包含的文件。语句只能指定一个被包含的文件。(2)include语语句句可可以以出出现现在在源源程程序序的的任任何何地地方方。被被包包含含的的文文件件若与包含文件不在同一个子目录下,必须指明其路径名。若

53、与包含文件不在同一个子目录下,必须指明其路径名。(3)文文件件包包含含允允许许多多重重包包含含,比比如如文文件件1包包含含文文件件2,文文件件2又又包包含文件含文件3等。等。6.7 6.7 任务和函数任务和函数任务和函数任务和函数在行为级设计中,经常需要在程序的多个不同地方实现在行为级设计中,经常需要在程序的多个不同地方实现同样的功能。这表明有必要把这些公共的部分提取出来,将同样的功能。这表明有必要把这些公共的部分提取出来,将其组成子程序,然后在需要的地方调用这些子程序,以避免其组成子程序,然后在需要的地方调用这些子程序,以避免重复编码。重复编码。 绝大多数程序设计语言都提供了过程或子程序来达

54、到绝大多数程序设计语言都提供了过程或子程序来达到这个目的。同样,这个目的。同样,verilogverilog语言提供的任务和函数可以将较大语言提供的任务和函数可以将较大的行为级设计划分为较小的代码段,允许的行为级设计划分为较小的代码段,允许verilogverilog设计者将在设计者将在多个地方位用的相同代码提取出来,编写成多个地方位用的相同代码提取出来,编写成任务和函数任务和函数。Verilog的任务及函数区别和联系任务(任务(task)task)通常用于调试,或对硬件进行行为描述通常用于调试,或对硬件进行行为描述可以包含时序控制(可以包含时序控制(# #延迟,延迟, 等)等)可以有可以有

55、inputinput,outputoutput,和,和inoutinout参数参数可以调用其他任务或函数可以调用其他任务或函数函数函数(function)(function)通常用于计算,或描述组合逻辑通常用于计算,或描述组合逻辑不能包含任何延迟;函数仿真时间为不能包含任何延迟;函数仿真时间为0 0只含有只含有inputinput参数并由函数名返回一个结果参数并由函数名返回一个结果可以调用其他函数,但不能调用任务可以调用其他函数,但不能调用任务区别区别6.7任务与函数任务与函数 任务(任务(task)任务定义格式:任务定义格式:task;/注意无端口列表注意无端口列表端口及数据类型声明语句;端

56、口及数据类型声明语句;其它语句;其它语句;endtask任务调用的格式为:任务调用的格式为:(端口(端口1,端口,端口2,);需要注意的是:任务调用时和定义时的端口变量应是一一需要注意的是:任务调用时和定义时的端口变量应是一一对应的。对应的。 任务举例任务举例1module alutask (code, a, b, c);input1:0 code;input3:0 a, b;output4:0 c;reg4:0 c;task my_and; /任务定义,注意无端口列表任务定义,注意无端口列表input3:0 a,b; /a, b, out 名称的作用域范围为名称的作用域范围为task 任务内

57、部任务内部output4:0 out;integer i;beginfor(i=3;i=0;i=i-1)outi=ai&bi; /按位与按位与endendtaskalways(code or a or b)begincase(code)2b00: my_and (a, b, c); /* 调用任务调用任务my_and,需注意,需注意端口列表的顺序应与任务定义中的一致,这里的端口列表的顺序应与任务定义中的一致,这里的a,b,c分分别对应任务定义中的别对应任务定义中的a,b,out */2b01: c=a|b; /或或2b10: c=a-b; /相减相减2b11: c=a+b; /相加相加endc

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

59、任任务务可可以以调调用用别别的的任任务务和和函函数数,可可以以调调用用的的任任务务和和函函数数个数不限。个数不限。7.2 Verilog 函数函数函数函数(function)(function)类似于其它编程语言中的函数概念。与任务一类似于其它编程语言中的函数概念。与任务一样,样,Verilog HDLVerilog HDL语言中的函数使用包括了函数的定义和函数语言中的函数使用包括了函数的定义和函数的调用。的调用。1. 1. 函数的定义函数的定义函数定义的语法如下:函数定义的语法如下:function function ; beginbegin endendendfunctionendfunc

60、tion其中:关键词其中:关键词function function 和和endfunctionendfunction表示这部分语句是表示这部分语句是一个函数定义结构,一个函数定义结构,functionfunction语句标识着这个函数定义结语句标识着这个函数定义结构的开头;构的开头;endfunctionendfunction语句标识着函数定义结构的结尾。语句标识着函数定义结构的结尾。“ ”是为被定义函数所取的一个名称,对被是为被定义函数所取的一个名称,对被定义函数的调用是通过这个函数名来进行的。这个函数名定义函数的调用是通过这个函数名来进行的。这个函数名在函数定义结构内部还代表着一个内部变量

61、,函数调用后在函数定义结构内部还代表着一个内部变量,函数调用后的返回值是通过这个函数名变量传递给调用语句的返回值是通过这个函数名变量传递给调用语句( (调用语句调用语句就是对函数进行了调用的语句就是对函数进行了调用的语句) )的。的。“”是可选的,它用来对函是可选的,它用来对函数调用返回数据的类型或宽度进行说明数调用返回数据的类型或宽度进行说明(这个数据是通这个数据是通过函数名返回的过函数名返回的),它可以有如下形式:,它可以有如下形式: “msb:lsbmsb:lsb”:这种形式说明函数名所代表的返回数据:这种形式说明函数名所代表的返回数据变量是一个多位的寄存器变量,它的位数由变量是一个多位

62、的寄存器变量,它的位数由msb:lsbmsb:lsb指定,比如如下函数定义语句:指定,比如如下函数定义语句:function 7:0 adderfunction 7:0 adder; 就定义了一个函数就定义了一个函数“adderadder”,它的函数名,它的函数名“adderadder”还代表着一个还代表着一个8 8位宽的寄存器变量,其最高位位宽的寄存器变量,其最高位为第为第7 7位,最低位为第位,最低位为第0 0位。位。函数的主要特性函数的主要特性函数定义中不能包含任何时序控制语句。函数定义中不能包含任何时序控制语句。函数至少有一个输入,不能包含任何输出或双向端口。函数至少有一个输入,不能包

63、含任何输出或双向端口。函数只返回一个数据,其缺省为函数只返回一个数据,其缺省为regreg类型。类型。传送到函数的参数顺序和函数输入参数的说明顺序相同。传送到函数的参数顺序和函数输入参数的说明顺序相同。函数在模块(函数在模块(module)module)内部定义。内部定义。函数不能调用任务,但任务可以调用函数。函数不能调用任务,但任务可以调用函数。函数举例函数举例function7:0 get0;input7:0 x;reg7:0 count;integer i; begin count=0; for (i=0;i=7;i=i+1) if(xi=1b0) count=count+1; get0

64、=count; endendfunction 上上面面的的get0函函数数循循环环核核对对输输入入数数据据x的的每每一一位位,计计算算出出x中中0的的个数,并返回一个适当的值。个数,并返回一个适当的值。在进行函数定义时必须注意:在进行函数定义时必须注意:(1) (1) 与任务一样,函数定义结构只能出现在模块中,而不能出现与任务一样,函数定义结构只能出现在模块中,而不能出现在过程块内。在过程块内。(2) (2) 函数至少必须有一个输入端口。函数至少必须有一个输入端口。(3) (3) 函数不能有任何类型的输出端口函数不能有任何类型的输出端口(output(output端口端口) )和双向端口和双向

65、端口(inout(inout端口端口) )。(4) (4) 在函数定义结构中的行为语句部分内不能出现任何类型的时在函数定义结构中的行为语句部分内不能出现任何类型的时间控制描述,也不允许使用间控制描述,也不允许使用disabledisable终止语句。终止语句。(5) (5) 与任务定义一样,函数定义结构内部不能出现过程块。与任务定义一样,函数定义结构内部不能出现过程块。(6) (6) 在一个函数内可以对其它函数进行调用,但是函数不能调用在一个函数内可以对其它函数进行调用,但是函数不能调用其它任务。其它任务。(7) (7) 在第一行在第一行“functionfunction”语句中不能出现端口名

66、列表语句中不能出现端口名列表。2. 2. 函数的调用函数的调用函数调用的格式如下:函数调用的格式如下: ( (1, 2, )m );其中,其中,m m个个“ ”与函数定义结构中说明的各个输与函数定义结构中说明的各个输入端口一一对应,它们代表着各个输入端口的输入数据。这入端口一一对应,它们代表着各个输入端口的输入数据。这些输入表达式的排列顺序及类型必须与各个输入端口在函数些输入表达式的排列顺序及类型必须与各个输入端口在函数定义结构中的排列顺序及类型保持严格一致。定义结构中的排列顺序及类型保持严格一致。在调用函数时必须注意如下两点:在调用函数时必须注意如下两点:(1) (1) 函数的调用不能单独作

67、为一条语句出现,它只能作为一函数的调用不能单独作为一条语句出现,它只能作为一个操作数出现在调用语句内。个操作数出现在调用语句内。例如,下面这条语句对前面所定义的函数例如,下面这条语句对前面所定义的函数“getbytegetbyte”进行进行了调用:了调用:out = getbyte( input1out = getbyte( input1,number)number);在这条调用语句中,函数调用部分在这条调用语句中,函数调用部分“getbyte( input1getbyte( input1,number)number)”被看作是一个操作数,这个操作数的取值就是函数调被看作是一个操作数,这个操作

68、数的取值就是函数调用的返回值。在整个调用语句中,函数调用部分是作为用的返回值。在整个调用语句中,函数调用部分是作为“赋值表赋值表达式达式”出现在整条过程赋值语句中的,函数调用部分不能单独地出现在整条过程赋值语句中的,函数调用部分不能单独地作为一条语句出现,这就是说语句作为一条语句出现,这就是说语句“getbyte(input1getbyte(input1,number)number);”是非法的。是非法的。函数举例函数举例module code_83(din,dout);input7:0 din;output2:0 dout;function2:0 code;input7:0 din; cas

69、ex(din) 8b1xxx_xxxx:code=3h7; 8b01xx_xxxx:code=3h6; 8b001x_xxxx:code=3h5; 8b0001_xxxx:code=3h4; 8b0000_1xxx:code=3h3; 8b0000_01xx:code=3h2; 8b0000_001x:code=3h1; 8b0000_000x:code=3h0; default:code=3hx;endfunctionassign dout=code(din);endmodule 函数举例函数举例modulefunct(clk,n,result,reset);inputreset,clk;i

70、nput3:0n;output31:0result;reg31:0result;always(posedgeclk)beginif(!reset)result=0;elsebeginresult=2*factorial(n);endendfunction31:0factorial;Input3:0opa;reg3:0i;beginfactorial=opa?1:0;for(i=2;i=opa;i=i+1)factorial=i*factorial;endendfunction任务与函数的比较任务与函数的比较 6.8顺序执行与并发执行顺序执行与并发执行两个或更多个两个或更多个“always”过程

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

72、,a;always (posedge clk) begin q=q; a=q; endendmodule顺序执行模块顺序执行模块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综合结果综合结果思考与练习思考与练习 6-1试编写求补码的试编写求补码的Ve

73、rilog程序,输入是带符号的程序,输入是带符号的8位二进制数。位二进制数。6-2试编写两个四位二进制数相减的试编写两个四位二进制数相减的Verilog程序。程序。6-3有一个比较电路,当输入的一位有一个比较电路,当输入的一位8421BCD码大于码大于4时,输出为时,输出为1,否,否则为则为0。试编写出。试编写出Verilog程序。程序。6-4试编写一个实现试编写一个实现3输入与非门的输入与非门的Verilog源程序。源程序。6-5用用Verilog语言设计一个类似语言设计一个类似74138的译码器电路,用的译码器电路,用Synplify软件对软件对设计文件进行综合,观察设计文件进行综合,观察RTL级综合视图和门级综合视图。级综合视图和门级综合视图。6-6用用Verilog语言设计一个功能类似语言设计一个功能类似74161的电路,用的电路,用Synplify软件对设软件对设计文件进行综合,观察计文件进行综合,观察RTL级综合视图和门级综合视图。级综合视图和门级综合视图。6-7用用Verilog设计一个设计一个8位加法器,用位加法器,用QuartusII软件进行综合和仿真。软件进行综合和仿真。6-8用用Verilog设计一个设计一个8位计数器,用位计数器,用QuartusII软件进行综合和仿真。软件进行综合和仿真。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号