如何在C中模拟4位二进制加法器

时间:2013-02-04 20:29:34

标签: c binary logic bit-manipulation

我的教授指派班级编写C程序,使用基本加法器模拟32位加法器。我知道32位加法器由8 X 4位加法器组成。但是,我甚至不确定如何在C中模拟4位加法器。我需要实现一个4位二进制纹波进位加法器,一个4位二进制超前进位发生器和一个4位超前进位加法器。从全加器的真值表和卡诺图中,我获得了求和输出功能。总和我收到了A xor B xor Carry In。对于执行功能,我收到(A * B)+(进入(A xor B))。现在我不确定去哪里。我很确定我需要使用按位运算符来操作位级别的整数(我已经掌握了按位运算符的基本知识,尽管我从未在纸和笔之外实现它们)。

如何将整数分解以获得函数的A,B和进位输入?如何获得Sum和Carry Out输出?如何将完整加法器串在一起以获得4位加法器?

感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

嗯,对于一个简单的解决方案,我们可以采用半加器和全加器电路图并对其进行抽象。来自维基百科:

半加法器:

Half Adder

Full Adder:

full Adder

#include<stdio.h>

typedef char bit;
bit carry = 0;
bit halfadd( bit A, bit B ){
    carry = A & B;
    return A ^ B;
}
bit fulladd( bit A, bit B ){
    bit xor = A ^ B;
    bit ret = carry ^ xor;
    carry = (carry & xor) | (A & B);
    return ret; 
}

void fillNum( int num, bit *array ){
    int i;
    for( i = 0; i < 32; ++ i ){
        array[i] = ( num >> i ) & 1;
    }
}

int main(){ 
    bit num1[32] = {0}, num2[32] = {0};
    int A = 64620926, B = 1531529858;
    fillNum( A, num1 );
    fillNum( B, num2 );

    int r = 0;
    bit tmp = halfadd( num1[0], num2[0] );
    putchar( tmp ? '1' : '0' );
    r = tmp;
    int i;
    for( i = 1; i < 32; ++i ){
        tmp = fulladd( num1[i], num2[i] );
        r += tmp << i;
        putchar( tmp ? '1' : '0' );
    }
    putchar( carry ? '1' : '0' );
    printf("\n%d\n\n%d + %d = %d", r, A, B, A+B);
    return 0;
}

这将首先输出LSB的附加值,但它显示了基本原理。 This works according to Ideone.在模拟4位加法器时,只需采用类似的方法处理逻辑电路。

如果您不想先读取数组的整数,可以随时使用

#define GETBIT(num,bit)((num>>bit)&1)

为安全起见,如果需要,可以将其置于函数调用中

答案 1 :(得分:2)

如果我这样做,我会使用查找表模拟一个4位加法器。在这种情况下,它将是一个256条目表,可以设置为16 x 16数组值。

unsigned short outputs[16][16];

multOut = outputs[inA][inB];

您必须初始化您的数组,但这应该非常简单。

使用数组中每个值的第5位作为执行位。

答案 2 :(得分:0)

首先,您需要将较大的整数分解为单个位。这取决于系统的字节顺序(数字是存储最多,还是最不重要的位先存储)。一系列位掩码会有所帮助。假设大端,

int bit[]={
             1<<0, //least significant bit
             1<<1, 
             1<<2,
             1<<3
};

然后获取你要做的数字的第一位

leastSignificantBitOfA = A&bit[0];

从那里你可以使用一些共享数组来存储输出,或者可以创建一个简单的结构,如:

struct fullAdderReturn{
       int sum;
       int carryOut;
}

struct fullAdderReturn oneBitAdder(int a, int b, int carryIn)
{
     struct fullAdderReturn output;

     output.sum = a&b;
     output.carryOut = (a&b) | (a&carryIn) | (b&carryIn);

     return output;
}

我在这里放了一个简单的2位纹波加法器http://ideone.com/NRoQMS,希望它可以给你一些想法。