硬件描述语言verilog-HDL基础.ppt_第1页
硬件描述语言verilog-HDL基础.ppt_第2页
硬件描述语言verilog-HDL基础.ppt_第3页
硬件描述语言verilog-HDL基础.ppt_第4页
硬件描述语言verilog-HDL基础.ppt_第5页
已阅读5页,还剩297页未读 继续免费阅读

下载本文档

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

文档简介

1、Verilog HDL 基础 第一部分 初级篇,第一讲 Verilog 的基本概念,2020/8/7,2,硬件描述语言HDL(Hardware Description Language)是硬件设计人员和电子设计自动化(EDA)工具之间的接口,其主要目的是用来编写设计文件,建立电子系统行为级的仿真模型。,1.1 硬件描述语言HDL,2020/8/7,3,1.1 硬件描述语言HDL,硬件描述语言利用计算机的巨大能力对用HDL建模的复杂数字逻辑进行仿真,然后再自动综合以生成符合要求且在电路结构上可以实现的数字逻辑网表(Netlist),根据网表和某种工艺的器件自动生成具体电路然后生成该工艺条件下这种

2、具体电路的延时模型。仿真验证无误后用于制造ASIC芯片或写入CPLD和FPGA器件中。,2020/8/7,4,什么是硬件描述语言,具有特殊结构能够对硬件逻辑电路的功能进行描述的一种高级编程语言 这种特殊结构能够: 描述电路的连接 描述电路的功能 在不同抽象级上描述电路 描述电路的时序 表达具有并行性 HDL主要有两种:Verilog和VHDL Verilog起源于C语言,因此非常类似于C语言,容易掌握 VHDL格式严谨 VHDL出现较晚,但标准化早。IEEE 1706-1985标准。,2020/8/7,5,为什么要使用硬件描述语言,电路的逻辑功能容易理解; 便于计算机对逻辑进行分析处理; 把逻

3、辑设计与具体电路的实现分成两个独立的阶段来操作; 逻辑设计与实现的工艺无关; 逻辑设计的资源积累可以重复利用; 可以由多人共同更好更快地设计非常复杂的逻辑电路(几十万门以上的逻辑系统)。,2020/8/7,6,1.2 Verilog HDL 的历史,1.2.1 什么是Verilog HDL Verilog HDL是硬件描述语言的一种,用于数 字电子系统设计。设计者可用它进行各种级别的 逻辑设计,可用它进行数字逻辑系统的仿真验 证、时序分析、逻辑综合。它是目前应用最广泛 的一种硬件描述语言。,2020/8/7,7,1.2 Verilog HDL 的历史,1.2.2 Verilog HDL的产生及

4、发展 Verilog HDL是在1983年由GDA(GateWay Design Automation)公司的Phil Moorby所创。Phi Moorby后来成为Verilog-XL的主要设计者和Cadence公司的第一个合伙人。 在19841985年间,Moorby设计出了第一个Verilog-XL的仿真器。 1986年,Moorby提出了用于快速门级仿真的XL算法。 1990年,Cadence公司收购了GDA公司 1991年,Cadence公司公开发表Verilog语言,成立了OVI(Open Verilog International)组织来负责Verilog HDL语言的发展。 1

5、995年制定了Verilog HDL的IEEE标准,即IEEE1364。,2020/8/7,8,1.2 Verilog HDL 的历史,2020/8/7,9,VHDL - 比VerilogHDL早几年成为I EEE标准; - 语法/结构比较严格,因而编写出的 模块风格比较清晰; - 比较适合由较多的设计人员合作完成 的特大型项目(一百万门以上)。,1.3 Verilog HDL 和 VHDL的比较,2020/8/7,10,Verilog HDL - 较多的第三方工具的支持 - 语法结构比VHDL简单 - 学习起来比VHDL容易 - 仿真工具比较好使 - 测试激励模块容易编写,1.3 Veril

6、og HDL 和 VHDL的比较,2020/8/7,11,1.3 Verilog HDL 和 VHDL的比较,2020/8/7,12,1.4 Verilog 目前的应用情况和适用的设计,Verilog的主要应用包括: ASIC和FPGA工程师编写可综合的RTL代码 高抽象级系统仿真进行系统结构开发 测试工程师用于编写各种层次的测试程序 用于ASIC和FPGA单元或更高层次的模块的模型开发,2020/8/7,13,1.4 Verilog 目前的应用情况和适用的设计,Verilog 较为适合系统级(System)、算法 级(Alogrithem)、寄存器传输级(RTL)、逻辑 (Logic)、门级

