verilog

您所在的位置:网站首页 verilog一维数组定义和赋值 verilog

verilog

2024-07-17 12:17| 来源: 网络整理| 查看: 265

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

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的数十六进制表示

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位值为不定值 负数 注意:减号不可以放在位宽和进制之间,也不可以放在进制和具体的数之间。 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)的取值保持不变,直到触发条件。

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



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3