新闻中心

EEPW首页 > EDA/PCB > 设计应用 > Verilog HDL基础教程之:数据类型和运算符

Verilog HDL基础教程之:数据类型和运算符

作者:时间:2013-08-23来源:网络收藏

常用

本文引用地址:http://www.eepw.com.cn/article/189525.htm

中总共有19种是用来表示数字电路硬件中的数据储存和传送元素的。在本书中,我们先只介绍4个最基本的数据类型,它们分别是:reg型,wire型,integer型和parameter型。

其他数据类型在后面的章节里逐步介绍,读者也可以查阅附录中 语法参考书的有关章节逐步掌握。其他的类型如下:large型、medium型、scalared型、time型、small型、tri型、trio型、tri1型、triand型、trior型、trireg型、vectored型、wand型和wor型。

这些数据类型除time型外都与基本逻辑单元建库有关,与系统设计没有很大的关系。在一般电路设计自动化的环境下,仿真用的基本部件库是由半导体厂家和EDA工具厂家共同提供的。系统设计工程师不必过多地关心门级和开关级的 语法现象。Verilog HDL语言中也有常量和变量之分,它们分别属于以上这些类型。下面对最常用的几种进行介绍。

常量

常量是在程序运行过程中其值不能被改变的量。下面首先对在Verilog HDL语言中使用的数字及其表示方式进行介绍。

1.数字

(1)整数。

在Verilog HDL中,整型常量有以下4种进制表示形式。

① 二进制整数(b或B)。

② 十进制整数(d或D)。

③ 十六进制整数(h或H)。

④ 八进制整数(o或O)。

数字表达方式有以下3种。

① 位宽>进制>数字>,这是一种全面的描述方式。

② 进制>数字>,在这种描述方式中,数字的位宽采用缺省位宽(这由具体的机器系统决定,但至少32位)。

③ 数字>,在这种描述方式中,采用缺省进制十进制。

在表达式中,位宽指明了数字的精确位数。例如:一个4位二进制数数字的位宽为4,一个4位十六进制数数字的位宽为16(因为每单个十六进制数要用4位二进制数来表示),如下例所示:

8'b10101100 //位宽为8的数的二进制表示,'b表示二进制

8'ha2 //位宽为8的数的十六进制,'h表示十六进制。

(2)x和z值。

在数字电路中,x代表不定值,z代表高阻值。一个x可以用来定义十六/八/二进制数的四/三/一位二进制数的状态。z的表示方式同x类似。z还有一种表达方式是可以写作?。在使用case表达式时建议使用这种写法,以提高程序的可读性,如下例所示:

4'b10x0 //位宽为4的二进制数从低位数起第二位为不定值

4'b101z //位宽为4的二进制数从低位数起第一位为高阻值

12'dz //位宽为12的十进制数其值为高阻值(第一种表达方式)

12'd? //位宽为12的十进制数其值为高阻值(第二种表达方式)

8'h4x //位宽为8的十六进制数其低四位值为不定值

(3)负数。

一个数字可以被定义为负数,只需在位宽表达式前加一个减号,并且减号必须写在数字定义表达式的最前面。注意减号不可以放在位宽和进制之间,也不可以放在进制和具体的数之间,如下例所示:

-8'd5 //这个表达式代表5的补数(用8位二进制数表示)

8'd-5 //非法格式

(4)下划线(underscore_)。

下划线可以用来分隔数字的表达以提高程序可读性。但不可以用在位宽和进制处,只能用在具体的数字之间,例如:

16'b1010_1011_1111_1010 //合法格式

8'b_0011_1010 //非法格式

当常量不声明位数时,默认值是32位,每个字母用8位的ASCII值表示,例如:

10=32'd10=32'b1010 //十进制和二进制

1=32'd1=32'b1 //十进制和二进制

-1=-32'd1=32'hFFFFFFFF //十进制和十六进制

'BX=32'BX=32'BXXXXXXX…X //默认声明为32位

AB=16'B01000001_01000010 //每个字母用8位表示

2.参数(Parameter)

