文章目录

  • 无符号加法器
  • 有符号加法器
  • 有符号减法器
  • 加减法器
  • TB
  • Reference

减法器中也有类似于半减器、全减器、串行借位减法器之类的,但是为了实现简单和复用代码,计划采用加法器来实现减法器。

无符号加法器

如果两个数都是无符号的,那么可以直接相加,需要有一位作为进位。

有符号加法器

以4bit有符号数为例

  • 大于等于0的数的情况同无符号数一致,最高位保持为0

  • 负数与正数相加,负数的绝对值大于正数
    例如-8+7=1000+0111=01111,计算结果错误(符号位舍去后无误)
    负数的绝对值等于正数
    -7+7=1001+0111=0=10000,计算结果错误(进位舍去后无误)
    负数的绝对值小于正数
    -6+7=1010+0111=0=10001,计算结果错误(进位舍去后无误)

    若是保持输出为4位,则输出结果无误,但是为了兼容无符号加法器,不能舍去。

    处理思路是进行扩位。将4bit扩大到5bit,进位丢弃
    -8+7=11000+00111=11111 correct
    -7+7=11001+00111=00000 correct
    -6+7=11010+00111=00001 correct
    丢掉进位以后,最高位就是符号位。看似数据的范围变小了,但是本来结果就需要5位表达,所以在相加之前扩位对结果没有影响。

  • 负数与负数相加
    -8+(-8)=11000+11000=10000
    -8+(-7)=11000+11001=10001
    结果完全正确。

有符号减法器

继承上面的思想,再运算之前先进行扩位,即,复制最高位

  • 正数减去正数
    7-6=7+(-6)=00111+11010=00001
    可以看到转换为正数加上负数以后,计算十分简单

    问题是如何进行转换
    6=00110 取反11001 加一11010,似乎没问题
    7=00111 取反11000 加一11001,也没毛病

  • 正数减去负数
    7-(-8)=7+8=00111+01000=01111

    问题是如何进行转换
    -8=11000 取反00111 加一01000,没毛病
    -7=11001 取反00110 加一00111,没毛病

    加一的操作可以当做进位

  • 负数减去负数
    -8-(-8)=-8+8=11000+01000=00000
    -8-(-7)=-8+7=11000+00111=11111
    -7-(-8)=-7+8=11001+01000=00001
    么得问题

  • 负数减去正数
    -8-7=-8+(-7)=11000+11001=10001
    -8-8=-8+(-8)=11000+11000=10000
    -6-7=-6+(-7)=11010+11001=10011
    么得问题

    所有情况都已经推理完毕,下面就是代码部分了

    上面废话太多。事实上,因为有符号加法器是完全没有问题的,所以只要能够顺利把减法运算换成加法运算就成功了一半。需要注意的是极端情况的-8,因为运算中没有加8的情况

加减法器

基于串行进位加法器https://blog.csdn.net/I_LOVE_MCU/article/details/126196302
超前进位加法器目前不支持任意位数

module adder_substractor #(parameter WIDTH = 4
)(input [WIDTH-1:0]     in1,input [WIDTH-1:0]   in2,input               add_sub,output  [WIDTH:0]   sum
);
wire [WIDTH:0] in1_exp;
wire [WIDTH:0] in2_exp;
wire cin;assign in1_exp = {in1[WIDTH-1], in1};
assign in2_exp = add_sub? {in2[WIDTH-1], in2}: ~{in2[WIDTH-1], in2};
assign cin = ~add_sub;// 因为对输入进行了扩位,所以WIDTH需要加1,在输出的时候会被截位,但对结果无影响
serial_adder #(.WIDTH ( WIDTH+1 )) u_lookahead_carry_adder (.in1                     ( in1_exp   ),.in2                     ( in2_exp   ),.cin                     ( cin   ),.sum                     ( sum   )
);endmodule

