数字IC基础:有符号数和无符号数加、减法的Verilog设计

相关阅读

数字IC基础icon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/category_12365795.html?spm=1001.2014.3001.5482


        本文是对数字IC基础:有符号数和无符号数的加减运算一文中的谈到的有符号数加减法的算法进行Verilog实现,有关算法细节请阅读原文,本文不会过多谈到原理相关问题。

        虽然有符号加减和无符号加减在底层都是使用同样的补码加法器结构,但我们首先分别设计有符号加减法器和无符号加减法器,然后再将其组成一个完整的加减计算单元。

        一个有符号数加减法器的Verilog描述如下所示。

//本加减法器不涉及-8作为减数的情况,-8作为减数需要单独讨论
module signed_adder(input signed [7:0]A, B, input mode, output reg signed [7:0]C, output reg OF);always@(*)beginif(mode == 0) begin //有符号加法C = A + B;OF = ((A[7] == B[7]) & (C[7] != A[7])); //溢出endelse begin //有符号减法C = A + (~B) +1'b1;OF = ((A[7] != B[7]) & (C[7] != A[7])); //溢出endend
endmodule

       图1和图2是分别对加法和减法功能进行测试的波形,可以看出在某些情况下结果出现了溢出。 

图1 有符号加法测试的波形

 图2 有符号减法测试的波形

        一个无符号加减法器的Verilog描述如下所示。

module unsigned_adder(input [7:0]A, B, input mode, output reg[7:0]C, output reg CF);reg cout;always@(*)beginif(mode == 0) begin //无符号加法{cout, C} = A + B;CF = cout;      //进位endelse begin          //无符号减法{cout, C} = A + (~B) +1'b1;CF = cout;     //借位endend
endmodule

        其中A和B会按照算法中谈到的一样,先补零拓展成9位数(这是自动进行的,进一步的位宽拓展问题可以阅读Verilog基础:表达式位宽的确定(位宽拓展)_verilog定义位宽-CSDN博客这篇文章),然后再按照有符号加减的运算。图3和图4是分别对加法和减法功能进行测试的波形,可以看出在某些情况下结果出现了进位和借位。  

图3 无符号加法测试的波形

 

图4 无符号减法测试的波形 

        现在可以将两者结合,这样一个可以进行有符号数加减法和无符号数加减法的通用计算器就诞生了。

module adder(input [7:0]A, B, input mode, output reg[7:0]C, output reg CF);reg cout;always@(*)beginif(mode == 00) begin //有符号加法C = A + B;OF = ((A[7] == B[7]) & (C[7] != A[7])); //溢出endelse if(mode == 01) begin //有符号减法C = A + (~B) +1'b1;OF = ((A[7] != B[7]) & (C[7] != A[7])); //溢出endif(mode == 10) begin //无符号加法{cout, C} = A + B;CF = cout;      //进位endelse if(mode == 11)begin          //无符号减法{cout, C} = A + {(~B)} +1'b1;CF = !cout;     //借位endend
endmodule

        下面是介绍有符号数和无符号数的加减运算的文章。

数字IC基础:有符号数和无符号数的加减运算icon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/article/details/134537623

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/159409.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode—876.链表的中间结点【简单】

