计算机结构中的一个问题,
使用 2 个 4:2:1 MUX 和常量 0 和 1 构建一个全加器。使用最少数量的常量。
显然,这个问题也可以使用非门来解决,但我对没有它们的问题感兴趣。
计算机结构中的一个问题,
使用 2 个 4:2:1 MUX 和常量 0 和 1 构建一个全加器。使用最少数量的常量。
显然,这个问题也可以使用非门来解决,但我对没有它们的问题感兴趣。
如果您的意思是四输入多路复用器,您可以这样做(添加a
、b
和c
):
carry = mux(/* controls */ a, b, /* inputs */ 0, c, c, 1);
我不知道sum
没有其他门怎么走。一种选择是(使用 AND 和 OR):
sum = mux(/* controls */ carry, a, /* inputs */ b|c, 0, 1, b&c);
使用 XOR(可能很明显):
sum = mux(/* controls */ a, b^c, /* inputs */ 0, 1, 1, 0);
这是为什么你不能用两个多路复用器来做的草图:
由于您有两个多路复用器和两个输出,因此每个多路复用器必须产生一个输出;因此,您需要计算sum
自carry
或计算carry
自sum
。如果没有非门,您无法sum
仅使用三个输入进行计算,因此您需要先进行计算carry
。你可以这样做;那么你需要sum
从输入和carry
. 由于输入是对称的,多路复用器sum
的控制可以是两个输入或一个输入和carry
。第一种情况失败的原因与您无法sum
首先计算的原因相同。查看真值表carry
和一个输入的所有可能组合(称为它a
),没有办法sum
唯一地计算carry
和a
仅使用一个变量或常量作为sum
多路复用器的每个数据输入的输入是相同的。
我刚刚编写了一个简单的小 C# 程序来检查每个可能的输入组合,但它无法找到解决方案。所以,除非我犯了某种程序错误,否则这个问题没有解决办法。
using System;
class Program
{
static void Main(string[] args)
{
bool[] aValues = new bool[] { false, false, false, false, true, true, true, true };
bool[] bValues = new bool[] { false, false, true, true, false, false, true, true };
bool[] cValues = new bool[] { false, true, false, true, false, true, false, true };
bool[] carryValues = new bool[] { false, false, false, true, false, true, true, true };
bool[] constantFalse = new bool[] { false, false, false, false, false, false, false, false };
bool[] constantTrue = new bool[] { true, true, true, true, true, true, true, true };
bool[] sumValues = new bool[] { false, true, true, false, true, false, false, true };
bool[][] allInputs = new bool[][] { aValues, bValues, cValues, carryValues, constantFalse, constantTrue };
for (int controlOneIndex = 0; controlOneIndex < allInputs.Length; controlOneIndex++)
for (int controlTwoIndex = 0; controlTwoIndex < allInputs.Length; controlTwoIndex++)
for (int inputOneIndex = 0; inputOneIndex < allInputs.Length; inputOneIndex++)
for (int inputTwoIndex = 0; inputTwoIndex < allInputs.Length; inputTwoIndex++)
for (int inputThreeIndex = 0; inputThreeIndex < allInputs.Length; inputThreeIndex++)
for (int inputFourIndex = 0; inputFourIndex < allInputs.Length; inputFourIndex++)
{
for (int calculationIndex = 0; calculationIndex < sumValues.Length; calculationIndex++)
{
if (MuxResult(allInputs[controlOneIndex][calculationIndex],
allInputs[controlTwoIndex][calculationIndex],
allInputs[inputOneIndex][calculationIndex],
allInputs[inputTwoIndex][calculationIndex],
allInputs[inputThreeIndex][calculationIndex],
allInputs[inputFourIndex][calculationIndex]) != sumValues[calculationIndex])
{
goto tryNextValue;
}
}
Console.WriteLine("Success: controls: {0} {1} inputs: {2} {3} {4} {5}",
controlOneIndex, controlTwoIndex, inputOneIndex, inputTwoIndex, inputThreeIndex, inputFourIndex);
tryNextValue: ;
}
Console.WriteLine("done");
Console.ReadLine();
}
private static bool MuxResult(bool controlOne, bool controlTwo, bool inputOne, bool inputTwo, bool inputThree, bool inputFour)
{
if (controlOne)
{
if (controlTwo)
return inputFour;
else
return inputTwo;
}
else
{
if (controlTwo)
return inputThree;
else
return inputOne;
}
}
}
A B Cin S cout
0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
1 0 1 0 1
1 1 0 0 1
1 1 1 1 1
通过将A
, 作为两个 2*1 多路复用器的选择线,我们在输入编号 1 中的输入编号 0 中的第一个多路复用器中B XOR Cin
拥有->
在输入编号 0 中的第二个多路复用器中,我们在输入编号 1 中拥有B XNOR Cin
该多路复用器
->这对于.S
B AND Cin
B OR Cin
Cout
VB中的全加器
Class fullAdder
Private _A As Boolean
Private _B As Boolean
Private _Cin As Boolean
Private _Sum As Boolean
Private _Cout As Boolean
Public Sub New()
Me.A = False
Me.B = False
Me.Cin = False
End Sub
Public Sub SetInputs(a As Boolean, b As Boolean, cIn As Boolean)
Me.A = a
Me.B = b
Me.Cin = cIn
End Sub
'Inputs Outputs
'A B Cin Cout S
'0 0 0 0 0
'1 0 0 0 1
'0 1 0 0 1
'1 1 0 1 0
'0 0 1 0 1
'1 0 1 1 0
'0 1 1 1 0
'1 1 1 1 1
Public Sub DoAdd()
'debugIn()
Dim ABxor As Boolean = Me.A Xor Me.B
Me.Sum = ABxor Xor Me.Cin
Dim ABxorAndCin As Boolean = ABxor And Me.Cin
Dim ABand As Boolean = Me.A And Me.B
Me.Cout = ABxorAndCin Or ABand
'debugOut()
End Sub
Private Sub debugIn()
Debug.WriteLine("'I {0} {1} {2}", Me.A, Me.B, Me.Cin)
End Sub
Private Sub debugOut()
Debug.WriteLine("'O {0} {1}", Me.Cout, Me.Sum)
Debug.WriteLine("")
End Sub
Public Property Sum() As Boolean
Get
Return Me._Sum
End Get
Set(ByVal value As Boolean)
Me._Sum = value
End Set
End Property
Public Property Cout() As Boolean
Get
Return Me._Cout
End Get
Set(ByVal value As Boolean)
Me._Cout = value
End Set
End Property
Public Property A() As Boolean
Get
Return Me._A
End Get
Set(ByVal value As Boolean)
Me._A = value
End Set
End Property
Public Property B() As Boolean
Get
Return Me._B
End Get
Set(ByVal value As Boolean)
Me._B = value
End Set
End Property
Public Property Cin() As Boolean
Get
Return Me._Cin
End Get
Set(ByVal value As Boolean)
Me._Cin = value
End Set
End Property
End Class