第九章 硬件描述语言Verilog HDL (2)_第1页
第九章 硬件描述语言Verilog HDL (2)_第2页
第九章 硬件描述语言Verilog HDL (2)_第3页
第九章 硬件描述语言Verilog HDL (2)_第4页
第九章 硬件描述语言Verilog HDL (2)_第5页
已阅读5页,还剩145页未读 继续免费阅读

下载本文档

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

文档简介

1、19.8 9.8 循环语句循环语句9.9 9.9 结构说明语句结构说明语句9.10 9.10 编译预处理语句编译预处理语句9.11 9.11 语句的顺序执行与并行执行语句的顺序执行与并行执行9.12 9.12 不同抽象级别的不同抽象级别的Verilog HDLVerilog HDL模型模型9.13 9.13 设计技巧设计技巧9.1 9.1 引言引言9.2 Verilog HDL9.2 Verilog HDL基本结构基本结构9.3 9.3 数据类型及常量、变量数据类型及常量、变量9.4 9.4 运算符及表达式运算符及表达式9.5 9.5 语句语句9.6 9.6 赋值语句和块语句赋值语句和块语句9

2、.7 9.7 条件语句条件语句第第9 9章章 硬件描述语言硬件描述语言Verilog HDLVerilog HDL29.1 9.1 引言引言一、什么是一、什么是Verilog HDLVerilog HDL二、二、Verilog HDLVerilog HDL的发展历史的发展历史三、不同层次的三、不同层次的Verilog HDLVerilog HDL抽象抽象 四、四、Verilog HDLVerilog HDL的特点的特点39.1 9.1 引言引言一、一、什么是什么是Verilog HDL Verilog HDL是一种用于是一种用于数字数字逻辑电路设计的硬件描述逻辑电路设计的硬件描述语言(语言(H

3、radware Description Language ),可以用来进,可以用来进行数字电路的仿真验证、时序分析、逻辑综合。行数字电路的仿真验证、时序分析、逻辑综合。用Verilog HDL描述的电路设计就是该电路的Verilog HDL模型。Verilog HDL 既是一种行为描述语言也是一种结构描述语言。 既可以用电路的功能描述,也可以用元器件及其之间的既可以用电路的功能描述,也可以用元器件及其之间的连接来建立连接来建立Verilog HDLVerilog HDL模型。模型。49.1 9.1 引言引言二、二、Verilog HDLVerilog HDL的发展历史的发展历史 1983年,由

4、年,由GDA(GateWay Design Automation)公)公司的司的Phil Moorby首创;首创; 1989年,年,Cadence公司收购了公司收购了GDA公司;公司; 1990年,年, Cadence公司公开发表公司公开发表Verilog HDL; 1995年年,IEEE制定并公开发表制定并公开发表Verilog HDL1364-1995标准;标准; 1999年,模拟和数字电路都适用的年,模拟和数字电路都适用的Verilog标准公开标准公开发表发表59.1 9.1 引言引言三、不同层次的三、不同层次的Verilog HDLVerilog HDL抽象抽象 Verilog HDL

5、Verilog HDL模型可以是实际电路的不同级别的抽象。模型可以是实际电路的不同级别的抽象。抽象级别可分为抽象级别可分为五五级:级:系统级系统级(system level): (system level): 用高级语言结构(如case语句)实现的设计模块外部性能的模型;算算法级法级(algorithmic level): (algorithmic level): 用高级语言结构实现的设计算法模型(写出逻辑表达式);RTLRTL级级(register transfer level): (register transfer level): 描述数据在寄存器之间流动和如何处理这些数据的模型;门级门

6、级(gate level): (gate level): 描述逻辑门(如与门、非门、或门、与非门、三态门等)以及逻辑门之间连接的模型;开关级开关级(switch level): (switch level): 描述器件中三极管和储存节点及其之间连接的模型。返回返回9.1269.1 9.1 引言引言四、四、Verilog HDLVerilog HDL的特点的特点 语法结构上的主要语法结构上的主要特点特点: 形式化地表示电路的行为和结构; 借用C语言的结构和语句; 可在多个层次上对所设计的系统加以描述,语言对设计规模不加任何限制; 具有混合建模能力:一个设计中的各子模块可用不同级别的抽象模型来描述

7、; 基本逻辑门、开关级结构模型均内置于语言中,可直接调用; 易创建用户定义原语(UDP,User Designed Primitive) 。 易学易用,功能强易学易用,功能强与与C C语言语言非常相非常相似似!79.2 Verilog HDL9.2 Verilog HDL基本结构基本结构一、简单的一、简单的Verilog HDLVerilog HDL例子例子二、二、Verilog HDLVerilog HDL模块的结构模块的结构三、逻辑功能定义三、逻辑功能定义四、关键字四、关键字五、标识符五、标识符六、编写六、编写Verilog HDLVerilog HDL源代码的标准源代码的标准89.2 V

