我的教授分配了这个类,编写了C语言程序,用基本加法器模拟32位加法器。 我知道32位加法器由8个4位加法器组成。 但是,我不知道如何用c模拟4位加法器。 我需要实现4位二进制纹波进位加法器、4位二进制进位生成器和4位进位加法器。 通过完全加法器真值表和Karnaugh映射,获得了Sum和Carry Out输出的功能。 关于总和,收到了A xor B xor进行。 关于执行功能,收到了(A * B ) (进位) A xor B ) )。 我不知道现在去哪里。 我确信必须使用按位运算符在位级别操作整数。 但是,虽然没有在纸笔之外实现过它们,但是基本上知道位运算符。
如何分解整数以获得函数的a、b和“进位”输入? 如何获得“合计运行”的输出? 如何将所有加法器连接起来得到4位加法器?
感谢您的协助!
我什么都没尝试过。 因为我不知道哪里不幸福
您的问题确实是“如何将整数分解为单个位? ”,这就是应该更改标题等的地方。
那么,作为简单的解决方案,可以采用半加法器和全加法器的电路图,进行抽象。 来自维基百科:
半加法器:
完全加法器:
#包含
typedef char bit;
bit carry=0;
bithalfadd(bita,bit B ) {
嘉莉=ab;
return A ^ B;
}
bitfulladd(bita,bit B ) {
bit xor=A ^ B;
bit ret=carry ^ xor;
carry=(carryxor )|) ab;
返回;
}
voidfillnum(intnum,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;
bittmp=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 (嘉莉? '1' : '0';
printf((%d(%d ) d=%d ),r、a、b、A B );
返回0;
}
首先输出带LSB的附加值,展示了基本原理。 据Ideone称,这是有效的。 在模拟4位加法器的情况下,可以用同样的方法处理逻辑电路。
如果不首先将整数读入数组,则始终可以使用
#definegetbit(num,bit ) ) (numbit )1) )。
为了安全起见,可以将其放入函数调用中
可以,但是你刚为他们完成了某人的作业。
我的看法是,如果他真的对学习感兴趣,他就不会偷窃。
然后,使用查找表模拟4位加法器。 在这种情况下,这将是256个条目表,可以设置为16 x 16的值数组。
unsigned short outputs[16][16];
multOut=outputs[inA][inB];
数组需要初始化,但这应该非常简单。
数组中每个值的第五位用作进位位。
首先,需要将大整数分解为单个位。 这取决于系统的耐用性(数字存储器是顶层还是底层)。 一组位掩码很有用。 假设大结局、
int bit[]={
10,//least significant bit
十一、
十二、
13
(;
因此,要获得数字第一名,请执行以下操作
leastSignificantBitOfA=Abit[0];
从那里,可以使用几个共享数组来存储输出,或者创建简单的结构,例如:
struct fullAdderReturn{
int sum;
int carryOut;
}
structfulladderreturnonebitadder (inta,int b,int carryIn ) )。
{
struct fullAdderReturn output;
output.sum=ab;
output.carryout=(ab )|)| (acarryIn )|)| (bcarryIn;
返回输出;
}
我在这里在http://ideone.com/NRoQMS上组合了简单的2位波形加法器。 我希望那个能给你提供想法。