主页: 元存储博客
文章目录
- 前言
- 1. 整数表示
- 1.1 整数数据类型
- 1.2 整数转换函数
- 2. 负数表示
- 3. 实数表示
- 4. 逻辑电平表示
- 5. 逻辑值表示
- 6. 字符表示法
- 7. 字符串表示
前言
Verilog中,可以使用多种方式表示数值。
1. 整数表示
1.1 整数数据类型
基数格式共有四种,分别是十进制('d 或 'D),十六进制('h 或 'H),二进制('b 或 'B),八进制('o 或 'O)。数值可以指定位宽,也可以不指定位宽。
二进制表示法:以’b’或’B’为前缀,后跟一串0和1的数字序列。例如,4位宽的二进制数值可以表示为4’b1010。
八进制表示法 , 以’o’ 或 ‘O’ 为前缀, 如八进制数77, 8’o77。八进制数值77转换为十进制表示是63。
十进制表示法:直接使用十进制数字表示。例如,十进制数值23可以表示为8’d23, 也可直接用 23。
十六进制表示法:以’h’或’H’为前缀,后跟一串0-9和A-F的数字序列。例如,8位宽的十六进制数值可以表示为8’h7F。32’h3022_c0de // 32bit 的十六进制数值,下划线 _ 是为了增强代码的可读性。
整数表示法:使用整数变量声明和赋值。例如,使用整数变量n表示数值100可以表示为integer n = 100。
1.2 整数转换函数
Verilog提供了一些系统函数来处理整数。
$dec():将十六进制或二进制表示的整数转换为十进制数。
$bin():将十进制或十六进制表示的整数转换为二进制数。
$hex():将十进制或二进制表示的整数转换为十六进制数。
module integer_example;
reg [7:0] binary_num = 8'b11001011;
reg [15:0] decimal_num = 134;
reg [7:0] hex_num = 8'hCB;
initial begin
$display("Binary number: %b", binary_num);
$display("Decimal number: %d", decimal_num);
$display("Hexadecimal number: %h", hex_num);
$display("Decimal representation of binary number: %d", $dec(binary_num));
$display("Binary representation of decimal number: %b", $bin(decimal_num));
$display("Hexadecimal representation of decimal number: %h", $hex(decimal_num));
end
endmodule
结果:
Binary number: 11001011
Decimal number: 134
Hexadecimal number: CB
Decimal representation of binary number: 203
Binary representation of decimal number: 10000110
Hexadecimal representation of decimal number: 86
2. 负数表示
在Verilog中,负数可以使用有符号二进制补码表示法表示。有符号二进制补码表示法中,最高位(MSB)用来表示符号,0表示正数,1表示负数。其余位表示数值部分。
在进行运算时,Verilog会根据这种表示法进行符号扩展和溢出处理。例如,如果要对两个8位的有符号数进行相加,Verilog会自动进行符号扩展和溢出处理,以保证运算结果正确。
在Verilog中,负数可以使用两种表示方式:补码和符号-数(Sign-Magnitude)。下面分别介绍这两种表示方式的实践。
符号-数表示法: 符号-数表示法是另一种表示负数的方法。在符号-数表示法中,最高位为符号位,0表示正数,1表示负数,其余位表示数值的二进制表示。
例如,假设我们要表示-5,将5的二进制表示为0101,然后将最高位改为1得到符号-数表示:1101。所以-5的符号-数表示为1101。
在Verilog中,可以使用固定位数的有符号数据类型(如reg signed)来表示符号-数。例如,可以声明一个8位有符号变量来表示-5:
reg signed [7:0] num; assign num = 8'sb1101;
补码表示法: 补码是最常用的表示负数的方法。在补码表示法中,最高位为符号位,0表示正数,1表示负数。补码的数值计算方式为:正数的补码与其本身相同,负数的补码等于其绝对值的反码加1。
例如,假设我们要表示-5,首先将5的二进制表示取反得到反码:0101 -> 1010,然后将反码加1得到补码:1010 + 1 = 1011。所以-5的补码表示为1011。
在Verilog中,可以使用固定位数的有符号数据类型(如reg signed)来表示补码。例如,可以声明一个8位有符号变量来表示-5:
reg signed [7:0] num; assign num = 8'sb1011;
需要注意的是,补码表示法在进行数值计算时更方便,因为在补码的加减运算中,可以直接按照二进制数的运算规则进行操作。而符号-数表示法在进行数值计算时需要进行额外的处理,如判断符号位并进行特殊计算。因此,在大多数情况下,补码表示法更常用。
3. 实数表示
Verilog中的实数可以用固定的点表示法或浮点表示法来表示。
固定点表示法使用一个固定的小数点位置来表示实数。例如,如果我们选择小数点在整数部分的最后一位后面,那么实数3.14就可以表示成314。在Verilog中,可以使用整数类型来表示固定点数,并使用一个参数来指定小数点的位置。
浮点表示法使用科学计数法来表示实数,包括一个尾数和一个指数。在Verilog中,可以使用实数类型来表示浮点数。
下面是一些示例,演示了如何使用固定点表示法和浮点表示法来表示实数:
使用固定点表示法:
parameter FIXED_POINT = 16; // 小数点的位置
reg [31:0] fixed_point_number;
initial begin
fixed_point_number = 3.14 * (1 << FIXED_POINT);
$display("Fixed point number: %d", fixed_point_number);
end
使用浮点表示法:
reg [31:0] float_number;
initial begin
float_number = 3.14;
$display("Floating point number: %f", float_number);
end
在Verilog中,实数类型使用32位浮点数表示,其中24位用于尾数,8位用于指数。因此,在浮点表示法中,实数的精度会有限。为了提高精度,可以使用更高位数的固定点表示法。
4. 逻辑电平表示
Verilog HDL 有下列3种基本的值来表示硬件电路中的电平逻辑:
0:逻辑 0 或 “假”
1:逻辑 1 或 “真”
z 或 Z:高阻
z 意味着信号处于高阻状态,常见于信号(input, reg)没有驱动时的逻辑结果。
5. 逻辑值表示
逻辑值可以用以下两个关键字来表示:
0(代表逻辑低,表示逻辑“假”或“假设”)
1(代表逻辑高,表示逻辑“真”或“成立”)
这两个关键字分别用于表示逻辑门的输入和输出值。在Verilog中,逻辑值可以用于描述和表达逻辑门的功能和行为。逻辑值可以用于逻辑门之间的连接,以实现数字电路的功能。
用逻辑值true和false来表示布尔数据。例如,真值true可以表示为1’b1。
6. 字符表示法
用ASCII码或Unicode编码表示字符数据。例如,字符’A’可以表示为8’h41’。
7. 字符串表示
字符串可以用字符串字面值表示,字符串字面值被包围在双引号(")或单引号(')之间。
使用双引号表示字符串:
module example;
reg [7:0] data = "Hello";
initial begin
$display("%s", data);
end
endmodule
使用单引号表示字符串:
module example;
reg [7:0] data = 'Hello';
initial begin
$display("%s", data);
end
endmodule
Verilog中还支持转义序列来表示特殊字符,如换行符(\n),制表符(\t),回车符(\r)等。
module example;
reg [31:0] data = "Hello\nWorld!";
initial begin
$display("%s", data);
end
endmodule
字符串"Hello\nWorld!“被赋值给32位寄存器data,当打印出来时,”\n"将被解释为换行符。
参考文献
声明
本文仅为学习交流目的。
文中部分文字和图片来源于互联网,列在参考的文献,但可能有遗漏。如有侵权,请告知我删除。