Мне нужно спроектировать ALU с двумя 8-битными входами A и B и управляющими входами x, y и z, который поддерживает следующие операции:
x y z | operation
0 0 0 | S = A-B
0 0 1 | S = A+B
0 1 0 | S = A*8
0 1 1 | S = A/8
1 0 0 | S = A NAND B (bitwise)
1 0 1 | S = A XOR B (bitwise)
1 1 0 | s = reverse the bits of A
1 1 1 | S = NOT A (bitwise)
Это должно быть сделано с помощью 8-битного сумматора и арифметико-логического расширителя. Читая мой учебник, я вижу, что цель AL-расширителя состоит в том, чтобы изменить входные биты так, чтобы сумматор, а не много дополнительных компонентов, мог использоваться для всего (или, по крайней мере, это то, что я понимаю из него) ). Например, AL-расширитель может поместить биты в дополнение к двум, чтобы сумматор делал вычитание. Аналогично, для побитовых логических операций биты могут быть изменены соответствующим образом, и один из входов сумматора может быть просто нулем, чтобы результат был получен правильно.
Но что именно я делаю с умножением? Моя книга очень расплывчатая, поэтому я не уверен, что AL-extender потребует от меня сделать что-то умное, чтобы заставить сумматор работать (просто добавлю 8 раз в моем случае? ... ха-ха), или если я можно просто кинуть множитель туда. Я должен прочитать о делении, но я уверен, что это похоже на умножение.
Ну, так или иначе, суть в том, что AL-экстендер «разрешен» иметь / иметь в нем? Является ли его единственной целью изменить ввод, чтобы его можно было подать на сумматор?
* РЕДАКТИРОВАТЬ: Ну, это умножение / деление на 8, так что это может быть легко выполнено со сдвигом влево или вправо на 3. У меня все еще был бы настоящий / правильный AL-экстендер, если бы я добавил туда несколько сдвигов? (Может быть, я переосмысливаю это как полный новичок ...)
источник
Ответы:
Самый простой подход - декодировать входные данные xyz в восемь строк. Затем из них вы реализуете логику, которая управляет линиями выбора микросхемы, чтобы включить соответствующий модуль, который обрабатывает входы, а также любые преобразования, которые необходимы, чтобы модуль выполнял правильную работу.
Я не думаю, что вы можете использовать сумматор для своих логических операций, потому что сумматор несет (если у него нет некоторого ввода, который отключает поведение переноса переноса). Но вы можете иметь один блок, чтобы сделать всю логику.
Может быть, есть причина, почему они называют эти АЛУ, с отдельными А и Л. :)
Умножение на 8 означает просто получение нулей на трех нижних входных строках, игнорирование трех верхних строк и отображение строки 0 на строки 3, 1 на 4 и т. Д. Это как ж / д стрелка.
источник
(Обман)× 8-битный остаток. Для умножения и деления вы будете использовать все биты в блоке из 64 ключевых слов, но, например, инверсия битов делает его менее эффективным: он не зависит от значения B, поэтому у вас будет 256 идентичных значений для каждый вход A и старший байт даже не будут использоваться. Таким образом, в то время как вам нужно только 256 8 = 2048 бит для обращения битов, вы бы использовали 65536 умножить на 16 = 1048576 бит; это не очень эффективно. Вы можете назвать это серьезным недостатком решения Flash, но я бы хотел, чтобы вы реализовали множитель 8 8, используя базовые логические элементы за 2 доллара.× × ×
Самое простое, но наиболее мощное решение - использовать флэш-память в качестве таблицы поиска результатов. 8-битный вход A + 8-битный вход B + 3-битный код операции - 19 бит. Выберите 512 кбит 16-битный Flash (около $ 2), используйте 19 строк ввода в качестве адреса и запрограммируйте его с результатами для каждой комбинации входов. Таким образом, вы можете выполнять любые операции, которые вам нравятся. Вы хотите грешить (A)? Просто добавьте таблицу поиска синуса из 256 слов, и вы даже получите 16-битный точный результат. Вы не ограничены умножением на 8; вы можете умножить A на B. Точно так же вы можете разделить A на B и получить 8-битное отношение и
ОК, может быть, вы не хотите этого; Логические ворота намного сложнее. Как говорит Каз, начните с декодера 3-8, чтобы иметь уникальный сигнал для каждого кода операции. Вы можете сделать это с основными воротами, но я бы предложил использовать 74HC238 для начала. Когда АЛУ работает, вы все равно можете заменить HC238 набором ворот.
То, что вы не хотите для множителя, это сдвиговый регистр, который сдвигается влево 3 раза. Это зарегистрированная функция, для которой нужны часы, а не комбинаторная функция, которая немедленно выдает результат. (Обратите внимание, что Flash также выдает любой результат в наносекундах, хотя и медленнее, чем с комбинаторной логикой.) Имеет путь от A0 до Y3, от A1 до Y4 и т. Д., Который вы включаете с помощью декодированного кода операции «010». Аналогично, Y3 будет подключен к A6, если сигнал «011» активен (деление), и к A4, когда опкод равен «110» (инверсия битов). Это значит много мультиплексирования.
Чтобы вернуться к Flash, вы также можете создать комбинацию комбинационной логики для простых операций, таких как NAND, NOR, сдвиг влево, сдвиг вправо , и использовать только Flash для умножения и деления. Вы можете использовать меньший Flash (128 слов вместо 512 слов) или добавить более продвинутые функции, такие как синус, который я привел в качестве примера (возможно, не самый лучший, но я уверен, что вы можете что-то придумать).(∗)
источник
Я застрял на той же проблеме из той же книги. К счастью, я наткнулся на эту ветку, которая дала мне представление, что делать. У Каза есть отличное замечание о вождении нулей и отображении линий. Расширитель ALU в этой книге состоит из n (n, представляющих число битов, с которыми нужно работать) идентичных, но отдельных комбинационных компонентов и одного другого компонента для переноса. Эти компоненты имеют пять входов и два выхода. Пять входов: «X», «Y», «Z» (для выбора операции) и «a», «b» (отдельные биты A и B с одинаковым значением). Я предполагаю, что идея состоит в том, чтобы разделить проблему на более мелкие куски, чтобы получить таблицу истинности разумного размера. Это 5 входов против 8 + 8 + 3 = 19 входов, если расширитель будет принимать все биты от A и B плюс управляющие входы. Сейчас же, если бы расширитель был составлен таким образом (19 входов), я думаю, что логика для умножения могла бы быть реализована в этом единственном компоненте, но о написании таблицы истинности для этого не могло быть и речи. Так или иначе, мое решение состоит в том, чтобы использовать мультиплексоры после каждого компонента, который обрабатывает отдельные биты a и b, предполагая, что компонент уже спроектирован таким образом, что вход XYZ = 010 пропускает бит «a» без изменений и отфильтровывает «b», то есть 'b' = 0. Мультиплексор должен иметь два входа: один из вышеуказанного компонента и один из компонента в трех местах справа. Три крайних справа мукса должны иметь нули в качестве второго входа. Простая комбинационная логика с логическим элементом И и двумя инверторами может устанавливать мультиплексоры, когда XYZ = 010.
источник