8、erilog HDL9.2 Verilog HDL基本结构基本结构一、简单的一、简单的Verilog HDLVerilog HDL例子例子 例例9.2.1 8 8位全加器位全加器module adder8 ( cout,sum,a,b,cin ); output cout; / 输出端口声明输出端口声明 output 7:0 sum; input 7:0 a,b; / 输入端口声明输入端口声明 input cin; assign cout,sum=a+b+cin;endmodule assign语句:无论右边表达式操作数何时发生变化,右边表达式都语句:无论右边表达式操作数何时发生变化,右边表达

9、式都会重新计算,并且在指定的延迟后给左边表达式赋值。会重新计算,并且在指定的延迟后给左边表达式赋值。I/O说明说明端口定义端口定义功能描述功能描述模块名(文件名)整个整个Verilog HDLVerilog HDL程序嵌套在程序嵌套在modulemodule和和endmoduleendmodule声明语句中。声明语句中。每条语句相对每条语句相对modulemodule和和endmoduleendmodule最好缩进最好缩进2 2格或格或4 4格!格!/ / 表示注释部分,一般只占据表示注释部分,一般只占据一一行。对编译不起作用!行。对编译不起作用!单行注释符99.2 Verilog HDL9.

10、2 Verilog HDL基本结构基本结构 例例9.2.2 8 8位计数器位计数器module counter8 ( out,cout,data,load, cin,clk ); output 7:0 out; output cout; input 7:0 data; input load, cin,clk ; reg7:0 out; always (posedge clk) begin if(load) out = data; / 同步预置数据同步预置数据 else out = out + 1 + cin; / 加加1计数计数 end assign cout = &out &

11、 cin; /若若out为为8hFF,cin为为1,则,则cout为为1endmoduleI/O说明说明端口定义端口定义功能描述功能描述信号类型声明信号类型声明缩减运算符位运算符109.2 Verilog HDL9.2 Verilog HDL基本结构基本结构 例例9.2.3 2 2位比较器位比较器module compare2 ( equal,a,b); output equal; input 1:0 a,b; assign equal = ( a = = b ) ? 1:0; / * 如果如果a等于等于b,则,则equal 为为1,否则为,否则为0 * /endmodule“=”非阻塞过程性

12、赋值:将想要赋给左式的值安排在未来时刻。不等上一个赋值非阻塞过程性赋值:将想要赋给左式的值安排在未来时刻。不等上一个赋值完成执行下个赋值语句。完成执行下个赋值语句。“=” 阻塞过程性赋值:按照顺序执行,前一个赋值结束才执行下边的赋值语句。阻塞过程性赋值:按照顺序执行,前一个赋值结束才执行下边的赋值语句。连续赋值语句连续赋值语句条件运算符条件运算符/ / * * * * / /内表示注释部分,一般可占据内表示注释部分,一般可占据多多行。行。对编译不起作用!对编译不起作用!多行注释符多行注释符119.2 Verilog HDL9.2 Verilog HDL基本结构基本结构 例例9.2.4 三态驱动

13、器三态驱动器module trist2(out,in,enable); output out; input in, enable; bufif1 mybuf(out,in,enable);endmodule例化元件名门元件关键字门元件例化门元件例化程序通过调用一程序通过调用一个在个在VerilogVerilog语言库中现存的实例语言库中现存的实例门元件来实现某逻辑门功能。门元件来实现某逻辑门功能。 Inputs | OutputIN ENABLE| OUTX0| Z11| 101| 0bufif1bufif1的真值表的真值表门元件例化门元件例化12module trist1(out,in,en

14、able); output out; input in, enable; mytri tri_inst(out,in,enable);endmodulemodule mytri(out,in,enable); output out; input in, enable; assign out = enable? in:bz; / * 如果如果enable为为1,则,则out = in,否则为高阻态,否则为高阻态 * /endmodule9.2 Verilog HDL9.2 Verilog HDL基本结构基本结构 例例9.2.5 三态驱动器三态驱动器例化元件名子模块名顶层模块顶层模块子模块子模块模

15、块元件例化模块元件例化模块元件例化模块元件例化顶层模块(顶层模块(trist1trist1)调用由某子模块)调用由某子模块(mytrimytri)定义的实例元件()定义的实例元件(tri_insttri_inst)来实现某功能。)来实现某功能。返回返回逻辑逻辑功能定义功能定义139.2 Verilog HDL9.2 Verilog HDL基本结构基本结构Verilog HDL程序是由程序是由模块模块构成的。每个模块嵌套在构成的。每个模块嵌套在module和和endmodule声明语句中。模块是可以进行层次嵌套的。声明语句中。模块是可以进行层次嵌套的。每个每个Verilog HDL源文件中只准有

