第6章Verilog行为语句_第1页
第6章Verilog行为语句_第2页
第6章Verilog行为语句_第3页
第6章Verilog行为语句_第4页
第6章Verilog行为语句_第5页
已阅读5页,还剩103页未读 继续免费阅读

下载本文档

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

文档简介

1、 主要内容主要内容类别类别语句语句可综合性可综合性过程语句过程语句initialalways块语句块语句串行块串行块begin-end并行块并行块fork-join赋值语句赋值语句持续赋值持续赋值assign过程赋过程赋值值=、=条件语句条件语句if-elsecase循环语句循环语句forrepeatwhileforever编译向导语句编译向导语句defineincludeifdef, else, endif综合(综合(Synthesis) 将较高层次的设计描述自动转化为较低层次描述的过程;将较高层次的设计描述自动转化为较低层次描述的过程; 综合器是能自动实现上述转换的软件工具,是能将原理图综

2、合器是能自动实现上述转换的软件工具,是能将原理图或或HDL语言描述的电路功能转化为具体电路网表的工具;语言描述的电路功能转化为具体电路网表的工具; 对于设计者而言,采用的描述级别越高,设计越容易。但对于设计者而言,采用的描述级别越高,设计越容易。但对综合器而言,有可能无法将某些抽象级别高的描述转化为对综合器而言,有可能无法将某些抽象级别高的描述转化为电路。因此设计者应了解综合器的性能。电路。因此设计者应了解综合器的性能。 很多综合器可将很多综合器可将HDL文本对应的硬件电路以图形的方式文本对应的硬件电路以图形的方式呈现出来,非常直观,便于学习者建立呈现出来,非常直观,便于学习者建立HDL程序与

3、硬件电路程序与硬件电路之间的对应关系。之间的对应关系。菜单菜单TOOLS/Netlist Viewer-RTL(寄存器传输级寄存器传输级) ViewerC、ASM.程序程序CPUCPU指令指令/ /数据代码:数据代码:010010 100010 1100010010 100010 1100软件程序编译器软件程序编译器 COMPILER软件编译器和硬件综合器区别软件编译器和硬件综合器区别VHDL/VERILOG.程序程序 硬件描述语言硬件描述语言 综合器综合器 SYNTHESIZERSYNTHESIZER为为ASICASIC设计提供的设计提供的 电路网表文件电路网表文件(a)软件语言设计目标流程

4、软件语言设计目标流程(b)硬件语言设计目标流程硬件语言设计目标流程module aoi(a,b,c,d,f);/* 模块名为模块名为aoi,端口列表,端口列表a,b,c,d,f */input a,b,c,d;/模块的输入端口为模块的输入端口为a,b,c,doutput f; /模块的输出端口为模块的输出端口为fwire a,b,c,d,f; /定义信号的数据类型定义信号的数据类型assign f=(a&b)|(c&d); /逻辑功能描述逻辑功能描述endmodule例例4.1“与与-或或-非非”电路电路 o Verilog程序是由模块module构成的。每个模块的内容都嵌在m

5、odule和endmodule两个关键字之间;每个模块实现特定的功能。o 每个模块首先要进行端口定义,并说明输入和输出口(input、output或inout),然后对模块的功能进行定义。o Verilog程序书写格式自由,一行可以写几个语句,一个语句也可以分多行写。o 除了endmodule等少数语句外,每个语句的最后必须有分号。o 可用 /*/ 和 /对Verilog程序作注释。 o 模块声明包括模块名字,模块输入、输出端口列表。模块定义格式如下:module 模块名(端口1,端口2,端口3,);如图1所示,在What is the name of this project的栏目中输入工程

6、的名字,即取名模块名,同时下面的顶层实体名Top-Level Entity也同步显示模块名;与设计文件保存时一致,即模块名.v。如图1所示,在What is the name of this project的栏目中输入工程的名字,即取名模块名,同时下面的顶层实体名Top-Level Entity也同步显示模块名;o 对模块的输入输出端口要明确说明,其格式为:input 端口名1,端口名2, 端口名n;/输入端口输入端口output 端口名1,端口名2, 端口名n;/输出端口输出端口inout 端口名1,端口名2, 端口名n;/输入输出双向端口输入输出双向端口注意:每个端口还要声明其数据类型;注

7、意:每个端口还要声明其数据类型; 输入和双向端口不能声明为寄存器型;输入和双向端口不能声明为寄存器型; 在测试模块中不需要定义端口。在测试模块中不需要定义端口。 输入输出端口数目之和与端口列表的总数目相同!输入输出端口数目之和与端口列表的总数目相同!o 对模块中所用到的所有信号(包括端口信号、节点信号等)都必须进行数据类型的定义。Verilog语言提供了各种信号类型,分别模拟实际电路中的各种物理连接和物理实体。o 如果信号的数据类型没有定义,则综合器将其默认为是wire型。 reg3:0 out; /定义信号定义信号out的数据类型为的数据类型为4位位reg型;型; wire a,b,c,d,

8、f; /定义信号定义信号a,b,c,d,f为为wire(连线)(连线)型型o模块中最核心的部分是逻辑功能定义。o定义逻辑功能的几种基本方法:(1)用assign持续赋值语句定义assign语句多用于组合逻辑的赋值,称为持续赋值方式。 assign cout=(qout=9)?1:0;(2)用always过程块定义always过程语句既可以用来描述组合电路,也可以描述时序电路。 它只有两种状态:等待状态和执行状态,其状态取决于敏感信号,当敏感信号中的任何一个信号发生变化,并满足条件时,过程就会启动并将过程中的语句执行一遍;否则过程处于等待或挂起状态。always (ina,inb,cin)alw

9、ays (posedge clk) / always过程块及敏感信号列表(3)调用元件(元件例化) component instantiation 调用元件的方法类似于在电路图输入方式下调入图形符号来完成设计,这种方法侧重于电路的结构描述。 门元件关键字(); o and a3(out,a,b,c);/*调入一个调入一个三输入与门三输入与门*/3:8 DECODERABG1CG2ANG2BNY0NY1NY2NY3NY4NY5NY6NY7N74138instAND3inst1o (4)调用任务任务task,函数函数function(5)调用其他模块-Chapter7();module();out

10、put输出端口列表;/输出端口声明input输入端口列表;/输入端口声明/*定义数据,信号的类型,函数声明*/reg信号名;/逻辑功能定义assign=;/使用assign语句定义逻辑功能/用always块描述逻辑功能always()begin/过程赋值/if-else,case语句/while,repeat,for循环语句/task,function调用end/调用其他模块-P1777.6();/门元件例化门元件关键字();Endmodule两个或更多个“always”过程块、“assign”持续赋值语句、实例元件调用等操作都是同时执行的。o initialo alwayso 在一个模块(在

11、一个模块(module)中,使用中,使用initial和和always语句的次数是不受限制的。语句的次数是不受限制的。initial语句常用于仿语句常用于仿真中的初始化,真中的初始化,initial过程块中的语句仅执行一过程块中的语句仅执行一次;次;always块内的语句则是不断重复执行的。块内的语句则是不断重复执行的。o N N个个always块是并发执行的。块是并发执行的。o always ()begin/过程赋值过程赋值/if-else,case,casex,casez条件语句条件语句/while,repeat,for循环循环/task,function调用调用endo “always”

12、过程语句通常是带有触发条件的,触发条件过程语句通常是带有触发条件的,触发条件写在敏感信号表达式中,只有当触发条件满足时,其后写在敏感信号表达式中,只有当触发条件满足时,其后的的“begin-end”块语句才能被执行。块语句才能被执行。o 敏感信号表达式又称事件表达式或敏感信号列表,敏感信号表达式又称事件表达式或敏感信号列表,即当该表达式中变量的值改变时,就会引发块内即当该表达式中变量的值改变时,就会引发块内语句的执行。因此语句的执行。因此敏感信号表达式中应列出影响敏感信号表达式中应列出影响块内取值的所有信号。块内取值的所有信号。若有两个或两个以上信号若有两个或两个以上信号时,它们之间用时,它们

13、之间用“or”连接。连接。o 例如:例如: ( (a) a) / /当信号当信号a a的值发生改变的值发生改变 ( (a or b) a or b) / /当信号当信号a a或信号或信号b b的值发生改变的值发生改变 ( (posedgeposedge clock) / clock) /当当clock clock 的上升沿到来时的上升沿到来时 ( (negedgenegedge clock) / clock) /当当clock clock 的下降沿到来时的下降沿到来时 ( (posedgeposedge clkclk or or negedgenegedge reset) reset) / /

14、当当clkclk的上升沿到来或的上升沿到来或resetreset信号的下降沿到来信号的下降沿到来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; 2b11: out=in3; default: out=2bx;endcaseendmodule4

15、选选1数据选择器数据选择器 边沿敏感 电平敏感 always (posedge clk or en)o Xo always (posedge clk or negedge clr)o begino if(clr) out=0; / X /if(!clr)块内的逻辑描述要与敏感信号表达式中信号的有效电平一致o else out=in;o endo 对于时序电路,事件通常是由时钟边沿触发的,为表达边对于时序电路,事件通常是由时钟边沿触发的,为表达边沿这个概念,沿这个概念,Verilog提供了提供了posedge和和negedge关键字来描关键字来描述。比如:述。比如:o 【例】同步置数、同步清零的

16、计数器【例】同步置数、同步清零的计数器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【例例4.11】 带异步清带异步清0/异步置异步置1(低电

17、平有效)的(低电平有效)的D触发器触发器module dff_asyn(q,qn,d,clk,set,reset);input d,clk,set,reset; output reg q,qn;always(posedge clk or negedge set or negedge reset)/下降沿下降沿 beginif(reset) begin q=1b0;qn=1b1; end/异步清异步清0,低电平有效,低电平有效else if(set) begin q=1b1;qn=1b0; end/异步置异步置1,低电平有效,低电平有效else begin q=d;qn=d; end enden

18、dmoduleo 块语句是由块标志符块语句是由块标志符begin-end或并行块或并行块fork-join界定的一界定的一组语句,组语句,当块语句只包含一条语句时,块标志符可以缺省当块语句只包含一条语句时,块标志符可以缺省。o begin-end串行块中的语句按串行块中的语句按串行方式顺序执行串行方式顺序执行。比如:。比如:beginregb=rega;regc=regb;endo 由于由于begin-end块内的语句顺序执行,在最后,将块内的语句顺序执行,在最后,将regb、regc 的值都更新为的值都更新为rega的值,该的值,该begin-end块执行完后,块执行完后,regb、regc

19、 的值是相同的。的值是相同的。assign为持续赋值语句,主要用于对为持续赋值语句,主要用于对wire型变量的赋值。型变量的赋值。比如:比如:assign c=a&b;在上面的赋值中,在上面的赋值中,a、b、c三个变量皆为三个变量皆为wire型变量,型变量,a和和b信号的任何变化,都将随时反映到信号的任何变化,都将随时反映到c上来。上来。5.3.1 net型n Net型数据相当于硬件电路中的各种物理连接,其特点是型数据相当于硬件电路中的各种物理连接,其特点是输出的值紧跟输入值的变化而变化。对连线型有两种驱输出的值紧跟输入值的变化而变化。对连线型有两种驱动方式,一种方式是在结构描述中将其

20、连接到一个门元动方式,一种方式是在结构描述中将其连接到一个门元件或模块的输出端;件或模块的输出端;另一种方式是用持续赋值语句另一种方式是用持续赋值语句assign对其进行赋值。对其进行赋值。n wire是最常用的是最常用的Net型型变量。变量。n wire型变量的定义格式如下:型变量的定义格式如下:wire 数据名数据名1,数据名,数据名2,数据名数据名n;例如:例如: wire a,bwire a,b; / /定义了两个定义了两个wirewire型变量型变量a a和和b bn Examples:wire7:0 databus; /databus的宽度是的宽度是8位位wire19:0 addr

21、bus; /addrbus的宽度是的宽度是20位位5.3.2 Variable型n variable型变量必须放在过程语句(如型变量必须放在过程语句(如initial、always)中)中,通过过程赋值语句赋值;,通过过程赋值语句赋值;在在always、initial等过程块内被等过程块内被赋值的信号也必须定义成赋值的信号也必须定义成variable型型。n 注意:注意:variable型变量并不意味着一定对应着硬件上的一个型变量并不意味着一定对应着硬件上的一个触发器或寄存器等存储元件,在综合器进行综合时,触发器或寄存器等存储元件,在综合器进行综合时,variable型变量会根据具体情况来确定

22、是映射成连线还是映型变量会根据具体情况来确定是映射成连线还是映射为触发器或寄存器。射为触发器或寄存器。 n reg型变量是最常用的一种型变量是最常用的一种variable型变量型变量。定义格式如下:。定义格式如下: reg 数据名数据名1,数据名,数据名2,数据名数据名n; 例如:例如:reg a,b; /定义了两个定义了两个reg型变量型变量a,bn Examples:reg7:0 qout; /定义定义qout为为8位宽的位宽的reg型向量型向量reg8:1 qout; /*信号定义信号定义?clk: 时钟信号;时钟信号;clr: 异步复位信号;异步复位信号;pause: 暂停信号;暂停信

23、号; msh,msl: 百分秒的高位和低位;百分秒的高位和低位;sh,sl: 秒信号的高位和低位;秒信号的高位和低位; mh,ml: 分钟信号的高位和低位。分钟信号的高位和低位。*/ module paobiao(clk,clr,pause,msh,msl,sh,sl,mh,ml);oinput clk,clr,pause;output3:0 msh,msl,sh,sl,mh,ml;oreg3:0 msh,msl,sh,sl,mh,ml; reg cn1,cn2;/cn1为百分秒向秒的进位,为百分秒向秒的进位,cn2为秒向分的进位为秒向分的进位o/*百分秒计数进程,每满百分秒计数进程,每满10

24、0,cn1产生一个进位产生一个进位*oalways (posedge clk or posedge clr)o begin if(clr) begin msh,msl=8h00;cn1=0;end/异步复位异步复位oelse if(!pause) /pause为为0时正常计数,为时正常计数,为1时暂停计数时暂停计数obeginoif(msl=9) msl=0;o else if(msh=9) begin msh=0; cn1=1; endoelse msh=msh+1;endo else begin msl=msl+1; cn1=0; endoendoendo /*秒计数进程,每计满秒计数进程

25、,每计满60,cn2产生一个进位产生一个进位*o always (posedge cn1 or posedge clr)o begin if(clr) begin sh,sl=8h00;cn2=0;end/异步复位异步复位oelse if(sl=9) /低位是否为低位是否为9obegin sl=0;o if(sh=5) begin sh=0; cn2=1; endoelse sh=sh+1;endoelse begin sl=sl+1; cn2=0; end oendo/*分钟计数进程,每分钟计数进程,每计满计满60,系统自动清零,系统自动清零*o always (posedge cn2 or

26、 posedge clr)o begin if(clr) begin mh,ml=8h00;end/异步复位异步复位oelse if(ml=9)obegin ml=0;oif(mh=5) mh=0;oelse mh=mh+1;endoelse ml=ml+1;oendo endmoduleo 过程赋值语句多用于对过程赋值语句多用于对reg型变量进行赋值。型变量进行赋值。(1)非阻塞()非阻塞(non_blocking)赋值方式赋值方式 赋值符号为赋值符号为“=”, 如:如:b= a; 非阻塞赋值在整个过程块结束时才完成赋值操作,即非阻塞赋值在整个过程块结束时才完成赋值操作,即b的的值并不是立刻

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

28、赋值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; endendmodule同时同时 顺序顺序module non_block(c,b,a,clk);output c,b; reg c,b;input clk,a;always (

29、posedge clk) begin b=a; endalways (posedge clk) begin c=b; endendmodule 非阻塞赋值仿真波形图非阻塞赋值仿真波形图 阻塞赋值仿真波形图阻塞赋值仿真波形图 非阻塞赋值综合结果非阻塞赋值综合结果阻塞赋值综合结果阻塞赋值综合结果o 在可综合的硬件设计中,使用阻塞和非阻塞赋值在可综合的硬件设计中,使用阻塞和非阻塞赋值语句时,应注意以下原则语句时,应注意以下原则(1)当用)当用“always”块来描述组合逻辑时,既可以用阻塞块来描述组合逻辑时,既可以用阻塞赋值,也可以采用非阻塞赋值,应尽量使用阻塞赋值。赋值,也可以采用非阻塞赋值,应尽

30、量使用阻塞赋值。(2)对时序逻辑描述和建模,使用非阻塞赋值方式。)对时序逻辑描述和建模,使用非阻塞赋值方式。(3)为锁存器()为锁存器(Latch)建模,应使用非阻塞赋值。)建模,应使用非阻塞赋值。(4)若在同一个)若在同一个“always”过程块中既为组合逻辑建模,过程块中既为组合逻辑建模,又为时序逻辑建模,最好使用非阻塞赋值方式。又为时序逻辑建模,最好使用非阻塞赋值方式。 例例10.13o 在可综合的硬件设计中,使用阻塞和非阻塞在可综合的硬件设计中,使用阻塞和非阻塞赋值语句时,应注意以下原则赋值语句时,应注意以下原则(5)在一个)在一个“always”过程块中,最好不要混合使过程块中,最好

31、不要混合使用阻塞赋值和非阻塞赋值,虽然同时使用这两种赋用阻塞赋值和非阻塞赋值,虽然同时使用这两种赋值方式在综合时并不一定会出错,但对同一个变量值方式在综合时并不一定会出错,但对同一个变量不能既进行阻塞赋值,又进行非阻塞赋值,这样在不能既进行阻塞赋值,又进行非阻塞赋值,这样在综合时会报错。综合时会报错。例例10.1415(6)不能在两个或两个以上的)不能在两个或两个以上的“always”过程块中过程块中对同一个变量赋值,这样会引发冲突,在综合时会对同一个变量赋值,这样会引发冲突,在综合时会报错。报错。mod13BCD(7)仿真时使用)仿真时使用$strobe显示非阻塞赋值的变量。显示非阻塞赋值的

32、变量。o assign cout=(qout=9)?1:0;条件运算符omodule paobiao(clk,clr,pause,msh,msl,sh,sl,mh,ml);oinput clk,clr,pause;output3:0 msh,msl,sh,sl,mh,ml;oreg3:0 msh,msl,sh,sl,mh,ml;oreg cn1,cn2;/cn1为百分秒向秒的进位,cn2为秒向分的进位o/*百分秒计数进程,每满100,cn1产生一个进位* o/*秒计数进程,每计满60,cn2产生一个进位*o oalways (posedge cn1 or posedge clr)obegin

33、if(clr) begin sh,sl=8h00;cn2=0;end/异步复位oelse if(sl=9) /低位是否为9obegin sl=0;oif(sh=5) begin sh=0;cn2=1;endoelse sh=sh+1;endoelse begin sl=sl+1;cn2=0;end oendo/*分钟计数进程,每计满60,系统自动清零oalways (posedge cn2 or posedge clr)obegin if(clr) begin mh,ml=8h00;end/异步复位oelse if(ml=9)obegin ml=0;oif(mh=5) mh=0;oelse m

34、h=mh+1;endoelse ml=ml+1;/begin cn2=0;endoendoendmodule/*行为描述*/【例例10.9】 阻塞赋值方式描述的移位寄存器阻塞赋值方式描述的移位寄存器1module block1(q0,q1,q2,q3,din,clk);input clk,din; output reg q0,q1,q2,q3;always (posedge clk)begin q3=q2; /注意赋值语句的顺序注意赋值语句的顺序 q2=q1; q1=q0; q0=din;end endmoduleo 例例10.9的的RTL综合结果综合结果 【例例10.10】 阻塞赋值方式描述

35、的移位寄存器阻塞赋值方式描述的移位寄存器2。module block2(q0,q1,q2,q3,din,clk);input clk,din; output reg q0,q1,q2,q3;always (posedge clk)begin q3=q2; q1=q0; /该句与下句的顺序与例该句与下句的顺序与例10.9颠倒颠倒 q2=q1; q0=din;end endmoduleo 例例10.10的的RTL综合结果综合结果 【例例10.11】 阻塞赋值方式描述的移位寄存器阻塞赋值方式描述的移位寄存器3。module block3(q0,q1,q2,q3,din,clk);input clk,

36、din; output reg q0,q1,q2,q3;always (posedge clk)begin q0=din; /4条赋值语句的顺序与例条赋值语句的顺序与例10.9中完全颠倒中完全颠倒 q1=q0; q2=q1; q3=q2;end endmoduleo 例例10.11的的RTL综合结果综合结果 【例例10.12】 非阻塞赋值方式描述的移位寄存器。非阻塞赋值方式描述的移位寄存器。module block4(q0,q1,q2,q3,din,clk);input clk,din; output reg q0,q1,q2,q3;always (posedge clk)begin q3=q

37、2; q1=q0; q2=q1; q0=din;end endmoduleo 例例10.12的的RTL综合结果综合结果 o 对于阻塞赋值来说,赋值语句的顺序对最后对于阻塞赋值来说,赋值语句的顺序对最后的综合结果有着直接的影响。而如果采用非的综合结果有着直接的影响。而如果采用非阻塞赋值方式来描述的话,则可以不考虑赋阻塞赋值方式来描述的话,则可以不考虑赋值语句的排列顺序,只需将其连接关系描述值语句的排列顺序,只需将其连接关系描述清楚即可。清楚即可。o 例例10.12o( if-else语句)语句)o if-else语句使用方法有以下语句使用方法有以下3种:种:(1)if(表达式)表达式) 语句语句