在Verilog HDL中用parameter来定义常量,即用parameter来定义一个标识符代表一个常量,称为符号常量,即标识符形式的常量。采用标识符代表一个常量可提高程序的可读性和可维护性。parameter型数据是一种常数型的数据,其说明格式如下:

Parameter 参数名1=表达式,参数名2=表达式, …, 参数名n=表达式;

parameter是参数型数据的确认符,确认符后跟着一个用逗号分隔开的赋值语句表。在每一个赋值语句的右边必须是一个常数表达式。也就是说,该表达式只能包含数字或先前已定义过的参数,例如:

parameter msb=7; //定义参数msb为常量7

parameter e=25, f=29; //定义两个常数参数

parameter r=5.7; //声明r为一个实型参数

parameter byte_size=8, byte_msb=byte_size-1; //用常数表达式赋值

parameter average_delay = (r+f)/2; //用常数表达式赋值

参数型常数经常用于定义延迟时间和变量宽度。在模块或实例引用时可通过参数传递改变在被引用模块或实例中已定义的参数。下面将通过一个例子进一步说明在层次调用的电路中改变参数常用的一些用法。

module Decode(A,F); //模块声明

parameter Width=1, Polarity=1; //参数声明

……………

endmodule

module Top;

wire[3:0] A4; //连线资源声明

wire[4:0] A5;

wire[15:0] F16;

wire[31:0] F32;

Decode #(4,0) D1(A4,F16); //模块引用,并传递参数(4,0)

Decode #(5) D2(A5,F32); //模块引用,并传递参数(5)

endmodule

在引用Decode实例时,D1和D2的Width将采用不同的值,分别为4和5,且D1的Polarity将为0。可用例子中所用的方法来改变参数,即用“#(4,0)”向D1中传递“Width=4,Polarity=0”,用“#(5)”向D2中传递“Width=5,Polarit=1”。

变量

变量是在程序运行过程中,其值可以改变的量。在Verilog HDL中变量类型有很多种,这里只对常用的几种变量进行介绍。

1.网络类型变量

网络类型表示结构实体(例如门)之间的物理连接。网络类型的变量不能储存值,而且它必需受到驱动器(例如门或连续赋值语句,assign)的驱动。如果没有驱动器连接到网络类型的变量上,则该变量就是高阻的,即其值为z。

常用的网络类型变量包括wire型和tri型。这两种变量都是用于连接器件单元,它们具有相同的语法格式和功能。之所以提供这两种名字来表达相同的概念是为了与模型中所使用的变量的实际情况相一致。

wire型变量通常是用来表示单个门驱动或连续赋值语句驱动的网络型数据,tri型变量则用来表示多驱动器驱动的网络型数据。如果wire型或tri型变量没有定义逻辑强度(logic strength),在多驱动源的情况下,逻辑值会发生冲突,从而产生不确定值。

表1所示为在同等驱动强度下,两个驱动源驱动的wire型和tri型变量的真值表。

表1 wire/tri型变量真值表

wire/tri型变量双驱动源运算结果

驱动源1

驱动源2

0

1

x

z

0

0

x

x

0

1

1

x

1

x

x

x

x

x

z

0

1

x

z

wire型变量常用来表示用于以assign关键字指定的组合逻辑信号。Verilog程序模块中输入/输出信号类型缺省时自动定义为wire型。wire型变量可以用作任何方程式的输入,也可以用作“assign”语句或实例元件的输出。wire型变量的声明格式如下:

wire [n-1:0] 变量名1,变量名2,…,变量名i; //共有i条总线,每条总线内有n条线路

也可以如下表示:

wire [n:1] 变量名1,变量名2,…,变量名i; //共有i条总线,每条总线内有n条线路

其中,wire是wire型变量的确认符,[n-1:0]和[n:1]代表该变量的位宽,即该变量有几位,最后跟着的是变量的名字。如果一次定义多个变量,变量名之间用逗号隔开。声明语句的最后要用分号表示语句结束。如下所示:

wire a; //定义了一个一位的wire型变量

wire [7:0] b; //定义了一个八位的wire型变量

wire [4:1] c, d; //定义了两个四位的wire型变量


上一页 1 2 3 4 下一页

评论


相关推荐

技术专区

关闭