16、一个顶层模块,其他为子模块。源文件中只准有一个顶层模块,其他为子模块。每个模块要进行端口定义,并说明输入输出端口,然后对模块的每个模块要进行端口定义,并说明输入输出端口,然后对模块的功能进行行为逻辑描述。功能进行行为逻辑描述。程序书写格式自由,一行可以写几个语句,一个语句也可以分多程序书写格式自由,一行可以写几个语句,一个语句也可以分多行写。行写。除了除了endmodule语句、语句、begin_end语句和语句和fork_join语句外,每个语语句外,每个语句和数据定义的最后必须有分号。句和数据定义的最后必须有分号。可用可用/*.*/和和/.对程序的任何部分作注释。加上必要的注释,以对程序的

17、任何部分作注释。加上必要的注释,以增强程序的可读性和可维护性。增强程序的可读性和可维护性。149.2 Verilog HDL9.2 Verilog HDL基本结构基本结构二、二、Verilog HDLVerilog HDL模块的结构模块的结构 VerilogVerilog的基本设计单元是的基本设计单元是“模块模块 (block) (block) ” 。 Verilog Verilog 模块的结构由在模块的结构由在modulemodule和和endmoduleendmodule关键词关键词之间的之间的4 4个主要部分组成:个主要部分组成:module block1(amodule block1(

18、a, ,b b, ,c c, ,d )d ); input ainput a, ,b b, ,c c; output doutput d; wire xwire x; assign d = a | xassign d = a | x; assign x = ( b & assign x = ( b & c )c );endmoduleendmoduleI/O说明说明端口定义端口定义功能描述功能描述信号类型声明信号类型声明1234159.2 Verilog HDL9.2 Verilog HDL基本结构基本结构三、逻辑功能定义三、逻辑功能定义 在在Verilog Verilog 模

19、块中有模块中有3 3种方法可以描述电路的逻辑功能种方法可以描述电路的逻辑功能:(1 1)用用assign 语句语句 assign x = ( b & c );连续赋值语句连续赋值语句常用于描述组合组合逻辑门元件例化门元件例化模块元件例化模块元件例化例化元件名门元件关键字(2 2)用元件例化(用元件例化(instantiate)and myand3( f,a,b,c);v 注注1 1:元件例化即是调用:元件例化即是调用Verilog HDLVerilog HDL提供的元件;提供的元件;v 注注2 2:元件例化包括:元件例化包括门门元件例化和元件例化和模块模块元件例化;元件例化;v 注注3

20、 3:每个实例元件的名字必须每个实例元件的名字必须唯一唯一!以避免与其!以避免与其它调用元件的实例相混淆。它调用元件的实例相混淆。v 注注4 4:例化元件名也可以省略!例化元件名也可以省略!169.2 Verilog HDL9.2 Verilog HDL基本结构基本结构(3 3)用用 “alwaysalways” 块语句块语句 always (posedge clk) / 每当时钟上升沿到来时执行一遍块内语句每当时钟上升沿到来时执行一遍块内语句 begin if(load) out = data; / 同步预置数据同步预置数据 else out = data + 1 + cin; / 加加1计

21、数计数 end结构说明语句结构说明语句v注注1 1:“alwaysalways” 块语句块语句常用于描述常用于描述时序时序逻辑,也逻辑,也可描述可描述组合组合逻辑。逻辑。v注注2 2:“alwaysalways” 块块可用多种手段来表达逻辑关系可用多种手段来表达逻辑关系,如用,如用if-elseif-else语句或语句或casecase语句。语句。v注注3 3: “alwaysalways” 块语句与块语句与assignassign语句是并发执行语句是并发执行的,的, assignassign语句一定要放在语句一定要放在“alwaysalways” 块语句之外块语句之外!179.2 Veril

22、og HDL9.2 Verilog HDL基本结构基本结构v Verilog Verilog HDLHDL模块的模板(仅考虑用于逻辑综合的部分)模块的模板(仅考虑用于逻辑综合的部分)module () ; output 输出端口列表;输出端口列表; input 输入端口列表输入端口列表; /(1)使用)使用assign语句定义逻辑功能语句定义逻辑功能 wire 结果信号名;结果信号名; assign = 表达式表达式 ; /(2)使用)使用always块定义逻辑功能块定义逻辑功能 always () begin /过程赋值语句过程赋值语句 /if语句语句 / case语句语句 / while,

23、repeat,for循环语句循环语句 / task,function调用调用 end189.2 Verilog HDL9.2 Verilog HDL基本结构基本结构/ (3)元件例化)元件例化 (); / 模块元件例化模块元件例化 (); / 门元件例化门元件例化endmodule例化元件名例化元件名也可以省略!也可以省略!199.2 Verilog HDL9.2 Verilog HDL基本结构基本结构四、关键字四、关键字 关键字关键字事先定义好的确认符,用来组织语言结构;事先定义好的确认符,用来组织语言结构;或者用于定义或者用于定义Verilog HDLVerilog HDL提供的门元件(如

24、提供的门元件(如andand,notnot,oror,bufbuf)。)。 用用小写小写字母定义!字母定义! 如如always,assign,begin,case,casex,else,end,for,function,if,input,output,repeat,table,time,while,wire 见见数字系统设计与数字系统设计与Verilog HDL P285附录附录A。用户程序中的用户程序中的变变量、节点等量、节点等名称名称不能与不能与关键字关键字同同名!名!209.2 Verilog HDL9.2 Verilog HDL基本结构基本结构Verilog HDL关键字关键字edge

