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

相关阅读

数字IC基础https://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@(*)begin
        if(mode == 0) begin //有符号加法
            C = A + B;
            OF = ((A[7] == B[7]) & (C[7] != A[7])); //溢出
        end
        else begin //有符号减法
            C = A + (~B) +1'b1;
            OF = ((A[7] != B[7]) & (C[7] != A[7])); //溢出
        end
    end
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@(*)begin
        if(mode == 0) begin //无符号加法
            {cout, C} = A + B;
            CF = cout;      //进位
        end
        else begin          //无符号减法
            {cout, C} = A + (~B) +1'b1;
            CF = cout;     //借位
        end
    end
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@(*)begin
        if(mode == 00) begin //有符号加法
            C = A + B;
            OF = ((A[7] == B[7]) & (C[7] != A[7])); //溢出
        end
        else if(mode == 01) begin //有符号减法
            C = A + (~B) +1'b1;
            OF = ((A[7] != B[7]) & (C[7] != A[7])); //溢出
        end
        if(mode == 10) begin //无符号加法
            {cout, C} = A + B;
            CF = cout;      //进位
        end
        else if(mode == 11)begin          //无符号减法
            {cout, C} = A + {(~B)} +1'b1;
            CF = !cout;     //借位
        end
    end
endmodule

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

数字IC基础:有符号数和无符号数的加减运算https://blog.csdn.net/weixin_45791458/article/details/134537623

相关推荐
爱吃汽的小橘1 天前
基于ads1256的ADC控制实现
fpga开发
易享电子2 天前
基于单片机车窗环境监测控制系统Proteus仿真(含全部资料)
单片机·嵌入式硬件·fpga开发·51单片机·proteus
cycf2 天前
系统同步接口输入延迟(五)
fpga开发
cmc10282 天前
131.如何区分FPGA芯片型号是-2l还是-2方法
fpga开发
sz66cm2 天前
FPGA基础 -- 无毛刺时钟切换(glitch-free clock switching)
fpga开发
Blossom.1182 天前
把AI“绣”进丝绸:生成式刺绣神经网络让古装自带摄像头
人工智能·pytorch·python·深度学习·神经网络·机器学习·fpga开发
电子凉冰2 天前
FPGA强化-VGA显示设计与验证
fpga开发
XINVRY-FPGA2 天前
XC7A100T-2FGG484I Xilinx Artix-7 FPGA
arm开发·嵌入式硬件·fpga开发·硬件工程·信息与通信·信号处理·fpga
cmc10282 天前
129.FPGA绑定管脚时差分管脚只绑_p是不行的,tx与rx只绑一个也不行
fpga开发
望获linux2 天前
【实时Linux实战系列】FPGA 与实时 Linux 的协同设计
大数据·linux·服务器·网络·数据库·fpga开发·操作系统