7、(Gate)和电路开关级(Switch)的 设计,而对于特大型(千万门级以上)的系 统级(System)设计,则VHDL更为合适。,2020/8/7,14,1.5 采用 Verilog HDL 设计复杂数字电路的优点,1.5.1 传统设计方法电路原理图输入法 采用电路原理图输入法进行设计,周期长、需 要专门的设计工具、需手工布线等。这种低水平的 设计方法大大延长了设计周期。,2020/8/7,15,采用Verilog输入法,可以很容易地把完成的设计 移植到不同厂家的不同芯片中去,并在不同规模应用 时可以较容易地作修改。 采用Verilog输入法最大的优点是其与工艺无关 性。实际上这是利用了计算

8、机的巨大能力并在EDA工 具帮助下,把逻辑验证与具体工艺库匹配、布线即时 延计算分成不同的阶段来实现,从而减轻了人们的繁 琐劳动。,1.5.2 Verilog HDL 设计法与传统的电路原理图输入法的比较,2020/8/7,16,1.5 采用 Verilog HDL 设计复杂数字电路的优点,1.5.3 Verilog 的标准化与软核的重用 Verilog 是在1983年由GDA公司首先开发成功的,经 过诸多改进,于1995年11月正式被批准为Verilog IEEE1363 1995标准,又于2001年3月在原标准的基础上经过改进和 补充推出Verilog IEEE13642001新标准。 由

9、于Verilog HDL设计方法与工艺无关性,因而大 大提高了Verilog 模型的可重用性。我们把功能经过验证的、 可综合的、实现后电路结构总门数在5000门以上的Verilog HDL模型称之为“软核”(Softcore),而把由软核构成的器件成 为虚拟器件。利用软核和虚拟器件的可重复利用的特性就可 大大缩短设计周期,加快了复杂电路的设计。,2020/8/7,17,1.5.4 软核、固核和硬核的概念以及它 们的重用,显而易见,在具体实现手段和工艺技术尚未确定的逻辑设计阶段,软核具有最大的灵活性。而近年来电路实现工艺技术的发展是相当迅速的,为了逻辑电路设计成果的积累,和更快更好地设计更大规模

10、的电路,发展软核的设计和推广软核的重用技术是非常有必要的。,把在某一种专用半导体集成电路工艺的(ASIC)器件上实现的经验证是正确的总门数在5000门以上的电路结构掩膜,称之为“硬核”。,把在某一种现场可编程门阵列(FPGA)器件上实现 的,经验证是正确的总门数在5000门以上电路结构编码文件,称之为“固核”。,2020/8/7,18,1.6 Verilog HDL 的设计流程简介,自顶向下的设计是从系 统级开始,把系统级划分为 若干个基本单元,然后再把 每个基本单元划分为下一层 次的基本单元,一直这样做 下去,直到可以直接用EDA 元件库的基本元件来实现为 止图1.1.3为自顶向下(Top-

11、 Down)的示意图,以设计树 的形式绘出。,1.6.1 自顶向下(Top-Down)设计的基本概念,图 1.1.3 Top-Down 设计思想,2020/8/7,19,1.6 Verilog HDL 的设计流程简介,1.6.2 层次管理的基本概念 复杂数字逻辑电路和系统的层次化、结构化设计隐含着硬件设计方案的逐次分解。完整的硬件设计可以由图1.1.3所示的设计树描述。在这个设计树上,节点对应着该层次上基本单元的行为描述,树枝对应着基本单元的结构分解。在不同的层次都可以进行仿真以对设计思想进行验证。EDA工具提供了有效的手段来管理错综复杂的层次,即可以很方便地查看某一层次某模块的源代码或电路图

12、以改正仿真时发现的错误。,2020/8/7,20,1.6.3 具体模块的设计编译和仿真的过程,1.6 Verilog HDL 的设计流程简介,从左图可以看出,模块设计流程主要由两大主要功能部分组成: 1)设计开发:即从编写设计文件综合到布局布线投片生成这样一系列步骤。 2)设计验证:也就是进行各种仿真的一系列步骤,如果在仿真过程中发现问题就返回设计输入进行修改。,2020/8/7,21,1.6 Verilog HDL 的设计流程简介,1.6.4 对应具体工艺器件的优化、映象和布局布线 由于各种ASIC和FPFA器件的工艺各不相同,因而当用不同厂家的不同器件来实现已验证的逻辑网表(EDIF文件)