25、elseendendcaseendfunctionendprimitiveendmoduleendspecifyendtableendtaskeventforforceforeverforkfunction highz0highz1 ififnoneinitialinoutinputintegerjoinlargemacromodulemediummodulenandnegedgenor notnotif0notif1nmosoroutputparameterpmosposedgeprimitivepulldownpulluppull0pull1andalwaysassignbeginbufb

26、ufif0bufif1casecasexcasezcmosdeassigndefaultdefparamdisable219.2 Verilog HDL9.2 Verilog HDL基本结构基本结构Verilog HDL关键字关键字(续)(续)tri0tri1 vectoredwaitwandweak0weak1whilewireworxnorxorrcmosrealrealtimeregreleaserepeatrnmosrpmosrtranrtranif0rtranif1scalaredsmallspecifyspecparamstrengthstrong0 strong1supply0s

27、upply1tabletasktrantranif0tranif1timetritriandtriortrireg229.2 Verilog HDL9.2 Verilog HDL基本结构基本结构五、标识符五、标识符 任何用任何用Verilog Verilog HDLHDL语言描述的语言描述的“东西东西”都通过其名字来识别,都通过其名字来识别,这个名字被称为这个名字被称为标识符标识符。 如源文件名、模块名、端口名、变量名、常量名、实例名等。如源文件名、模块名、端口名、变量名、常量名、实例名等。 标识符可由字母、数字、下划线和标识符可由字母、数字、下划线和$ $符号构成;符号构成;但第一个字符但第

28、一个字符必须是字母或下划线,不能是数字或必须是字母或下划线,不能是数字或$ $符号符号! 在在Verilog Verilog HDLHDL中变量名是区分大小写的!中变量名是区分大小写的! 合法合法的名字:的名字:A_99_ZReset_54MHz_Clock$Module 不合法不合法的名字:的名字:123a$datamodule7seg.v标识符标识符不能与不能与关键字关键字同名!同名!239.3 9.3 数据类型及常量、变量数据类型及常量、变量一、数据类型一、数据类型二、常量二、常量三、变量三、变量 249.3 9.3 数据类型及常量、变量数据类型及常量、变量一、数据类型一、数据类型 数据

29、类型是用来表示数字电路中的数据存储和传送单元。数据类型是用来表示数字电路中的数据存储和传送单元。 Verilog Verilog HDLHDL中共有中共有19种数据类型;种数据类型; 其中其中4个最基本的数据类型为:个最基本的数据类型为:integer型parameter型reg型wire型 其 它 数 据 类 型 :其 它 数 据 类 型 :large型、medium型、 scalared型、 small型、time型、tri型、tri0型、tri1型、triand型、trior型、trireg型、vectored型、wand型、wor型等二、常量二、常量 在程序运行过程中,其值不能被改变的

30、量,称为在程序运行过程中,其值不能被改变的量,称为常量常量。数字数字(包括整数,x和z值,负数)parameterparameter常量常量(或称符号常量)259.3 9.3 数据类型及常量、变量数据类型及常量、变量整常数的整常数的3种表达方式:种表达方式:表表 达达 方方 式式说说 明明 举举 例例 完整的表达方式8b11000101或8 hc5 缺省位宽,则位宽由机器系统决定,至少32位hc5 缺省进制为十进制,位宽默认为32位197(1 1)整数型常量整数型常量(即(即整常数整常数)的)的4 4种进制表示形式:种进制表示形式:二进制整数(b或B);十进制整数(d或D);十六进制整数(h或

31、H);八进制整数(o或O)。v注:注:这里位宽指对应二进制数的宽度。这里位宽指对应二进制数的宽度。269.3 9.3 数据类型及常量、变量数据类型及常量、变量(2 2)x x和和z z值值x x表示不定值,表示不定值,z z表示高阻值;表示高阻值;8b1001xxxx或8 h9x8b1010zzzz或8 haz每个字符代表的二进制数的宽度取决于所用的进制;每个字符代表的二进制数的宽度取决于所用的进制;当用二进制表示时,已标明位宽的数若用当用二进制表示时,已标明位宽的数若用x x或或z z表示某些位,则只有在表示某些位,则只有在最左边最左边的的x x或或z z具有具有扩展性扩展性!为清晰可见,最

