Verilog HDL语言讲义.doc

上传人:创****公 文档编号:3631360 上传时间:2019-06-27 格式:DOC 页数:32 大小:282.50KB
下载 相关 举报
Verilog HDL语言讲义.doc_第1页
第1页 / 共32页
Verilog HDL语言讲义.doc_第2页
第2页 / 共32页
Verilog HDL语言讲义.doc_第3页
第3页 / 共32页
Verilog HDL语言讲义.doc_第4页
第4页 / 共32页
Verilog HDL语言讲义.doc_第5页
第5页 / 共32页
点击查看更多>>
资源描述

1、1Verilog HDL 语言讲义北京大学信息科学技术学院2010.102目录一 VERILOG 语言简介 .4二 VERILOG 模块的基本概念 .42.1 模块的结构 .52.1.1 模块声明和端口定义 .52.1.2 模块内容 .6三 VERILOG 语言要素 .73.1 数据类型及常量、变量 .73.1.1 常量 .73.1.2 变量 .93.2 运算符及表达式 .103.2.1 逻辑运算符 .103.2.2 位运算符 .103.2.3 移位运算符 .113.3 赋值语句和块语句 .113.3.1 赋值语句 .113.3.2 块语句 .123.4 条件语句和循环语句 .133.4.1

2、条件语句 .133.4.2 循环语句 .143.5 结构说明语句 .153.5.1 initial 语句 .163.5.2 always 语句 .163.5.3 function 语句 .17四 组合逻辑模块 .184.1 全加器 .184.2 比较器 .184.3 多路选择器 .194.4 总线和总线操作 .20五 时序逻辑模块 .205.1 状态机 .205.2 状态机的置位和复位 .235.2.1 异步置位和复位 .235.2.2 同步置位与复位 .24六 VERILOG HDL 的描述方式 .256.1 行为描述方式 .256.2 RTL 描述方式 .266.3 结构描述方式 .27七

3、 VERILOG HDL 测试模块(TEST FIXTURE) .28八 QUARTUS II 和 MAXPLUS II、MODELSIM 的使用 .2938.1 QUARTUS II 的使用 .298.2 MAXPLUS II 的使用 .308.3 MODELSIM 的使用 .32九 参考文献 .32其他: .344一 Verilog 语言简介Verilog HDL 语言作为硬件描述语言的一种,它在现代电子设计中发挥了巨大作用。用该语言可以对波形和电路进行描述。用该语言可以进行仿真验证和面向硬件实现的可综合设计。Verilog HDL 语言可以用于模拟和数字电路硬件描述,本讲义只涉及数字设计

4、部分。1983 年GDA 公司的 Phil Moorby 首创 Verilog HDL。1989 年 Cadence 公司收购了 GDA。2001 年 IEEE发布了 Verilog 语言的 Verilog HDL IEEE1364-2001 国际标准。 Verilog HDL 是一种通用的硬件描述语言。它的语法和 C 语言有很多相似之处,所以有 C编程经验的人容易学习掌握。Verilog 语言适用于不同层次的描述,它可用于行为级、寄存器传输级、和门级以及电路开关级等设计。Verilog HDL 语言得到绝大多数流行 EDA 开发软件的支持。绝大多数的制造厂商都支持 Verilog HDL 设

5、计,所以用 Verilog HDL 进行 IC 设计容易选择制造厂商。Verilog 具有编程语言接口(PLI),它可以支持 C 语言对 Verilog 内部的访问。Verilog HDL 的内容比较多。本讲义对最基本的 Verilog 语言语法进行简要讲解,使得读者对最 Verilog 语言有个初步了解。在掌握这些基本概念后,通过练习读者可用简单的写法完成组合逻辑和时序逻辑设计以及测试程序(test fixture )设计。通过这些学习为读者进一步深入学习硬件描述语言打下基础。二 Verilog 模块的基本概念Verilog HDL 程序的基本设计单元是“模块” 。一个模块由几个部分组成,下

