chVerilogHDL基础与组合电路建模_第1页
chVerilogHDL基础与组合电路建模_第2页
chVerilogHDL基础与组合电路建模_第3页
chVerilogHDL基础与组合电路建模_第4页
chVerilogHDL基础与组合电路建模_第5页
已阅读5页,还剩107页未读 继续免费阅读

下载本文档

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

文档简介

chVerilogHDL基础与组合电路建模演示文稿第1页,共112页。优选chVerilogHDL基础与组合电路建模第2页,共112页。3.1VerilogHDL基本语法规则3.2VerilogHDL门级建模3.3VerilogHDL数据流建模与运算符3.4组合电路的行为级建模3.5分层次的电路设计方法第3页,共112页。3.1VerilogHDL基本语法规则3.1.1词法规定3.1.2逻辑值集合3.1.3常量及其表示3.1.4数据类型4第4页,共112页。3.1.1词法规定为对数字电路进行描述,Verilog语言规定了一套完整的语法结构。1.间隔符:

Verilog的间隔符主要起分隔文本的作用,可以使文本错落有致,便于阅读与修改。间隔符包括空格符(\b)、TAB键(\t)、换行符(\n)及换页符。2.注释符:注释只是为了改善程序可读性,编译时不起作用。多行注释符(用于写多行注释):/*---*/;单行注释符:以//开始到行尾结束为注释文字。5第5页,共112页。任何用VerilogHDL语言描述的“东西”都通过其名字来识别,这个名字被称为标识符。如源文件名、模块名、端口名、变量名、常量名、实例名等。标识符可由字母、数字、下划线和$符号构成;但第一个字符必须是字母或下划线,不能是数字或$符号!在VerilogHDL中变量名是区分大小写的!合法的名字:A_99_ZReset_54MHz_Clock$Module

不合法的名字:123a$datamodule7seg.v标识符不能与关键字同名!三、标识符和关键字

6第6页,共112页。关键字——事先定义好的确认符,用来组织语言结构;或者用于定义VerilogHDL提供的门元件(如and,not,or,buf)。用小写字母定义!——如always,assign,begin,case,casex,else,end,for,function,if,input,output,repeat,table,time,while,wire用户程序中的变量、节点等名称不能与关键字同名!三、标识符和关键字

7第7页,共112页。为了表示数字逻辑电路的逻辑状态,Verilog语言规定了4种基本的逻辑值。0逻辑0、逻辑假1逻辑1、逻辑真x或X不确定的值(未知状态)z或Z高阻态3.1.2逻辑值集合8第8页,共112页。数据类型是用来表示数字电路硬件中的数据存储和传送元素的。常量是在程序运行过程中,其值不能被改变的量。3.1.3常量及其表示9第9页,共112页。3.1.3常量及其表示三种类型的常量整数型常量实数型常量字符串型常量实数型常量十进制记数法如:0.1、2.0、5.67科学记数法如:23_5.1e2、5E-423510.0、0.0005十进制数形式的表示方法:表示有符号常量例如:30、-2带基数形式的表示方法:格式为:<+/-><位宽>’<基数符号><数值>整数型常量例如:3’b101、5’o37、8’he3,8’b1001_0011

10第10页,共112页。3.1.3常量及其表示;Verilog允许用参数定义语句定义一个标识符来代表一个常量,称为符号常量。定义的格式为:

parameter参数名1=常量表达式1,参数名2=常量表达式2……如parameterBIT=1,BYTE=8,PI=3.14;字符串常量字符串是用双撇号括起来的字符序列,它必须包含在同一行中,不能分成多行书写。例如:

