收藏 分销(赏)

Verilog行为描述高级语句PPT课件.ppt

上传人:可**** 文档编号:744181 上传时间:2024-02-29 格式:PPT 页数:40 大小:379KB
下载 相关 举报
Verilog行为描述高级语句PPT课件.ppt_第1页
第1页 / 共40页
Verilog行为描述高级语句PPT课件.ppt_第2页
第2页 / 共40页
点击查看更多>>
资源描述
第四讲 行为描述高级语句 过程语句(过程语句(initialinitial、alwaysalways)块语句(块语句(begin-endbegin-end、fork-joinfork-join)赋值语句(赋值语句(assignassign、=、=)条件语句(条件语句(if-elseif-else、casecase、casezcasez、casexcasex)循环语句(循环语句(forfor、foreverforever、repeatrepeat、whilewhile)编编译译指指示示语语句句(definedefine、includeinclude、ifdefifdef、elseelse、endifendif)任务(任务(tasktask)与与 函数(函数(functionfunction)顺序执行与并发执行顺序执行与并发执行1.Verilog HDL行为语句类别语句可综合性过程语句initialalways块语句串行块begin-end并行块fork-join赋值语句持续赋值assign过程赋值=、=条件语句if-elsecase循环语句forrepeatwhileforever编译向导语句defineincludeifdef,else,endif2.4.1 过程语句 initial alwayso在一个模块(module)中,使用initial和always语句的次数是不受限制的。initial语句常用于仿真中的初始化,initial过程块中的语句仅执行一次;always块内的语句则是不断重复执行的,always结构在仿真过程中是时刻活动的。3.always过程语句使用模板always()begin/过程赋值/if-else,case,casex,casez选择语句/while,repeat,for循环/task,function调用end“always”过程语句通常是带有触发条件的,触发条件写在敏感信号表达式中,只有当触发条件满足时,其后的“begin-end”块语句才能被执行。4.敏感信号表达式敏感信号表达式又称事件表达式或敏感信号列表,即当该表达式中变量的值改变时,就会引发块内语句的执行。因此敏感信号表达式中应列出影响块内取值的所有信号。若有两个或两个以上信号时,它们之间用“or”连接。alwaysalways(a)a)/当信号a a的值发生改变 alwaysalways(a or b)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的上升沿到来或resetreset信号的下降沿到来电平敏感,组合逻辑电路采用边沿敏感,时序逻辑用。不要混用5.敏感信号列表举例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;endcaseendmodule4选1数据选择器6.posedge和negedge关键字对于时序电路,事件通常是由时钟边沿触发的,为表达边沿这个概念,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上升沿触发 begin if(!reset)out=8h00;/同步清0,低电平有效 else if(load)out=data;/同步预置 else out=out+1;/计数 endendmodule7.4.2 块语句o块语句是由块标志符begin-end或fork-join界定的一组语句,当块语句只包含一条语句时,块标志符可以缺省。n顺序块,以关键字beginend将多条语句封装成块。按顺序执行。beginregb=rega;regc=regb;end由于begin-end块内的语句顺序执行,在最后,将regb、regc的值都更新为rega的值,该begin-end块执行完后,regb、regc的值是相同的。8.n并行块(了解即可)o以关键字fork join将多条语句封装成块 o所有语句并行执行initial fork a=0;#5 b=1;#10 c=a,b;#15 d=b,a;join并行块容易引起竞争适用于绝对时间的控制实际建模时,并行块不可综合。用于仿真。仅用顺序块即可9.4.3 过程赋值语句 o行为级的赋值语句o必须出现在initial和always结构中o过程赋值语句的左端都必须是reg类型o分为阻塞性赋值和非阻塞性赋值 10.非阻塞(non_blocking)赋值方式赋值符号为“=”,如:b=a;非阻塞赋值在整个过程块结束时才完成赋值操作,即b的值并不是立刻就改变的。实际并行。阻塞(blocking)赋值方式赋值符号为“=”,如:b=a;阻塞赋值在该语句结束时就立即完成赋值操作,即b的值在该条语句结束后立刻改变。如果在一个块语句中,有多条阻塞赋值语句,那么在前面的赋值语句没有完成之前,后面的语句就不能被执行,仿佛被阻塞了(blocking)一样,因此称为阻塞赋值方式。实际顺序执行。11.阻塞赋值与非阻塞赋值 非阻塞赋值module non_block(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;endendmodule12.阻塞赋值与非阻塞赋值非阻塞赋值综合结果:阻塞赋值综合结果13.阻塞赋值与非阻塞赋值非阻塞赋值仿真波形图 阻塞赋值仿真波形图 14.4.4 条件语句o(if-else语句)if-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;15.o关键字为case、default、endcaseocase语句的结构如下。case(敏感表达式)值1:语句1;/case分支项 值2:语句2;值n:语句n;default:语句n+1;endcasecase语句16.注意事项lcase语句中的每个分支条件必须不同,变量的位宽要严格相等,还要使用明确指定宽度的方式,避免使用“d”等不指明宽度的分支条件。lcase语句中的每个分支可以接多条待执行语句,只需要使用beginend即可lcase语句中只能有一个default语句,而且建议使用default,也是为了得到最后综合的电路不会生成锁存器。如2b01:begin out=a-b;sum=a+b;end17.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=7b0110011;4d5:decodeout=7b1011011;4d6:decodeout=7b1011111;4d7:decodeout=7b1110000;4d8:decodeout=7b1111111;4d9:decodeout=7b1111011;default:decodeout=7bx;endcase endendmodule18.简易ALU电路的行为级建模 module my_ALU(out,a,b,select);output 4:0 out;input 3:0 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;endcaseendmodule19.4.5 循环语句repeatinitialbeginfor(i=0;i4;i=i+1)out=out+1;endinitialbeginrepeat(5)out=out+1;endinitialbegini=0;while(i0)i=i+1;endforwhile在Verilog中存在四种类型的循环语句,用来控制语句的执行次数。这四种语句分别为:(1)forever:连续地执行语句;多用在“initial”块中,以生成时钟等周期性波形。(2)repeat:连续执行一条语句n次。(3)while:执行一条语句直到某个条件不满足。(4)for:有条件的循环语句。20.forever循环 o没有条件,永远循环o类似always,但使用在initial里o比较如下两例Initial begin clock=0;forever#10 clock=clock;endinitial clock=0;always#10 clock=clock;21.用forfor语句描述七人投票表决器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)pass=1;/超过4人赞成,则通过else pass=0;endendmodule22.用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(size)/repeat语句,size为循环次数 beginif(temp_b1)/如果temp_b的最低位为1,就执行下面的加法outcome=outcome+temp_a;temp_a=temp_a1;/操作数b右移一位 endendendmodule23.4.6 编译指示语句oVerilog允许在程序中使用特殊的编译向导(CompilerDirectives)语句,在编译时,通常先对这些向导语句进行“预处理”,然后再将预处理的结果和源程序一起进行编译。o 向导语句以符号“”开头,以区别于其它语句。Verilog提供了十几条编译向导语句,如:define、ifdef、else、endif、restall等。比较常用的有define,include和ifdef、else、endif等。24.宏替换define define语句用于将一个简单的名字或标志符(或称为宏名)来代替一个复杂的名字或字符串,其使用格式为:define宏名(标志符)字符串 如:define sum define sum ina+inb+inc+indina+inb+inc+ind 在上面的语句中,用简单的宏名sum来代替了一个复杂的表达式ina+inb+inc+ind,采用了这样的定义形式后,在后面的程序中,就可以直接用sum来代表表达式ina+inb+inc+ind了。25.文件包含include include是文件包含语句,它可将一个文件全部包含到另一个文件中。其格式为:include“文件名”使用include语句时应注意以下几点:l一个include语句只能指定一个被包含的文件。linclude语句可以出现在源程序的任何地方。被包含的文件若与包含文件不在同一个子目录下,必须指明其路径名。l文件包含允许多重包含,比如文件1包含文件2,文件2又包含文件3等。26.4.7 任务与函数 o任务(task)任务定义格式:task;/注意无端口列表 端口及数据类型声明语句;其它语句;endtask任务调用的格式为:(端口1,端口2,);需要注意的是:任务调用时和定义时的端口变量应是一一对应的。27.使用任务时,需注意 任务的定义与调用须在一个module模块内。定义任务时,没有端口名列表,但需要紧接着进行输入输出端口和数据类型的说明。当任务被调用时,任务被激活。任务的调用与模块调用一样通过任务名调用实现,调用时,需列出端口名列表,端口名的排序和类型必须与任务定义中的相一致。一个任务可以调用别的任务和函数,可以调用的任务和函数个数不限。28.o函数的目的是返回一个值,以用于表达式计算函数的定义格式:function 函数名;端口声明;局部变量定义;其它语句;endfunction是一个可选项,如果缺省,则返回值为1位寄存器类型的数据。函数(function)29.函数举例function 7: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=count;endendfunction 上面的get0函数循环核对输入数据x的每一位,计算出x中0的个数,并返回一个适当的值。30.在使用函数时,需注意 函数的定义与调用须在一个module模块内。函数只允许有输入变量且必须至少有一个输入变量,输出变量由函数名本身担任,在定义函数时,需对函数名说明其类型和位宽。定义函数时,没有端口名列表,但调用函数时,需列出端口名列表,端口名的排序和类型必须与定义时的相一致。这一点与任务相同 函数可以出现在持续赋值assign的右端表达式中。函数不能调用任务,而任务可以调用别的任务和函数,且调用任务和函数个数不受限制。31.任务与函数的比较 32.4.8 顺序执行与并发执行两个或更多个“always”过程块、“assign”持续赋值语句、实例元件调用等操作都是同时执行的。在“alwaysalways”模块内部,其语句如果是非阻塞赋值,也是并发执行的;而如果是阻塞赋值,则语句是按照指定的顺序执行的,语句的书写顺序对程序的执行结果有着直接的影响。33.顺序执行的例子顺序执行模块1module serial1(q,a,clk);output q,a;input clk;reg q,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;endendmodule34.顺序执行顺序执行模块1 1仿真波形图 顺序执行模块2 2仿真波形图 35.顺序执行模块1 1综合结果顺序执行模块2 2综合结果36.习 题1 阻塞赋值和非阻塞赋值有什么本质的区别?2 用持续赋值语句描述一个4选1数据选择器。3 用行为语句设计一个8位计数器,每次在时钟的上升沿,计数器加1,当计数器溢出时,自动从零开始重新计数。计数器有同步复位端。4 设计一个4位移位寄存器。5 initial语句与always 语句的关键区别是什么?6 分别用任务和函数描述一个4选1多路选择器。7 总结任务和函数的区别。37.习 题8.在Verilog中,哪些操作是并发执行的,哪些操作是顺序执行的?9.试编写求补码的Verilog程序,输入是带符号的8位二进制数。10.试编写两个4位二进制数相减的Verilog程序。11.有一个比较电路,当输入的一位8421BCD码大于4时,输出为1,否则为0,试编写出Verilog程序。12.用Verilog设计一个类似74138的译码器电路,用Synplify软件对设计文件进行综合,观察RTL级综合视图和门级综合视图。38.实验与设计1.44矩阵键盘检测电路设计实验要求:用Verilog描述44矩阵键盘检测电路44矩阵键盘电路39.2.计数器设计实验要求:设计不同占空比的计数器并进行仿真。(1)对本实验中三个程序进行波形仿真,查看输出波形,比较三个波形的区别,并思考源代码的区别,比较各输出波形的占空比。(2)在完成以上实验的基础上,设计一个带进位输出的模24分频器,要求进位输出端的高电平持续8个时钟周期,低电平持续16个时钟周期,同时具有复位端,复位端低电平有效,进行波形仿真。40.
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 教育专区 > 外语文库 > 高中英语

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服