32、好直接写出每一位的值!为清晰可见,最好直接写出每一位的值! 例8bzx = 8bzzzz_zzzx 例8b1x = 8b0000_001x“?”是是z z的另一种表示符号,建议在的另一种表示符号,建议在casecase语句中使用语句中使用?表示高阻态表示高阻态z 例 casez (select) 4b?1: out = a; 4b?1?: out = b; 4b?1?: out = c; 4b1?: out = d; endcase279.3 9.3 数据类型及常量、变量数据类型及常量、变量(3 3)负数负数在位宽前加一个减号,即表示负数在位宽前加一个减号,即表示负数如:如:-8-8d5 /5

33、的补数,的补数,= 8b11111011减号不能放在位宽与进制之间,也不能放在进制减号不能放在位宽与进制之间,也不能放在进制与数字之间!与数字之间!8 d-5 /非法格式非法格式v 为提高可读性,在较长的数字之间可用下划线为提高可读性,在较长的数字之间可用下划线_ _隔开!但隔开!但不可以用在不可以用在和和之间。之间。 如:如:1616b1010_1011_1100_1111 /b1010_1011_1100_1111 /合法合法 8 8b b_ _0011_1010 /0011_1010 /非法非法v当常量未指明位宽时,默认为当常量未指明位宽时,默认为3232位。位。10 = 3210 =

34、32d10 = 32d10 = 32b1010b1010-1 = -32-1 = -32d1 = 32d1 = 32b1111b11111111 = 321111 = 32hFFFFFFFFhFFFFFFFF289.3 9.3 数据类型及常量、变量数据类型及常量、变量(4 4)parameterparameter常量(符号常量)常量(符号常量)用用parameterparameter来定义一个标识符,代表一个常量来定义一个标识符,代表一个常量称为称为符号符号常量。常量。参数型数据的确认符parameterparameter 参数名参数名1 = 1 = 表达式表达式, ,参数名参数名2 = 2

35、= 表达式表达式, , ;每个赋值语句的右边必须为常数表达式,即只能包含数字或先前定义过的符号常量! parameter addrwidth = 16; /合法格式 parameter addrwidth = datawidth*2; /非法格式常用参数来定义延迟时间和变量宽度。可用字符串表示的任何地方,都可以用定义的参数来代替。参数是本地的,其定义只在本模块内有效。在模块或实例引用时,可通过参数传递改变在被引用模块或实例中已定义的参数!赋值语句表299.3 9.3 数据类型及常量、变量数据类型及常量、变量三、变量三、变量 在程序运行过程中,其值可以改变的量,称为在程序运行过程中,其值可以改变

36、的量,称为变量变量。 其数据类型有其数据类型有1919种,常用的有种,常用的有3 3种:种:网络型(nets type)寄存器型(register type )数组(memory type)1. nets1. nets型变量型变量 定义定义输出始终随输入的变化而变化的变量输出始终随输入的变化而变化的变量。 表示结构实体(如门)之间的表示结构实体(如门)之间的物理物理连接。连接。常用常用netsnets型变量:型变量:wire,tri:连线类型(两者功能一致)wor,trior:具有线或特性的连线(两者功能一致)wand,triand:具有线与特性的连线(两者功能一致)tri1,tri0:上拉电

37、阻和下拉电阻supply1,supply0:电源(逻辑1)和地(逻辑0)netsnets型变量型变量不能储存值!不能储存值!309.3 9.3 数据类型及常量、变量数据类型及常量、变量 wire型变量型变量最常用的nets型变量,常用来表示以assign语句赋值的组合逻辑信号。模块中的输入/输出信号类型缺省为wire型。可用做任何方程式的输入,或“assign”语句和实例元件的输出。wirewire 数据名数据名1,1,数据名数据名2, 2, , ,数据名数据名n;n;wiren-1:0wiren-1:0 数据名数据名1,1,数据名数据名2, 2, , ,数据名数据名m;m;或或 wiren:

38、1wiren:1 数据名数据名1,1,数据名数据名2, 2, , ,数据名数据名m;m;每条总线位宽为n共有m条总线wirewire型向量(总线)型向量(总线)319.3 9.3 数据类型及常量、变量数据类型及常量、变量 定义定义对应对应具有状态保持作用具有状态保持作用的电路元件(如触发器、的电路元件(如触发器、寄存器等)寄存器等), ,常用来表示常用来表示过程块过程块语句(如语句(如initialinitial,alwaysalways,tasktask,functionfunction)内的指定信号)内的指定信号 。 常用常用registerregister型变量:型变量:reg:常代表触

39、发器integer:32位带符号整数型变量real:64位带符号实数型变量time:无符号时间变量纯数学的纯数学的抽象描述抽象描述2. register2. register型变量型变量329.3 9.3 数据类型及常量、变量数据类型及常量、变量vregisterregister型变量与型变量与netsnets型变量的根本区别是:型变量的根本区别是: registerregister型型变量需要被明确地赋值,并且在被重新赋值前一直保持变量需要被明确地赋值,并且在被重新赋值前一直保持原值。原值。vregisterregister型变量必须通过型变量必须通过过程过程赋值语句赋值!不能通过赋值语句赋