13、时,就需要不同的基本单元库与布线延迟模型与之对应才能进行准确的优化、映象、和布局布线。基本单元库与布线延迟模型由熟悉本厂工艺的工程师提供,再由EDA厂商的工程师编入相应的处理程序,而逻辑电路设计师只需用一文件说明所用的工艺器件和约束条件,EDA工具就会自动地根据这一文件选择相应的库和模型进行准确的处理从而大大提高设计效率。,2020/8/7,22,1.7 小结,掌握HDL设计方法应从学习Verilog HDL设计方法开始。 由于Top-Down的设计方法是首先从系统设计入手的,因而从顶层进行功能划分和结构设计。系统的总体仿真是顶层进行功能化分的重要环节,这时的设计与工艺无关。 从底向上的设计在

14、某种意义上讲是Top-Down设计的逆过程。,Verilog 数字系统设计教程,第二讲 Verilog 语法的基本概念,2020/8/7,24,概述,Verilog既是一种行为描述的语言也是一种结构描述语言。Verilog模型可以是实际电路的不同级别的抽象。这些抽象的级别包括: 系统级(system):用高级语言结构实现设计模块的外部性能的模型。 算法级(algorithm):用高级语言结构实现设计算法的模型。 RTL级(Register Transfer Level):描述数据在寄存器之间流动和如何处理、控制这些数据流动的模型。 以上三种都属于行为描述,只有RTL级才与逻辑电路有明确的对应关

15、系。 门级(gate-level):描述逻辑门以及逻辑门之间的连接的模型。 开关级(switch-level):描述器件中三极管和储存节点以及它们之间连接的模型。,2020/8/7,25,Verilog HDL行为描述语言具有以下功能: 可描述顺序执行或并行执行的程序结构。 用延迟表达式或事件表达式来明确地控制过程的启动时间。 通过命名的事件来触发其它过程里的激活行为或停止行为。 提供了条件如if-else、case、循环程序结构。 提供了可带参数且非零延续时间的任务(task)程序结构。 提供了可定义新的操作符的函数结构(function)。 提供了用于建立表达式的算术运算符、逻辑运算符、位

16、运算符。 Verilog HDL语言作为一种结构化的语言也非常适合于门级和开关级的模型设计。,概述,2020/8/7,26,概述,因其结构化的特点又使它具有以下功能: 提供了一套完整的表示组合逻辑的基本元件的原语(primitive); 提供了双向通路(总线)和电阻器件的原语; 可建立MOS器件的电荷分享和电荷衰减动态模型。,2020/8/7,27,2.1 Verilog 模块的基本概念,下面先介绍几个简单的Verilog HDL 程序,从中了解Verilog模块的特性 【例 2.1】 module muxtwo (out, a, b, sl); input a,b,sl; output ou

17、t; reg out; always (sl or a or b) if (! sl) out = a; else out = b; endmodule,a,b,sl,out,2020/8/7,28,2.1 Verilog 模块的基本概念,MUX(多路选择器)的行为可以描述为:只要信号a或b或sl发生变化,如果sl为0则选择a输出;否则选择b输出。 这个行为的描述并没有说明如果输入 a 或 b是三态的(高阻时)输出应该是什么,但有具体结构的真实电路是有一定的输出的。 没有考虑延时问题,2020/8/7,29,2.1 Verilog 模块的基本概念,【例2.2】,module twomux (o

18、ut, a, b, sl); input a, b, sl; output out; not u1 (nsl, sl ); and #1 u2 (sela, a, nsel); and #1 u3 (selb, b, sl); or #2 u4 (out, sela, selb); endmodule,MUX的结构级描述,采用Verilog基本单元(门)描述。描述中含有传输延时。,2020/8/7,30,2.1 Verilog 模块的基本概念,【例 2.3】 module adder ( count,sum,a,b,cin ); input 2:0 a,b; input cin; output

19、 count; output 2:0 sum; assign count,sum=a+b+cin; endmodule,这个例子描述了一个三位的加法器。从例子中可以看出,整个Verilog HDL程序是位于module和endmodule声明语句之间的,2020/8/7,31,2.1 Verilog 模块的基本概念,【例 2.4】 module compare ( equal,a,b ); output equal; /声明输出信号equal input 1:0 a,b; /声明输入信号a,b assign equal=(a=b)?1:0; /*如果两个输入信号相等则输出为1。否则输出为0*/

