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有符号数与无符号数的相互转化相关推荐

  1. 对verilog中有符号数和无符号数的理解

    文章目录 对verilog中有符号数和无符号数的理解 对verilog中有符号数和无符号数的理解 ​ verilog中使用signed表示有符号数,比如: wire signed [7:0] din; ...

  2. Verilog 有符号数与无符号数运算

    无符号数运算,左值位宽不够,发生截断的现象 reg [3:0] a = 4'b1111;//15 reg [3:0] b = 4'b0010;//2 wire [3:0] c; wire [3:0] ...

  3. verilog中有符号数和无符号数的相关运算

    目录 1.有符号数和有符号数的加减运算(输入和输出为原码) 2.无符号数和有符号数的加减运算(输入和输出为原码) 3.有符号数和有符号数的乘法(输入和输出为原码) 1.有符号数和有符号数的加减运算(输 ...

  4. verilog有符号数和无符号数的计算

    有符号和无符号数 在电路设计中肯定会使用到有符号数无符号数的运算,今天简单说说具体怎么使用有符号数无符号数进行运算,这里以减法为例. 我们知道计算机运算都是以二进制的形式进行的,不过遇到负数,通常用二 ...

  5. Verilog 和VHDL有符号数和无符号数相关运算

    目录 一.Verilog有无符号数运算 1.有符号数和有符号数的加减运算(输入和输出为原码) 2.无符号数和有符号数的加减运算(输入和输出为原码) 3.有符号数和有符号数的乘法(输入和输出为原码) 二 ...

  6. verilog数值计算-有符号数和无符号数

    verilog数值计算-有符号数和无符号数 位宽截断 算术运算 有符号数赋值 位宽截断 位宽大的数赋值给位宽小的数,数据就会被截断,截断的规则就是从低位开始取,被截断的是高位 code wire [5 ...

  7. java中有符号数和无符号数,C语言中无符号数和有符号数之间的运算

    C语言中有符号数和无符号数进行运算(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算,其中算术运算默认返回无符号数,逻辑运算当然是返回0或1了. unsigned int和int进行运算 ...

  8. 理解有符号数和无符号数的区别

    理解有符号数和无符号数 回头看上一节,我们所讲的数都是正数.同样是年纪和工资,前者不需要有负值,但后者可能需要--至少所有的老板都这样认为. 那么,负数在计算机中如何表示呢? 这一点,你可能听过两种不 ...

  9. c语言中的无符号字节,C语言之有符号数和无符号数

    我们知道,在C语言中存在无符号数和有符号数(一些高级语言如Java里面是没有无符号数的),但是对于计算机而言,其本身并不区别有符号数和无符号数,因为在计算机里面都是0或者1,但是在我们的实际使用中有时 ...

最新文章

  1. vue 组件id重复问题
  2. Epplus:导出Excel
  3. Erlang基础学习总结2
  4. opencv形状识别学习总结
  5. 三招看穿ERP软件是否可行
  6. Matlab | 数字信号处理:用窗函数法设计FIR数字滤波器
  7. win10计算机本地无法连接,win10无法连接到这个网络怎么办_win10无法连接到这个网络如何解决...
  8. 一步步编写操作系统 61 任务状态段 TSS
  9. 分库分表学习总结(2)——数据库中间件MyCat学习总结之MyCat-Web原理介绍
  10. Android--xml布局文件中使用include
  11. 爬虫之模拟登录、自动获取cookie值、验证码识别
  12. (第二天)编写训练记忆软件--数字编码矩阵V1.0
  13. 小技巧!Win10系统怎样恢复使用Win7中的照片查看器?非常简单!
  14. java 手机网站 cookie操作_Java中的cookie管理方案——完整易用的客户端cookie操作库...
  15. java进行多个照片合并操作
  16. Ariane和riscv-gnu-toolchain工具链的安装
  17. Android 3年外包工面试笔记,有机会还是要去大厂学习提升
  18. javac java编译-g
  19. OneNote-做笔记的软件-强烈推荐
  20. MSPA提取生态源地过程

热门文章

  1. 卷积神经网络VGG16
  2. 管理工作中的“七种浪费”【转】
  3. java数组及数组函数
  4. Redis 慢查询 命令 slowlog
  5. 文科生学Python,为了什么?
  6. 编译ZeroMQ以支持Libsodium出现的“ No package 'libsodium' found”问题
  7. C# 获取汉字拼音首字母
  8. jasper报错java.lang.ExceptionInInitializerError net.sf.jasperreports.engine.fill.JRBaseFiller
  9. IIS中ftp设置指定的用户登录(三)
  10. Unity Vector3.Lerp Vector3.LerpUnclamped 的区别