没有合适的资源?快使用搜索试试~ 我知道了~
介绍节本的verilog语言,是电子系统硬件(1)行为描述、(2)结构描述、(3)数据流描述的一种语言
资源推荐
资源详情
资源评论
第三章 Verilog HDL 基本语法
--------------------------------------------------------------------------------------------------------------------------------------------
------
第三章 Verilog HDL的基本语法
前言
Verilog HDL是一种用于数字逻辑电路设计的语言。用Verilog HDL描述的电路设计就是该电路的
Verilog HDL模型。Verilog HDL既是一种行为描述的语言也是一种结构描述的语言。这也就是说,
既可以用电路的功能描述也可以用元器件和它们之间的连接来建立所设计电路的Verilog HDL模型。
Verilog模型可以是实际电路的不同级别的抽象。这些抽象的级别和它们对应的模型类型共有以下五
种:
• 系统级(system):用高级语言结构实现设计模块的外部性能的模型。
• 算法级(algorithm):用高级语言结构实现设计算法的模型。
• RTL级(Register Transfer Level):描述数据在寄存器之间流动和如何处理这些数据的模型。
• 门级(gate-level):描述逻辑门以及逻辑门之间的连接的模型。
• 开关级(switch-level):描述器件中三极管和储存节点以及它们之间连接的模型。
一个复杂电路系统的完整Verilog HDL模型是由若干个Verilog HDL模块构成的,每一个模块又可以
由若干个子模块构成。其中有些模块需要综合成具体电路,而有些模块只是与用户所设计的模块交互
的现存电路或激励信号源。利用Verilog HDL语言结构所提供的这种功能就可以构造一个模块间的清
晰层次结构来描述极其复杂的大型设计,并对所作设计的逻辑电路进行严格的验证。
Verilog HDL行为描述语言作为一种结构化和过程性的语言,其语法结构非常适合于算法级和RTL级的
模型设计。这种行为描述语言具有以下功能:
• 可描述顺序执行或并行执行的程序结构。
• 用延迟表达式或事件表达式来明确地控制过程的启动时间。
• 通过命名的事件来触发其它过程里的激活行为或停止行为。
• 提供了条件、if-else、case、循环程序结构。
• 提供了可带参数且非零延续时间的任务(task)程序结构。
• 提供了可定义新的操作符的函数结构(function)。
• 提供了用于建立表达式的算术运算符、逻辑运算符、位运算符。
• Verilog HDL语言作为一种结构化的语言也非常适合于门级和开关级的模型设计。因其结
构化的特点又使它具有以下功能:
− 提供了完整的一套组合型原语(primitive);
− 提供了双向通路和电阻器件的原语;
− 可建立MOS器件的电荷分享和电荷衰减动态模型。
Verilog HDL的构造性语句可以精确地建立信号的模型。这是因为在Verilog HDL中,提供
了延迟和输出强度的原语来建立精确程度很高的信号模型。信号值可以有不同的的强度,
可以通过设定宽范围的模糊值来降低不确定条件的影响。
Verilog HDL作为一种高级的硬件描述编程语言,有着类似C语言的风格。其中有许多语句如:if语句、
case语句等和C语言中的对应语句十分相似。如果读者已经掌握C语言编程的基础,那么学习Verilog
HDL并不困难,我们只要对Verilog HDL某些语句的特殊方面着重理解,并加强上机练习就能很好地掌
握它,利用它的强大功能来设计复杂的数字逻辑电路。下面我们将对Verilog HDL中的基本语法逐一
加以介绍。
3.1.简单的Verilog HDL模块
3.1.1.简单的Verilog HDL程序介绍
17
第三章 Verilog HDL 基本语法
--------------------------------------------------------------------------------------------------------------------------------------------
------
下面先介绍几个简单的Verilog HDL程序,然后从中分析Verilog HDL程序的特性。
例[3.1.1]:module adder ( count,sum,a,b,cin );
input [2:0] a,b;
input cin;
output count;
output [2:0] sum;
assign {count,sum} = a + b + cin;
endmodule
这个例子通过连续赋值语句描述了一个名为adder的三位加法器可以根据两个三比特数a、b和进位
(cin)计算出和(sum)和进位(count)。 从例子中可以看出整个Verilog HDL程序是嵌套在module
和 endmodule 声明语句里的。
例[3.1.2]:module compare ( equal,a,b );
output equal; //声明输出信号equal
input [1:0] a,b; //声明输入信号a,b
assign equal=(a==b)?1:0;
/*如果a、b 两个输入信号相等,输出为1。否则为0*/
endmodule
这个程序通过连续赋值语句描述了一个名为compare的比较器。对两比特数 a、b 进行比较,如a与b
相等,则输出equal为高电平,否则为低电平。在这个程序中,/*........*/和//.........表示注释
部分,注释只是为了方便程序员理解程序,对编译是不起作用的。
例[3.1.3]:module trist2(out,in,enable);
output out;
input in, enable;
bufif1 mybuf(out,in,enable);
endmodule
这个程序描述了一个名为trist2的三态驱动器。程序通过调用一个在Verilog语言库中现存的三态驱
动器实例元件bufif1来实现其功能。
例[3.1.4]: module trist1(out,in,enable);
output out;
input in, enable;
mytri tri_inst(out,in,enable);
//调用由mytri模块定义的实例元件tri_inst
endmodule
module mytri(out,in,enable);
output out;
input in, enable;
assign out = enable? in : 'bz;
endmodule
这个程序例子通过另一种方法描述了一个三态门。在这个例子中存在着两个模块。模块trist1调用由
模块mytri定义的实例元件tri_inst。模块trist1是顶层模块。模块mytri则被称为子模块。
通过上面的例子可以看到:
18
第三章 Verilog HDL 基本语法
--------------------------------------------------------------------------------------------------------------------------------------------
------
• Verilog HDL程序是由模块构成的。每个模块的内容都是嵌在module和endmodule两个
语句之间。每个模块实现特定的功能。模块是可以进行层次嵌套的。正因为如此,才可
以将大型的数字电路设计分割成不同的小模块来实现特定的功能,最后通过顶层模块
调用子模块来实现整体功能。
• 每个模块要进行端口定义,并说明输入输出口,然后对模块的功能进行行为逻辑描述。
• Verilog HDL程序的书写格式自由,一行可以写几个语句,一个语句也可以分写多行。
• 除了endmodule语句外,每个语句和数据定义的最后必须有分号。
• 可以用/*.....*/和//.......对Verilog HDL程序的任何部分作注释。一个好的,有使
用价值的源程序都应当加上必要的注释,以增强程序的可读性和可维护性。
3.1.2.模块的结构
Verilog的基本设计单元是“模块”(block)。一个模块是由两部分组成的,一部分描述接口,另一部
分描述逻辑功能,即定义输入是如何影响输出的。下面举例说明:
module block (a,b,c,d);
input a,b;
output c,d;
assign c= a | b ;
assign d= a & b;
endmodule
a
b
c
d
请看上面的例子,程序模块旁边有一个电路图的符号。在许多方面,程序模块和电路图符号是一致的,
这是因为电路图符号的引脚也就是程序模块的接口。而程序模块描述了电路图符号所实现的逻辑功
能。上面的Verilog设计中,模块中的第二、第三行说明接口的信号流向,第四、第五行说明了模块
的逻辑功能。以上就是设计一个简单的Verilog程序模块所需的全部内容。
从上面的例子可以看出,Verilog结构完全嵌在module和endmodule声明语句之间,每个Verilog程序
包括四个主要部分:端口定义、I/O说明、内部信号声明、功能定义。
3.1.3.模块的端口定义
模块的端口声明了模块的输入输出口。其格式如下:
module 模块名(口1,口2,口3,口4, ………);
3.1.4.模块内容
模块的内容包括I/O说明、内部信号声明、功能定义。
I/O说明的格式如下:
输入口: input 端口名1,端口名2,………,端口名i; //(共有i个输入口)
输出口: output 端口名1,端口名2,………,端口名j; //(共有j个输出口)
I/O说明也可以写在端口声明语句里。其格式如下:
module module_name(input port1,input port2,…
19
第三章 Verilog HDL 基本语法
--------------------------------------------------------------------------------------------------------------------------------------------
------
output port1,output port2… );
内部信号说明:在模块内用到的和与端口有关的wire 和 reg 变量的声明。
如: reg [width-1 : 0] R变量1,R变量2 。。。。;
wire [width-1 : 0] W变量1,W变量2 。。。。;
………..
功能定义: 模块中最重要的部分是逻辑功能定义部分。有三种方法可在模块中产生逻辑。
1).用“assign”声明语句
如: assign a = b & c;
这种方法的句法很简单,只需写一个“assign”,后面再加一个方程式即可。例子中的方程式描述了
一个有两个输入的
与门。
2).用实例元件
如: and and_inst( q, a, b );
采用实例元件的方法象在电路图输入方式下,调入库元件一样。键入元件的名字和相连的引脚即可,
表示在设计中用到一个跟
与门(and)一样的名为and_inst的与门,其输入端为a, b,输出为q。要求
每个实例元件的名字必须是唯一的,以避免与其他调用
与门(and)的实例混淆。
3).用“always”块
如:always @(posedge clk or posedge clr)
begin
if(clr) q <= 0;
else if(en) q <= d;
end
采用“assign”语句是描述组合逻辑最常用的方法之一。而“always”块既可用于描述组合逻辑也可
描述时序逻辑。上面的例子用“always”块生成了一个带有异步清除端的D触发器。“always”块可
用很多种描述手段来表达逻辑,例如上例中就用了if...else语句来表达逻辑关系。如按一定的风格
来编写“always”块,可以通过综合工具把源代码自动综合成用门级结构表示的组合或时序逻辑电路。
注意:
如果用Verilog模块实现一定的功能,首先应该清楚哪些是同时发生的,哪些是顺序发生的。上面三个
例子分别采用了“assign”语句、实例元件和“always”块。这三个例子描述的逻辑功能是同时执行的。
也就是说,如果把这三项写到一个 VeriIog 模块文件中去,它们的次序不会影响逻辑实现的功能。
这三项是同时执行的,也就是并发的。
然而,在“always”模块内,逻辑是按照指定的顺序执行的。“always”块中的语句称为“顺序语句”,
因为它们是顺序执行的。请注意,两个或更多的“always”模块也是同时执行的,但是模块内部的语
句是顺序执行的。 看一下“always”内的语句,你就会明白它是如何实现功能的。 if..else… if
必须顺序执行,否则其功能就没有任何意义。如果else语句在if语句之前执行,功能就会不符合要求!
为了能实现上述描述的功能,“always”模块内部的语句将按照书写的顺序执行。
3.2.数据类型及其常量、变量
Verilog HDL中总共有十九种数据类型,数据类型是用来表示数字电路硬件中的数据储存和传送元素
的。在本教材中我们先只介绍四个最基本的数据类型,它们是:
reg型、wire型、integer型、parameter型
其它数据类型在后面的章节里逐步介绍,同学们也可以查阅附录中Verilog HDL语法参考书的有关章
节逐步掌握。其它的类型如下:
large型、medium型、scalared型、time型、small型、tri型、trio型、tri1型、triand型、trior
型、trireg型、vectored型、wand型、wor型。这些数据类型除time型外都与基本逻辑单元建库有关,
与系统设计没有很大的关系。在一般电路设计自动化的环境下,仿真用的基本部件库是由半导体厂家
和EDA工具厂家共同提供的。系统设计工程师不必过多地关心门级和开关级的Verilog HDL语法现象。
20
第三章 Verilog HDL 基本语法
--------------------------------------------------------------------------------------------------------------------------------------------
------
Verilog HDL语言中也有常量和变量之分。它们分别属于以上这些类型。下面就最常用的几种进行介
绍。
3.2.1.常量
在程序运行过程中,其值不能被改变的量称为常量。下面首先对在Verilog HDL语言中使用的数字及其
表示方式进行介绍。
一.数字
整数:
在Verilog HDL中,整型常量即整常数有以下四种进制表示形式:
1) 二进制整数(b或B)
2) 十进制整数(d或D)
3) 十六进制整数(h或H)
4) 八进制整数(o或O)
数字表达方式有以下三种:
1) <位宽><进制><数字>这是一种全面的描述方式。
2) <进制><数字>在这种描述方式中,数字的位宽采用缺省位宽(这由具体的机器系统
决定,但至少32位)。
3) <数字>在这种描述方式中,采用缺省进制十进制。
在表达式中,位宽指明了数字的精确位数。例如:一个4位二进制数的数字的位宽为4,一个4位十六进制
数的数字的位宽为16(因为每单个十六进制数就要用4位二进制数来表示)。见下例:
8'b10101100 //位宽为8的数的二进制表示, 'b表示二进制
8'ha2 //位宽为8的数的十六进制,'h表示十六进制。
x和z值:
在数字电路中,x代表不定值,z代表高阻值。一个x可以用来定义十六进制数的四位二进制数的状态,
八进制数的三位,二进制数的一位。z的表示方式同x类似。z还有一种表达方式是可以写作?。在使用
case表达式时建议使用这种写法,以提高程序的可读性。见下例:
4'b10x0 //位宽为4的二进制数从低位数起第二位为不定值
4'b101z //位宽为4的二进制数从低位数起第一位为高阻值
12'dz //位宽为12的十进制数其值为高阻值(第一种表达方式)
12'd? //位宽为12的十进制数其值为高阻值(第二种表达方式)
8'h4x //位宽为8的十六进制数其低四位值为不定值
负数:
一个数字可以被定义为负数,只需在位宽表达式前加一个减号,减号必须写在数字定义表达式的最前
面。注意减号不可以放在位宽和进制之间也不可以放在进制和具体的数之间。见下例:
-8'd5 //这个表达式代表5的补数(用八位二进制数表示)
8'd-5 //非法格式
下划线(underscore_):
下划线可以用来分隔开数的表达以提高程序可读性。但不可以用在位宽和进制处,只能用在具体的数
字之间。见下例:
16'b1010_1011_1111_1010 //合法格式
8'b_0011_1010 //非法格式
当常量不说明位数时,默认值是32位,每个字母用8位的ASCII值表示。
例:
10=32’d10=32’b1010
21
剩余58页未读,继续阅读
资源评论
weixin_42189898
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功