20、 endmodule,这个程序描述了一个比较器.在这个程中,/*.*/和/.表示注释部分,注释只是为了方便程序员理解程序,对编译是不起作用的。,2020/8/7,32,【例2.5】 module trist2(out,in,enable); output out; input in ,enable; bufil1 mybuf(out,in,enable); endmodule,2.1 Verilog 模块的基本概念,程序通过调用一个在Verilog语言提供的原语库中现存的三态驱动器元件bufil1来实现其逻辑功能。这个调用过程也称为库元件bufif1的实例化,在本模块中它被具体化为mybuf.

21、,33,【例2.6】 module trist1(sout,sin,ena); output sout; input sin,ena; mytri tri_inst(.out(sout),.in(sin),.enable(ena); /调用由mytri模块定义的实例元件tri_inst,即把已定义的模块myfri在本模块中具体化为tri_inst endmodule module mytri(out,in,enable); output out; input in,enable; assign out=enable?in:bz; endmodule,2.1 Verilog 模块的基本概念,20

22、20/8/7,34,2.2 Verilog 用于模块的测试,如何检查上述例子其功能是否正确? 需要有测试激励信号输入到被测模块 需要记录被测模块的输出信号 需要把用功能和行为描述的Verilog模块转换为门级电路互连的电路结构(综合)。 需要对已经转换为门级电路结构的逻辑进行测试(门级电路仿真)。 需要对布局布线后的电路结构进行测试。 (布局布线后仿真)。,35,2.2 Verilog 用于模块的测试,36,2.3 小结,通过上面的例子可以看到: (1)Verilog HDL程序是由模块构成的。每个模块的内容都是位于module和endmodule两个语句之间。每个模块实现特定的功能。 (2)

23、模块是可以进行层次嵌套的。 (3)每个模块要进行端口定义,并说明输入输出口,然后对模块的功能进行描述。 (4)Verilog HDL程序的书写格式自由,一行可以写几个语句,一个语句也可以分写多行。 (5)除了endmodule语句外,每个语句和数据定义的最后必须有分号。 (6)可以用/*.*/和/.对Verilog HDL程序的任何部分作注释。一个好的,有使用价值的源程序都应当加上必要的注释,以增强程序的可读性和可维护性。,Verilog 数字系统设计教程,第三讲 常用Verilog 语法之一,3.1 模块的结构,Verilog的基本设计单元是“模块”(block) 。一个模块是由两部分 组成

24、的,一部分描述接口,另一部分描述逻辑功能,即定义输入是 如何影响输出的。 module block1(a, b, c, d); input a, b; output c, d; assign c = a | b; assign d = a endmodule,a,b,c,d,Verilog 模块的结构由在module和endmodule 关 键词之间的四个主要部分组成: - 端口定义: module block1(a, b, c, d ); - I/O说明 : input a, b, c ; output d ; - 内部信号声明: wire x; - 功能定义: assign d = a |

25、 x ; assign x = ( b endmodule,3.1 模块的结构,3.1 模块的结构,3.1.1 模块的端口定义 模块的端口声明了模块的输入输出口。其格式如下: module 模块名(口1,口2,口3,口4, ); 3.1.2 模块内容 模块的内容包括I/O说明、内部信号声明、功能定义。 I/O说明的格式 输入口: input信号位宽1:0 端口名1; input信号位宽1:0 端口名2; input信号位宽1:0 端口名i; /(共有i个输入口),3.1 模块的结构,输出口 output信号位宽1:0 端口名1; output信号位宽1:0 端口名2; output信号位宽1:

26、0 端口名j; /(共有j个输出口) 输入/输出口: inout信号位宽1:0 端口名1; inout信号位宽1:0 端口名2; inout信号位宽1:0 端口名k; /(共有k个双向总线端口) I/O说明也可以写在端口声明语句里。其格式如下: module module_name(input port1,input port2, output port1,output port2 );,3.1 模块的结构,内部信号说明 在模块内用到的和与端口有关的wire 和 reg 变量的声明。 如: reg width-1 : 0 R变量1,R变量2 ; wire width-1 : 0 W变量1,W变

27、量2 ; ,3.1 模块的结构,功能定义 模块中最重要的部分是逻辑功能定义部分。有三种方法可在 模块中产生逻辑。 - 用 assign 语句(数据流描述): assign a = b end,3.1 模块的结构,3.1.3 理解要点 如在模块中逻辑功能由下面三个语句块组成 : assign cs = ( a0 end 三条语句是并行的,它们产生独立的逻辑电路; 而在 always 块中: begin 与 end 之间是顺序执行的。,3.2 数据类型及其常量及变量,3.2.1.常量 在程序运行过程中,其值不能被改变的量称为常量。 一数字 整数。在Verilog HDL中,整型常量即整常数有以下四

28、种进制表示形式: 1) 二进制整数(b或B) 2) 十进制整数(d或D) 3) 十六进制整数(h或H) 4) 八进制整数(o或O) 数字表达方式有以下三种: 1) 这是一种全面的描述方式。 2) 在这种描述方式中,数字的位宽采用缺省位宽 (这由具体的机器系统决定,但至少32位)。 3) 在这种描述方式中,采用缺省进制十进制。,3.1.2 数值 1. Verilog HDL中的数值可取下面的四类值:,Verilog HDL中有两类数值常量 整型数和实型数,下划线符号“_”除了不能放于数值的首位以外,可以随意用在整型数与实型数中,他们对数值的大小没有任何改变,只是为了提高可读性。 1)整型数及其表