6、面是两个简单的 Verilog HDL 程序,从中了解 Verilog 模块的基本概念:例 1.1module AOI(a,b,c,d,f);input a,b,c,d;output f;wire a,b,c,d,f;assign f=(aendmodule这个例子是一个“与-或-非”门电路的模块。例 1.25module muxtwo(ain,bin,select,sout);output sout;input ain,bin,select;mymux2 m(.out(sout),.a(ain),.b(bin),.sl(select);/调用由 mymux2 模块定义的实例元件 m,即把已定

7、义过的模块 mymux2 在/本模块中具体化为 mendmodulemodule mymux2(out,a,b,sl);input a,b,sl;output out;reg out;always (sl or a or b)if(!sl) out=a;else out=b;endmodule这个例子描述了一个二选一多路器,在这个例子中存在着两个模块。模块 muxtwo 调用了由模块 mymux2 定义的实例部件 m,模块 muxtwo 是上层模块,模块 mymux2 称为子模块。在实例部件 m 中,带“.”的表示被引用模块的端口,名称必须与被引用模块的端口一致,小括号中表示在本模块中与之连接

8、的线路。通过以上两个例子可以看到: Verilog 程序是由模块构成的。每个模块的内容都是位于 module 和 endmodule 两个语句之间。 模块是可以层次嵌套的。 每个模块要进行端口定义,并说明是输入口还是输出口,然后对模块的功能进行描述。 Verilog HDL 程序的书写格式自由,一行可以写几个语句,一个语句也可以分写多行。 除了 endmodule 语句外,每个语句和数据定义的最后必须有分号。 可以用/*/或/对 Verilog HDL 程序的任何部分作注释。62.1 模块的结构2.1.1 模块声明和端口定义模块声明包括模块名字和模块的端口声明,其格式如下:module 模块名

9、 (口 1,口 2,口 3,口 4,);在引用模块时其端口可以用两种方法连接:严格按照模块定义的端口顺序来连接,不用标明原模块定义时规定的端口名,例如:模块名(连接端口 1 信号名,连接端口 2 信号名,连接端口 3 信号名,) ;在引用时用“.”符号,标明原模块是定义时规定的端口名,例如:模块名(.端口 1 名(连接信号 1 名) ,.端口 2 名(连接信号 2 名) ,) ;推荐使用第二种表示方法,这样表示的好处是可以用端口名与被引用模块的端口对应,而不必严格按端口顺序对应,提高了程序的可读性和移植性。模块结束的标志为关键字:endmodule。2.1.2 模块内容模块的内容包括 I/O

10、说明,内部信号声明和功能定义。(1)I/O 说明的格式:输入口: input width-1:0 端口名 1;输出口: output width-1:0 端口名 1;输入/输出口: inout width-1:0 端口名 1;注:width 为信号位宽,若 width 为 1,则width-1:0可省略;若几个端口为同样类型(同为输入、输出或输入/输出,而且 width 一样) ,则可在同一个语句里声明,例如:input width-1:0 端口名 1,端口名 2,端口名 3,;(2)内部信号说明:在模块内用到的和与端口有关的 wire 和 reg 类型变量的声明。如:reg width-1:

11、0 R 变量 1,R 变量 2,;wire width-1:0 W 变量 1,W 变量 2,;7(3)逻辑功能定义:有 3 种方法可以在模块中产生逻辑。用“assign”持续赋值语句定义,如:assign F=(A调用元件(元件例化) ,如:and #2 myand(out,a ,b);这个语句调用了一个跟与门(and)一样的名为 myand 的与门,其输入端为 a,b,输出为out。输出延迟为两个单位时间。用“always ”过程块赋值,如:always (posedge clk)beginif(reset) out=0;else out=out+1;end 注:在 Verilog 模块中所

12、有过程块(如:initial 块、always 块) 、连续赋值语句、实例引用都是并行的;在同一个模块中这三者出现的先后顺序没有关系;只有连续赋值语句 assign 和实例引用语句可以独立于过程块而存在于模块的功能定义部分。别的很多和 C 语言类似的语句只能出现在过程块,如 initial 和 always 中。三 Verilog 语言要素3.1 数据类型及常量、变量Verilog HDL 中总共有 19 种数据类型。其中 4 个最基本的数据类型是 reg 型、wire 型、integer 型和 parameter 型。其他类型有 large 型、medium 型、scalared 型、tim

13、e 型、small 型、tri 型、 trio 型、 tril 型、triand 型、trior 型、trireg 型、vectored 型、wand 型和 wor 型。Verilog HDL 语言中也有常量和变量之分。它们分别属于以上这些类型。83.1.1 常量整数(integer)型在 Verilog HDL 中,整型常量的格式如下:+/-整数常量有以下 4 种进制:二进制(b 或 B)十进制(d 或 D 或缺省)十六进制(h 或 H)八进制(o 或 O)在表达式中,位宽指明了数字的精确位数。例如:8b10101100 /位宽为 8 的数的二进制表示, b 表示二进制8ha2 /位宽为 8

14、 的数的十六进制表示, h 表示十六进制在数字电路中,x 代表不定值,z 代表高阻值。z 还有一种表达方式是可以写作“?” ,例如:4b10x0 /位宽为 4 的二进制数,从低位数起第 2 位为不定值4b101z /位宽为 4 的二进制数,从低位数起第 1 位为高阻值12d? /位宽为 12 的十进制数,其值为高阻值在书写和使用整数时应注意以下问题:1. 较长的数字将可用下划线分开,但不可以用在位宽和进制处,只能用在具体的数字之间,而且下划线不能用作首字符。例如:16b1010_1011_1111_1010 /合法格式8b_0011_1010 /非法格式2. 缺省位宽为 32 位,缺省进制为十

15、进制;但若说明了进制而无说明位宽时,其宽度为相应值中定义的位数。如:o721 /9 位八进制数hAF /8 位十六进制数3. 如果定义的位宽比实际位数长,通常在左边填 0 补位,但如果数最左边一位为 x或 z 值,就相应地用 x 或 z 在左边补位;如果定义的位宽比实际位数小,那么最9左边的位相应地被截断。4. 整数可以带符号,并且+/- 号应写在最左边,而不可以放在位宽、进制和具体的数之间。例如:-8d5 /这个表达式表示 5 的补数(用八位二进制数表示)8d-5 /非法格式5. 数字中不能有空格,但在表示进制的字母两侧可以有空格。参数(parameter)型在 Verilog HDL 中用

16、 parameter 来定义常量,即用 parameter 来定义一个标识符代表一个常量,称为符号常量,即标识符形式的常量。parameter 型数据是一种常数型的数据,其格式如下:parameter 参数名 1=表达式,参数名 2=表达式,参数名 n=表达式;parameter 是参数型数据的确认符。确认符后跟着一个用逗号分隔开的赋值语句表。在每一个赋值语句的右边必须是一个常数表达式,即该表达式只能包含数字或先前已经定义过的参数。例如:parameter byte_size=8,byte_msb=byte_size-1;在模块或实例引用时,可通过参数传递改变在被引用模块或实例中已定义的参数。

17、例 2.1module Decode(A,F);parameter Width=1,Polarity=1;.endmodulemodule Topwire3:0 A4;wire4:0 A5;wire15:0 F16;wire31:0 F32;Decode #(4,0 ) D1(A4,F16) ;Decode #(5) D2(A5,F32) ;endmodule10这个例子在引用模块 Decode 实例时,用了两个参数类型变量:Width 和 Polarity 且都为1。在 Top 模块中引用 Decode 实例时,可通过参数的传递来改变定义时已规定的参数值,即通过#(4,0)实际调用的是参数

18、Width 和 Polarity 分别为 4 与 0 的 Decode 模块;通过#(5)实际调用的是参数 Width 为 5,而 Polarity 仍为 1 的 Decode 模块。3.1.2 变量wire 型wire 型数据用来表示以 assign 关键字指定的组合逻辑信号。 Verilog 程序模块中输入、输出信号类型默认时自动定义为 wire 型。wire 型信号可以用做任何方程式的输入,也可以用做“assign”语句或实例元件的输出。wire 型信号的格式如下:wire n-1:0 数据名 1,数据名 2,数据名 i; wire n:1 数据名 1,数据名 2,数据名 i;/共有 i

19、 条总线,每条总线内有 n条线路reg 型reg 是寄存器数据类型的关键字,通过赋值语句可以改变寄存器储存的值,其作用与改变触发器储存的值相当。设计者可以通过结构语句来控制是否执行这些赋值语句,这些控制结构描述了硬件触发条件,例如时钟的上升沿和多路器的选通信号。reg 型数据常用来表示“always”模块内的指定信号,常代表触发器。在设计中要由“always”模块通过使用行为描述语句来表达逻辑关系。在 “always”块内被赋值的每一个信号都必须定义成 reg 型。reg 型数据的格式如下:reg n-1:0 数据名 1,数据名 2,数据名 i;reg n:1 数据名 1,数据名 2,数据名 i;Verilog HDL 可以通过对 reg 型变量建立数组来对存储器建模,可以描述 RAM 型存储器、ROM 存储器和 reg 文件。在 Verilog HDL 语言中没有多维数组存在。但是可以通过扩展 reg 型数据的地址范围来生成 memory 型数据。其格式如下:reg n-1:0 存储器名m-1 :0;reg n-1:0 存储器名m :1;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 实用文档资料库 > 公文范文

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。