40、值!不能通过assignassign语句赋值!语句赋值!v在过程块内被赋值的每个信号必须定义成在过程块内被赋值的每个信号必须定义成registerregister型!型!339.3 9.3 数据类型及常量、变量数据类型及常量、变量 reg型变量型变量定义定义在过程块中被赋值的信号在过程块中被赋值的信号,往往往往代表触发器,代表触发器,但但不一定不一定就是触发器(也可以是组合逻辑信号)!就是触发器(也可以是组合逻辑信号)!regreg 数据名数据名1,1,数据名数据名2, 2, , ,数据名数据名n;n;regn-1:0regn-1:0 数据名数据名1,1,数据名数据名2, 2, , ,数据名数

41、据名m;m;或或 regn:1regn:1 数据名数据名1,1,数据名数据名2, 2, , ,数据名数据名m;m;每个向量位宽为n共有m个reg型向量 例例 reg4:1 regc,regd; / reg4:1 regc,regd; / /regc,regdregc,regd为为4 4位宽的位宽的regreg型向量型向量regreg型向量(总线)型向量(总线)349.3 9.3 数据类型及常量、变量数据类型及常量、变量用用regreg型变量生成型变量生成组合逻辑组合逻辑举举例例:module rw1( a, b, out1, out2 ) ; input a, b; output out1,

42、out2; reg out1; wire out2; assign out2 = a ; always (b) out1 = b;endmoduleaout2BUFFbINVout1过程赋值语句连续赋值语句电平电平触发Verilog中中reg与与wire的区别的区别regreg型变量既可生成触发器,型变量既可生成触发器,也可生成组合逻辑;也可生成组合逻辑; wirewire型变量只能生成组合逻辑。型变量只能生成组合逻辑。359.3 9.3 数据类型及常量、变量数据类型及常量、变量用用regreg型变量生成型变量生成触发器触发器举举例例:module rw2( clk, d, out1, out

43、2 ); input clk, d; output out1, out2; reg out1; wire out2; assign out2 = d & out1 ; always (posedge clk) begin out1 b)&(bc) 可简写为: ab & bc (a= =b)|(x= = y)可简写为: a= =b|x= = y (!a)|(ab)可简写为: !a|ab为提高程序的可读性,明确表达各运算符之间为提高程序的可读性,明确表达各运算符之间的优先关系,建议使用的优先关系,建议使用括号括号!459.4 9.4 运算符及表达式运算符及表达式三、位运算符

44、三、位运算符位运算符位运算符说明说明 &|,按位取反按位与按位或按位异或按位同或双双目运算符单单目运算符 位运算其结果与操作数位数相同。位运算符中的双目位运算其结果与操作数位数相同。位运算符中的双目运算符要求对两个操作数的相应位运算符要求对两个操作数的相应位逐位逐位进行运算。进行运算。 两个不同长度的操作数进行位运算时,将自动按两个不同长度的操作数进行位运算时,将自动按右右端端对齐对齐,位数少的操作数会在高位用,位数少的操作数会在高位用0 0补齐。补齐。 例 若A = 5b11001,B = 3b101, 则A & B = (5b11001)&(5b0000101)=

45、5b00001 469.4 9.4 运算符及表达式运算符及表达式 例例 & &运算符和运算符和& &(按位与)的区别(按位与)的区别&运算的结果为运算的结果为1 1位的逻辑值位的逻辑值注意注意&和和& &的区别!的区别!被认为是 1b1被认为是 1bx逻辑与结果为 1bx479.4 9.4 运算符及表达式运算符及表达式四、关系运算符四、关系运算符关系运算符关系运算符说明说明= 小于小于或等于大于大于或等于双双目运算符括号内先运算!括号内先运算!算术运算先运算!算术运算先运算! 运算结果为运算结果为1 1位的逻辑值位的逻辑值1 1或

46、或0 0或或x x。关系运算时,若关系为关系运算时,若关系为真真,则返回值为则返回值为1 1;若声明的关系为;若声明的关系为假假,则返回值为,则返回值为0 0;若某操作数为;若某操作数为不不定值定值x x,则返回值为,则返回值为x x。所有的关系运算符优先级别相同。所有的关系运算符优先级别相同。关系运算符的优先级关系运算符的优先级低于低于算术运算符。算术运算符。 例 asize - 1等同于: a(size - 1) size -(1a)不等同于: size-1 n An 或或 An A3 = 4b0001; 4b10014 = 4b0000 4b10011 = 5b10010; 4b1001

