如何用 C 语言模拟 4 位二进制加法器

JT9*_*JT9 1 c binary logic bit-manipulation

我的教授布置全班同学编写一个 C 程序来使用基本加法器模拟 32 位加法器。我知道 32 位加法器由 8 X 4 位加法器组成。然而,我什至不确定如何在 C 中模拟 4 位加法器。我需要实现一个 4 位二进制纹波进位加法器、一个 4 位二进制先行进位生成器和一个 4 位先行进位加法器。从全加器的真值表和卡诺图,我获得了 Sum 和 Carry Out 输出的函数。对于 Sum,我收到了 A xor B xor Carry In。对于进位函数,我收到了 (A*B) + (进位(A xor B))。现在我不确定该去哪里。我很确定我需要使用按位运算符在位级别操作整数(我有按位运算符的基本知识,尽管我从未在纸和铅笔之外实现过它们)。

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

感谢您的帮助!

Kas*_*lai 5

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

半加法器:

半加法器

全加器:

全加器

#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;
}
Run Code Online (Sandbox Code Playgroud)

这将首先输出 LSB 的附加值,但它演示了基本原理。根据 Ideone 的说法,这是有效的。在模拟 4 位加法器时,只需应用类似的方法来处理逻辑电路即可。

如果您不想先将整数读取到数组中,则可以随时使用

#define GETBIT(num,bit)((num>>bit)&1)
Run Code Online (Sandbox Code Playgroud)

为了安全起见,如果需要,您可以将其放入函数调用中