29、示 Verilog HDL的整数可以使二进制(b或B)、十进制(d或D)、十六进制(h或H)与八进制(o或O),有下面三种书写形式 (1)简单的十进制格式; (2)缺省位宽的基数格式; (3)指定位宽的基数格式。,Verilog HDL中有两类数值常量 整型数和实型数,()简单的十进制格式: 用的数字串组成的十进制数,可以用符号“”或“”来表示数的正负 ()缺省位宽的基数格式; 表示形式为: 符号“”为基数格式表示的固有字符,该字符不能省略,否则为非法表示形式;参数用于说明数值采用的进制格式;参数为相应进制格式下的一串数字这种格式未指定位宽,其缺省值至少为位 ()指定位宽的基数格式: 表示形式

30、为:sizebase_formatnumber 参数size用来指定所表示数字的位宽当位宽小于数值的实际大小时,相应的高位部分被忽略;当位宽大于数值的实际位数,且数值的最高位是或时,相应的高位部分补;而当位宽大于数值的实际位数,但数值的最高位是x或z时,相应的高位部分补或,Verilog HDL中有两类数值常量 整型数和实型数,基数符号及其合法的表示值,Verilog HDL中有两类数值常量 整型数和实型数,例;三种格式的整数表示法,15(十进制15)简单的十进制 h15(十进制21,十六进制15)缺省位宽的十六进制 5b10011(十进制19,二进制10011)位的二进制 12h01F(十进

31、制31,十六进制01F)位的十六进制,Verilog HDL中有两类数值常量 整型数和实型数,Verilog HDL中的实数可以用十进制与科学计数法两种格式来表示,如果采用十进制格式,小数点两边必须都有数字,否则为非法的表示形式 实数表示法的实例 1.8 /十进制计数法 3.8e10 /科学计数法 2.1E-9 /科学计数法可用e或E表示,其结果相同 3_2387.3398_3047 /使用下划线提高可读性 3. /非法表示,小数点两遍都必须有数 .2e6 /非法表示,小数点两遍都必须有数 .12 /非法表示,小数点两遍都必须有数,实型数及其表示,Verilog HDL中有两类数值常量 整型数

32、和实型数,3.2 数据类型及其常量及变量,x和z值。 在数字电路中,x代表不定值,z代表高阻值。一个x可以用来定义十六进制数的4位二进制数的状态,八进制数的3位,二进制数的1位。z的表示方式同x类似。z还有一种表达方式是可以写作“?”。,3.2 数据类型及其常量及变量,负数。一个数字可以被定义为负数,只需在位宽表达式前加一个减号,减号 必须写在数字定义表达式的最前面。注意减号不可以放在位宽和进制之间也不 可以放在进制和具体的数之间。 -8d5 /这个表达式代表5的补数(用八位二进制数表示) 8d-5 /非法格式 下画线(underscore_)。下划线可以用来分隔开数的表达以提高程序可 读性。

33、但不可以用在位宽和进制处,只能用在具体的数字之间。 16b1010_1011_1111_1010 /合法格式 8b_0011_1010 /非法格式 当常量不说明位数时,默认值是32位,每个字母用8位的ASCII值表示。,3.2 数据类型及其常量及变量,二参数(parameter)型 用参数声明一个可变常量,常用于定义延时及宽度变量。 参数定义的语法:parameter ; 可一次定义多个参数,用逗号隔开。 在使用文字(literal)的地方都可以使用参数。 参数的定义是局部的,只在当前模块中有效。 参数定义可使用以前定义的整数和实数参数。,module mod1( out, in1, in2)

