我的教授指派班级编写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位加法器?
感谢您的帮助!
答案 0 :(得分:3)
嗯,对于一个简单的解决方案,我们可以采用半加器和全加器电路图并对其进行抽象。来自维基百科:
半加法器:
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,希望它可以给你一些想法。