Verilog中的基本数据类型

本文将讨论 verilog 中常用的数据类型,包括对数据表示、线网类型、变量类型和数组,分享一下使用方法和注意事项。
一、verilog 中的数值表示编写 verilog代码 时,经常需要在代码中表示数据值,可以将这些数据表示为2进制、8进制、10进制或16进制值。
特别是verilog中需要定义数据的位宽,因为verilog 本质上是在描述硬件电路。
语法:
说明:
bits:位宽,可省略,则默认是32bitrepresentation:进制, b或b表示2进制,o或o表示8进制,d或d表示10进制,h或h表示16进制,可省略,则默认是十进制​value :具体数值示例:
8'b1000_1000; //2进制表示4'o10; //8进制表示4'd8; //10进制表示4'h8; //十六进制表示每一个bit位不同值表示:
二、verilog 中的基本数据类型verilog 中的基本数据类型可以分为两大类:线网类型(net)和变量类型(variable )
net类型用来对数字电路中的连接关系建模,无法存储数值,表示数据驱动路线。
variable类型用来对寄存器或触发器建模,可以存储数据。
1、verilog 中的net类型用来描述设计中不同组件之间的物理连接,net类型本身不能用于存储数据或驱动数据。
通常使用连续赋值(continuous assignment)语句来将数据驱动到线型(wire)上,如assign 语句。
verilog 中最常用的net类型就是wire类型。 使用wire类型来声明设计中基本的点对点连接信号,顾名思义,它们大致相当于传统电路中的电线(wire英文原意)。
wire a; //声明一个1位宽wire类型信号a assign a = c; //使用assign关键字来赋值assign b = d; //使用assign关键字来赋值2、verilog 中的变量类型verilog 中使用变量类型来存储数据,可以一直保持这个值直到被再次赋值。
verilog中最常用的变量类型是reg类型,用于always语句块内,如下面的代码片段所示,实现了一个d触发器。
reg q;//d触发器always @(posedge clock) q <= d;end虽然reg 类型常被用来建模触发器,但在某些情况下,reg 类型也可用于在 verilog 中对组合逻辑进行建模。
reg q;always @(*) q = d;endverilog 中最常用的数值数据类型是integer类型。 但是,integer类型通常用于模块中的内部信号而不是端口。
注意:integer默认是32bit的有符号数。
integer a = 255; //声明一个值为255的integer类型变量a3、verilog 中的有符号(signed)和无符号数据(unsigned)verilog-2001 标准引入了signed 和 unsigned关键字,在verilog-2001标准发布之前,所有net类型和variable类型都只能用于存储无符号(unsigned)数据类型。
默认情况下,integer类型是有符号的,而 reg 和 wire 类型都是无符号的。 如果希望修改此默认行为,则需要使用这些关键字(signed 和 unsigned),在 verilog 代码中将变量类型声明为signed时,会是补码。
示例:
//声明无符号reg变量a、有符号reg变量breg [31:0] a;reg signed [31:0] b; //声明无符号wire变量a、有符号wire变量bwire [31:0] a;wire signed [31:0] b; //声明无符号integer变量a、有符号integer变量binteger unsigned a;integer b;4、verilog 中的数组(arrays )在 verilog 中可以创建和使用arrays(数组)类型,在fpga中实际是使用lut或bram来实现的。
(1)一维数组
语法:
说明:
type表示数组元素的类型size表示数据元素的位宽大小variable_name表示数组名称elements是表示数组的大小示例:
//定义一个共有8个元素的数组example,每个元素的位宽为3位wire [2:0] example [7:0];可以使用带有数组下标的方括号来访问数组中的单个元素,如:
//将5赋值给数组example中的最后一个元素assign example[7] = 3'h5;(2)多维数组
在verilog-1995标准中,只能创建一维数组。 verilog 2001 标准则可以创建多于一维的数组。 为此,只需添加另一个字段来定义需要的元素数量。
语法:
说明:
type表示数组元素的类型size表示数据元素的位宽大小variable_name表示数组名称elements0是表示数组第一层的大小elements1表示数组第二层的大小示例:
wire [3:0] example2d [7:0][1:0];//赋值操作assign example2d [7][1] = 4'ha;assign example2d [7][0] = 4'ha;verilog数组还是挺好用的,可以用于简化写代码的逻辑,适用于循环复制的模块或代码。
genvar i;wire [1:0] data_in [0:4];wire [1:0] data_out [0:4];generatefor(i = 0; i < 5; i = i + 1) begin: module_test mod_test u_mod_test( .clk(clk), .reset(reset), .data_in(data_in[i]), .data_out(data_out[i]) );endendgenerateinteger j;reg [2:0] shift_add_index [0:8];always@(posedge clk) begin shift_add_index[0] <= 'd2;endalways@(posedge clk) begin for(j = 1; j < 9; j = j+1) begin shift_add_index[j] <= shift_add_index[j-1] + j; endend

微型气象传感器价格多少
各类应用软件正推动数字阅读日渐普及,5G技术赋能数字阅读
全球有73家运营商推出了符合3GPP标准的商用5G服务
5G除了快还有什么作用5G能给这个世界带来什么样子
RFID在工作中和日常生活中的影响因素分析
Verilog中的基本数据类型
HTC发布了一个SDK,为Vive和Vive Pro提供无手套手指追踪功能
什么是嵌入式?嵌入式技术发展历程及趋势
超低功耗高抗干扰56SEGx4COM的LCD液晶屏驱动芯片
Win7和win10到底谁比较好?应该如何选择
怎样使用纯直流电为Logitech环绕扬声器供电
基于无人机影像北部湾典型岛群红树林生态系统净初级生产力估算
工业5g网关数据采集配置实现远程平台监控
电感元件电压与电流的关系
真无线降噪蓝牙耳机推荐||千元机降噪耳机推荐
储能电源让户外用电更便捷
GSEE电容式传感器在制药设备中的应用解析
Mobileye作为英特尔在自动驾驶领域的主力军,还需要面临哪些挑战?
怎样使用RC汽车零件作为遥控器
红米note5到底好不好用 体验大水桶千元真旗舰