Verilog有符号数与无符号数的相互转化
Verilog有符号数与无符号数的相互转化
最近在使用DA转换时碰到一个问题,DA芯片输入的数值必须是正的,但输出的数据为有符号数,涉及到一个转化的问题,写一篇博客总结一下。
- 问题描述
- 一、正数
- 二、负数
- 1.-128
- 2.-1
- 结论
- 三、延伸
- 总结
问题描述
把8位有符号数(-128-127)转化为8位无符号数(255-0),转化到255-0是因为该DA模块输入数据越大反而输出电压越小。
一、正数
比较显然,直接用127减该数就可以。
二、负数
举两个例子:
1.-128
-128补码为1000_0000,用127-(-128),计算器计算为:
用Verilog写个简单的模块仿真一下:
module subtraction(input [7:0] a,input [7:0] b,output [7:0] c);
assign c=b-a;
endmodule
多余的1位Verilog会自动截断掉,结果为1111_1111,即为255。
2.-1
补码为1111_1111。也是类似的,自动把多余的位舍弃掉,结果为1000_0000,即为128:
结论
直接可以通过该语句实现,即用127减一下:
assign c=8'b0111_1111-a;
三、延伸
要将-128-127转化为0-255,该怎么做。与上面的不同,需要用128加原本的数,但128若用有符号数表示,需要9位,那该怎么做,可以先试一试。
以-1为例,补码为1111_1111,还是先用计算器试一下,直接用无符号的128,即1000_0000:
Verilog代码:
module adder(input [7:0] a,input [7:0] b,output [7:0] c);
assign c=b+a;
endmodule
vivado仿真:
若用十进制表示,有符号十进制:
无符号十进制:
可以看到不管是无符号还是有符号都因为超出了范围(-128-127和0-255),结果是不正确的,但还是能正确将有符号数转化为无符号数(-1变成127)。
总结
其实该问题可以看做补码的计算的问题,总结一下算让我理解了补码存在的意义。
回顾一下补码的定义:
正数和0
正整数的补码是其二进制表示,与原码相同。
负数
求负整数的补码,将其原码除符号位外的所有位取反后加1。
补码让二进制的正负加减运算变得很方便,即使位宽产生溢出也可以通过舍弃多余的高位产生正确的结果(如前面的127-(-1)),比较计算器的结果和vivado仿真的结果。
Verilog有符号数与无符号数的相互转化相关推荐
- 对verilog中有符号数和无符号数的理解
文章目录 对verilog中有符号数和无符号数的理解 对verilog中有符号数和无符号数的理解 verilog中使用signed表示有符号数,比如: wire signed [7:0] din; ...
- Verilog 有符号数与无符号数运算
无符号数运算,左值位宽不够,发生截断的现象 reg [3:0] a = 4'b1111;//15 reg [3:0] b = 4'b0010;//2 wire [3:0] c; wire [3:0] ...
- verilog中有符号数和无符号数的相关运算
目录 1.有符号数和有符号数的加减运算(输入和输出为原码) 2.无符号数和有符号数的加减运算(输入和输出为原码) 3.有符号数和有符号数的乘法(输入和输出为原码) 1.有符号数和有符号数的加减运算(输 ...
- verilog有符号数和无符号数的计算
有符号和无符号数 在电路设计中肯定会使用到有符号数无符号数的运算,今天简单说说具体怎么使用有符号数无符号数进行运算,这里以减法为例. 我们知道计算机运算都是以二进制的形式进行的,不过遇到负数,通常用二 ...
- Verilog 和VHDL有符号数和无符号数相关运算
目录 一.Verilog有无符号数运算 1.有符号数和有符号数的加减运算(输入和输出为原码) 2.无符号数和有符号数的加减运算(输入和输出为原码) 3.有符号数和有符号数的乘法(输入和输出为原码) 二 ...
- verilog数值计算-有符号数和无符号数
verilog数值计算-有符号数和无符号数 位宽截断 算术运算 有符号数赋值 位宽截断 位宽大的数赋值给位宽小的数,数据就会被截断,截断的规则就是从低位开始取,被截断的是高位 code wire [5 ...
- java中有符号数和无符号数,C语言中无符号数和有符号数之间的运算
C语言中有符号数和无符号数进行运算(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算,其中算术运算默认返回无符号数,逻辑运算当然是返回0或1了. unsigned int和int进行运算 ...
- 理解有符号数和无符号数的区别
理解有符号数和无符号数 回头看上一节,我们所讲的数都是正数.同样是年纪和工资,前者不需要有负值,但后者可能需要--至少所有的老板都这样认为. 那么,负数在计算机中如何表示呢? 这一点,你可能听过两种不 ...
- c语言中的无符号字节,C语言之有符号数和无符号数
我们知道,在C语言中存在无符号数和有符号数(一些高级语言如Java里面是没有无符号数的),但是对于计算机而言,其本身并不区别有符号数和无符号数,因为在计算机里面都是0或者1,但是在我们的实际使用中有时 ...
最新文章
- vue 组件id重复问题
- Epplus:导出Excel
- Erlang基础学习总结2
- opencv形状识别学习总结
- 三招看穿ERP软件是否可行
- Matlab | 数字信号处理:用窗函数法设计FIR数字滤波器
- win10计算机本地无法连接,win10无法连接到这个网络怎么办_win10无法连接到这个网络如何解决...
- 一步步编写操作系统 61 任务状态段 TSS
- 分库分表学习总结(2)——数据库中间件MyCat学习总结之MyCat-Web原理介绍
- Android--xml布局文件中使用include
- 爬虫之模拟登录、自动获取cookie值、验证码识别
- (第二天)编写训练记忆软件--数字编码矩阵V1.0
- 小技巧!Win10系统怎样恢复使用Win7中的照片查看器?非常简单!
- java 手机网站 cookie操作_Java中的cookie管理方案——完整易用的客户端cookie操作库...
- java进行多个照片合并操作
- Ariane和riscv-gnu-toolchain工具链的安装
- Android 3年外包工面试笔记,有机会还是要去大厂学习提升
- javac java编译-g
- OneNote-做笔记的软件-强烈推荐
- MSPA提取生态源地过程
热门文章
- 卷积神经网络VGG16
- 管理工作中的“七种浪费”【转】
- java数组及数组函数
- Redis 慢查询 命令 slowlog
- 文科生学Python,为了什么?
- 编译ZeroMQ以支持Libsodium出现的“ No package 'libsodium' found”问题
- C# 获取汉字拼音首字母
- jasper报错java.lang.ExceptionInInitializerError net.sf.jasperreports.engine.fill.JRBaseFiller
- IIS中ftp设置指定的用户登录(三)
- Unity Vector3.Lerp Vector3.LerpUnclamped 的区别