38、1;/非完整性非完整性if语句语句(2)if(表达式)表达式) 语句语句1; /二重选择的二重选择的if语句语句 else 语句语句2;(3)if(表达式表达式1) 语句语句1; /多重选择的多重选择的if语句语句 else if(表达式表达式2) 语句语句2; else if(表达式表达式3) 语句语句3; else if(表达式表达式n) 语句语句n; else 语句语句n+1;o 要点:o 表达式为逻辑表达式,其值为时为值真;0, x, z为假。o 语句若为多句,用 begin-end括起来。o if语句的嵌套,最好用 begin-end括起来。always(posedge co or

39、negedge en)/A state machine for preset valuesbeginif(!en)beginAVALUE=agreen;/initial value,important!state=1;endelsebegincase(state)0:begin AVALUE=agreen;state=1;end1:begin AVALUE=ayellow;state=2;end2:begin AVALUE=aleft;state=3;end3:begin AVALUE=ayellow;state=4;end4:begin AVALUE=ared;state=0;endendc

40、aseendendIf语句实例modulepulse(in,clk,out);inputin,clk;outputout;regout;reg1:0counter;regflag;always(posedgeclk)beginif(in)beginif(!flag)beginout=1;counter=counter+1;endif(counter=3)beginout=0;flag=1;endendelsebeginflag=0;counter=0;out=0;endendendmodule例:脉冲发生器o/*秒计数进程,每计满秒计数进程,每计满60,cn2产生一产生一个进位个进位*oalw

41、ays (posedge cn1 or posedge clr)o begin if(clr) begin sh,sl=8h00;cn2=0;end/异步复位,异步复位,位拼接运算符oelse if(sl=9) /低位是否为低位是否为9o begin sl=0;oif(sh=5) begin sh=0;cn2=1;endoelse sh=sh+1;o endo else begin sl=sl+1;cn2=0;end o end o /assign cout=(qout=8d59)?1:0; Xo 条件运算符o 模模12BCD码加法计数器?码加法计数器?o output7:0 qout;o 5

42、9的的BCD表示表示 qout7:4=0101& qout3:0= 1001o 12的BCD(qout4=1&qout1=1)等价于等价于qout7:4=0001& qout3:0= 00102.2-置零法置零法【例6.15】模60BCD码计数器-多重嵌套的if语句omodule count_60(qout,cout,data,load,reset,clk);ooutput7:0 qout;ooutput cout;oinput7:0 data;oinput load,clk,reset;oreg7:0 qout;oalways(posedge clk)oBegin i

43、f(reset) qout=0; /同步复位同步复位oelse if(load) qout=data; /同步置数;同步置数;oelseobeginoif(qout3:0=9) /模模10控制;控制;obeginoqout3:0=0; /域域选择选择oif(qout7:4=5) qout7:4=0; /模模60控制;控制;oelse qout7:4=qout7:4+1; /域域选择选择oendoelse qout3:0=qout3:0+1;oendoendoassign cout=(qout=8d59)?1:0; /进位控制;进位控制; Xo/qout7:4=0101& qout3:0

44、= 1001oendmodule/模模60BCD码减法计数器?码减法计数器?o 1、case语句语句o case语句的使用格式如下。语句的使用格式如下。 case (敏感表达式)敏感表达式) 值值1: 语句语句1;/case分支项分支项 值值2: 语句语句2; 值值n: 语句语句n; default:语句语句n+1; endcaseo 要点:o 敏感表达式一般为一个变量或表达式;o 一般要列出敏感表达式的所有可能取值,不能穷举时,剩余其它情况执行 default语句;o 多用于条件译码电路,如描述译码器、数据选择器、状态机及微处理器的指令译码等;【例例4.5】 三人表决电路的三人表决电路的Ve

45、rilog描述描述-P107 数据流描述数据流描述 VSP149 【例例6.16】行为描述行为描述 module vote(a,b,c,f);/模块名与端口列表模块名与端口列表input a,b,c;/模块的输入端口模块的输入端口output f;/模块的输出端口模块的输出端口wire a,b,c,f; /定义信号的数据类型定义信号的数据类型assign f=(a&b)|(a&c)|(b&c);/逻辑功能描述逻辑功能描述Endmodule/&和和|属于位运算符,分别表示按位与、按位或属于位运算符,分别表示按位与、按位或/23 25 27 -for参考参考P150

46、例例6.171、位拼接运算符、位拼接运算符 input3:0 indec; input D3,D2,D1,D0;assign indec= D3,D2,D1,D0;output6:0 decodeout;output a,b,c,d,e,f,g;assign decodeout= a,b,c,d,e,f,g;2、一个共阴、一个共阴数码管3、段码与位码4、静态与动态显示module decode4_7(decodeout,indec);output6:0 decodeout;input3:0 indec; reg6:0 decodeout;always (indec) begin case(in

47、dec) /用用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; e

48、ndcase endendmodule2、casez与与casex语句语句1)当case的分支取值某些位为高阻z,那末对这些位不予比较,只关注别的位的比较结果,这时用casez语句;)当case的分支取值某些位为不定值x,那末对这些位不予比较,只关注别的位的比较结果,这时用casex语句;Casez(select)4b?1:out=a;4b?10:out=b;4b?100:out=c;4b1000:out=d;endcase参考参考P151例例6.19o repeat loopinitialbeginfor(i=0;i4;i=i+1)out=out+1;endinitialbeginrepea

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

50、有条件的循环语句。有条件的循环语句。o for语句的使用格式如下(同语句的使用格式如下(同C语言):语言):for(表达式表达式1;表达式;表达式2;表达式;表达式3)语句;)语句;即:即:for(循环变量赋初值;循环结束条件;循循环变量赋初值;循环结束条件;循环变量增值)执行语句;环变量增值)执行语句;P153- P153- 例例6.216.21 例例6.16 case6.16 casemodule voter7(pass,vote);output pass;input6:0 vote;reg2:0 sum; integer i; reg pass;always (vote) begin s

51、um=0;for(i=0;i=4else pass=0; endendmodule含主、副专家裁判含主、副专家裁判5人表决器?人表决器?o repeat语句的使用格式为:语句的使用格式为: repeat(循环次数表达式)循环次数表达式) 语句;语句;或或 repeat(循环次数表达式)循环次数表达式) begin endmodule mult_repeat(outcome, a, b);parameter size=8; / 参数定义参数定义 inputsize:1 a,b;output2*size:1 outcome;reg2*size:1 temp_a,outcome;regsize:1

52、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右移一位右移一位end endendmoduleo Verilog允许在程序中使用特殊的编译向导允许在程序中使用特殊的编译向导(Compiler Directives)语句,在编译时,通常先语句

53、,在编译时,通常先对这些向导语句进行对这些向导语句进行“预处理预处理”,然后再将预处,然后再将预处理的结果和源程序一起进行编译。理的结果和源程序一起进行编译。o 向导语句以符号向导语句以符号“”开头,以区别于其它语句。开头,以区别于其它语句。Verilog提供了十几条编译向导语句,如:提供了十几条编译向导语句,如:define、ifdef、else、endif、restall等。比较常用的有等。比较常用的有define,include和和ifdef、else、endif等。等。 o define语句用于将一个简单的名字或标志符(或称语句用于将一个简单的名字或标志符(或称为宏名)来代替一个复杂的

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

55、句,它可将一个文件全部包是文件包含语句,它可将一个文件全部包含到另一个文件中。其格式为:含到另一个文件中。其格式为:include “文件名文件名”o 使用使用include语句时应注意以下几点:语句时应注意以下几点:(1)一个)一个include语句只能指定一个被包含的文件。语句只能指定一个被包含的文件。(2)include语句可以出现在源程序的任何地方。被语句可以出现在源程序的任何地方。被包含的文件若与包含文件不在同一个子目录下,必包含的文件若与包含文件不在同一个子目录下,必须指明其路径名。须指明其路径名。(3)文件包含允许多重包含,比如文件)文件包含允许多重包含,比如文件1包含文件包含文

56、件2,文件文件2又包含文件又包含文件3等。等。 o 任务(任务(task)o 任务定义格式:任务定义格式: task ; /注意无端口列表注意无端口列表 端口及数据类型声明语句;端口及数据类型声明语句; 其它语句;其它语句; endtasko 任务调用的格式为:任务调用的格式为: (端口(端口1,端口,端口2,);o 需要注意的是:任务调用时和定义时的端口变量应是一需要注意的是:任务调用时和定义时的端口变量应是一一对应的。一对应的。o 任务的定义与调用须在一个任务的定义与调用须在一个module模块内。模块内。o 定义任务时,没有端口名列表,但需要紧接着进行定义任务时,没有端口名列表,但需要紧

57、接着进行输入输出端口和数据类型的说明。输入输出端口和数据类型的说明。o 当任务被调用时,任务被激活。当任务被调用时,任务被激活。任务的调用与模块任务的调用与模块调用一样通过任务名调用实现,调用一样通过任务名调用实现,调用时,需列出端调用时,需列出端口名列表,端口名的排序和类型必须与任务定义中口名列表,端口名的排序和类型必须与任务定义中的相一致。的相一致。o 一个任务可以调用别的任务和函数,可以调用的任一个任务可以调用别的任务和函数,可以调用的任务和函数个数不限。务和函数个数不限。 o 函数的目的是返回一个值,以用于表达式计算函数的目的是返回一个值,以用于表达式计算o 函数的定义格式:函数的定义

58、格式: function 函数名;函数名; 端口声明;端口声明; 局部变量定义;局部变量定义; 其它语句;其它语句;endfunctiono 是一个可选项,如果是一个可选项,如果缺省,则返回值为缺省,则返回值为1位寄存器类型的数据。位寄存器类型的数据。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=count; endendfunction 上面的上面的get0函数循环核对输入数据函数循环核对输入数据x的每

59、一位,计算出的每一位,计算出x中中0的个数,并返回一个适当的值。的个数,并返回一个适当的值。o 函数的定义与调用须在一个函数的定义与调用须在一个module模块内。模块内。o 函数只允许有输入变量且必须至少有一个输入变量,函数只允许有输入变量且必须至少有一个输入变量,输出变量由函数名本身担任,在定义函数时,需对函数输出变量由函数名本身担任,在定义函数时,需对函数名说明其类型和位宽。名说明其类型和位宽。o 定义函数时,没有端口名列表,但调用函数时,需列定义函数时,没有端口名列表,但调用函数时,需列出端口名列表,端口名的排序和类型必须与定义时的相出端口名列表,端口名的排序和类型必须与定义时的相一致

60、。这一点与任务相同一致。这一点与任务相同o 函数可以出现在持续赋值函数可以出现在持续赋值assign的右端表达式中。的右端表达式中。o 函数不能调用任务,而任务可以调用别的任务和函数,函数不能调用任务,而任务可以调用别的任务和函数,且调用任务和函数个数不受限制。且调用任务和函数个数不受限制。o【例例7.26】 用函数定义的用函数定义的8线线3线优先编码器线优先编码器74148的的Verilog描述描述omodule coder83(din,dout);oinput7:0 din;ooutput2:0 dout;ofunction2:0 code; /函数定义函数定义oinput7:0 din; /函数只有输入端口,输出为函数函数只有输入端口,输出为函数名本身名本身oif

温馨提示

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

评论

0/150

提交评论