2023每日刷题(三十三) Leetcode—876.链表的中间结点 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* middleNode(struct ListNode* head) {struct ListNod…

DolphinDB 浙商银行 | 第二期现场培训圆满结束

自 DolphinDB 高级工程师计划开展以来,客户们纷纷响应,除了定期收看我们每周三开设的线上公开课外,也有部分客户报名参加了 “总部工程师培训计划” 。 上周,我们迎来了总部培训的第二期学员:来自浙商银行的4位策略研…

K8S部署mongodb-sharded-cluster(7.0.2)副本分片

添加源 helm repo add bitnami https://charts.bitnami.com/bitnami指定版本拉取 helm pull --repo https://charts.bitnami.com/bitnami mongodb-sharded --version 7.0.5安装时选择SCRAM-SHA-1默认是SCRAM-SHA-256 helm install -n prod mymongodb mongodb-sharded --value…

如何用CHAT分析网络流行语的构成特点及趋势?

问CHAT:请分析下网络流行语的构成特点及趋势 CHAT回复: 网络流行语的构成特点: 1. 新颖性:网络流行语象征着新潮的概念、思想和观点,它们新颖独特且易于传播。 2. 深入人心的设定:网络流行语通常是由大众…

浅谈能源智能管理系统在大学高校中的应用

安科瑞 华楠 摘要:结合深圳南方科技大学能效系统工程设计实例,针对校园中电耗、热量消耗、冷量消耗及水资源消耗数据的采集、传输、分析管理系统,分析了系统中的水、电、气在高校中的能耗分布,并阐述了节能应用方案,可…

Imaris 卡退,是不是缓存盘没有设置好?

必须记录一下,从Imaris哔哩哔哩官方视频上学到的,如何设置缓存位置,尤其是做3D视频的时候。 但是隔一段时间就忘记,找不到当时的哔哩哔哩视频 这里记一下 如果是空间比较小的C盘,可以改成一个空间大一点的位置。 把缓…

机器学习入门(第三天)——K近邻(物以类聚)

K-nearest neighbor 知识树 怎么区分红豆绿豆? How to distinguish red beans and green beans? 之前我们构造了一个超平面来解决这个问题,既然超平面可以切分,是不是红豆之间和绿豆之间有着某种关联。即:物以类聚。 如果一个…

【Linux进阶之路】动静态库

文章目录 回顾一. 静态库1.代码传递的方式2.简易制作3.原理 二. 动态库1.简易制作2.基本原理 尾序 回顾 前面在gcc与g的使用中,我们简单的介绍了动态库与静态库的各自的优点与区别: 动态链接库,也就是所有的程序公用一份代码,虽然方便省空间&…

Elasticsearch:FMA 风格的向量相似度计算

作者:Chris Hegarty 在 Lucene 9.7.0 中,我们添加了利用 SIMD 指令执行向量相似性计算的数据并行化的支持。 现在,我们通过使用融合乘加 (Fused Mulitply-Add - FMA) 进一步推动这一点。 什么是 FMA 乘法和加法是一种常见的运算,…

作品Demo:大全

实用小demo 1.3D-地图工程 获取连接:nullhttps://m.tb.cn/h.5kzPTgJ?tkRPBlWep4ZIf 2.3D-饼图 获取连接:https://m.tb.cn/h.5Pt4A8k?tkXRzWWepUnu4https://m.tb.cn/h.5Pt4A8k?tkXRzWWepUnu4

一个月B站涨粉200万,品牌号不可错过的吸粉秘籍

越来越多品牌为了持续在B站营销而创建品牌官方账号,发布原创作品融入B站UP主中,吸引B站用户塑造品牌形象,提高品牌传播度、品牌声量。 据飞瓜数据(B站版)统计,B站有着超过2万个品牌号,本篇文章…

亚马逊买家号用邮箱怎么注册

想要用邮箱注册亚马逊买家号,那么准备好能接受验证码的邮箱后打开相应的亚马逊官网即可。打开官网后点击注册——输入昵称——输入邮箱——输入密码——接受邮箱验证码并输入,如果遇到需要手机号验证就输入手机号,如果不需要验证,…

7.Gin 路由详解 - 路由分组 - 路由文件抽离

7.Gin 路由详解 - 路由分组 - 路由文件抽离 前言 在前面的示例中,我们直接将路由的定义全部写在 main.go 文件中,如果后面 路由越来越多,那将会越来越不好管理。 所以,下一步我们应该考虑将路由进行分组管理,并且将其抽…

剧情继续:马斯克曝出OpenAI前员工举报信,董事会与奥特曼谈判回归

丰色 发自 凹非寺 量子位 | 公众号QbitAI 经过4天的极限拉扯、反转再反转,奥特曼有可能重新回归了。 据知情人士透露,OpenAI董事会正与奥特曼进行一场“富有成效”的新谈判。 如果奥特曼回到OpenAI,他将继续担任CEO。 与此同时&#xff0c…

【开源】基于JAVA的音乐偏好度推荐系统

项目编号: S 012 ,文末获取源码。 \color{red}{项目编号:S012,文末获取源码。} 项目编号:S012,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.1.1 音乐档案模块2.1…

Unsupervised Condition GAN

Unsupervised Condition GAN主要有两种做法: Direct Transformation 直接输入domain X图片,经过Generator后生成对应的domain Y的图像。这种转化input和output不能够差太多。通常只能实现较小的转化,比如改变颜色等。 Projection to Commo…

【C++】:STL中的string类的增删查改的底层模拟实现

本篇博客仅仅实现存储字符(串)的string 同时由于Cstring库设计的不合理,我仅实现一些最常见的增删查改接口 接下来给出的接口都是基于以下框架: private:char* _str;//思考如何不用constsize_t _size;size_t _capacity;//这样写可以const static size_t…

【Windows 常用工具系列 13 -- Confluence 如何快速输入代码块 code block】

文章目录 Confluence 如何快速输入代码块方法二 Confluence 如何快速输入代码块 在使用使用 confluence 进行文档编辑时,有时需要贴上部分代码,但是直接贴代码在 confluence上,显示效果不是太好看,所以confluence 给我们提供了符…

SpringBoot启动后自动打开浏览器访问项目

更简单的一个方法 Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " url); Springboot项目启动后自动打开浏览器访问(超实用)_浏览器访问springboot项目-CSDN博客 Springboot项目启动后自动打开浏览器访问 1、在Springboot项目中每次启动完项…