47、2 = 6b100100; 16 = 32b1000000v将操作数右移或左移将操作数右移或左移n n位,相位,相当于将操作数除以或乘以当于将操作数除以或乘以2 2n n。右移位数不变,右移位数不变,但右移的数据但右移的数据会丢失!会丢失!529.4 9.4 运算符及表达式运算符及表达式八、条件运算符八、条件运算符三三目运算符in1outMUXin0sel信号信号 = = 条件条件?表达式表达式1 1:表达式表达式2 2 条件运算符为条件运算符为?:?: 用法:用法: 例例 数据选择器数据选择器assign out = sel? in1:in0;当条件为当条件为真真,信号取表,信号取表达式达式

48、1 1的值;为的值;为假假,则,则取表达式取表达式2 2的值。的值。sel=1sel=1时时out=in1out=in1; sel=0sel=0时时out=in0out=in0539.4 9.4 运算符及表达式运算符及表达式九、位拼接运算符九、位拼接运算符 位拼接运算符为位拼接运算符为 用于将两个或多个信号的某些位拼接起来,表示一个用于将两个或多个信号的某些位拼接起来,表示一个整体整体信号。信号。 用法:用法: 信号信号1 1的某几位,信号的某几位,信号2 2的某几位,的某几位,信号,信号n n的某几位的某几位 例如在进行加法运算时,可将进位输出与和拼接在一起使用。例如在进行加法运算时,可将进

49、位输出与和拼接在一起使用。 例1 output 3:0 sum; /和 output cout; /进位输出进位输出 input3:0 ina,inb; input cin; assign cout,sum = ina + inb +cin;/进位与和拼接在一起进位与和拼接在一起 例2 a,b3:0,w,3b101 = a,b3,b2,b1,b0,w,1b1,1b0,1b1549.4 9.4 运算符及表达式运算符及表达式 可用重复法简化表达式,如:4w /等同于w,w,w,w 还可用嵌套方式简化书写,如: b,3a,b /等同于b,a,b,a,b,a,b,也等同于b,a,b,a,b,a,b用于

50、表示重复的表达式必须为常数常数表达式!v在位拼接表达式中,不允许存在没有指明位数的信号在位拼接表达式中,不允许存在没有指明位数的信号,必须指明信号的位数;若未指明,则,必须指明信号的位数;若未指明,则默认为默认为3232位的位的二进制数二进制数!v如如1,0 = 641,0 = 64h00000001_00000000h00000001_00000000, 注意注意1,01,0不等于不等于2 2b10b10559.4 9.4 运算符及表达式运算符及表达式十、运算符的优先级十、运算符的优先级类类 别别运运 算算 符符优先级优先级逻辑、位运算符! 高低算术运算符* / % 移位运算符关系运算符 =

51、等式运算符= = ! = = !=缩减、位运算符& & | |逻辑运算符&|条件运算符?:表表3-3 运算符的优先级运算符的优先级为提高程序的可读性,为提高程序的可读性,建议使用建议使用括号括号来控制来控制运算的优先级!运算的优先级!例(ab)&(bc) (a= =b)|(x= = y) (!a)|(ab)569.5 9.5 语句语句u赋值语句赋值语句u块语句块语句u条件语句条件语句u循环语句循环语句u结构说明语句结构说明语句u编译预处理语句编译预处理语句579.5 9.5 语句语句赋值语句赋值语句连续赋值语句过程赋值语句块语句块语句begin_end语句for

52、k_join语句Quartus II不支持条件语句条件语句if_else语句case语句循环语句循环语句forever语句MAX+PLUS II不支持repeat语句MAX+PLUS II不支持while语句MAX+PLUS II不支持for语句结构说明语句结构说明语句initial语句Quartus II不支持always语句task语句MAX+PLUS II不支持function语句编译预处理语句编译预处理语句define语句include语句Quartus II不支持timescale语句Quartus II不支持表表3-4 Verilog HDL的语句的语句589.5 9.5 语句语句

53、v注:注: 上表中,凡上表中,凡Quartus IIQuartus II不支持的语句是不可综合的不支持的语句是不可综合的,通常用在测试文件中;未注明,通常用在测试文件中;未注明“Quartus IIQuartus II不支持不支持”的语句均是可综合的。的语句均是可综合的。repeatrepeat语句和语句和tasktask语句语句MAX+PLUS IIMAX+PLUS II不支持,但不支持,但Quartus IIQuartus II支持;支持;foreverforever语句、语句、 whilewhile语句语句MAX+PLUS IIMAX+PLUS II不支持,不支持,Quartus IIQ

54、uartus II支持,但通常用在测试模块中;支持,但通常用在测试模块中;表中只有表中只有4 4种语句(种语句(fork_joinfork_join,initialinitial, includeinclude, timescaletimescale)是)是Quartus IIQuartus II不支持不支持的,它们通常用在测试模块中(的,它们通常用在测试模块中(ModelSimModelSim软件支持软件支持)。)。599.6 9.6 赋值语句和块语句赋值语句和块语句一、赋值语句一、赋值语句二、非阻塞赋值与二、非阻塞赋值与 阻塞赋值的区别阻塞赋值的区别三、块语句三、块语句609.6 9.6

