码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 数字IC基础:有符号数和无符号数加、减法的Verilog设计


    相关阅读

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


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

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

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

    1. //本加减法器不涉及-8作为减数的情况,-8作为减数需要单独讨论
    2. module signed_adder(input signed [7:0]A, B, input mode, output reg signed [7:0]C, output reg OF);
    3. always@(*)begin
    4. if(mode == 0) begin //有符号加法
    5. C = A + B;
    6. OF = ((A[7] == B[7]) & (C[7] != A[7])); //溢出
    7. end
    8. else begin //有符号减法
    9. C = A + (~B) +1'b1;
    10. OF = ((A[7] != B[7]) & (C[7] != A[7])); //溢出
    11. end
    12. end
    13. endmodule

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

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

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

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

    1. module unsigned_adder(input [7:0]A, B, input mode, output reg[7:0]C, output reg CF);
    2. reg cout;
    3. always@(*)begin
    4. if(mode == 0) begin //无符号加法
    5. {cout, C} = A + B;
    6. CF = cout; //进位
    7. end
    8. else begin //无符号减法
    9. {cout, C} = A + (~B) +1'b1;
    10. CF = cout; //借位
    11. end
    12. end
    13. endmodule

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

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

     

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

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

    1. module adder(input [7:0]A, B, input mode, output reg[7:0]C, output reg CF);
    2. reg cout;
    3. always@(*)begin
    4. if(mode == 00) begin //有符号加法
    5. C = A + B;
    6. OF = ((A[7] == B[7]) & (C[7] != A[7])); //溢出
    7. end
    8. else if(mode == 01) begin //有符号减法
    9. C = A + (~B) +1'b1;
    10. OF = ((A[7] != B[7]) & (C[7] != A[7])); //溢出
    11. end
    12. if(mode == 10) begin //无符号加法
    13. {cout, C} = A + B;
    14. CF = cout; //进位
    15. end
    16. else if(mode == 11)begin //无符号减法
    17. {cout, C} = A + {(~B)} +1'b1;
    18. CF = !cout; //借位
    19. end
    20. end
    21. endmodule

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

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

  • 相关阅读:
    docker镜像的导入导出
    HTML CSS JS 网页设计作业「我的家乡吉林」
    OpenCV开发笔记(七十七):相机标定(二):通过棋盘标定计算相机内参矩阵矫正畸变摄像头图像
    uniapp支付之APP微信支付unicloud版(附源码)
    【LockSupport】概述、阻塞⽅法park、唤醒⽅法unpark(thread)、 解决的痛点、带来的⾯试题_JUC19
    基于BP神经网络的手写体数字识别matlab仿真实现
    【Lua面试】 迭代器和泛型For
    游戏建模‖那些你找工作时不明白的事
    刘二大人 PyTorch深度学习实践 笔记 P6 逻辑斯蒂回归
    复盘:Jetson AGX Xavier部署YOLOv5结合ROS小车实现对目标的检测跟踪
  • 原文地址:https://blog.csdn.net/weixin_45791458/article/details/134550579
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号