''thisisastring''''helloworld!''符号常量11第11页,共112页。3.1.4

数据类型变量的数据类型寄存器型线网型线网类:是指输出始终根据输入的变化而更新其值的变量,它一般指的是硬件电路中的各种物理连接.常用的网络类型由关键词wire定义,格式如下:wire[n-1:0]变量名1,变量名2,…,变量名n;变量宽度例:网络型变量L的值由与门的驱动信号a和b所决定,即L=a&b。a、b的值发生变化,线网L的值会立即跟着变化。12第12页,共112页。wire型数据常用来表示用以assign关键字指定的组合逻辑信号。Verilog程序模块中输入、输出信号类型默认时,自动定义为wire型。wire型信号可以用做任何方程式的输入,也可以用做assign语句或实例元件的输出。wirea;//定义了一个1位的wire型数据wire[7:0]b;//定义了一个8位的wire型数据wire[4:1]c,d;//定义了二个4位的wire型数据wire型13第13页,共112页。表3.1.3线网类型变量及其说明线网类型功能说明wire,tri用于表示单元(元件)之间的连线,wire为一般连线;tri用于描述由多个信号源驱动的线网,并没有其他特殊意义,两者的功能完全相同。wor,trior具有线或特性的线网,用于一个线网被多个信号驱动的情况wand,riand具有线与特性的线网,用于一个线网被多个信号驱动的情况trireg具有电荷保持特性的线网类型,用于开关级建模tri1上拉电阻,用于开关级建模tri0下拉电阻,用于开关级建模supply1用于对电源建模,高电平1supply0用于对地建模,低电平014第14页,共112页。关于“多重驱动”在写可综合的Verilog代码时,建议不要对同一个变量进行多次赋值(简称多重驱动),以避免出现多个信号同时驱动一个输出变量的情况。BLAC图3.1.2多重驱动示意图例如,A、B、C三个内部信号同时接到(驱动)一个输出端L。或者说,输出L同时被三个内部信号所驱动。此时L的逻辑值可能无法确定。15第15页,共112页。3.1.4

数据类型变量的数据类型寄存器型线网型寄存器型变量对应的是具有状态保持作用的电路等元件,如触发器寄存器。寄存器型变量只能在initial或always内部被赋值。16第16页,共112页。寄存器变量类型寄存器类型功能说明reg常用的寄存器型变量integer32位带符号的整数型变量real/realtime64位带符号的实数型变量time64位无符号的时间变量表3.1.5寄存器变量类型及其说明例:regclock;//一个1位寄存器变量的声明

reg[3:0]counter;//一个4位寄存器变量的声明抽象描述,不对应具体硬件end17第17页,共112页。3.2VerilogHDL门级建模3.2.1多输入门3.2.4门级建模举例3.2.2多输出门3.2.3三态门18第18页,共112页。基本概念:结构级建模:就是根据逻辑电路的结构(逻辑图),实例引用VerilogHDL中内置的基本门级元件或者用户定义的元件或其他模块,来描述结构图中的元件以及元件之间的连接关系。门级建模:VerilogHDL中内置了12个基本门级元件(Primitive,有的翻译为“原语”)模型,引用这些基本门级元件对逻辑图进行描述,也称为门级建模。19第19页,共112页。VerilogHDL基本门级元件(Primitive:原语)

多输入门:and、nand、or、nor、xor、xnor

只有单个输出,1个或多个输入多输出门:not、buf

允许有多个输出,但只有一个输入三态门:bufif0、bufif1、notif0、notif1

有一个输出,一个数据输入和一个控制输入上拉电阻pullup、下拉电阻pulldown20第20页,共112页。6.4.1多输入门原语名称图形符号逻辑表达式and(与门)L=A&Bnand(与非门)L=~(A&B)or(或门)L=A|Bnor(或非门)L=~(A|B)xor(异或门)L=A^Bxnor(同或门)L=A~^B

共6个:and、nand、or、nor、xor、xnor

特点:只有1个输出,有多个输入多输入门的一般引用格式为:Gate_name<instance>(OutputA,Input1,Input2,…,InputN);21第21页,共112页。基本门的调用方法举例:若同一个基本门在当前模块中被调用多次,可在一条调用语句中加以说明,中间以逗号相隔。andA1(out,in1,in2,in3);xnorNX1(out,in1,in2,in3,in4);

对基本门级元件,调用名A1、NX1可以省略。22第22页,共112页。真值表举例表3.2.2and、nand真值表and输入1nand输入101xz01xz输入200000输入201111101xx110xxx0xxxx1xxxz0xxxz1xxx23第23页,共112页。3.2.2多输出门允许有多个输出,但只有一个输入。notN1(out1,out2,…,in);xx10zx10输入buf输出buf真值表输出xx01zx10输入notnot真值表bufB1(out1,out2,…,in);out1inout2outN…24第24页,共112页。3.2.3三态门有一个输出、一个数据输入和一个输入控制。如果输入控制信号无效,则三态门的输出为高阻态z。25第25页,共112页。boutasel//Gate-leveldescriptionmodule_2to1muxtri(a,b,sel,out);

inputa,b,sel;

outputout;

triout;bufif1(out,b,sel);

bufif0(out,a,sel);endmodule

-2选1数据选择器一些Verilog原型(Primitive)小结:门级建模就是列出电路图结构中的元件,并按网表连接。3.2.4门级建模举例26第26页,共112页。moduleaddbit(a,b,ci,sum,co);inputa,b,ci;outputsum,co;wirea,b,ci,sum,co,n1,n2,n3;

xor

u0(n1,a,b,),

u1(sum,n1,ci);

and

u2(n2,a,b),

u3(n3,n1,ci);

or(co,n2,n3);endmodule

-1位全加器3.2.4门级建模举例27第27页,共112页。门级描述小结:1.给电路图中的每个输入输出引脚赋以端口名.2.给电路图中每条内部连线取上各自的连线名.3.给电路图中的每个逻辑元件取一个编号(即“调用名”).4.给所要描述的这个电路模块确定一个模块名.5.用module定义相应模块名的结构描述,并将逻辑图中所有的输入输出端口名列入端口名表项中,再完成对各端口的输入输出类型说明.6.依照电路图中的连接关系,确定各单元之间端口信号的连接,完成对电路图内部的结构描述.7.最后用endmodule结束模块描述全过程.end28第28页,共112页。3.3VerilogHDL数据流建模与运算符3.3.1数据流建模3.3.2运算符及其优先级29第29页,共112页。在数字电路中,信号经过组合逻辑时会类似于数据流动,即信号从输入流向输出,并不会在其中存储。当输入发生变化时,总会在一定时间以后体现在输出端。同样,我们可以模拟数字电路的这一特性,对其进行建模,这种建模方式通常被称为数据流建模。3.3VerilogHDL数据流建模与运算符30第30页,共112页。3.3VerilogHDL数据流建模与运算符对于基本单元逻辑电路,使用Verilog语言提供的门级元件模型描述电路非常方便。但随着电路复杂性的增加,使用的逻辑门较多时,使用HDL门级描述的工作效率就很低。本节介绍的数据流建模能够在较高的抽象级别描述电路的逻辑功能,并且通过逻辑综合软件,能够自动地将数据流描述转换成为门级电路。数据流建模主要使用逻辑表达式,所以要了解各种运算符和表达式。31第31页,共112页。3.3.1数据流建模

数据流建模使用的连续赋值语句,由关键词assign开始,后面跟着由操作数和运算符等组成的逻辑表达式。一般用法如下:

wire[位宽说明]变量名1,变量名2,……,变量名n;

assign

变量名=表达式;注意,assign

语句只能对wire型变量进行赋值,所以等号左边变量名的数据类型必须是wire型。32第32页,共112页。3.3.1数据流建模

数据流建模使用的连续赋值语句,由关键词assign开始,后面跟着由操作数和运算符等组成的逻辑表达式。一般用法如下:

wire[位宽说明]变量名1,变量名2,……,变量名n;

assign

变量名=表达式;连续赋值语句的执行过程是:只要逻辑表达式右边变量的逻辑值发生变化,则等式左边的值立即被计算出来并赋给左边的变量。33第33页,共112页。modulemux2to1_dataflow(D0,D1,S,Y

);

inputD0,D1,S;outputY;wireY;//下面是逻辑功能描述

assignY=(~S&D0)|(S&D1);

//表达式左边Y必须是wire型endmodule

端口类型说明电路结构描述数据类型说明例用数据流描述方式建立模型34第34页,共112页。modulemux2x1_df(D0,D1,S,L);inputD0,D1,S;outputL;

assignL=S?D1:D0;endmodule例:用条件运算符描述了一个2选1的数据选择器。条件运算符:如果S=1,则输出L=D1;否则L=D0。35第35页,共112页。例:用数据流建模方法对2线-4线译码器的行为进行描述。

36第36页,共112页。moduledecoder_df(A1,A0,E,Y);inputA1,A0,E;output[3:0]Y;

assignY[0]=~(~A1&~A0&~E);assignY[1]=~(~A1&A0&~E);assignY[2]=~(A1&~A0&~E);assignY[3]=~(A1&A0&~E);endmodule例:用数据流建模方法对2线-4线译码器的行为进行描述。

37第37页,共112页。例:用数据流描述风格对一个4位二进制数的加法器建模。

moduleadder4(Cout,Sum,A,B,Cin);parameterwidth=4;

output[width-1:0]Sum;

outputCout;

input[width-1:0]A,B;

inputCin;

assign{Cout,Sum}=A+B+Cin;

endmodule38第38页,共112页。3.3.1数据流建模数据流建模提供了用逻辑表达式描述电路的一种方式。不必考虑电路的组成以及元件之间的连接,是描述组合逻辑电路常用的一种方式。39第39页,共112页。3.3.2

表达式与操作数表达式由运算符合操作数构成,其目的是根据运算符的含义计算出一个结果值。A~^B;Add1[31:20]+Add2[31:20]操作数可以是常数、整数、实数、线网、寄存器、时间等任何数据类型。40第40页,共112页。运算符按功能分为9类:算术运算符逻辑运算符关系运算符等式运算符缩减运算符条件运算符位运算符移位运算符位拼接运算符运算符按操作数的个数分为3类:单目运算符——带一个操作数逻辑非!,按位取反~,缩减运算符,移位运算符双目运算符——带两个操作数算术、关系、等式运算符,逻辑、位运算符的大部分三目运算符——带三个操作数条件运算符

3.3.3

运算符及其优先级41第41页,共112页。3.3.3

运算符及其优先级1.运算符(9类)?:条件运算符{}连接运算符<<,>>逻辑移位运算符==,!=,===,!==相等与全等运算符<,>,<=,>=关系运算符(双目)!,&&,||逻辑运算符&,~&,|,~|,^,^~or~^缩位运算符(单目)~,&,|,^,^~or~^位运算符+,-,*,/,%算术运算符所含运算符运算符分类42第42页,共112页。一、算术运算符算术运算符说明+-*/%加减乘除求模双目运算符进行整数除法运算时,结果值略去小数部分,只取整数部分!%称为求模(或求余)运算符,要求%两侧均为整型数据;求模运算结果值的符号位取第一个操作数的符号位!

[例]-11%3结果为-2进行算术运算时,若某操作数为不定值x,则整个结果也为x。 MAX+PLUSII不支持“/”

和“%”运算!QuartusII都支持!43第43页,共112页。[例]除法和求模运算的区别注意/和%的区别!44第44页,共112页。9/4=29%4=1arithmetic.vwf45第45页,共112页。二、关系运算符关系运算符说明<<=>>=小于小于或等于大于大于或等于双目运算符括号内先运算!算术运算先运算!运算结果为1位的逻辑值1或0或x。关系运算时,若关系为真,则返回值为1;若声明的关系为假,则返回值为0;若某操作数为不定值x,则返回值为x。所有的关系运算符优先级别相同。关系运算符的优先级低于算术运算符。[例]a<size-1 等同于:a<(size-1)size-(1<a) 不等同于:size-1<a46第46页,共112页。三、等式运算符等式运算符说明==!====!==等于不等于全等不全等双目运算符运算结果为1位的逻辑值1或0或x。等于运算符(==)和全等运算符(===)的区别:使用等于运算符时,两个操作数必须逐位相等,结果才为1;若某些位为x或z,则结果为x。使用全等运算符时,若两个操作数的相应位完全一致(如同是1,或同是0,或同是x,或同是z),则结果为1;否则为0。所有的等式运算符优先级别相同。===和!==运算符常用于case表达式的判别,又称为“case等式运算符”。MAX+PLUSII和QuartusII都不支持!47第47页,共112页。[例]if(A

==

1’bx)$display(“AisX”);//当A为不定值时,式(A==1’bx)的运算结果为x,则该语句不执行if(A

===

1’bx)$display(“AisX”);//当A为不定值时,式(A===1’bx)的运算结果为1,该语句执行==01xz01xz10xx01xxxxxxxxxx===01xz01xz1000010000100001“==”的真值表“===”的真值表等于运算的结果可能为1或0或x全等于运算的结果只有1或048第48页,共112页。a、b的初值同为4‘b0100,c和d的初值同为4’b10x0a==ba!=ba===ba!==b1010c==dc!=dc===dc!==dxx10相等与全等运算符==(逻辑相等),!=(逻辑不等)===(条件全等),!==(条件不全等)49第49页,共112页。四、逻辑运算符逻辑运算符把它的操作数当作布尔变量:非零的操作数被认为是真(1‘b1);零被认为是假(1‘b0);不确定的操作数如4’bxx00,被认为是不确定的(可能为零,也可能为非零)(记为1’bx);但4’bxx11被认为是真(记为1’b1,因为它肯定是非零的)。逻辑运算符说明

&&(双目)||(双目)!(单目)逻辑与逻辑或逻辑非进行逻辑运算后的结果为布尔值(为1或0或x)!50第50页,共112页。“&&”和“||”的优先级除高于条件运算符外,低于关系运算符、等式运算符等几乎所有运算符;逻辑非“!”优先级最高。[例](a>b)&&(b>c) 可简写为:a>b&&b>c(a==b)||(x==y) 可简写为:a==b||x==y(!a)||(a>b) 可简写为:!a||a>b为提高程序的可读性,明确表达各运算符之间的优先关系,建议使用括号!51第51页,共112页。五、位运算符位运算符说明~&|^^~,~^按位取反按位与按位或按位异或按位同或双目运算符单目运算符位运算其结果与操作数位数相同。位运算符中的双目运算符要求对两个操作数的相应位逐位进行运算。两个不同长度的操作数进行位运算时,将自动按右端对齐,位数少的操作数会在高位用0补齐。

[例]若A=5’b11001,B=3’b101,则A&B=(5’b11001)&(5’b00101)=5’b00001

52第52页,共112页。六、缩减运算符缩减运算符说明&~&|~|^^~,~^与与非或或非异或同或单目运算符运算法则与位运算符类似,但运算过程不同!对单个操作数进行递推运算,即先将操作数的最低位与第二位进行与、或、非运算,再将运算结果与第三位进行相同的运算,依次类推,直至最高位。运算结果缩减为1位二进制数。[例]reg[3:0]a;b=|a;//等效于b=((a[0]|a[1])|a(2))|a[3]注意缩减运算符和位运算符的区别!53第53页,共112页。位运算符与缩位运算的比较A:4’b1010、B:4’b1111,A~^B=1010A^B=0101A|B=1111A&B=1010~A=0101~B=0000

位运算~^A=1~^B=1^A=0^B=0|A=1~|B=0~&A=1&B=1&A=1&0&1&0=0

缩位运算54第54页,共112页。七、移位运算符移位运算符说明>><<右移左移单目运算符只有当右操作数为常数时MAX+PLUSII支持!左移会扩充位数!用法:A>>n或A<<n

将操作数右移或左移n位,同时用n个0填补移出的空位。[例]4’b1001>>3=4’b0001;4’b1001>>4=4’b00004’b1001<<1=5’b10010;4’b1001<<2=6’b100100;

1<<6=32’b1000000将操作数右移或左移n位,相当于将操作数除以或乘以2n。右移位数不变,但右移的数据会丢失!55第55页,共112页。八、条件运算符三目运算符in1outMUXin0sel信号=条件?表达式1:表达式2条件运算符为?:用法:[例]数据选择器assignout=sel?in1:in0;当条件为真,信号取表达式1的值;为假,则取表达式2的值。sel=1时out=in1;sel=0时out=in056第56页,共112页。对同一个操作数的重复拼接还可以双重大括号构成的运算符{{}}例如{4{A}}=4’b1111,{2{A},2{B},C}=8’b11101000。· 在VerilogHDL语言中有一个特殊的运算符:位拼接运算符{}作用是将两个或多个信号的某些位拼接起来成为一个新的操作数,进行运算操作。九、位拼接运算符设A=1’b1,B=2’b10,C=2’b00则{B,C}=4’b1000{A,B[1],C[0]}=3’b110{A,B,C,3’b101}=8’b11000101。{信号1的某几位,信号2的某几位,……,信号n的某几位}57第57页,共112页。2.运算符的优先级优先级的顺序从下向上依次增加。类型符号优先级别取反!~-(求2的补码)最高优先级算术*/+-最低优先级移位>><<关系<<=>>=等于==!=缩位&~&^^~|~|逻辑&&||条件?:end为提高程序的可读性,建议使用括号来控制运算的优先级![例](a>b)&&(b>c)

(a==b)||(x==y)

(!a)||(a>b)58第58页,共112页。3.4组合电路的行为级建模行为建模是VerilogHDL行为建模的主要方法,也是VerilogHDL最能体现其高级编程语言之处,如果学过其他高级变成语言(如C语言),就会对本节介绍的诸如if-else、for循环之类的语法结构非常熟悉。此外,本节还将介绍过程赋值的特点和用法。就像连续赋值用于数据流行为建模一样,过程赋值用于顺序行为建模。第59页,共112页。3.4VerilogHDL行为级建模行为级建模就是描述数字逻辑电路的功能和算法。在Verilog中,行为级描述主要使用由关键词initial或always定义的两种结构类型的语句。一个模块的内部可以包含多个initial或always语句。initial语句是一条初始化语句,仅执行一次,经常用于测试模块中,对激励信号进行描述,在硬件电路的行为描述中,有时为了仿真的需要,也用initial语句给寄存器变量赋初值。initial语句主要是一条面向仿真的过程语句,不能用于逻辑综合。在always结构型语句内部有一系列过程性赋值语句,用来描述电路的功能(行为)。60第60页,共112页。3.5VerilogHDL行为级建模在详细解释二者的使用方法之前,可以仅从其英文单词的字面意思来了解一下它们的作用:initial用于做“初始化”操作,always则“始终”在执行某些操作。作为顺序行为建模的两条基本语句,initial和always存在一些共同的特点:61第61页,共112页。所有的initial和always语句都是在时刻0(仿真刚开始)开始执行;initial和always之后都跟随着一段程序,这段程序会被封装成一个“程序块”,可以用begin-end(顺序语句块)封装,也可以用fork-join(并行语句块)封装。如果这段程序只有1条语句,可以不用封装;一个模块中可以包含任意多个initial或always语句,这些initial语句和always语句彼此之间都是并行执行的,即这些语句的执行顺序与其在模块中书写的顺序无关。62第62页,共112页。3.4.1行为级建模基础下面介绍行为级建模中经常使用的语句:1.initial语句结构及过程赋值语句2.always语句结构及过程赋值语句3.条件语句(if-else)4.多路分支语句(case-endcase)5.for循环语句(例如for等)63第63页,共112页。1.initial语句的一般用法:所有在initial语句内的语句构成了一个initial块。initial块从仿真0时刻开始执行,在整个仿真过程中只执行一次。如果一个模块中包括了若干个initial块,则这些initial块从仿真0时刻开始并发执行,且每个块的执行是各自独立的。如果在块内包含了多条行为语句,那么需要将这些语句组成一组,一般是使用关键字begin和end将它们组合为一个块语句;如果块内只有一条语句,则不必使用begin和end。由于initial块语句在整个仿真期间只能执行一次,因此它一般被用于初始化、信号监视、生成仿真波形等目的。64第64页,共112页。65第65页,共112页。可以发现,initial语句执行时可以通过指定时延而控制某个信号的值不断变化。如果这个变化是很有规律的,而且所有时延值都相同,并且值只在0和1之间交替变换,就可以在这个信号上形成一个时钟波形。通过改变时延值和不同的变化值,可以生成任意的波形信号。可见initial语句主要用于初始化和波形生成。66第66页,共112页。always语句包括的所有行为语句构成了一个always语句块。该always语句块从仿真0时刻开始顺序执行其中的行为语句;在最后一条执行完成后,再次开始执行其中的第一条语句,如此循环往复,直至整个仿真结束。always语句通常用于对数字电路中一组反复执行的活动进行建模。例如时钟信号发生器,每半个时钟周期时钟信号翻转一次。在现实电路中只要电源接通,时钟信号发生器从时刻0就有效,一直工作下去。2.always语句的一般用法:67第67页,共112页。2.always语句的一般用法:always

@(事件控制表达式)begin:块名块内局部变量的定义;

过程赋值语句(包括高级语句);endbegin…end

之间只有一条语句时,关键词可以省略;begin…end

之间的多条语句被称为顺序语句块。可以给语句块取一个名字,称为有名块。“@”称为事件控制运算符,用于挂起某个动作,直到事件发生。“事件控制表达式”也称为敏感事件表,它是后面begin和end之间的语句执行的条件。当事件发生或某一特定的条件变为“真”时,后面的过程赋值语句就会被执行。68第68页,共112页。时延控制“#10”,always语句从时刻0开始,每隔10个单位时间就把Clk上的值翻转一次,这样就在Clk上得到了一个周期为20的波形信号。always中的时序控制可以是上例中的时延控制,也可以是事件控制。事件控制就是等待某一事件发生,该事件的发生将执行always语句。69第69页,共112页。[例]用符号“@”定义了事件控制的always语句。reg[0:5]InstrReg;reg[3:0]Accum;wireExecuteCycle;always@(EcecuteCycle)//always语句开始执行的条件是事件EcecuteCycle的发生begin//顺序语句块开始case(InstrReg[0:1])//顺序语句块内的case开始2'b00:Store(Accum,InstrReg[2:5]);//Store是用户在别处自定义的任务2'b11:Load(Accum,InstrReg[2:5]);//Load是用户在别处自定义的任务2'b01:Jump(InstrReg[2:5]);//Jump是用户在别处自定义的任务2'b10:;//不做任何操作endcase//顺序语句块内的case结构开始end//顺序语句块结束70第70页,共112页。这个always语句用到了符号@,意思是只要ExecuteCycle上有事件发生(值的变化),就执行顺序语句块中的语句。符号“@”定义的是触发事件,一旦检测到ExecuteCycle上的电平跳变时的边沿,就执行always语句。事件控制”@”缺省为“电平敏感事件”,若使用关键词“posedge”和“negedge”定义边沿触发。71第71页,共112页。moduleDFF(Clk,D,Set,Q,Qbar);inputClk,D,Set;outputQ,Qbar;regQ,Qbar;always@(negedgeClk)beginif(Set!=1)begin#5Q=D;#1Qbar=~Q;endelsebegin#3Q=1;#2Qbar=0;endendendmodule[例]一个边沿敏感事件控制的always语句72第72页,共112页。begin

语句1;语句2;

语句n;endbegin:块名块内声明语句;语句1;语句2;

语句n;end注:块内声明语句可以是参数声明、reg型变量声明、integer型变量声明、real型变量声明语句。或3、顺序块的格式73第73页,共112页。[例1]beginb=a;c=b;//c的值为a的值end[例2]beginb=a;

#10c=b;//在两条赋值语句间延迟10个时间单位end注:这里标识符“#”表示延迟;在模块调用中“#”表示参数的传递举例74第74页,共112页。[例]使用行为描述风格对下图所示的2线4线译码器进行建模75第75页,共112页。76第76页,共112页。4、条件语句一、if-else语句判定所给条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。if-else语句有3种形式其中“表达式”为逻辑表达式或关系表达式,或一位的变量。若表达式的值为0、x或z,则判定的结果为“假”;若为1,则结果为“真”。语句可为单句,也可为多句;多句时一定要用“begin_end”语句括起来,形成一个复合块语句。对于每个判定只有两个分支条件语句分为两种:if-else语句和case语句;它们都是顺序语句,应放在“always”块内!77第77页,共112页。4、条件语句允许一定形式的表达式简写方式,如:if(expression)等同于if(expression==1)if(!expression)等同于if(expression!=1)if(表达式)语句1;if(表达式1)语句1;else

语句2;if(表达式1)语句1;elseif(表达式2)语句2;

…elseif(表达式n)语句n;方式1:方式2:方式3:适于对不同的条件,执行不同的语句78第78页,共112页。4、条件语句if语句可以嵌套;若if与else的数目不一样,注意用“begin_end”语句来确定if与else的配对关系!if(表达式1)

if(表达式2)语句1;

else

语句2;else

if(表达式3)语句3;

else

语句4;if(表达式1)

begin

if(表达式2)语句1;

endelse

语句2;当if与else的数目不一样时,最好用“begin_end”语句将单独的if语句括起来:if语句的嵌套:79第79页,共112页。例:使用if-else语句对4选1数据选择器的行为进行描述注意,过程赋值语句只能给寄存器型变量赋值,因此,输出变量Y的数据类型定义为reg。modulemux4to1_bh(D,S,Y);input[3:0]D;//输入端口

input[1:0]S;//输入端口

outputregY;//输出端口及变量数据类型

always@(D,S)//电路功能描述

if(S==2’b00)Y=D[0];elseif(S==2’b01)Y=D[1];elseif(S==2’b10)Y=D[2];elseY=D[3];endmodule80第80页,共112页。5、多路分支语句(case语句)case(敏感表达式)值1:语句1;值2:语句2;

值n:语句n;

default:

语句n+1;endcase1.case语句当敏感表达式取不同的值时,执行不同的语句。功能:当某个(控制)信号取不同的值时,给另一个(输出)信号赋不同的值。常用于多条件译码电路(如译码器、数据选择器、状态机、微处理器的指令译码)!case语句有3种形式:case,casez,casex适于对同一个控制信号取不同的值时,输出取不同的值!case语句与if-else语句有什么区别呢?

81第81页,共112页。说明:其中“敏感表达式”又称为“控制表达式”,通常表示为控制信号的某些位。值1~值n称为分支表达式,用控制信号的具体状态值表示,因此又称为常量表达式。default项可有可无,一个case语句里只能有一个default项!值1~值n必须互不相同,否则矛盾。值1~值n的位宽必须相等,且与控制表达式的位宽相同。3、多路分支语句(case语句)82第82页,共112页。2.casez与casex语句是case语句的两种变体在case语句中,分支表达式每一位的值都是确定的(或者为0,或者为1);在casez语句中,若分支表达式某些位的值为高阻值z,则不考虑对这些位的比较;在casex语句中,若分支表达式某些位的值为z或不定值x,则不考虑对这些位的比较。在分支表达式中,可用“?”来标识x或z。

3、多路分支语句(case语句)83第83页,共112页。例:对具有使能端En的4选1数据选择器的行为进行Verilog描述。当En=0时,数据选择器工作,En=1时,禁止工作,输出为0。modulemux4to1_bh

(D,S,Y,En);input[3:0]D,[1:0]S;inputEn;outputregY;

always@(D,S,En)beginif(En==1)Y=0;//En=1时,输出为0else//En=0时,选择器工作case(S)2’d0:Y=D[0];2’d1:Y=D[1];2’d2:Y=D[2];2’d3:Y=D[3];endcaseendendmodule84第84页,共112页。应注意列出所有条件分支,否则当条件不满足时,编译器会生成一个锁存器保持原值!这一点可用于设计时序电路,如计数器:条件满足时加1,否则保持原值不变。而在组合电路设计中,应避免生成隐含锁存器!有效的方法是在if语句最后写上else项;在case语句最后写上default项。三、使用条件语句注意事项85第85页,共112页。6、循环语句循环语句分为4种:所有的循环语句都只能在initial或always中使用for语句——通过3个步骤来决定语句的循环执行:(1)给控制循环次数的变量赋初值。(2)判定循环执行条件,若为假则跳出循环;若为真,则执行指定的语句后,转到第(3)步。(3)修改循环变量的值,返回第(2)步。repeat语句——连续执行一条语句n次while语句——执行一条语句,直到循环执行条件不满足;若一开始条件即不满足,则该语句一次也不能被执行!forever语句——无限连续地执行语句,可用disable语句中断!86第86页,共112页。一、for语句for

(表达式1;表达式2;表达式3)语句for(循环变量赋初值;循环执行条件;循环变量增值)执行语句两条语句8条语句一般形式简单应用形式相当于采用while语句建立的循环结构:begin

循环变量赋初值;

while(循环执行条件)begin<执行语句>

循环变量增值;

endendfor语句比while语句简洁!87第87页,共112页。例:用for实现显示一个32位整数的循环moduleloop1;integeri;initialfor(i=0;i<4;i=i+1)begin$display("i=%h",i);endendmodule88第88页,共112页。moduleecoder3to8_bh(A,En,Y);input[2:0]A,En;outputreg[7:0]Y;integerk;//声明一个整型变量kalways@(A,En)//beginY=8’b1111_1111;//设译码器输出的默认值

for(k=0;k<=7;k=k+1)//下面的if-else语句循环8次

if((En==1)&&(A==k))Y[k]=0;//当En=1时,根据A进行译码

elseY[k]=1;//处理使能无效或输入无效的情况

endendmodule

试用Verilog语言描述具有高电平使能的3线-8线译码器.循环8次89第89页,共112页。[例]用for语句描述的7人投票表决器:若超过4人(含4人)投赞成票,则表决通过。modulevote7(pass,vote); outputpass; input[6:0]vote; reg[2:0]sum;//sum为reg型变量,用于统计赞成的人数

integeri;regpass;always@(vote)beginsum=0;//sum初值为0

for(i=0;i<=6;i=i+1)

//for语句

if(vote[i])sum=sum+1;

//只要有人投赞成票,则sum加1

if(sum[2])pass=1;//若超过4人赞成,则表决通过

elsepass=0;endendmodule或写为if(sum[2:0]>=3’d4)

90第90页,共112页。超过4人赞成,则pass=1

91第91页,共112页。[例]编写一个能够统计输入变量Din中1的个数的程序。92第92页,共112页。93第93页,共112页。1.while语句有条件地执行一条或多条语句。首先判断循环执行条件表达式是否为真。若为真,则执行后面的语句或语句块;然后再回头判断循环执行条件表达式是否为真,若为真,再执行一次后面的语句;如此不断,直到条件表达式不为真。while

(循环执行条件表达式)语句while

(循环执行条件表达式)

begin

……

end或格式二、while和forever语句94第94页,共112页。注1:首先判断循环执行条件表达式是否为真,若不为真,则其后的语句一次也不被执行!注2:在执行语句中,必须有一条改变循环执行条件表达式的值的语句!注3:while语句只有当循环块有事件控制(即@(posedgeclock))时才可综合!95第95页,共112页。modulecount1s_while(count,rega,clk); output[3:0]count; input[7:0]rega;inputclk;reg[3:0]count;always@(posedgeclk) begin:count1reg[7:0]tempreg;//用作循环执行条件表达式

count=0;//count初值为0tempreg=rega;//tempreg初值为rega

while(tempreg)

//若tempreg非0,则执行以下语句

beginif(tempreg[0])count=count+1;

//只要tempreg最低位为1,则count加1

tempreg=tempreg>>1;

//右移1位

endendendmodule[例]用while语句对一个8位二进制数中值为1的位进行计数。改变循环执行条件表达式的值96第96页,共112页。97第97页,共112页。无条件连续执行forever后面的语句或语句块。forever

语句forever

begin……

end或常用在测试模块中产生周期性的波形,作为仿真激励信号。常用disable语句跳出循环!注:不同于always语句,不能独立写在程序中,一般用在initial语句块中!格式initialbegin:Clocking clk=0;#10forever#10clk=!clk;endinitialbegin:Stimulus ……

disableClocking;//停止时钟

end一般情况下是不可综合的!常用在测试文件中2.forever语句98第98页,共112页。连续执行一条或多条语句n次。repeat

(循环次数表达式)语句repeat

(循环次数表达式)

begin……

end执行语句为多条语句或格式只有部分综合工具可

温馨提示

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

评论

0/150

提交评论