目录

  • Verilog中有符号与无符号的加法和乘法运算

    • 无符号乘法和加法
    • 有符号乘法和加法
      • 有符号和无符号运算

参考:
https://blog.csdn.net/vivid117/article/details/101427302
http://wscentity.lofter.com/post/1d00edbd_6476453

Verilog中有符号与无符号的加法和乘法运算

无符号乘法和加法

对于无符号的乘法和加法,没有什么好说的,就是直接用‘*’和‘+’。

有符号乘法和加法

有符号和无符号运算

verilog里如果有符号数和无符号数做运算,会强制当作无符号运算
这就涉及verilog处理运算时的法则:
例如 c = a + b; 其中a和b都是四位数,c是五位。在计算时,verilog会将a和b都扩展到5位,然后再做加法,而如果a和b中有无符号数,则位宽扩展就按照无符号数来,也就是高位补0。所以如果a和b中既有无符号又有有符号,结果就不正确了。
解决方法是用 \$signed()来修饰:c = a + $signed(b)这样在c = a + b,这个运算开始的扩位就会按照有符号数的方式进行扩位,在高位补符号位,加法得出的结果就是a、b视为有符号数的结果。
例子:

||| |||
||| |||

可见结果是不是signed倒是无所谓的。但是最好还是加上。

有符号数乘法

例如有符号数[3:0]a * [3:0]b. 其中a=-5,b=7。a用补码表示为1011,b用补码表示是0111,对于这个例子,乘法过程如下:

其中,b的符号位跟a相乘的时候需要注意,如果b的符号位是1,则与a相乘的时候实际表示的是-1*a,所以需要将a的结果按位\(\color{red}{取反加一}\)。上面的例子b的符号位是0,所以结果是101_1101,补码是1100011 = -35。如果遇到符号位是1的情况,比如a=-5,b=-3:

可以看到上面最后一行的结果需要对a进行\(\color{red}{取反加一}\)才正确,并且此时\(\color{red}{取反加一也包括a的符号位}\)。
另外,还需要注意的是所有部分积都要补符号位补到乘法输出值的位数。
其实乘法器就是由加法组成,所以b中的每一位跟a做乘法(异或)之后把部分积累加时,仍然需要遵从加法的原则,扩展符号位直到达到输出位宽,然后再加。
所以有符号乘法跟无符号乘法的区别就在这,无符号乘法不需要考虑符号位扩展问题,而有符号乘法在累加部分积的时候需要做符号位扩展,并且还要考虑符号位参与乘法时的含义不同,也就是说符号位的0表示0,但1却表示-1,所以符号位的1做乘法就不是异或而是\(\color{red}{对所有位取反再加一}\)了。

有符号乘法器的实现

上面说的是对于补码形式的有符号数如何计算乘法,而实际上上面这种方法是将符号位也参与到运算中,这种方式实际上需要区分符号位的乘法,所以在设计带符号乘法器时可能需要修改传统无符号乘法器中的加法器类型,可以参考:
https://blog.csdn.net/iteye_3619/article/details/82282317
在verilog中,一般有符号乘法器的做法是先将补码输入都转成原码,再将符号位单独拿出来进行异或,然后其余部分当作无符号数乘起来,最后再对结果取补码转回原码结果。