55、赋值语句和块语句赋值语句和块语句一、赋值语句一、赋值语句 分为两类:分为两类:(1 1)连续连续赋值语句赋值语句assignassign语句,用于对语句,用于对wirewire型变型变量赋值,是描述量赋值,是描述组合逻辑组合逻辑最常用的方法之一。最常用的方法之一。 例 assign c=a&b; /a、b、c均为wire型变量(2 2)过程过程赋值语句赋值语句用于对用于对regreg型变量赋值,有两种型变量赋值,有两种方式:方式:非阻塞(non-blocking)赋值方式: 赋值符号为=,如 b = a ; 阻塞(blocking)赋值方式: 赋值符号为=,如 b = a ; 619.

56、6 9.6 赋值语句和块语句赋值语句和块语句二、非阻塞赋值与阻塞二、非阻塞赋值与阻塞赋值的区别赋值的区别1. 1. 非阻塞非阻塞赋值方式赋值方式 clkDFFcD QD QabDFF非阻塞非阻塞赋值赋值在在块块结束时才完结束时才完成赋值操作!成赋值操作!注:注:c c的值比的值比b b的值落后一个时钟周期!的值落后一个时钟周期!629.6 9.6 赋值语句和块语句赋值语句和块语句2. 2. 阻塞阻塞赋值方式赋值方式 阻塞阻塞赋值赋值在在该语该语句句结束时就完成结束时就完成赋值操作!赋值操作!clkDFFcD Qab注:在一个块语句中,如果有多条阻塞注:在一个块语句中,如果有多条阻塞赋值语句,在

57、赋值语句,在前面的赋值语句没有完成之前,后面的语句就不能被前面的赋值语句没有完成之前,后面的语句就不能被执行,就像被阻塞了一样,因此称为执行,就像被阻塞了一样,因此称为阻塞阻塞赋值方式赋值方式。 这里这里c c的值与的值与b b的值一样的值一样 !639.6 9.6 赋值语句和块语句赋值语句和块语句非阻塞非阻塞(non-blocking)non-blocking)赋值方式赋值方式 ( b= a) ( b= a): b的值被赋成新值a的操作, 并不是立刻完成的,而是在块结束时才完成; 块内的多条赋值语句在块结束时同时赋值; 硬件有对应的电路。阻塞阻塞(blocking)blocking)赋值方式

58、赋值方式 ( b = a) ( b = a): b的值立刻被赋成新值a; 完成该赋值语句后才能执行下一句的操作; 硬件没有对应的电路,因而综合结果未知。非阻塞非阻塞赋值与赋值与阻塞阻塞赋值方式的主要赋值方式的主要区别区别v建议在初学时只使用一种方式,不要混用!建议在初学时只使用一种方式,不要混用!v建议在可综合风格的模块中使用建议在可综合风格的模块中使用非阻塞非阻塞赋值!赋值!649.6 9.6 赋值语句和块语句赋值语句和块语句三、块语句三、块语句 用来将两条或多条语句组合在一起,使其在格式上用来将两条或多条语句组合在一起,使其在格式上更像一条语句,以增加程序的可读性。更像一条语句,以增加程序

59、的可读性。 块语句有两种:块语句有两种:begin_endbegin_end语句标识顺序执行的语句fork_joinfork_join语句标识并行执行的语句用用begin_endbegin_end标识的标识的块块Quartus IIQuartus II不支持,通不支持,通常用在测试文件中常用在测试文件中1. 1.顺序块顺序块块内的语句是顺序执行的;每条语句的延迟时间是相对于前一条语句的仿真时间而言的;直到最后一条语句执行完,程序流程控制才跳出该顺序块。659.6 9.6 赋值语句和块语句赋值语句和块语句beginbegin 语句语句1 1; 语句语句2 2; 语句语句n n;endendbeg

60、inbegin:块名:块名 块内声明语句;块内声明语句; 语句语句1 1; 语句语句2 2; 语句语句n n;endend注:块内声明语句可以是注:块内声明语句可以是参数参数声明、声明、regreg型型变量声明变量声明、integerinteger型型变量声明、变量声明、realreal型型变量声明语句。变量声明语句。或或669.6 9.6 赋值语句和块语句赋值语句和块语句 例例1 1 例例2 #10注注:这里标识符:这里标识符“# #”表示延迟;表示延迟; 在模块调用中在模块调用中“# #”表示参数的传递表示参数的传递679.6 9.6 赋值语句和块语句赋值语句和块语句 例例3 3 用顺序块和延迟控制组合产生一个时序波形。用顺序块和延迟控制组合产生一个时序波形。 parameter d = 50;注:注:每条语句的延迟时间每条语句的延迟时间d d是是相对于前一条

温馨提示

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

评论

0/150

提交评论