Исходя из моего предыдущего вопроса того же типа, « Создайте машину добавления, используя логические элементы NAND , на этот раз вас попросят умножить вместо добавления».
Построить схему (двухпроводные) NAND - логических вентилей , которые будут принимать входные провода A1
, A2
, A4
, B1
, B2
, B4
, представляющие два двоичных чисел A
в B
от 0 до 7, а возвращаемых значений на выходных проводах C1
, C2
, C4
, C8
, C16
, и C32
, представляя C
, который является продуктом A
и B
.
Ваша оценка определяется количеством используемых вами ворот NAND (1 балл за ворота). Чтобы упростить задачу, вы можете использовать на диаграмме вентили AND, OR, NOT и XOR со следующими соответствующими баллами:
NOT: 1
AND: 2
OR: 3
XOR: 4
Каждый из этих баллов соответствует количеству вентилей NAND, необходимых для построения соответствующих вентилей.
Самый низкий балл побеждает.
источник
Ответы:
60 55 5048 воротОригинал (60 ворот) был систематическим подходом - умножьте каждую цифру на каждую, а затем сложите их вместе. А именно, увидеть деревья Уоллеса и Дадда
Верхняя половина - это сеть умножения - умножьте каждую цифру на каждую и сгруппируйте выходные цифры с одинаковым весом. Некоторые биты были оставлены инвертированными, чтобы сохранить ворота.
Вторая половина - сеть сумматора. Каждый блок представляет собой один сумматор - либо половинный сумматор (5 вентилей - 1x XOR и инвертор), либо полный сумматор (9 вентилей - 2x XOR и NAND инвертированные биты переноса). Верхняя часть - это входные данные, нижняя часть - это сумма, левая часть - результат. увидеть предыдущий вызов
Затем множитель 2x2 был оптимизирован вручную для специально созданной сети с 13 шлюзами , что является оптимальным размером, найденным @boothby . Благодарность!
Вставка его в младший бит и повторная оптимизация дерева сумматоров экономит пять элементов (см. Редакцию № 2). Однако вставка его в верхний угол приводит к наложению. Немного математики говорит нам, однако, что отбрасывание младшего бита старшего множителя решает наложение, и что остается сделать, это добавить оставшиеся два бита и суммировать вещи.
Одно это, к сожалению, не дает никакой экономии, но открывает две оптимизации. Во-первых, два множителя имеют два общих элемента и могут быть объединены вместе. На данный момент мы вернулись к 55. Во-вторых, в сети дополнений нам не нужен полудейдер, потому что мы знаем, что его перенос будет равен нулю. Мы можем заменить его на ИЛИ. OR - это NAND с инвертированными входами. Это приводит нас к двум 2-цепочкам NOT на каждую ветвь, которые затем могут быть удалены для общей экономии пяти шлюзов. К сожалению, половина сумматора в C16 все еще несет, поэтому мы не можем сделать то же самое там. В-третьих, у полного сумматора есть полезное свойство: если вы инвертируете его входы и выходы, он все равно будет вести себя одинаково. Поскольку все его входы уже инвертированы, мы также можем переместить инверторы за ним. Дважды. Мы могли бы сделать то же самое в оригинале, но ... Ну что ж. У нас еще есть половинный сумматор с двумя инвертированными входами. Я хочу оптимизировать эту часть больше, но я сомневаюсь, что смогу.
Поскольку мы вытягиваем НЕ из компонента, мы должны как-то это обозначить. Мы получили половину сумматора с перевернутым переносом (AKA Tapped XOR) по цене четырех ворот.
Тем временем мы также значительно переработали диаграмму.
источник
39 ворот
Я совершенно уверен, что здесь нет более простых конструкций, чем мой. Это было очень сложно сделать. Я делаю другие минимальные схемы тоже.
Задержка передачи указывается положением вниз каждого элемента NAND на листе.
Verilog код и тестирование:
Ким Ойхус
источник