EDA技术与Verilog设计王金明版第6章.ppt
《EDA技术与Verilog设计王金明版第6章.ppt》由会员分享,可在线阅读,更多相关《EDA技术与Verilog设计王金明版第6章.ppt(88页珍藏版)》请在三一办公上搜索。
1、第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)顺序执行与并发执行,Verilog HDL行为语句,6.1 过程语句,一、initial和alwaysinitial 从0时刻起,顺序执行其后的块语句一次;always 从0时刻起(若带有触发条件
2、的话,则从触发时刻起),反复执行其后的块语句多次,仅当碰到诸如$finish之类的结束控制语句之后,才能停止循环过程,initial 过程块的使用主要是面向功能模拟的,通常用来描述测试模块的初始化、监视、波形生成等功能;always过程块的使用主要是对硬件功能模拟的行为进行描述,也可以在测试模块用来对时钟进行描述。利用always过程块可以实现触发器、锁存器和组合电路。一个模块中可有多个initial和always语句,代表多个过程块的存在,它们之间相互独立,并行运行,1.always过程语句使用模板,always()begin/过程赋值/if-else,case,casex,casez选择语
3、句/while,repeat,for循环/task,function调用end“always”过程语句通常是带有触发条件的,触发条件写在敏感信号表达式中,只有当触发条件满足时,其后的“begin-end”块语句才能被执行。,敏感信号表达式“event-expression”,敏感信号表达式又称事件表达式或敏感信号列表,即当该表达式中变量的值改变时,就会引发块内语句的执行。因此敏感信号表达式中应列出影响块内取值的所有信号。若有两个或两个以上信号时,它们之间用“or”连接。例如:(a)/当信号a的值发生改变(a or b)/当信号a或信号b的值发生改变(posedge clock)/当clock
4、的上升沿到来时(negedge clock)/当clock 的下降沿到来时(posedge clk or negedge reset)/当clk的上升沿到来或reset信号的下降沿到来,敏感信号列表举例(4选1数据选择器),module mux4_1(out,in0,in1,in2,in3,sel);output 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;2
5、b11:out=in3;default:out=2bx;endcaseendmodule,敏感信号分为两类:边沿敏感型;电平敏感型,每一个always过程最好由一种类型的敏感信号来触发,而不要将边沿敏感型和电平敏感型信号列在一起,比如:always(posedge clk or posedge clr)/边沿型always(A or B)/两个敏感信号都是电平敏感型always(posedge clk or clr)/不建议这样用,最好不要将边沿敏感型和电平敏感型信号列在一起,posedge和negedge关键字,对于时序电路,事件通常是由时钟边沿触发的,为表达边沿这个概念,Verilog提供
6、了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 out=out+1;/计数 endendmodule,posedge和negedge关键字,always(posedge
7、clk or posedge clear)/clear信号上升沿到来时清零,故高电平清零有效always(posedge clk or negedge clear)/clear信号下降沿到来时清零,故低电平清零有效注意:块内的逻辑描述要与敏感信号表达式中信号的有效电平一致。下面描述错误:always(posedge clk or negedge clear)begin if(clear)out=0;out=in;else end,2、always语句:其声明格式如下:always always语句包括的所有行为语句构成了一个always块。该块从仿真0时刻开始顺序执行其中的语句。在仿真过程中不
8、断重复执行的。always语句由于其不断重复执行的特性,只有和一定的时序控制结合在一起才有用。如果一个always语句没有时序控制,则这个always语句将会成为一个仿真死锁。例:always areg=areg;这个always语句将会生成一个0延迟的无限循环跳变过程,这时会发生仿真死锁。,如果加上时序控制,则这个always语句将变为一条非常有用的描述语句。见下例:例:always#half_period areg=areg;这个例子生成了一个周期为:period(=2*half_period)的无限延续的信号波形,常用这种方法来描述时钟信号,作为激励信号来测试所设计的电路。Verilog
9、提供三种时序控制方法:基于延迟的时序控制、基于事件的时序控制和电平敏感的时序控制。,timescale 1ns/1nsmodule clk_gen_demo(clock1,clock2);output clock1,clock2;reg clock1,clock2;initial/完成时钟信号的初始化beginclock1=0;clock2=1;#500$finish;endalways#50 clock1=clock1;always#100 clock2=clock2;endmodule,用always过程块实现复杂组合逻辑电路,例:用always过程语句描述简单算术逻辑单元。define
10、add 3d0define minus 3d1define band 3d2define bor 3d3define bnot 3d4module alu(out,opcode,a,b);input2:0 opcode;/操作码input7:0 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 endcaseendendmodule,边沿触发的always块常常描述时序逻辑,如果符合可综合风格要求可用综合工具自动转换为表示
11、时序逻辑的寄存器组和门级逻辑,而电平触发的always块常常用来描述组合逻辑和锁存器,如果符合可综合风格要求可转换为表示组合逻辑的门级逻辑或锁存器。一个模块中可以有多个always块,它们都是并行运行的。,2.initial过程语句,initial语句使用格式 initial begin 语句1;语句2;endinitial语句不带触发条件,initial过程中的语句块沿时间轴只执行一次。initial语句通常用于仿真模块中对激励向量的描述,或用于给寄存器变量赋初值,它是面向模拟仿真的过程语句,通常不能被逻辑综合工具所接受。,用initial过程语句对测试变量赋值,timescale 1ns/
12、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,例1:initial begin areg=0;/初始化寄存器areg memoryindex=0;end在这个例子中用initial语句在仿真开始时对各变量进行初始化。,6.2 块语句,块语句通常用来将两条或多条语句组合在一起,使其在格式上看更象一条语句。块语句有两种,一种是begin_end语句,通常用来标识顺序执行的语句,用它来标识的块称为顺序块。一种是
13、fork_join语句,通常用来标识并行执行的语句,用它来标识的块称为并行块。下面进行详细的介绍。,6.2 块语句,块语句是由块标志符begin-end或fork-join界定的一组语句,当块语句只包含一条语句时,块标志符可以缺省。begin-end串行块中的语句按串行方式顺序执行。比如:beginregb=rega;regc=regb;end由于begin-end块内的语句顺序执行,在最后,将regb、regc 的值都更新为rega的值,该begin-end块执行完后,regb、regc 的值是相同的。,6.2 块语句,并行块fork-joinfork-join块中的所有语句是并发执行的。比
14、如:forkregb=rega;regc=regb;join由于fork-join块内的语句同时执行,在上面的块语句执行完后,regb更新为rega的值,而regc的值更新为没有改变前regb的值,故执行完成后,regb与regc的值是不同的。,6.3 赋值语句,1、持续赋值语句(Continuous Assignments)assign为持续赋值语句,主要用于对wire型变量的赋值。比如:assign c=a/持续赋值,如果sel为0,则out=a;否则out=bendmodule,2、过程赋值语句:过程赋值语句可以给寄存器、整数、时间变量赋值。连续赋值语句总是处于活动状态,而过程赋值语句只
15、有在执行到的时候才会起作用。在Verilog HDL语言中,信号有两种赋值方式:(1).非阻塞(Non_Blocking)赋值方式(如 b=a;),1)它不会阻塞位于同一个顺序块中其后语句的执行。同一顺序块中的语句并发执行。2)b的值并不是立刻就改变的,块结束后才完成赋值操作。(2).阻塞(Blocking)赋值方式(如 b=a;)1)顺序块中的阻塞赋值语句按顺序执行。2)b的值在赋值语句执行完后立刻就改变。,非阻塞赋值方式和阻塞赋值方式的区别常给设计人员带来问题。问题主要是给“always”块内的reg型信号的赋值方式不易把握。一般情况下,如果用一个always块来描述时序电路,这个的“al
16、ways”模块内的reg型信号都是采用下面的非阻塞赋值方式:b=a;,例1:always(posedge clk)begin b=a;c=b;end例1 中的always块中用了非阻塞赋值方式,定义了两个reg型信号b和c,clk信号的上升沿到来时,b就等于a,c就等于b,这里应该用到了两个触发器。请注意:赋值是在always块结束后执行的,c应为原来b的值。这个always块实际描述的电路功能如下图所示:,例2:always(posedge clk)begin b=a;c=b;end例2中的 always块用了阻塞赋值方式。clk信号的上升沿到来时,将发生如下的变化:b马上取a的值,c马上取
17、b的值(即等于a),生成的电路图如下所示只用了一个触发器来寄存器a的值,又输出给b和c。这大概不是设计者的初衷,如果采用例1所示的非阻塞赋值方式就可以避免这种错误。,阻塞赋值与非阻塞赋值,非阻塞赋值仿真波形图,阻塞赋值仿真波形图,用阻塞方式完成与上述非阻塞赋值同样的功能,可用两个always块来实现,其中,两个always过程块是并发执行的。module non-block(c,b,a,clk);input clk,a;output c,b;reg c,b;always(posedge clk)begin b=a;end always(posedge clk)begin c=b;end end
18、module,阻塞赋值与非阻塞赋值,在可综合的硬件设计中,使用阻塞和非阻塞赋值语句时,应注意以下原则(1)当用“always”块来描述组合逻辑时,既可以用阻塞赋值,也可以采用非阻塞赋值,应尽量使用阻塞赋值。(2)对时序逻辑描述和建模,使用非阻塞赋值方式。(3)为锁存器(Latch)建模,应尽量使用非阻塞赋值。(4)若在同一个“always”过程块中既为组合逻辑建模,又为时序逻辑建模,最好使用非阻塞赋值方式。(5)在一个“always”过程块中,最好不要混合使用阻塞赋值和非阻塞赋值,虽然同时使用这两种赋值方式在综合时并不一定会出错,但对同一个变量不能既进行阻塞赋值,又进行非阻塞赋值,这样在综合时
19、会报错。(6)不能在两个个或两个以上的“always”过程块中对同一个变量赋值,这样会引发冲突,在综合时会报错。(7)使用$strobe显示非阻塞赋值的变量。,6.4 条件语句,(if-else语句)if-else语句使用方法有以下3种:(1)if(表达式)语句1;(2)if(表达式)语句1;else 语句2;(3)if(表达式1)语句1;else if(表达式2)语句2;else if(表达式3)语句3;else if(表达式n)语句n;else 语句n+1;条件语句必须在过程块语句中使用。所谓过程块语句是指由initial和always语句引导的执行 语句集合,除这两种块语句引导的begi
20、n end块中可以编写条件语句外,模块中的其他地方都不能编写。,if(条件表达式)块语句;若条件表达式成立(即值为1,若为0、x、z均为不成立)执行后面的块语句,否则不执行。,if(条件表达式)块语句1 else 块语句2若条件表达式成立执行块语句1,否则执行块语句2,if(条件表达式1)块语句1 else if(条件表达式2)块语句2 else if(条件表达式n)块语句n else 块语句n+1,说明,(1)3种形式的if语句中在if后面都有“表达式”,一般为逻辑表达式或关系表达式,系统对表达式的值进行判断,若为0,x,z,按“假”处理;若为1,按“真”处理,执行指定的语句。(2)第2,3
21、种形式的if语句,在每个else前面有一分号,整个语句结束处有一分号。例如:if(ab)out1=int1;else out1=int2;,说明,(3)在if和else后面可以包含一个内嵌的操作语句,也可以有多个操作语句,此时用begin和end这两个关键字将几个语句包含起来成为一个复合块语句 例如:if(ab)begin out1=int1;out2=int2;end else begin out1=int2;out2=int1;end,说明,(4)允许一定形式的表达式简写方式 例如:if(expression)等同与 if(expression=1)if(!expression)等同与 i
22、f(!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;always(posedge clk)/clk上升沿时刻计数 begin if(reset)qout=0;/同步复位 else if(load)qout=data;/同步置数 else i
23、f(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;/低位不为9,则加1endendassign cout=(qout=8h59)/产生进位输出信号enmodule,case语句是一种多分支语句,故case语句多用于多条件译码电路,如描述译码器、数据选择器等,case语句有case、casez、casex三种表示方法。case语句的使用格式如下。ca
24、se(敏感表达式)值1:语句1;/case分支项 值2:语句2;值n:语句n;default:语句n+1;endcase,case语句,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=7b
25、1111001;4d4:decodeout=7b0110011;4d5:decodeout=7b1011011;4d6:decodeout=7b1011111;4d7:decodeout=7b1110000;4d8:decodeout=7b1111111;4d9:decodeout=7b1111011;default:decodeout=7bx;endcase endendmodule,Verilog HDL针对电路的特性提供了case语句的其它两种形式用来处理case语句比较过程中的不必考虑的情况(dont care condition)。其中casez语句用来处理不考虑高阻值z的比较过程,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 技术 Verilog 设计 王金明版第
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-5428619.html