本文是Verilog学习笔记,参考于《Xilinx FPGA开发实用教程》和夏宇闻老师的Verilog经典教程系列
一、数据类型
Verilog HDL中总共有19种数据类型,数据类型是用来表示数字电路硬件中的数据储存和传送原色的
1. wire型
wire型数据常用来表示用于以assign关键字指定的组合逻辑信号。
Verilog程序模块中输入输出信号类型默认为wire型。
wire型信号可以用做方程式的输入,也可以用做”assign”语句或者实例元件的输出
wire型信号的定义格式:
wire [n-1:0] 数据名1,数据名2,...,数据名N;
//定义了N条线,每条线的位宽为n
2. reg型
reg是寄存器数据类型的关键字。
寄存器是数据存储单元的抽象,通过赋值语句可以改变寄存器存储的值,其作用相当于改变触发器存储器的值。
reg型数据常用来表示always模块内的指定信号,代表触发器。
通常在设计中要由always模块通过使用行为描述语句来表达逻辑关系。在always块内被赋值的每一个信号都必须定义为reg型,即赋值操作符的右端变量必须是reg型
reg型号数据的格式:
reg[n-1:0]数据名1,数据名2,...,数据N;
//定义了N个寄存器变量,每个数据位宽为n
**reg
型数据的默认值是不定的**。reg型数据可以为正值或负值。当一个reg型数据是一个表达式中的操作数时,它的值被当做无符号值,即正值(如果一个4位的reg型数据被写入-1,在表达式中运算时,其值被认为是+15)
reg型和wire型的区别:reg型保持最后一次的赋值,而wire型需要持续驱动
3. memory型
Verilog HDL通过对reg型变量建立数组来对存储器建模,可以描述RAM型存储器,ROM存储器和reg文
件。数组中的每一个单元通过一个数组索引进行寻址。在Verilog语言中没有多维数组存在。memory型数据是通过扩展reg数据的地址范围来生成
memory型号数据的格式:
reg [n-1:0] 存储器名[m-1:0];
//存储器中m个寄存器,每个寄存器数据位宽为n
对存储器进行地址索引的表达式必须是常数表达式
一个n位的寄存器可以在一条赋值语句里进行赋值,而一个完整的存储器则不行
reg [n-1:0] rega; //一个n位的寄存器
reg mema [n-1:0]; //一个由n个1位寄存器构成的存储器组
rega =0; //合法赋值语句
mema =0; //非法赋值语句
mema[3]=0; //给memory中的第3个存储单元赋值为0
4. parameter型
Verilog HDL中用parameter来定义常量,即用parameter来定义一个标识符表示一个常数。
提高程序的可读性和可维护性
parameter型号数据的格式:
parameter 参数名1=数据名1;
二、常量
Verilog HDL有下列4种基本数值:
- 0 ———— 逻辑0或“假”
- 1 ———— 逻辑1或“真”
- x ———— 未知(不区分大小写)
- z ———— 高阻(还可以写成”?”“)(不区分大小写)
x和z值举例
4'b1x00 //位宽为4的二进制数从低位数起第三位为不定值
4'b011z //位宽为4的二进制数从低位数起第一位为高阻值
12'dz //位宽为12的十进制数其值为高阻值(第一种表达方式)
12'd? //位宽为12的十进制数其值为高阻值(第二种表达方式)
8'h4x //位宽为8的十六进制数其低四位值为不定值
1. 整数
1.1 十进制格式
68 //十进制68
-56 //十进制-56
1.2 基数表示格式
基数格式的整数格式:
[长度] '基数 数值
长度:常量的位长
基数:可以是二进制、八进制、十进制、十六进制之一
数值:基于基数的数字序列,且数值不能为负数
8'b10101100 //位宽为8的数的二进制
8'ha2 //位宽为8的数的十六进制
2. 实数
2.1 十进制计数法
3.0
123.342
2.2 科学计数法
234.12e2 //值为23412
6e-3 //值为0.006
根据Verilog语言的定义,实数通过四舍五入隐式地转换为最相近的整数
3. 字符串
双引号内的字符序列,不能分成多行书写
用8位ASCII值表示的字符可以看作是无符号整数,因此字符串是8位ASCII值序列