Verilog -- 有符号与无符号的加法和乘法运算相关推荐

  1. Verilog有符号和无符号运算设计分析

    主要内容是对有符号数和无符号数在设计时,数据是怎样传递的,符号位是怎样来的,以及相关的几种运算设计应当遵循怎样的想法. 最近对加减乘除运算很困惑,主要是对于有符号数的运算的困扰,如果运算出现负数怎么办 ...

  2. c语言无符号扩展,深入理解计算机系统(2.4)---C语言的有符号与无符号、二进制整数的扩展与截断...

    开篇请各位猿友允许LZ啰嗦几句,最近一直在写计算机系统原理这系列文章,也已经下定决心要把这本书的内容写完.主要目的其实是为了巩固LZ的理解,另外也想把这些内容分享给猿友们,毕竟LZ觉得这些内容对程序猿 ...

  3. c语言中的无符号字符指什么,深入分析C语言中的有符号和无符号

    有符号和无符号指的是数字那么有符号和无符号的区别是什么,我们这里一起来看在C语言中的有符号和无符号分析吧,希望这篇文章能够对各位有用. 就像我们必须决定某个量使用整数还是实数,使用多大的范围数一样,我 ...

  4. 【C语言进阶深度学习记录】二 有符号与无符号

    今天学习C语言中的有符号与无符号 文章目录 1 计算机中的符号位 1.1 有符号数的表示法 1.2 无符号数的表示法 1.3 signed 和 unsigned 2 实验-当有符号数与无符号数进行运算 ...

  5. C语言——确定char、short、int和short变量有符号和无符号时的取值范围

    C语言--确定char.short.int和short变量有符号和无符号时的取值范围 #include <stdio.h> #include <limits.h>// dete ...

  6. 深入理解计算机系统(2.4)---C语言的有符号与无符号、二进制整数的扩展与截断...

    开篇请各位猿友允许LZ啰嗦几句,最近一直在写计算机系统原理这系列文章,也已经下定决心要把这本书的内容写完.主要目的其实是为了巩固LZ的理解,另外也想把这些内容分享给猿友们,毕竟LZ觉得这些内容对程序猿 ...

  7. 有符号和无符号整型的临界点

    在C++ primer plus 上的图 觉得好久copy下来了 关于有符号和无符号整型的重置点 .

  8. C语言中的有符号与无符号(挖坑)

    1.计算机中的符号位,计算机如何表示正数和负数? 数据类型的最高位用于标识数据的符号 最高位为1,表明这个数为负数 最高位为0,表明这个数为正数 2.有符号数的表示法 在计算机内部用补码表示有符号数 ...

  9. c++基本数据类型基本类型: 整型: 短整型: short int 整型: int 长整型:long int 字符型:char(分为有符号和无符号,默认有符号) 浮点型:

    基本类型: 整型: 短整型: short int 整型: int 长整型:long int 字符型:char(分为有符号和无符号,默认有符号) 浮点型:单精度型:float 双精度型:double 长 ...

最新文章

  1. netty tcp 字节有序-gt;对象有序
  2. 知乎赴美上市为缓解商业化瓶颈,下一步网络推广知乎想怎么做?
  3. 心中有“树”:数据结构之树详解
  4. Verilog定义计算位宽的函数clogb2
  5. 华三交换机mode是什么意思_交换机中相关术语代表什么意思,有必要弄清楚,赶紧收藏...
  6. 开源 免费 java CMS - FreeCMS1.7 栏目管理
  7. python执行sqlserver存储过程_python – 从SqlAlchemy调用MSSQL存储过程
  8. conda创建虚拟环境,拥有多个Anconda版本
  9. 电脑mysql是什么意思_数据库是什么意思
  10. 关于工厂的应用——中国工人和美国工人的问题
  11. 对linux信号量的理解以及实现
  12. 获取移动光猫(如HS8545M5等设备)pppoe密码明文
  13. oracle 提取重复数据,oracle里面查询重复数据的方法
  14. Swift 七种手势
  15. 【学习笔记】算法101--数学(二)2.3篇
  16. 【小学】小学汉语拼音知识复习汇总
  17. 二、VSCode——MiKTeX编写latex编码
  18. 开发者必看!Windows Server 2012全攻略
  19. Linux·VFS虚拟文件系统
  20. 电子计算机科学工程,计算机科学与技术学院

热门文章

  1. Jackson获取某个子节点的值并将其转化为Java的对象数组
  2. 美国教育骗局:高中生活,4小时睡眠,4杯咖啡,4.0的成绩
  3. 什么是私有云?您应该知道的 6 个优势
  4. codeforce Anton and Fairy Tale
  5. Vuex存储公共的数据步骤
  6. SVN authz 配置详解 转载
  7. 网络直播电视之M3U8解析篇(上)
  8. mac 设置composer 环境
  9. 无法启动此应用因为计算机丢失,解决提示“无法启动此程序,因为计算机中丢失chrome_elf.dll”的问题...
  10. Y combinator初创加速器2020冬季团队大赏——最好与最坏的时代