verilog有符号数的位宽转换

2 篇文章 0 订阅
2 篇文章 0 订阅

Verilog有符号数的位宽转换

想要搞明白Verilog中有符号数的位宽转换,必须首先理解计算机如何区分无符号数和有符号数。
有符号数通常以2的补码形式来表示!
2的补码:首位为符号位(0-正,1-负),其他位取反加1。下表是3位长模式的2的补码:

位模式表示的值
0000
0011
0102
0113
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的悉心指导

  • 5
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值