1

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

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

感谢您的帮助!

4

3 回答 3

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;
}

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

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

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

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

于 2013-02-04T21:00:21.837 回答
2

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

unsigned short outputs[16][16];

multOut = outputs[inA][inB];

你必须初始化你的数组,但这应该很简单。

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

于 2013-02-04T20:37:04.950 回答
0

To start you will need to break your larger integers into individual bits. This will depend on the endianess of your system (whether numbers are stored most, or least significant bit first). An array of bit masks would help. Assuming big endian,

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

So then to get the first bit of a number you would do

leastSignificantBitOfA = A&bit[0];

From there you could either use some shared array to store outputs or maybe make a simple structure like:

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;
}

I put together a simple 2-bit ripple adder here http://ideone.com/NRoQMS hopefully it gives you some ideas .

于 2013-02-04T21:57:29.187 回答