您好、欢迎来到现金彩票网!
当前位置:手机棋牌游戏平台 > 位异或 >

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

发布时间:2019-05-31 09:28 来源:未知 编辑:admin

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  Verilog HDL语言提供了功能强大的结构语句使设计者能有效地控制是否执行这些赋值语句。这些控制结构用来描述硬件触发条件,例如时钟的上升沿和多路器的选通信号。reg类型变量的缺省初始值为不定值,即x。

  reg型变量常用来表示用于“always”模块内的指定信号,常代表触发器。通常,在设计中要由“always”块通过使用行为描述语句来表达逻辑关系。在“always”块内被赋值的每一个信号都必须定义成reg型。和wire型变量类似,reg型变量的声明格式如下:

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

  reg型变量可以赋正值,也可以赋负值。但当一个reg型变量是一个表达式中的操作数时,它的值将被当作是无符号值,即正值。例如:当一个四位的寄存器用作表达式中的操作数时,如果开始寄存器被赋以值-1,则在表达式中进行运算时,其值被认为是+15。

  在这里,reg[n-1:0]定义了存储器中每一个存储单元的大小,即该存储单元是一个n位的寄存器。存储器名后的[m-1:0]或[m:1]则定义了该存储器中有多少个这样的寄存器。最后用分号结束定义语句。下面举例说明:

  这个例子定义了一个名为mema的存储器,该存储器有256个8位的存储器。该存储器的地址范围是0~255。需要注意的是,对存储器进行地址索引的表达式必须是常数表达式。

  另外,在同一个数据类型声明语句里,可以同时定义存储器型数据和reg型数据。 例如:

  尽管memory型数据和reg型数据的定义格式很相似,但要注意其不同之处。如一个由n个1位寄存器构成的存储器组是不同于一个n位的寄存器的,如下所示:

  一个n位的寄存器可以在一条赋值语句里进行赋值,而一个完整的存储器则不行,例如:

  如果想对memory中的存储单元进行读写操作,必须指定该单元在存储器中的地址。下面的写法是正确的。

  进行寻址的地址索引可以是表达式,这样就可以对存储器中的不同单元进行操作。表达式的值可以取决于电路中其他的寄存器的值。例如可以用一个加法计数器来做RAM的地址索引。

  单目运算符(unary operator):可以带一个操作数,操作数放在运算符的右边。

  二目运算符(binary operator):可以带两个操作数,操作数放在运算符的两边。

  三目运算符(ternary operator):可以带三个操作数,这三个操作数用三目运算符分隔开。

  :(减法运算符或负值运算符,如rega3、3)。

  % :(模运算符或求余运算符,要求%两侧均为整型数据,如7%3的值为1)。

  在进行整数除法运算时,结果值要略去小数部分,只取整数部分。而进行取模运算时,结果值的符号位采用模运算式里第一个操作数的符号位,例如:

  ~是一个单目运算符,用来对一个操作数进行按位取反运算。如表2所示为单目运算符~的运算规则表。

  按位异或运算就是将两个操作数的相应位进行异或运算,其运算规则如表5所示。

  按位同或运算就是将两个操作数的相应位先进行异或运算再进行非运算,其运算规则如表6所示。

  两个长度不同的数据进行位运算时,系统会自动将两者按右端对齐。位数少的操作数会在相应的高位用0填满,以使两个操作数按位进行操作。

  在进行关系运算时,如果声明的关系是假的(flase),则返回值是0;如果声明的关系是真的(true),则返回值是1;如果某个操作数的值不定,则关系是模糊的,返回值是不定值。

  所有的关系运算符有着相同的优先级别。关系运算符的优先级别低于算术运算符的优先级别,例如。

  从上面的例子可以看出这两种不同运算符的优先级别。当表达式size -(1a)进行运算时,关系表达式先被运算,然后返回结果值0或1被size减去。而当表达式 size -1a 进行运算时,size先被减去1,然后再同a相比。

  “= = =”和“!= =”运算符则不同,它在对操作数进行比较时,对某些位的不定值x和高阻值z也进行比较。两个操作数必需完全一致,其结果才是1,否则为0。“= = =”和“!= =”运算符常用于case表达式的判别,所以又称为“case等式运算符”。

  这4个等式运算符的优先级别是相同的。下面画出“= =”与“= = =”的真值表,帮助理解两者间的区别。

  a代表要进行移位的操作数,n代表要移几位。这两种移位运算都用0来填补移出的空位。下面举例说明:

  从上面的例子可以看出,start在移过两位以后,用0来填补空出的位。进行移位运算时应注意移位前后变量的位数,下面举例说明。

  即把某些信号的某些位详细地列出来,中间用逗号分开,最后用大括号括起来表示一个整体信号,例如:

  在位拼接表达式中不允许存在没有指明位数的信号。这是因为在计算拼接信号的位宽的大小时必需知道其中每个信号的位宽。

  缩减运算符是单目运算符,也有与、或、非运算。其与、或、非运算规则类似于位运算符的与、或、非运算规则,但其运算过程不同。位运算是对操作数的相应位进行与、或、非运算,操作数是几位数,则运算结果也是几位数。而缩减运算则不同,缩减运算是对单个操作数进行与、或、非递推运算,最后的运算结果是一位的二进制数。

  由于缩减运算的与、或、非运算规则类似于位运算符与、或、非运算规则,这里不再详细讲述,可参照位运算符的运算规则介绍。

  硬件描述语言Verilog HDL设计进阶之:自动转换量程频率计控制器

  硬件描述语言Verilog HDL设计进阶之:使用函数实现简单的处理器

  硬件描述语言Verilog HDL设计进阶之: 逻辑综合的原则以及可综合的代码设计风格

http://lake-macquarie.com/weiyihuo/79.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有