verilog——数据类型及其常量、变量和赋值

VerilogHDL中总共有19种数据类型。数据类型是用来表示数字电路硬件中的数据储存和传送元素的。它们是:
reg型、wire型、integer型和parameter型(最基本的四种)以及
large型、medium型、scalared型、time型、small型、tri型、trio型、tril型、triand型、trior型、trireg型、vectored型、wand型和wor型。

1.常量

1.数字

  1. 整数:
    有二进制(b或B)、十进制(d或D)、十六进制(h或H)、八进制(o或O)四种表示方式。

表达方式如下:(1)<位宽><进制><数字>(常用)
(2)<进制><数字>位宽为默认位宽(一般不少于32位)
(3)<数字>默认十进制
在表达式中,位宽指明了数字的精确位数。例如:一个4位二进制数的数字的位宽为4,一个4位十六进制数数字的位宽为16(因为每单个十六进制数就要用4位二进制数来表示)。
例如:
8'b10101111位宽为8的二进制表示,'b表示二进制
8'ha2位宽为8的数十六进制表示

  1. x和z值
    x和z值在数字电 路中,x代表不定值,z代表高阻值。一个x可以用来定义十六进
    制数的4位二进制数的状态、八进制数的3位、二进制数的1位。z的表示方式同x类似。z还有一种表达方式是可以写作“?”。在使用case表达式时建议使用这种写法,以提高程序的可读性
4'b10x0 //位宽为4的二进制数从低位数起第2位为不定值
4'b101z //位宽为4的二进制数从低位数起第1位为高阻值
12'dz  //位宽为12的十进制数,其值为高阻值(第1种表达方式)
12'd?  //位宽为12的十进制数,其值为高阻值(第2种表达方式)
8'h4x  //位宽为8的十六进制数,其低4位值为不定值
  1. 负数
    注意:减号不可以放在位宽和进制之间,也不可以放在进制和具体的数之间。
 4. 8'd5 //这个表达式代表5的补数(用八位二进制数表示)
8'd- 5 //非法格式

2.参数(parameter)型
在VerilogHDL中用parameter来定义常量即用parameter来定义一个标识符代表一个常量,称为符号常量,即标识符形式的常量,采用标识符代表一个常量可提高程序的可读性和可维护性(本人认为可理解C中的#define或者const)。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; //用常数表达式赋值

2.变量

1.wire类型
wire型数据常用来表示用以assign关键字指定的组合逻辑信号。Verilog 程序模块中输入、输出信号类型默认时自动定义为wire型。wire型信号可以用做任何方程式的输人,也可以用做“assign"语句或实例元件的输出。
wire型信号的格式同reg型信号的格式很类似。其格式如下:

wire [n-1:0]数据名1,数据名2,...数据名i; //共有i条总线,每条总线内有n条线路,
或
wire [n:1]数据名1,数据名2,...数据名i.

[n-1:0]和[n:1]都能表示总共是n个位宽

2.reg型
寄存器是数据储存单元的抽象。寄存器数据类型的关键字是reg。通过赋值语句可以改变寄存器储存的值,其作用与改变触发器储存的值相当。reg类型数据的默认初始值为不定值x。
如:reg rega定义了一个1位的名为rega的reg型数据
reg[3:0] regb定义了一个4位的名为regb的reg型数型

reg型数据常用来表示“always”模块内的指定信号,常代表触发器。通常,在设计中要由“always” 模块通过使用行为描述语句来表达逻辑关系。在“always"模块内被赋值的每一个信号都必须定义成reg型(但reg并不是只能是寄存器或触发器的输出)。

3.memory型
Verilog HDL通过对reg型变量建立数组来对存储器建模,可以描述RAM型存储器、
ROM存储器和reg文件。数组中的每一个单元通过一个数组索引进行寻址。在Verilog语言中没有多维数组存在,memory型数据是通过扩展reg型数据的地址范围来生成的。格式:reg[n-1:0] 存储器名[m-1:0]reg[n-1:0] 存储器名[m:1]

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

reg[7:0] m[255:0];

这个例子定义了一个名为m的存储器,该存储器有256个8位的寄存器构成的存储器组,该存储器的地址范围是0到255。

reg[n- 1:0] m;//一个n位的寄存器
reg m[n- 1:0];//一个由n个1位寄存器构成的存储器组

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

m[3]=0; //给memory中的第3个存储单元赋值为0

3.赋值

Verilog HDL有两种为变量赋值的方法

一种叫做连续赋值(Continuous Assignment),另一种叫做过程赋值(Procedural Assignment)。

过程赋值又分为阻塞赋值(Blocking Assignment)和非阻塞赋值(Nonblocking Assignment)

1.连续赋值
连续赋值是为线网型变量提供驱动的一种方法,它只能为线网型变量赋值,并且线网型变量也必须用连续赋值的方法赋值。

最基本的格式:assign # [延时量] 线网型变量名 =赋值表达式

赋值表达式可以是 a.标量 b.向量线网 c.向量寄存器 d.函数调用;

执行过程:连续赋值语句总是处于激活状态,只要右侧表达式中的任意一个操作数发生变化,表达式就会被立即重新计算,并且将结果赋值给对象。

2.过程赋值
过程赋值提供了为寄存器型变量赋值的方法,出现的位置是在各种块结构中,例如always块、 initial块等。

经过赋值后,变量(reg,integer,real,time)的取值保持不变,直到触发条件。

过程赋值又分为阻塞赋值非阻塞赋值两种。—>关于阻塞和非阻塞赋值的理解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RonaldoM要努力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值