用逻辑门实现四位加法器

一.无符号数全加器

1.无符号数四位全加器原理:

先来看一位全加器:

加数A

加数B

结果

0

0

0

0

1

1

1

0

1

1

1

0(进位1)

异或门相似,用异或门记录

用与门记录A+B的进位

将进位输入与A+B结果相与再与进位相或得进位输出,将进位输入与加数相加计算结果

四位全加器则将低位的进位输出与高位的进位输入相连,最低位进位输入接地从而保证其仅为输入始终为0,溢出与否由最高位进位输出判断

2.电路及方案

将四个一位全加器相互连接,低位的进位输出与高位的进位输入相连,最低位进位输入接地从而保证其仅为输入始终为0,溢出与否由最高位进位输出判断

图表 1四位全加器电路图

3.verilog语言实现:

module full_adder(

    input [3:0] a, b,

    input cin,

    output reg [3:0] cout,

    output reg [3:0] sum ,

    output [3:0] s,

    output overflow);

   

    integer i=0;

    always@(*)

        begin

            for(i=0;i<=3;i=i+1)

                if (i==0) begin

                    sum[i]=cin^a[i]^b[i];

                    cout[i]=a[i]&b[i]|cin&(a[i]^b[i]);

                end

                else begin

                    sum[i]=cout[i-1]^a[i]^b[i];

                    cout[i]=a[i]&b[i]|cout[i-1]&(a[i]^b[i]);

                end

        end

            assign s=a+b;

            assign overflow = ( a[3] & b[3] & ~s[3] ) | (~a[3] & ~b[3] & s[3]);

endmodule

RTL分析生成原理图

二.有符号数全加器

原理:有符号数则需要先判断符号位是否一致以及数的大小,当符号位不同时,需要将负数转补码再相通过一中的无符号数全加器相加,再将结果取补得原码;当符号位相同时,数值直接相加即可,同无符号数全加器,符号位取加数的符号位

至此,将无符号数全加器进行封装(如下图),根据原理通过HDL实现以上功能

verilog 行为描述:

module signed_adder

#(parameter WIDTH=4)

(

input wire [WIDTH-1:0] a,

input wire [WIDTH-1:0] b,

output reg [WIDTH-1:0] o_sum,

output reg [3:0] s,

output reg overflow

);

reg [WIDTH-1:0] o_a;

reg [WIDTH-1:0] o_b;

reg sign_a;

reg sign_b;

integer i=0;

always@(*)

    begin

        sign_a=a[WIDTH-1];

        sign_b=b[WIDTH-1];

        if(sign_a==sign_b==0) begin

            o_sum=a+b;

            s=a+b;

            overflow = ( a[3] & b[3] & ~s[3] ) | (~a[3] & ~b[3] & s[3]);//溢出判断

        end

        else if(sign_a==sign_b==1) begin

            o_a=(a^1)+1;

            o_b=(b^1)+1;

            o_sum=(a+b)^1;

            s=a+b;

            overflow = ( a[3] & b[3] & ~s[3] ) | (~a[3] & ~b[3] & s[3]);//溢出判断

        end

        else if(sign_a==0) begin

            o_b=(b^1)+1;

            o_sum=((a+b)^1)+1;

            s=a+b;

            overflow = ( a[3] & b[3] & ~s[3] ) | (~a[3] & ~b[3] & s[3]);//溢出判断

        end

        else begin

                o_a=(a^1)+1;

                o_sum=((a+b)^1)+1;

                s=a+b;

                overflow = ( a[3] & b[3] & ~s[3] ) | (~a[3] & ~b[3] & s[3]);//溢出判断

        end

    end

endmodule

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值