34、; . . . parameter cycle = 20, prop_ del = 3, setup = cycle/2 - prop_del, p1 = 8, x_ word = 16bx, file = / usr1/ jdough/ design/ mem_ file. dat; . . . wire p1: 0 w1; / A wire declaration using parameter . . . endmodule,注意:参数file不是string,而是一个整数,其值是所有字母的扩展ASCII值。若file=“AB”,则file值为8h4142。用法: $fopen(file

35、); $display(“%s”, file);,3.2 数据类型及其常量及变量,3.2.2 变量 变量即在程序运行过程中其值可以改变的量。常用的网络数据类型包括wire 型和tri型。wire型变量通常是用来表示单个门驱动或连续赋值语句驱动的网络 型数据,tri型变量则用来表示多驱动器驱动的网络型数据。 表 1.3.1 Wire/tri 变量的真值,3.2 数据类型及其常量及变量,一 wire型 wire型数据常用来表示用于以assign关键字指定的组合逻辑信号。 Verilog程序模块中输入输出信号类型缺省时自动定义为wire型。其格式 如下: wire n-1:0 数据名1,数据名2,数

36、据名i; /共有i条总线,每条总 线内有n条线路,或 wire n:1 数据名1,数据名2,数据名i;,3.2 数据类型及其常量及变量,二 reg型 寄存器是数据储存单元的抽象。寄存器数据类型的关键字是 reg。 reg类型数据的默认初始值为不定值x。 reg型数据常用来表示用于“always”模块内的指定信号,常代 表触发器。在“always”块内被赋值的每一个信号都必须定义成 reg型。 reg型数据的格式如下: reg n-1:0 数据名1,数据名2, 数据名i; 或 reg n:1 数据名1,数据名2, 数据名i;,module top; wire y; reg a, b; DUT u

37、1(y,a,b); initial begin a = 0; b = 0; #10 a =1; . end endmodule,module DUT(Y, A, B_); output Y; input A,B: wire Y, A, B; and (Y, A, B); endmodule,举例说明数据类型的选择,输入口(input)可以由寄存器或网络连接驱动,但它本身只能驱动网络连接。 输出口 (output)可以由寄存器或网络连接驱动,但它本身只能驱动网络连接。 输入/输出口(inout)只可以由网络连接驱动,它本身也只能驱动网络连接。 如果信号变量是在过程块 (initial块 或 al

38、ways块)中被赋值的,必须把它声明为寄存器类型变量,如何选择正确的数据类型?,如何选择正确的数据类型,module top; wire y; reg a, b; DUT u1 (y, a, b) ; initial begin a = 0; b = 0; #5 a = 1; end endmodule,module DUT (Y, A, B); output Y; input A, B; wire Y, A, B; and (Y, A, B) ; endmodule,输入端口可以由net/register驱动,但输入端口只能是net,输出端口可以是net/register类型,输出端口只能驱

39、动net,在过程块中只能给register类型赋值,若Y,A,B说明为reg则会产生错误。,in1,in2,O,A,B,Y,双向端口输入/输出只能是net类型,选择数据类型时常犯的错误举例,修改前: module example(o1, o2, a, b, c, d); input a, b, c, d; output o1, o2; reg c, d; reg o2 and u1(o2, c, d); always (a or b) if (a) o1 = b; else o1 = 0; endmodule,修改后: module example(o1, o2, a, b, c, d); i

40、nput a, b, c, d; output o1, o2; / reg c, d; / reg o2 reg o1; and u1(o2, c, d); always (a or b) if (a) o1 = b; else o1 = 0; endmodule,example.v,选择数据类型时常犯的错误举例,Compiling source file example.v Error! Illegal left-hand-side assignment Verilog-ILHSA example.v, 11: o1 = b; Error! Illegal left-hand-side as

41、signment Verilog-ILHSA example.v, 12: o1 = 0; 2 errors,第一次编译信息 verilog c example.v,第二次编译信息,Compiling source file example.v Error! Incompatible declaration, (c) defined as input at line 2 Verilog-IDDIL example.v, 5: Error! Incompatible declaration, (d) defined as input at line 2 Verilog-IDDIL example

