用逻辑门实现四位加法器

一.无符号数全加器

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文章来源地址https://uudwc.com/A/P3jO

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

原文地址:https://blog.csdn.net/sunshine_boy_wen/article/details/128436410

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

h
上一篇 2023年06月15日 01:00
使用ego1的xadc采集心电模块的输出并用vga显示
下一篇 2023年06月15日 01:00