Создайте полный сумматор, используя 2 4: 2: 1 MUX и константы 0 и 1 - PullRequest
0 голосов
/ 10 марта 2011

Вопрос по компьютерным структурам,

Создайте полный сумматор, используя 2: 2: 1 MUX и константы 0 и 1. Используйте минимальное количество констант.

Очевидно, что этот вопрос разрешим и без ворот, но меня интересует вопрос без них.

Ответы [ 4 ]

2 голосов
/ 10 марта 2011

Я только что написал простую небольшую 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;
        }
    }
}
2 голосов
/ 10 марта 2011

Если вы имеете в виду мультиплексирование с четырьмя входами, вы можете сделать (добавить 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 только с тремя входами без логического элемента NOT, поэтому сначала вам нужно вычислить carry.Вы можете сделать это;тогда вам нужно получить sum от входов и carry.Поскольку входы симметричны, для мультиплексора для sum могут быть установлены два входа или один вход и carry.Первый случай заканчивается по той же причине, по которой вы не можете сначала вычислить sum.Глядя на таблицу истинности и все возможные комбинации carry и одного ввода (назовите его a), невозможно вычислить sum уникально для случая, когда carry и a одинаковы, используя толькоодна переменная или константа в качестве входных данных для каждого ввода данных мультиплексора sum.

1 голос
/ 18 марта 2012
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 мультиплексоров мы имеем в первом мультиплексоре входной номер 0 B XOR Cin во входном номере 1 B XNOR Cin -> этот мультиплексор для Sво втором мультиплексоре во входном номере 0 у нас есть B AND Cin во входном номере 1 у нас есть B OR Cin -> это для Cout.

0 голосов
/ 15 марта 2011

Полный сумматор в 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
...