Verilog中的数据类型
Verilog中共有19种数据类型。
基本的四种类型: reg型、wire型、integer型、parameter型。
其他类型:large型、medium型、small型、scalared型、time型、tri型、trio型、tril型、triand型、trior型、trireg型、vectored型、wand型和wo r型。
这14中数据类型除time外都与基本逻辑单元建库有关。
A、常量
(1)数字
整数,整型常量即整常数有以下4种进制表⽰形式:1)⼆进制(b或B);2)⼗进制(d或D);3)⼗六进制(h或H);4)⼋进制(o或O)。
数字表达式分为三种:
1)<;位宽><;进制><;数字>,这是最完整的形式。
2)<;进制><;数字>,数字的位宽采⽤默认位宽(不同的机器系统不同,⾄少32位)。
3)<;数字>,采⽤默认进制(⼗进制)。
⽰例:(位宽指的是时间所占位数,⽽不是指⼗六进制有⼏位。如⽰例⼆,每⼀位⼗六进制数字需要4位⼆进制数字表⽰,所以2位⼗六进制的位宽为8)
8'b10101100    //位宽为8的⼆进制数字10101100
8'ha2              //位宽为8的⼗六进制数字a2
x值和z值:在数字电路中,x代表不定值,z代表⾼阻值。⼀个x可以定义⼗六进制的4位,⼋进制的3位。z的表⽰⽅式同x相同,另外z亦可以⽤“”来表⽰。(case块中⽤得较多)
4'b10x0            //位宽为4的⼆进制数从低位数起第⼆位为不定值
4'b101z            //位宽为4的⼆进制数从低位数起第⼀位为⾼阻值
12'dz              //位宽为12的10进制数,其值为⾼阻值(形式⼀)
12'd?              //位宽为12的10进制数,其值为⾼阻值(形式⼆)
8'h4x              //位宽为8的⼗六进制数,其低4位为不定值
负数:在位宽前⾯加⼀个减号,减号必须在数字定义表达式的最前⾯。
-8'd5              //代表5的补数(采⽤8位⼆进制表⽰)
下划线:⽤于区别开数字的表达式以提⾼程序的可读性。不能⽤在位宽和进制的地⽅,只能⽤在数字之间(数字前也不可以)。
16'b1010_1011_1111_1010    //合法形式
常量未加标志时,默认为32位的⼗进制数,字母⽤⼋位的ASCII值表⽰。
"AB"=16'b01000001_01000010            //字符串AB,为⼗六进制数16'h4142
(2)参数型(parameter)
⽤parameter来定义⼀个标志符代表⼀个常量,称作符号常量,他可以提⾼程序的可读性和可维护性。parameter是参数型数据的关键字,在每⼀个赋值语句的右边都必须是⼀个常数表达式。即该表达式只能包含数字或先前已经定义的参数。
parameter    msb=7;                //定义参数msb=7
parameter    r=5.7;                  //定义r为⼀个实型参数5.7
parameter    byte_size=8,byte_msb=byte_size-1;        //利⽤常数表达式赋值
参数型常量经常⽤于定义延迟时间和变量宽度。在模块和实例引⽤时,可以通过参数传递改变在被引⽤模块或实例中已经定义的参数。
本书(1)(p31)介绍了两种⽅法:
1)引⽤实例时,通过参数的传递来改变已经定义的参数值。    Decode  #(4,0) D1(A4,F16)
2)在多层次的模块中,改变参数需要使⽤defparam命令。    defparam  Test.T.B1.P=2;        //Test、T、B1分别是⾼层模块中的底层模块实例。
B、变量
⽹络数据类型表⽰结构实体之间的物理连接。⽹络数据类型的变量不能储存数值,⽽且必须受到驱动器(门或连续赋值语句assign)的驱动。
(1)wire型,默认为⾼阻值z。
⽹络数据类型包括 wire型和 tri型数据。
wire⽤于表⽰单个门驱动或者连续赋值语句驱动的⽹络数据类型;
tri型则⽤来表⽰多驱动器驱动的⽹络型数据。
如果没有定义wire和tri的逻辑强度,在多驱动元的情况下逻辑值会发⽣冲突,从⽽产⽣不确定值。(z的优先级最低,x的优先级最⾼)
wire / tri01x z
00x x0
1x1x1
x x x x x
z01x z
wire经常⽤来表⽰以assign为关键字的组合逻辑信号。Verilog程序模块中输⼊输出的信号类型默认时⾃动定义为wire型。参数定义格式如下;
wire [n-1,0] 数据名1,数据名2...数据名i;          //表⽰共有 i 条总线,每台总线内有n条线路。或者 wire [n,1] 数据名1,数据名2...数据名i;
[n-1,0] 和 [n,1] 表⽰该数据的位宽为n。如:
wire      a;            //定义了1个1位的wire数据
wire    [7,0] b;      //定义了1个8位的wire数据
wire    [4,1] a,b;    //定义了2个4位的wire数据
(2)reg型,默认为不定值x。
寄存器是存储单元的抽象,寄存器数据类型的关键字是reg。常⽤来表⽰always模块内的指定信号,代表触发器。在always模块内被赋值的每⼀个信号都必须定义成reg型。格式与wire型类似:
reg [n-1,0] 数据名1,数据名2,...数据名i;
reg [n,1]  数据名1,数据名2,...数据名i;
reg数据可以赋正值,也可以赋负值。但是当⼀个reg数据是⼀个表达式的操作式时,它的值被当做⽆符号值,即正值。如:4位的reg被赋值为-1,在表达式中为+15.
reg型只是表⽰被定义的信号将被⽤在always模块中,并不是说reg型数据就⼀定是存储器或触发器的输出。
(3)memory型(特殊的reg)
字符串常量占ram在Verilog中通过对reg数据建⽴数组来对存储器进⾏建模,⽤来买哦书RAM ROM和reg⽂件。verilog中没有多维数组存在,memory型数据是通过扩展reg型数据的地址范围实现的。存储器的地址索引必须是常数表达式(n-1,m-1等必须是常量,符号常量也可以)。如:
reg      [n-1,0] 存储器名[m-1,0];
reg      [n-1,0] 存储器名[m,1];
在这⾥[n-1,0]定义了存储器中每⼀个存储单元的⼤⼩,即n位寄存器。存储器名后⾯的[m-1,0],表⽰定义的存储器中有多少个这样的寄存器。reg    [7,0] mem[255,0];          //256个8位寄存器的存储器mem
reg    [n-1,0] rega;                  //⼀个n位的寄存器
reg    mema[n-1,0]                  //n个1位的寄存器形成的存储器
rega = 0;                                  //合法,对n位的寄存器赋值位0
mema = 0;                              //⾮法,不能对完整的存储器直接赋值
mema[3] = 0;                          //合法,将mema中第三个存储单元赋值为0

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。