1

私の教授はクラスに、基本的な加算器を使用して 32 ビット加算器をシミュレートする C プログラムを作成するように割り当てました。32 ビット加算器が 8 X 4 ビット加算器で構成されていることは知っています。ただし、C で 4 ビット加算器をシミュレートする方法さえわかりません。4 ビット バイナリ リップル キャリー加算器、4 ビット バイナリ ルックアヘッド キャリー ジェネレーター、および 4 ビット ルックアヘッド キャリーを実装する必要があります。加算器。全加算器とカルノー写像の真理値表から、Sum と Carry Out の出力の関数を取得しました。Sum については、A xor B xor キャリーインを受け取りました。キャリーアウト関数については、(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 ビット加算器をシミュレートします。この場合、16 x 16 の値の配列のように設定できる 256 エントリ テーブルになります。

unsigned short outputs[16][16];

multOut = outputs[inA][inB];

配列を初期化する必要がありますが、それは非常に簡単なはずです。

配列内の各値の 5 番目のビットを実行ビットとして使用します。

于 2013-02-04T20:37:04.950 に答える
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うまくいけば、いくつかのアイデアが得られます。

于 2013-02-04T21:57:29.187 に答える