Verilog有符号数的位宽转换
想要搞明白Verilog中有符号数的位宽转换,必须首先理解计算机如何区分无符号数和有符号数。
有符号数通常以2的补码形式来表示!
2的补码:首位为符号位(0-正,1-负),其他位取反加1。下表是3位长模式的2的补码:
位模式 | 表示的值 |
---|---|
000 | 0 |
001 | 1 |
010 | 2 |
011 | 3 |
111 | -1 |
110 | -2 |
101 | -3 |
100 | -4 |
因此,有符号数的位转换关键在于符号位(首位)!
1、有符号数位宽小到位宽大(4位转换为8位)
关键操作:转换时,高位补原符号位!!!(区别于无符号数的高位补零)
例如:将4位有符号数1100,转换为8位有符号数。
verilog 代码:
reg [3:0] original; //定义4位有符号数寄存器变量
reg [7:0] later; //定义8位有符号数寄存器变量
assign later = {{4{original[3]}}},original}; //高4位补original的符号位
original | 表示的值 |
---|---|
1100 | -4 |
later | 表示的值 |
---|---|
1111 1100 | -4 |
需要注意的是,位拼接“{}”容易混淆,笔者小熊在调试过程中,因为漏掉一个“{}”耽误了好久。
2、有符号数位宽大到位宽小(8位转换为4位)
有符号数位宽大到位宽小的转换就很简单了,直接截取低n位即可。
例如:将8位有符号数1111 1100,转换为4位有符号数。
verilog 代码:
reg [7:0] original; //定义8位有符号数寄存器变量
reg [3:0] later; //定义4位有符号数寄存器变量
assign later = {original[3:0]}; //截取original的低4位作为later
位拼接语法我参考的这篇文章:
https://zhidao.baidu.com/question/531343285.html
特别感谢冰雪聪明の师姐jiaojiao的悉心指导