42、.v, 5: Error! Gate (u1) has illegal output specification Verilog-GHIOS example.v, 8: 3 errors,3.2 数据类型及其常量及变量,三 memory型 Verilog HDL通过对reg型变量建立数组来对存储器建模,可以描述 RAM型存储器,ROM存储器和reg文件。数组中的每一个单元通过一个 数组索引进行寻址。在Verilog语言中没有多维数组存在。 memory型数 据是通过扩展reg型数据的地址范围来生成的。其格式如下: reg n-1:0 存储器名m-1:0; 或 reg n-1:0 存储器名m:1

43、;,3.3 运算符及表达式,Verilog HDL语言的运算符范围很广,其运算符按其功能可分为以下几类:,3.3 运算符及表达式,在Verilog HDL语言中运算符所带的操作数是不同的,按其所带 操作数的个数运算符可分为三种: 1) 单目运算符(unary operator):可以带一个操作数,操作数放在运算符的右边。 2) 二目运算符(binary operator):可以带二个操作数,操作数放在运算符的两边。 3) 三目运算符(ternary operator):可以带三个操作,这三个操作数用三目运算符 分隔开。 见下例: clock = clock; / 是一个单目取反运算符, clo

44、ck是操作数。 c = a | b; / 是一个二目按位或运算符, a 和 b是操作数。 r = s ? t : u; / ?: 是一个三目条件运算符, s,t,u是操作数。,3.3 运算符及表达式,3.3.1.基本的算术运算符,+ 加 - 减 * 乘 / 除 % 模,将负数赋值给reg或其它无符号变量使用2的补码算术。 如果操作数的某一位是x或z,则结果为x 在整数除法中,余数舍弃 模运算中使用第一个操作数的符号,module arithops (); parameter five = 5; integer ans, int; reg 3: 0 rega, regb; reg 3: 0 nu

45、m; initial begin rega = 3; regb = 4b1010; int = -3; /int = 11111111_1101 end initial fork #10 ans = five * int; / ans = -15 #20 ans = (int + 5)/ 2; / ans = 1 #30 ans = five/ int; / ans = -1 #40 num = rega + regb; / num = 1101 #50 num = rega + 1; / num = 0100 #60 num = int; / num = 1101 #70 num = reg

46、b % rega; / num = 1 #80 $finish; join endmodule,注意integer和reg类型在算术运算时的差别。integer是有符号数,而reg是无符号数。,3.3 运算符及表达式,3.3.2.位运算符, not reg 3: 0 rega, regb, regc; reg 3: 0 num; initial begin rega = 4b1001; regb = 4b1010; regc = 4b11x0; end initial fork #10 num = rega join endmodule,五类按位操作符的运算规则,五类按位操作符的运算规则,mo

