版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章Verilog设计初步
主要内容§2.1Verilog概述§2.2Verilog基本语法§2.3
Verilog行为语句§2.4
Verilog基本组合电路设计§2.5Verilog基本时序电路设计§2.1Verilog概述Verilog语言是1983年由GDA(GatewayDesignAutomation)公司的PhilMoorby首创的,之后Moorby又设计了Verilog-XL仿真器,Verilog-XL仿真器大获成功,也使得Verilog语言得到推广使用。1989年,Cadence收购了GDA,1990年,Cadence公开发表了VerilogHDL,并成立了OVI组织专门负责VerilogHDL的发展。Verilog于1995年成为IEEE标准,称为IEEEStandard1364-1995(Verilog-1995)IEEE“1364-2001”标准(Verilog-2001)也获得通过,多数综合器、仿真器都已支持Verilog-2001标准1、Verilog发展2、Verilog语言的特点既适于可综合的电路设计,也可胜任电路与系统的仿真。能在多个层次上对所设计的系统加以描述,从开关级、门级、寄存器传输级(RTL)到行为级,都可以胜任,同时语言不对设计规模施加任何限制。灵活多样的电路描述风格,可进行行为描述,也可进行结构描述;支持混合建模,在一个设计中各个模块可以在不同的设计层次上建模和描述。Verilog的行为描述语句,如条件语句、赋值语句和循环语句等,类似于软件高级语言,便于学习和使用。内置各种基本逻辑门,便于进行门级结构描述;内置各种开关级元件,可进行开关级的建模。易学易用,功能强,可满足各个层次设计人员的需要。3Verilog模块的结构
moduleaoi(a,b,c,d,f);/*模块名为aoi,端口列表a,b,c,d,f*/inputa,b,c,d; //模块的输入端口为a,b,c,doutputf;//模块的输出端口为fwirea,b,c,d,f;//定义信号的数据类型assignf=~((a&b)|(~(c&d))); //逻辑功能描述endmodule“与-或-非”电路
3Verilog模块的结构Verilog程序是由模块构成的。每个模块的内容都嵌在module和endmodule两个关键字之间;每个模块实现特定的功能。每个模块首先要进行端口定义,并说明输入和输出口(input、output或inout),然后对模块的功能进行定义。Verilog程序书写格式自由,一行可以写几个语句,一个语句也可以分多行写。除了endmodule等少数语句外,每个语句的最后必须有分号。可用/*……*/和//……对Verilog程序作注释。Verilong程序中的关键字必须小写,其它字符区别大小写,输入程序时一定要注意!⑴模块声明模块声明包括模块名字,模块输入、输出端口列表。模块定义格式如下:module模块名(端口1,端口2,端口3,……);⑵端口(Port)定义对模块的输入输出端口要明确说明,其格式为:input端口名1,端口名2,……端口名n; //输入端口output端口名1,端口名2,……端口名n;
//输出端口inout端口名1,端口名2,……端口名n; //输入输出端口⑶信号类型声明对模块中所用到的所有信号(包括端口信号、节点信号等)都必须进行数据类型的定义。Verilog语言提供了各种信号类型,分别模拟实际电路中的各种物理连接和物理实体。如果信号的数据类型没有定义,则综合器将其默认为是wire型。
⑷逻辑功能定义模块中最核心的部分是逻辑功能定义。定义逻辑功能的几种基本方法:(1)用assign持续赋值语句定义assign语句多用于组合逻辑的赋值,称为持续赋值方式。若干连续赋值语句是并列执行,与顺序无关。(2)用always过程块定义always过程语句既可以用来描述组合电路,也可以描述时序电路。过程块反复依据条件执行,相当无限循环执行。多个always过程块并行执行,与顺序无关。(3)调用元件(元件例化)调用元件的方法类似于在电路图输入方式下调入图形符号来完成设计,这种方法侧重于电路的结构描述。
以上逻辑功能混合使用时,它们都是并行执行的。⑸Verilog模块的模板
module<顶层模块名>(<输入输出端口列表>);output输出端口列表;//输出端口声明input输入端口列表;//输入端口声明/*定义数据,信号的类型,函数声明*/reg信号名;//逻辑功能定义assign<结果信号名>=<表达式>;
//使用assign语句定义逻辑功能//用always块描述逻辑功能always@(<敏感信号表达式>)begin
//过程赋值//if-else,case语句//while,repeat,for循环语句//task,function调用end//调用其他模块<调用模块名module_name><例化模块名>(<端口列表port_list>);//门元件例化
门元件关键字<例化门元件名>(<端口列表port_list>);endmodule⑹组合逻辑电路与时序逻辑电路特点组合逻辑电路:电路任意时刻的输出状态只由该时刻各输入状态组合决定,而与电路原状态无关。modulecomp2_1(x,y,z,a,b);inputa,b;outputx,y,z;assignx=(a==b)?1:0//这些语句是并行执行assigny=(a<b)?1:0assignz=(a>b)?1:0endmodule如下列数值比较器程序中a,b的输入状态决定x,y,z输出结果。如在实验中做过的两路输入选择器和二进制半加器都是组合逻辑电路组合电路常采用连续赋值方式(即assign语句)进行设计,但采用过程赋值语句(一般用阻塞赋值语句“=”来赋值)和所有输入信号的电平输入激励方式时也可实现组合逻辑电路设计,但要注意与时序逻辑中使用的赋值方式和激励条件的不同。可以观察到上下两个图输入状态完全决定输出状态!输出同步跟随输入而变!时序逻辑电路:电路的任意时刻的输出状态不仅取决于该时刻的输入状态,还与电路的原状态有关。所以时序电路都有记忆功能。组合逻辑电路与时序逻辑电路特点下列的D触发器程序,一般时序电路都由过程语句赋值(可用阻塞“=”或非阻塞赋值语句“<=”来表示)赋值)
,且有边沿时钟激励条件。可以看到上面图形中的输入d,只有在CLK上升沿时才能决定输出,其它时刻输出都由触发器的原状态决定(即输出不是同步跟随输入而变)。§2.2
Verilog基本语法概述1Verilog语言要素构成2常量3变量4参数5向量6运算符1Verilog语言要素构成Verilog程序由符号流构成,符号包括空白符(Whitespace)注释(Comments)操作符(Operators)数字(Numbers)字符串(Strings)标识符(Identifiers)关键字(Keywords)等例如:数码显示电路moduledecode4_7(decodeout,indec);output[6:0]decodeout;input[3:0]indec;reg[6:0]decodeout;always@(indec)
begin
case(indec)//用case语句进行译码4'd0:decodeout=7'b1111110;4'd1:decodeout=7'b0110000;4'd2:decodeout=7'b1101101;4'd3:decodeout=7'b1111001;4'd4:decodeout=7'b0110011;4'd5:decodeout=7'b1011011;4'd6:decodeout=7'b1011111;4'd7:decodeout=7'b1110000;4'd8:decodeout=7'b1111111;4'd9:decodeout=7'b1111011;default:decodeout=7'bx;
endcaseendendmodule标识符数字操作符注释关键字⑴空白符和注释
空白符(Whitespace)空白符包括:空格、tab、换行和换页。空白符使代码错落有致,阅读起来更方便。在综合时空白符被忽略。注释(Comment)◆单行注释:以“//”开始到本行结束◆多行注释:多行注释以“/*”开始,到“*/”结束例如:⑵标识符(Identifiers)标识符(Identifiers)Verilog中的标识符可以是任意一组字母、数字以及符号“$”和“_”(下划线)的组合,但标识符的第一个字符必须是字母或者下划线。另外,标识符是区分大小写的。Examples:countCOUNT//COUNT与count是不同的_A1_d2//以下划线开头R56_68FIVE用于定义各种功能模块、参数和变量的名字。⑶关键字(Keywords)Verilog语言内部已经使用的词称为关键字或保留字,这些保留字用户不能作为变量或节点名字使用。关键字都是小写的。
例如:◆
整数◆
实数◆
字符串2、常量及类型程序运行中,值不能被改变的量称为常量(constants),Verilog中的常量主要有如下3种类型:
①简单的十进制格式这种形式的整数数值代表一个可选的+或-的操作符的数字系列。并且是一个有符号的数,在计算机内将转换为32位补码形式。如32-15等⑴整数(integer)②基数格式表示法整数按如下方式书写:<size>'<base><value>即<位宽>’<进制符号><数字串>size为对应二进制数的宽度;base为进制;value是基于进制的数字序列。这种形式的表示可灵活控制整数在计算机内位数。进制有如下4种表示形式:◆
二进制(b或B)◆
十进制(d或D或缺省)◆
十六进制(h或H)◆
八进制(o或O)整数(integer)Examples:8’b11000101//位宽为八位的二进制数110001018’hd5//位宽为八位的十六进制数d5;5’O27//5位八进制数4’D2//4位十进制数24’B1x_01//4位二进制数1x015’Hx//5位x(扩展的x),即xxxxx4’hZ//4位z,即zzzz8□’h□2A/*在位宽和’之间,以及进制和数值之间允许出现空格,但’和进制之间,数值间是不允许出现空格的,比如8’□h2A、8’h2□A等形式都是不合法的写法*/整数(integer)“位宽”如果缺省则按数字串的实际位数计算,如指定的位宽与数字串的长度不相符,则首先保留右边的低位,左边超出的高位部分被截断;若指定的位宽超过数字的实际长度,通常在数字系列的高位部分添0补位,若数字系列最左边一位是X或Z,则用x或z在左边补齐。<位宽>’<进制符号><数字串>“进制符号”如果缺省则默认为十进制。“数字串”中除0~9和字母A~F(与十六进制对应的数字)外还可以出现3种符号;x(表示不确定或随机状态)、z(表示高阻状态)和_(下划线,没有实际意义,用于增强程序的可读性)。每个字符所代表的宽度取决于所用的进制。使用中注意的问题:实数(Real)有下面两种表示法。◆①十进制表示法。这种表示时必须加小数点。例如:2.00.1 //以上2例是合法的实数表示形式2. //非法:小数点两侧都必须有数字◆②科学计数法。例如:43_5.1e2 //其值为43510.09.6E2 //960.0(e与E相同)5E-4 //0.0005⑵实数(Real)⑶字符串(Strings)字符串是双引号内的字符序列。字符串不能分成多行书写。例如:"INTERNALERROR"是错误的字符串的作用主要是用于仿真时,显示一些相关的信息,或者指定显示的格式。
字符串是8位ASCⅡ值的系列,是无符号整数。用反斜杠\表示的字符是特殊的反义字符。如\n表示换行符\t制表符\\\*\2063、变量及数据类型
Verilog有下面四种基本的逻辑状态。◆
0:低电平、逻辑0或逻辑非◆
1:高电平、逻辑1或“真”◆x或X:不确定或未知的逻辑状态◆z或Z:高阻态Verilog中的所有数据类型都在上述4类逻辑状态中取值,其中x和z都不区分大小写,也就是说,值0x1z与值0X1Z是等同的。变量是用来表示数字电路中的物理连线、数据存储和传输单元等物理量,变量遵循标识符命名规则。
数据类型
Verilog中的变量分为如下两种数据类型:◆net型◆variable型net型中常用的有wire、tri等;variable型包括reg、integer等。注意:在Verilog-1995标准中,variable型变量称为register型;在Verilog-2001标准中将register一词改为了variable,以避免初学者将register和硬件中的寄存器概念混淆起来。VerilogHDL有两大类数据类型线网类型(net型)
nettype表示Verilog结构化元件间的物理连线。它的值由驱动元件的值决定,例如连续赋值或门的输出。如果没有驱动元件连接到线网,线网的缺省值为z。寄存器类型(variable型)
registertype表示一个抽象的数据存储单元,它只能在always语句和initial语句中被赋值,并且它的值从一个赋值到另一个赋值被保存下来。寄存器类型的变量具有x的缺省值。*线网类型表示构件间的物理连线,而寄存器类型表示抽象的数据存储元件。⑴net型Net型数据相当于硬件电路中的各种物理连接,其特点是输出的值紧跟输入值的变化而变化。对连线型有两种驱动方式,一种方式是在结构描述中将其连接到一个门元件或模块的输出端;另一种方式是用持续赋值语句assign对其进行赋值。wire是最常用的Net型变量。变量默认是wire。wire型变量的定义格式如下:wire
[数据宽度]数据名1,数据名2,……数据名n;
[数据宽度]:忽略时,后面的变量宽度为“1位”例如:
wirea,b;
//定义了两个wire型变量a和b,宽度为1位。Examples:wire[7:0]databus;//databus的宽度是8位wire[19:0]addrbus;//addrbus的宽度是20位modulemux4_1a(out,in1,in2,in3,in4,s0,s1);inputin1,in2,in3,in4,s0,s1;outputout;wire
s0_n,s1_n,w,x,y,z;//可以省略not(s0_n,s0),(s1_n,s1);and(w,in1,s0_n,s1_n),(x,in2,s0_n,s1), (y,in3,s0,s1_n),(z,in4,s0,s1);or(out,w,x,y,z);endmodule这个4选1逻辑电路采用结构描述方法,其中的s0_n、s1_n、w、x、y、z这6个信号代表器件之间的物理连接,定义为wire型,当然输入与输出口采用默认,也是wire型。【例2.1】Wire特性wire变量仿真时不需要占用存储单元.⑵
Variable(或称寄存器型)变量有5种不同的寄存器类型:
•reg
•integer
•time
•real
•realtime■variable型变量必须放在过程语句(如initial、always)中,通过过程赋值语句赋值;在always、initial等过程块内被赋值的信号必须定义成variable型。■注意:variable型变量并不意味着一定对应着硬件上的一个触发器或寄存器等存储元件,但在仿真时需要占用一个存储单元,在综合器进行综合时,variable型变量会根据具体情况来确定是映射成连线还是映射为触发器或寄存器。
例如:同样定义为reg型,但生成的电路单元不同。modulesel(a,b,s,y);inputa,b,s; outputy;regy;always@(a,b,s)
begin
if(s)y=b;
elsey=a;
end
endmoduley生成的为线型驱动的组合逻辑电路q生成的为寄存器型时序逻辑电路reg型变量■①reg型变量
是最常用的一种variable型变量。定义格式如下:
reg[msb:lsb]reg1,reg2,...regN;msb和lsb
定义了范围,并且均为常数值表达式。范围定义是可选的;如果没有定义范围,缺省值为1位寄存器。
例如:rega,b;//定义了两个reg型变量a,b,长度1位reg[7:0]qout,a;//定义qout和a均为8位宽的reg型向量reg[1:8]qout;reg型变量寄存器可以取任意长度,寄存器中的值通常被解释为无符号数。reg[1:4]
Comb;
...
Comb=-2;//Comb的值为14(1110),1110是2的补码。
Comb=5;//Comb的值为5(0101)。
如:在过程语句中的被赋值变量必须定义为reg型例如:always语句中被赋值的变量定义为reg型②integer为整数型变量
一般整数型在计算机内至少是32位长度,为补码有符号数,不能进行位操作,只能整体赋值,但可以通过赋值reg将其转变为位操作。
格式为:
integer
integer1,integer2,...intergerN[msb:1sb];
integer变量如:integera,b,c;定义了3个32位整型变量
integerhist[3:6];一个由4个整型数组成的32位数组msb和lsb是定义整数数组界限的常量表达式,数组界限的定义是可选的。注意容许无位界限的情况。一个整数最少容纳32位。但是具体实现可提供更多的位。integer
J;
reg[3:0]
Bcq;
J=6;//J的值为32‘b0000...00110。
Bcq=J;//Bcq的值为4’b0110。
Bcq=4‘b0101.
J=Bcq;//J的值为32’b0000...00101。
J=-6;//J的值为32‘b1111...11010。
Bcq=J;//Bcq的值为4’b1010。
注意赋值总是从最右端的位向最左边的位进行;任何多余的位被截断。例如:integer与reg变量转换reg[31:0]
Breg;integerBint;//Bint[6]和Bint[20:10]是不允许的。...
Breg=Bint;/*现在,Breg[6]和Breg[20:10]是允许的,并且从整数Bint获取相应的位值。*/
上例说明了如何通过简单的赋值将整数转换为位向量。类型转换自动完成,不必使用特定的函数。从位向量到整数的转换也可以通过赋值完成。③time类型time类型的寄存器用于存储和处理时间。time类型的寄存器使用下述方式加以说明。
timetime_id1,time_id2,...,time_idN[msb:1sb];
msb和lsb是表明范围界限的常量表达式。如果未定义界限,每个标识符存储一个至少64位的时间值。时间类型的寄存器只存储无符号数。
如:
time
Events[0:31];//为32个64位时间值数组。
timeCurrTime;//CurrTime
存储一个64位时间。4参数(parameter)在Verilog语言中,用参数parameter来定义符号常量,即用parameter来定义一个标志符代表一个常量。参数常用来定义时延和变量的宽度。参数是局部的,只在其定义的模块内部起作用。其定义格式如下:parameter
参数名1=表达式1,参数名2=表达式2,参数名3=表达式3,……;
//表达式可以是数字和已定义的参数组成的表达式例如:parameterSEL=8,CODE=8'ha3;//分别定义参数SEL代表常数8(10进制),参数CODE代表常量a3(16进制)参数(parameter)【例2.2】采用参数定义的加法器moduleadd_w(a,b,sum);parameterMSB=15; //参数定义input[MSB:0]a,b;output[MSB+1:0]sum;assignsum=a+b;endmodule定义参数便于对程序中进行相关调试!5向量
⑴标量与向量宽度为1位的变量称为标量,如果在变量声明中没有指定位宽,则默认为标量(1位)。举例如下:
wirea; //a为标量
regclk; //clk为标量reg型变量线宽大于1位的变量(包括net型和variable型)称为向量(vector)。向量的宽度用下面的形式定义:[msb:lsb]比如:
wire[3:0]bus;//4位的总线⑵位选择和域选择
在表达式中可任意选中向量中的一位或相邻几位,分别称为位选择和域选择,这种使用方法方便灵活处理各种问题。例如:A=mybyte[6];//位选择B=mybyte[5:2];//域选择再比如:reg[7:0]a,b;reg[3:0]c;regd;d=a[7]&b[7]; //位选择c=a[7:4]+b[3:0]; //域选择5向量
5向量
⑶存储器定义格式:reg[位线最高位序号:位线最低序号]信号名[字线最高位序号:字线最低序号];其中的[]内的值可省略,默认1位。如:reg[7:0]mem[0:255]定义了一个有256个单元的宽度为8位的存储器。Reg一维定义的是矢量寄存器,二维定义的是存储器。5向量
在一个reg语句中既可以定义存储器型又可以定义寄存器型变量与一维reg型变量不同的是,二维reg型变量在引用时只能以一个单元为单位,既不能同时选择多个单元,也不能单独操作单元中的某些位。犹如integer型变量本身就是32位的数据,因此integer型数组也只能以一个整数为单位引用。如果想对位操作,可以先读出对应单元数据赋值给一个寄存器,这样就可以对位操作。5向量
6运算符(Operators)
⑴算术运算符(Arithmeticoperators)常用的算术运算符包括:与通常算数运算相同。算术运算符⑵位运算符(Bitwiseoperators)位运算是将两个操作数按对应位分别进行逻辑运算(若长度不同要将位数少的操作数填零补齐)。~ 按位取反& 按位与| 按位或^ 按位异或^~,~^ 按位同或(符号^~与~^是等价的)运算符(Operators)⑶逻辑运算符(Logicaloperators)&& 逻辑与||
逻辑或! 逻辑非
同按位操作不同的是将整个操作数视为真、假或不确定进行逻辑运算(即1、0、x),运算结果也为这三种状态。当操作数为向量时,逻辑操作符会自动强制其逻辑化,即非零向量当作“1”处理,全零向量当作“0”处理,相当于做了一个“或”规约。如果操作数中含有x或z,结果也为x。运算符(Operators)⑷关系运算符(Relationaloperators)< 小于<= 小于或等于> 大于>= 大于或等于
用于判断两个表达式的值之间的大小关系,皆为二元操作符,判断结果为真、假和不确定(即1、0、x)三种状态。运算符(Operators)modulecomp2_2(x,y,z,a,b);
inputa,b;
outputx,y,z;
regx,y,z;always@(a,b)begin
if(a==b)x<=1'b1;
elseif(a<b)y<=1'b1;
elsez<=1'b1;endendmodulemodulecomp2_2(x,y,z,a,b);
inputa,b;
outputx,y,z;
regx,y,z;always@(a,b)begin
if(a==b)beginx<=1'b1;y<=1'b0;z<=1'b0;end
elseif(a<b)beginy<=1'b1;x<=1'b0;z<=1'b0;end
elsebeginz<=1'b1;x<=1'b0;y<=1'b0;endendendmodule下面是数字比较器电路,判断a、b大小,根据大小分别输出给x、y、z。下面两种编程方法哪一个正确?仿真结果⑸等式运算符(EqualityOperators)== 等于!= 不等于=== 全等!== 不全等用于判断两个表达式的值之间的大小关系,皆为二元操作符,判断结果为真、假和不确定(即1、0、x)三种状态。后两个只能在仿真中应用。运算符(Operators)等式运算符前两个运算符其比较结果有三种可能值:真(1),假(0)和不定值(x);而后两种运算符其比较结果只有二种可能值:真(1),假(0).运算符(Operators)⑹缩位运算符(Reductionoperators)& 与~& 与非| 或~| 或非^ 异或^~,~^ 同或它们与前面的按位操作符形式相同,但使用方法不同,它们是一元操作符,其作用是将操作数的各位逐个进行与(与、与非、或、或非、异或、同或等)操作,最终形成一位的逻辑值。运算符(Operators)⑺移位运算符(shiftoperators)>> 右移<< 左移功能与c语言逻辑移位指令一样,空出的位添0补齐。操作数<<(>>)移动位数a=4’B0010;a<<2;a=4’B1000如【例2.3】采用参数定义的约翰逊计数器modulejohnson_w(clk,clr,qout);inputclk,clr;parameterWIDTH=8; //参数定义outputreg[(WIDTH-1):0]qout;always@(posedgeclkorposedgeclr)begin
if(clr)qout<=0;elsebeginqout<=qout<<1; qout[0]<=~qout[WIDTH-1];//灵活运用位赋值实现复杂逻辑功能endendendmodule0000000000000001000000110000011111111111仿真结果运算符(Operators)⑻条件运算符(conditionaloperators)三目运算符=?:,其定义方式如下:signal=condition?true_expression:false_expression;即:信号=条件?表达式1:表达式2;当条件成立时,信号取表达式1的值,反之取表达式2的值。modulecomp2_1(x,y,z,a,b);
parameterWIDTH=8;
//通过配置参数width来调节比较器的位宽input[WIDTH-1:0]a,b;
outputx,y,z;
assignx=(a==b)?1:0;//这些语句是并行执行
assigny=(a<b)?1:0;
assignz=(a>b)?1:0;endmodule4位输入,2位输出的4-2二进制编码器。当输入编码不是4中取一码时,输出编码为全x。//example_4_9:4-2binaryencodermodulebinary_encoder_4_2(
input[3:0]i_dec,
output[1:0]o_dec);//利用数据流描述和条件运算符‘?:’进行建模
assigno_dec=(i_dec==4'b0001)?2'b00:(i_dec==4'b0010)?2'b01:(i_dec==4'b0100)?2'b10:(i_dec==4'b1000)?2'b11:2'bxx;endmodule4-2二进制编码器运算符(Operators)⑼位拼接运算符(concatenationoperators){}该运算符将两个或多个信号的某些位拼接起来。使用如下:{信号1的某几位,信号2的某几位,……,信号n的某几位}如:assign{ci,si}=ai+bi
半加器求和赋值语句运算符的优先级下列为默认的操作符优先级排列,在书写程序时建议用括号()来控制运算的优先级。
参数(parameter)【例2.4】采用参数定义的数据比较器modulecompare_w(a,b,larger,equal,less);parameterSIZE=6; //参数定义input[SIZE-1:0]a,b;outputlarger,equal,less;wirelarger,equal,less;//可以省略assignlarger=(a>b);assignequal=(a==b);assignless=(a<b);endmodule参数(parameter)【例2.5】采用参数定义的二进制计数器modulecount_w(en,clk,reset,out);inputclk,reset,en;parameterWIDTH=8; //参数定义output[WIDTH-1:0]out;reg[WIDTH-1:0]out;always@(posedgeclkornegedgereset)if(!reset)out=0;elseif(en)out=out+1;endmodule
主要内容◆过程语句(initial、always)◆块语句(begin-end、fork-join)◆赋值语句(assign、=、<=)◆条件语句(if-else、case、casez、casex)◆循环语句(for、forever、repeat、while)◆编译指示语句(`define、`include、`ifdef、`else、`endif)◆任务(task)与函数(function)◆顺序执行与并发执行§2.3
Verilog行为描述语句VerilogHDL行为语句类别语句可综合性过程语句initial
always√块语句串行块begin-end√并行块fork-join
赋值语句持续赋值assign√过程赋值=、<=√条件语句if-else√case√
循环语句for√repeat
while
forever
编译向导语句`define√`include`ifdef,`else,`endif√1过程语句initialalways在一个模块(module)中,使用initial和always语句的次数是不受限制的。initial语句常用于仿真中的初始化,initial过程块中的语句仅执行一次;always块内的语句则是不断重复执行的。并且模块中的多个always和initial语句是同时并行运行。always过程语句使用模板always@(<敏感信号表达式event-expression>)begin//过程赋值//if-else,case,casex,casez选择语句//while,repeat,for循环//task,function调用end“always”过程语句通常是带有触发条件的,触发条件写在敏感信号表达式中,只有当触发条件满足时,其后的“begin-end”块内语句才能按顺序执行。⑴敏感信号表达式:@(<敏感信号表达式event-expression>)敏感信号表达式又称事件表达式或敏感信号列表,即当该表达式中变量的值改变时,就会引发块内语句的执行。因此敏感信号表达式中应列出影响块内取值的所有信号。若有两个或两个以上信号时,它们之间用“,”连接(或用“or”连接)。敏感信号列表可放在模块内任何位置,但一般放在always语句后。例如:@(a) //当信号a的值发生改变@(a,b) //当信号a或信号b的值发生改变@(posedgeclock)//当clock的上升沿到来时@(negedgeclock)//当clock的下降沿到来时@(posedgeclkornegedgereset) //当clk的上升沿到来或reset信号的下降沿到来敏感信号列表举例modulemux4_1(out,in0,in1,in2,in3,sel);outputout;inputin0,in1,in2,in3;input[1:0]sel;regout;always
@(in0,in1,in2,in3,sel)//敏感信号列表case(sel)2'b00: out=in0;2'b01: out=in1;2'b10: out=in2;2'b11: out=in3;
default:out=2'bx;endcaseendmodule4选1数据选择器posedge和negedge关键字对于时序电路,事件通常是由时钟边沿触发的,为表达边沿这个概念,Verilog提供了posedge表示上升沿和negedge表示下降沿关键字来描述。比如:【例】同步置数、同步清零的计数器modulecount(out,data,load,reset,clk);output[7:0]out;input[7:0]data;inputload,clk,reset;reg[7:0]out;always
@(posedge
clk)//clk上升沿触发
begin
if(!reset)out=8'h00;//同步清0,低电平有效
else
if(load)out=data;//同步预置
else out=out+1; //计数endendmodule⑵语句块块语句是包含在过程语句中,是由块标志符begin-end或fork-join界定的一组语句,当块语句只包含一条语句时,块标志符可以缺省。begin-end串行块中的语句按串行方式顺序执行。比如:
begin regb=rega; regc=regb; end由于begin-end块内的语句顺序执行,在最后,将regb、regc的值都更新为rega的值,该begin-end块执行完后,regb、regc的值是相同的。但要注意当赋值符“=”变为“<=”赋值符,则语句不是顺序执行,而是并行执行(后面将进一步说明)。2赋值语句⑴持续赋值语句(ContinuousAssignments)assign为持续赋值语句,主要用于对wire型变量的赋值,并且用“=”进行赋值。比如:assignc=a&b;在上面的赋值中,a、b、c三个变量皆为wire型变量,a和b信号的任何变化,都将随时反映到c上来。该语句不能放在过程语句块中,并且同过程语句并行运行。过程赋值语句多用于对reg型变量进行赋值。并且放在过程语句initial和always中。(1)非阻塞(non_blocking)赋值方式赋值符号为“<=”,如:b<=a;非阻塞赋值在整个过程块结束时才完成赋值操作,即b的值并不是立刻就改变的。多个这样的语句是同时并行执行的。(2)阻塞(blocking)赋值方式赋值符号为“=”,如:b=a;阻塞赋值在该语句结束时就立即完成赋值操作,即b的值在该条语句结束后立刻改变。如果在一个块语句中,有多条阻塞赋值语句,那么在前面的赋值语句没有完成之前,后面的语句就不能被执行,仿佛被阻塞了(blocking)一样,因此称为阻塞赋值方式。所以这类赋值语句是顺序执行。⑵过程赋值语句阻塞赋值与非阻塞赋值硬件描述非阻塞赋值modulenon_block(c,b,a,clk);outputc,b;inputclk,a;regc,b;always@(posedgeclk) begin b<=a; c<=b; endendmodule阻塞赋值moduleblock(c,b,a,clk);outputc,b;inputclk,a;regc,b;always@(posedgeclk) begin b=a; c=b; endendmodule阻塞赋值与非阻塞赋值仿真波形非阻塞赋值仿真波形图
阻塞赋值仿真波形图阻塞赋值与非阻塞赋值生成的电路非阻塞赋值综合结果阻塞赋值综合结果在过程语句中采用不同的赋值语句将会得到不同结果,所以使用时要注意!持续赋值与过程赋值区别:观察下列两种方式赋值的语句,其实现的结果相同,但过程不同。regA_xor_xire生成的电路为:持续赋值与过程赋值区别:持续赋值与过程赋值区别:3条件语句⑴(if-else语句)if-else语句使用方法有以下3种:(1)if(表达式)语句块;//单分支条件语句(2)if(表达式)语句块;//双分支条件语句
else语句块;(3)if(表达式1)语句块;//多分支条件语
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国石化高校毕业生招聘考试真题2025
- 2025年洛阳市洛龙区事业单位联考招聘考试试卷真题
- 热射病院前急救专家共识重点总结2026
- 2026年小学六年级语文第二学期期末考试卷及答案(五)
- 儿童流感防治指南要点2026
- 溶瘤病毒免疫治疗
- 幼儿园诗歌语言活动教案《小雨点》
- 2026七下【专项练习】专题09+阅读理解
- 任务5.1预应力混凝土连续梁构造
- 2026中级安全工程师《其他安全》课程精讲(第1-3章)
- 2026届山东省青岛市高三5月三模历史试题(含答案)
- 广东省惠州市一中教育集团2025-2026学年七年级下学期语文期中考试试卷(解析版)
- 中国咳嗽基层诊疗与管理指南(2024年)解读
- 侵袭性肺曲霉病课件
- FZ∕T 12023-2021 间位芳纶本色纱线
- 电梯维保人员奖惩制度
- 百慕大三角分析课件
- 重庆市南川区-2023学年五年级下学期期末数学试卷
- 宋词-教学讲解课件(全)
- 设备验收安装及调试
- YC/T 479-2013烟草商业企业标准体系构成与要求
评论
0/150
提交评论