Проектирование простого АЛУ


8

Мне нужно спроектировать 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-экстендер, если бы я добавил туда несколько сдвигов? (Может быть, я переосмысливаю это как полный новичок ...)


1
Что такое 00011111 * 8? Что такое 00000000-00000111? Если ваш AL-экстендер сдвигается влево 3 раза для кода операции «010», он может затем присвоить B значение 0 и затем вызвать коды операции «001» или «000» в ALU.
Тони Эннис

Ответы:


5

Самый простой подход - декодировать входные данные xyz в восемь строк. Затем из них вы реализуете логику, которая управляет линиями выбора микросхемы, чтобы включить соответствующий модуль, который обрабатывает входы, а также любые преобразования, которые необходимы, чтобы модуль выполнял правильную работу.

Я не думаю, что вы можете использовать сумматор для своих логических операций, потому что сумматор несет (если у него нет некоторого ввода, который отключает поведение переноса переноса). Но вы можете иметь один блок, чтобы сделать всю логику.

Может быть, есть причина, почему они называют эти АЛУ, с отдельными А и Л. :)

Умножение на 8 означает просто получение нулей на трех нижних входных строках, игнорирование трех верхних строк и отображение строки 0 на строки 3, 1 на 4 и т. Д. Это как ж / д стрелка.


6

(Обман)
Самое простое, но наиболее мощное решение - использовать флэш-память в качестве таблицы поиска результатов. 8-битный вход A + 8-битный вход B + 3-битный код операции - 19 бит. Выберите 512 кбит 16-битный Flash (около $ 2), используйте 19 строк ввода в качестве адреса и запрограммируйте его с результатами для каждой комбинации входов. Таким образом, вы можете выполнять любые операции, которые вам нравятся. Вы хотите грешить (A)? Просто добавьте таблицу поиска синуса из 256 слов, и вы даже получите 16-битный точный результат. Вы не ограничены умножением на 8; вы можете умножить A на B. Точно так же вы можете разделить A на B и получить 8-битное отношение и×8-битный остаток. Для умножения и деления вы будете использовать все биты в блоке из 64 ключевых слов, но, например, инверсия битов делает его менее эффективным: он не зависит от значения B, поэтому у вас будет 256 идентичных значений для каждый вход A и старший байт даже не будут использоваться. Таким образом, в то время как вам нужно только 256 8 = 2048 бит для обращения битов, вы бы использовали 65536 умножить на 16 = 1048576 бит; это не очень эффективно. Вы можете назвать это серьезным недостатком решения Flash, но я бы хотел, чтобы вы реализовали множитель 8 8, используя базовые логические элементы за 2 доллара.×××

ОК, может быть, вы не хотите этого; Логические ворота намного сложнее. Как говорит Каз, начните с декодера 3-8, чтобы иметь уникальный сигнал для каждого кода операции. Вы можете сделать это с основными воротами, но я бы предложил использовать 74HC238 для начала. Когда АЛУ работает, вы все равно можете заменить HC238 набором ворот.

То, что вы не хотите для множителя, это сдвиговый регистр, который сдвигается влево 3 раза. Это зарегистрированная функция, для которой нужны часы, а не комбинаторная функция, которая немедленно выдает результат. (Обратите внимание, что Flash также выдает любой результат в наносекундах, хотя и медленнее, чем с комбинаторной логикой.) Имеет путь от A0 до Y3, от A1 до Y4 и т. Д., Который вы включаете с помощью декодированного кода операции «010». Аналогично, Y3 будет подключен к A6, если сигнал «011» активен (деление), и к A4, когда опкод равен «110» (инверсия битов). Это значит много мультиплексирования.

Чтобы вернуться к Flash, вы также можете создать комбинацию комбинационной логики для простых операций, таких как NAND, NOR, сдвиг влево, сдвиг вправо , и использовать только Flash для умножения и деления. Вы можете использовать меньший Flash (128 слов вместо 512 слов) или добавить более продвинутые функции, такие как синус, который я привел в качестве примера (возможно, не самый лучший, но я уверен, что вы можете что-то придумать).()



() Почему у вас есть умножение на 8, но не более простой сдвиг? Сдвиг влево / вправо, поворот влево / вправо (как с помощью переноса, так и без) являются обязательными для любого ALU, и вы можете делить на 8, используя 3 права на сдвиг, в то время как вы не можете делить на 2. Обращение битов - это типичный DSP функции, но вы не хотите создавать DSP для начала, не так ли? Я бы изменил функции на

x  y  z  |  operation

0  0  0  |  S = A - B
0  0  1  |  S = A + B
0  1  0  |  S = shift left A by 1 bit
0  1  1  |  S = shift right A by 1 bit
1  0  0  |  S = A NAND B (bitwise)
1  0  1  |  S = A XOR B (bitwise)
1  1  0  |  S = rotate left A
1  1  1  |  S = NOT A (bitwise)

1

Я застрял на той же проблеме из той же книги. К счастью, я наткнулся на эту ветку, которая дала мне представление, что делать. У Каза есть отличное замечание о вождении нулей и отображении линий. Расширитель 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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.