47、dule bitTest; reg3: 0a,b,c; initial begin a=4b1100;b=4b0011;c=4,b0101; $displayb(a); /按位非运算符,结果为4b0011 $displayb(a /按位异或非运算符,结果为4b0110 end endmodule,按位运算的例子,3.3 运算符及表达式,3.3.2.位运算符,当两个操作数位数不同时,位数 少的操作数零扩展到相同位数。,a = 4b1011; b = 8b01010011; c = a | b; / a零扩展为 8b00001011, 位运算符中除了是单目运算符以外,均为二目运算符,即要求运算符两

48、侧各有一个操作数. 位运算符中的二目运算符要求对两个操作数的相应位进行运算操作。,Verilog 数字系统设计教程,第四讲 常用 Verilog 语法之二,4.1 逻辑运算符,!not parameter five = 5; reg ans; reg 3: 0 rega, regb, regc; initial begin rega = 4b0011; /逻辑值为“1” regb = 4b10 xz; /逻辑值为“1” regc = 4b0z0 x; /逻辑值为“x” end initial fork #10 ans = rega join endmodule,Verilog HDL提供了三种

49、逻辑运算符: 逻辑与运算符: reg 3: 0 rega, regb, regc; reg val; initial begin rega = 4b0011; regb = 4b1010; regc = 4b0 x10; end initial fork #10 val = regc rega ; / val = x #20 val = regb = rega ; / val = 1 #40 val = regb regc ; / val = 1 #50 $finish; join endmodule,rega和regc的关系取决于x,无论x为何值,regbregc,其结果是1b1、1b0或1

50、bx。,4.3 等式运算符,赋值操作符,将等式右边表达式的值拷贝到左边。,逻辑等,case等,a = 2b1x; b = 2b1x; if (a = b) $display( a is equal to b); else $display( a is not equal to b);,a = 2b1x; b = 2b1x; if (a = b) $display( a is identical to b); else $display( a is not identical to b);,注意逻辑等与 case等的差别,2b1x=2b0 x 值为0,因为不相等 2b1x=2b1x 值为x,因为

51、可能不相等,也可能相等,2b1x=2b0 x 值为0,因为不相同 2b1x=2b1x 值为1,因为相同,4.3 等式运算符,= 逻辑等 ! = 逻辑不等,其结果是1b1、1b0或1bx。 如果左边及右边为确定值并且相等,则结果为1。 如果左边及右边为确定值并且不相等,则结果为0。 如果左边及右边有值不能确定的位,但值确定的位相等,则结果为x。 !=的结果与= =相反,值确定是指所有的位为0或1。不确定值是有值为x或z的位。,module equalities1(); reg 3: 0 rega, regb, regc; reg val; initial begin rega = 4b0011;

52、 regb = 4b1010; regc = 4b1x10; end initial fork #10 val = rega = regb ; / val = 0 #20 val = rega != regc; / val = 1 #30 val = regb != regc; / val = x #40 val = regc = regc; / val = x #50 $finish; join endmodule,module equTest; reg3: 0a,b,c,d,e,f; initial begin a=4;b=7; /缺省值为十进制数 c=4b010; d=4bx10; e=

53、4bx101; f=4bxx01; $displayb(c); /输出0010 $displayb(d); /输出xx10 $displayb(a=b); /相等运算符,结果为0 $displayb(c !=d); /不相等运算符,结果为x $displayb(c !=f); /不相等运算符,结果为1 $displayb(d=e); /全等运算符,结果为0 $displayb(c !=d); /非全等运算符,结果为1 end endmodule,相等关系运算符的例子,4.3 等式运算符,= 相同(case等) ! = 不相同(case不等),其结果是1b1、1b0或1bx。 如果左边及右边的值

54、相同(包括x、z),则结果为1。 如果左边及右边的值不相同,则结果为0。 !=的结果与 = 相反,综合工具不支持,module equalities2(); reg 3: 0 rega, regb, regc; reg val; initial begin rega = 4b0011; regb = 4b1010; regc = 4b1x10; end initial fork #10 val = rega = regb ; / val = 0 #20 val = rega != regc; / val = 1 #30 val = regb = regc; / val = 0 #40 val

55、= regc = regc; / val = 1 #50 $finish; join endmodule,4.4 移位运算符,逻辑右移 逻辑左移,移位操作符对其左边的操作数进行向左或向右的位移位操作。 第二个操作数(移位位数)是无符号数 若第二个操作数是x或z则结果为x, 将左边的操作数右移右边操作数指定的位数,在赋值语句中,如果右边(RHS)的结果: 位宽大于左边,则把最高位截去 位宽小于左边,则零扩展,module shift (); reg 9: 0 num, num1; reg 7: 0 rega, regb; initial rega = 8b00001100; initial fo

56、rk #10 num 3; / num = 00_0000_0001 #20 regb 3 ; / regb = 0000_0001 #30 num 2; /rega = 1111_1100 #50 num1 2;/num1=00_1111_1100 #60 $finish; join endmodule,建议:表达式左右位数一致,4.5 位拼接运算符,位拼接还可以用嵌套的方式来表达。 b,3a,b /这等同于b,a,b,a,b,a,b 用于表示重复的表达式如上例中的4和3,必须是常数表达式。, 位拼接运算符,其使用方法如下: 信号1的某几位,信号2的某几位,.,.,信号n的某几位,例: a,

57、b3:0,w,3b101,位拼接还可以用重复法来简化表达式。 4w /这等同于w,w,w,w,module concatTest; reg a; reg 1: 0b; reg 5: 0c; initial begin a=1b1; b=2b00; c=6b101001; $displayb(a, b);/产生一个3位数3b100 $displayb(c5: 3, a); /产生一个4位数4b1011 end endmodule,module replicTest; reg a; reg 1: 0b; reg 5: 0c; initial begin a=1b1; b=2b00; $displayb(4a); /结果为1111 c=4a; $displayb(c); /结果为001111 end endmodule,连接运算的例子,复制运算的例子,4.6 缩减运算符,缩减运算的具体运算过程是这样的:第一步先将操作数的第一位与第二位进行或与非运算,第二步将运算结果与第三位进行或与非运算,依次类推,直至最后一位。,reg 3:0 B; reg C

温馨提示

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

最新文档

评论

0/150

提交评论