TB

 `timescale  1ns / 1psmodule tb_adder_substractor;// adder_substractor Parameters
parameter PERIOD = 10;
parameter WIDTH  = 4;// adder_substractor Inputs
reg   [WIDTH-1:0]  in1                     = 0 ;
reg   [WIDTH-1:0]  in2                     = 0 ;
reg   add_sub                              = 0 ;// adder_substractor Outputs
wire  [WIDTH:0]  sum                       ;// initial
// begin
//     forever #(PERIOD/2)  clk=~clk;
// end// initial
// begin
//     #(PERIOD*2) rst_n  =  1;
// endadder_substractor #(.WIDTH ( WIDTH ))u_adder_substractor (.in1                     ( in1      [WIDTH-1:0] ),.in2                     ( in2      [WIDTH-1:0] ),.add_sub                 ( add_sub              ),.sum                     ( sum      [WIDTH:0]   )
);initial
beginin1 = -7;in2 = -7;add_sub = 1;#10;in1 = -7;in2 = -7;add_sub = 0;#10;in1 = -7;in2 = 8;add_sub = 0;#10;in1 = -7;in2 = 8;add_sub = 1;#10;in1 = 8;in2 = 8;add_sub = 0;#10;in1 = 8;in2 = 8;add_sub = 1;#10;in1 = 8;in2 = -7;add_sub = 0;#10;in1 = 8;in2 = -7;add_sub = 1;#10;// $finish;
endendmodule

Reference

浮点数的加减法器
https://www.cnblogs.com/mikewolf2002/p/10095995.html

加法器与减法器verilog相关推荐

  1. 数字IC经典电路(1)——经典加法器的实现(加法器简介及Verilog实现)

    加法器简介及Verilog实现 写在前面的话 经典加法器 8bit并行加法器 8bit超前进位加法器 8bit流水线加法器 8bit级联加法器 总结 写在前面的话 加法器是数字系统最基础的计算单元,用 ...

  2. vhdl加法器和减法器_半减法器和全减法器的设计

    vhdl加法器和减法器 A Subtractor is a digital circuit which performs subtraction operation. 减法器是执行减法运算的数字电路. ...

  3. 运放放大倍数计算公式_电源经典运放电路,加法器,减法器,同向放大器,反向放大器...

    运算放大器组成的电路五花八门,令人眼花瞭乱.工程师在分析它的工作原理时常抓不住核心,令人头大.为此小编特地搜罗天下运放电路之应用,来个"庖丁解牛",希望各位看完后有所收获. 遍观所 ...

  4. 两个运放制作加法器_运放基础第10讲,加法器、减法器、积分器、微分器、仪表放大器...

    运放基础第10讲,加法器.减法器.积分器.微分器.仪表放大器课程介绍 <运放第2部,运放电路设计实战基础视频> 课程介绍:<运放电路设计基础视频教程>的第一部分内容有三分之一到 ...

  5. 4 利用逻辑门实现加法器和减法器

    首先给大家分享一个巨牛巨牛的人工智能教程,是我无意中发现的.教程不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵段子,像看小说一样,哈哈-我正在学习中,觉得太牛了,所以分享给大家!点这里可以跳转 ...

  6. c语言加法器程序代码,利用EDA设计加法器和减法器并且附有程序代码的实验报告...

    满意答案 q316281484 2013.12.31 采纳率:48%    等级:12 已帮助:35577人 library ieee; use ieee.std_logic_1164.all; us ...

  7. 超前进位加法器(附Verilog代码)

    超前进位加法器: 普通全加器(行波进位加法器)是单比特全加器的级联,高位需要低位的进位位,故位宽增大时,加法的组合逻辑不断增大,超前进位加法器解决了这一问题. 优点:不需要等待低位的进位.直接计算就可 ...

  8. 多路选择器,加法器原理及verilog实现

    1.数据选择器是指经过选择,把多个通道的数据传到唯一的公共数据通道上.实现数据选择功能的逻辑电路称为数据选择器,它的作用相当于多个输入的单刀多掷开关.本例程以四选一数据选择器(电平触发)为例. 四选一 ...

  9. 加法器(减法器)运算放大电路

        图三中,由虚短知: V- = V+ = 0 --a 由虚断及基尔霍夫定律知,通过R2与R1的电流之和等于通过R3的电流, 故 (V1 – V-)/R1 + (V2 – V-)/R2 = (Vo ...

最新文章

  1. 手把手教你使用YOLOV5训练自己的数据集并用TensorRT加速
  2. python100个必背知识-学Python必背的初级单词,你都背了吗?
  3. 串口通信模块5:串口操作自定义类(3)
  4. 【探究】信号槽到底能不能有返回值?
  5. 数据库笔记04:数据库设计
  6. hdu 5148 cities 树形DP
  7. 记录——《C Primer Plus (第五版)》第十章编程练习第二题
  8. [转载]Jquery mobile 新手问题总汇
  9. day21-2 类的派生
  10. 【AD】Altium Designer 原理图的绘制
  11. List Navision Security setting, 列出Navision相关账户的权限
  12. Permute 3 for mac(万能音视频转换器)
  13. 邮件安全防护之反垃圾邮件开源软件ASSP
  14. 技术人的职场晋级指南:当心“1万小时定律”毁了你!
  15. vs的oxc000007b错误和key valid错误
  16. Python预测2022世界杯1/8决赛胜负
  17. 探月工程总设计师:嫦娥四号探索结果具有原创性
  18. Winform控件开发(9)——ListBox(史上最全)
  19. easyx游戏编程:魔塔(C++游戏开发)
  20. 设计模式C++实现40讲(11)终生受益的观察者模式

热门文章

  1. tombstone问题追踪与分析
  2. iOS组件化开发从开始到完整总结
  3. 线上投票活动怎么设置怎样设置投票怎样设置投票页面
  4. python signal模块作用_Python模块:signal
  5. Mycat 分片表全局自增主键实现及测试
  6. Python下绘制世界人口地图
  7. 缓存穿透 雪崩 击穿
  8. viewport在pc端是否生效_viewport移动端适配
  9. 2018年 CSDN博客背景皮肤设置
  10. pycharm没有找到manage repositories按钮解决方案