Найти тему
Разумный мир

Элементы ЭВМ. АЛУ - арифметико-логическое устройство. Часть 1

Оглавление

Центральным элементом любой ЭВМ является процессор. А центральным элементом любого процессора является АЛУ - арифметико-логическое устройство. Именно АЛУ, в конечном итоге, выполняет все, даже самые сложные, операции. Но, как и многое настоящие труженики, зачастую остается в тени славы, которая достается процессорам и ЭВМ.

Даже при изучении архитектуры процессоров АЛУ лишь изображают символом на функциональной схеме, не углубляясь в детали его устройства. АЛУ слишком низкоуровневое, что там может быть интересного... Между тем, интересного там много.

Давайте сегодня попробуем заглянуть внутрь одного из базовых кирпичиков процессоров. Я не буду рассматривать какую либо конкретную ЭВМ, конкретный процессор, конкретную микросхему. Я расскажу немного об АЛУ в общем и целом. Но мы обязательно заглянем внутрь этого хитрого устройства.

Статья не является учебником. Это не копия каких либо книг или учебников. Это не компиляция других источников и статей. Как и другие статьи канала, это мой личный опыт.

Что это вообще такое, АЛУ?

Разве собственно названия не достаточно для ответа на этот вопрос? Нет, недостаточно. АЛУ выполняет логические и арифметические операции, это правда. Но этого недостаточно для того, что бы перейти к более детальному рассмотрению его внутреннего устройства. Давайте начнем с самого простого

Соответствие математического выражения и функционального элемента АЛУ. Иллюстрация моя
Соответствие математического выражения и функционального элемента АЛУ. Иллюстрация моя

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

y = -a

Суть от этого не меняется. Операция это то, что делается. Операнды это то, над чем выполняется операция.

АЛУ это не процессор! Это один из многих узлов процессора. АЛУ ничего не знает о переменных и их адресах. Не обращается к памяти для выборки данных. АЛУ работает с входными сигналами (a, b, op, Ci) которые и являются для него данными, формируя на их основе выходные сигналы (y, Co).

АЛУ на функциональных схемах обозначается таким вот забавным, похожим на шорты, символом. Это историческое обозначение. На функциональных схемах показывают не переменные, и даже не операнды, а сигналы. Поэтому наши два операнда превратились в два сигнала, a и b.

Выполняемая операция теперь тоже сигнал, op. Мы должны обязательно передать этот сигнал в АЛУ, именно он определяет, что АЛУ будет делать с входными сигналами. На выходе, в результате выполнения заданной операции, будет сформирован сигнал y, это результат операции.

Но всё ли это? Нет, не все. Этого достаточно для выполнения логических операций (почти всех), но арифметические операции порождают еще и понятия переноса и заема. На первый взгляд, это внутреннее дело АЛУ. Но на самом деле, перенос/заем могут быть и входным сигналом, и выходным. Чуть далее мы это увидим.

А значит, более точно будет вот так

Операция, в общем случае, выполняется над тройкой операндов. Результат операции представляется парой значений. Иллюстрация моя
Операция, в общем случае, выполняется над тройкой операндов. Результат операции представляется парой значений. Иллюстрация моя

Здесь я показал современное изображение АЛУ. Перенос/заем обычно называется просто переносом и обозначается С (от carry - переносить). Не смотря на то, что для операции вычитания это будет заем. Ci это входной перенос (i - in), а Co выходной (o - out).

Немного о разрядности

Обратите внимание, что пока ни слова не было сказано о разрядности наших переменных/операндов/сигналов. И это не случайно. Дело в том, что разрядность АЛУ не обязательно совпадает с разрядностью процессора. А при конструировании процессора из отдельных микросхем (так было до появления микропроцессоров) несколько АЛУ могут работать совместно для обеспечения требуемой разрядности. Например, если АЛУ 4-х разрядные, а процессор 8-разрядный, то получится так

Последовательное включение АЛУ для повышения разрядности. Иллюстрация моя
Последовательное включение АЛУ для повышения разрядности. Иллюстрация моя

Здесь у нас два АЛУ, каждое из которых обрабатывает свою тетраду байта. При этом выходной сигнал переноса АЛУ младшей тетрады является выходным для АЛУ старшей тетрады. Без этого результат операции над байтом в целом был бы неверным.

То есть, переносы действительно являются не только внутренним делом АЛУ, даже в таком упрощенном случае. Разрядность сигнала переноса равна единице - это один бит. И он настолько важен, что для него предусмотрено место в слове состояния процессора. Но слово состояния процессора не тема сегодняшнего разговора.

Обратите внимание, что в некоторых процессорах в слове состояния есть дополнительный флаг межтетрадного переноса. Для нашего примера его легко реализовать с помощью сигнала Co АЛУ младшей тетрады.

В данном случае разрядность операндов/сигналов каждого АЛУ равна четырем. Я показал это на иллюстрации. Но, в общем случае, разрядность АЛУ может быть любой. В разумных пределах, конечно.

При этом даже одноразрядные АЛУ имеют практический смысл и практическое применение. На одноразрядном АЛУ можно построить последовательный процессор, который будет обрабатывать информацию бит за битом, последовательно.

Думаете, такие процессоры не имеют смысла и никогда не существовали? Ошибаетесь! Такие процессоры использовались, например, в настольных ЭВМ (программируемых калькуляторах) Wang. Я упоминал их в статье

Вычислительные машины СССР. Мало известная 15ВСМ-5

Если вам и этого недостаточно, то посмотрите на однобитный процессор Motorola

The Motorola MC145008 is a single chip, one-bit static CMOS processor optimized for decision-oriented tasks

Мы пока обошли стороной вопрос сигнала op. Это немного более сложный вопрос, так как операция может задаваться и кодом, и набором отдельных сигналов. Чуть далее мы рассмотрим это подробнее. Пока же будет достаточно точным говорить, что операция задается кодом. Соответственно, разрядность сигнала op определяется количеством различных операций, которые может выполнять АЛУ.

Обратите внимание, что разрядность кода операции никак не связана с разрядностью АЛУ!

Для данной статьи вопрос разрядности АЛУ не имеет большого значения. Ведь мы рассматриваем работу именно АЛУ, а не процессора, в котором оно используется.

Последовательное или параллельное?

Требуемую операцию можно выполнять для единицы данных (байт, слово, двойное слово, и т.д.) целиком, одновременно, параллельно, для всех ее разрядов (бит). Такие АЛУ называются параллельными. А можно выполнять операцию над каждым битом (группой бит) единицы информации по отдельности, друг за другом, последовательно. Такие АЛУ называются последовательными.

Но ведь последовательные АЛУ гораздо медленнее параллельных. Например, для байта, последовательное АЛУ потребует 8 циклов для выполнения операции вместо одного. Для чего вообще эти последовательные АЛУ нужны?

Например, последовательное АЛУ позволяет строить процессоры переменной разрядности, причем изменяемой "на лету", во время выполнения программы. И это может оказаться более важным, чем снижение быстродействия.

В реальном мире чистые последовательные и параллельные АЛУ (да и процессоры) не встречаются. Например, чуть ранее мы видели, как можно объединить два 4-х разрядных АЛУ. При этом обработка двух тетрад выполняется параллельно. Но ведь сигнал переноса не может быть обработан АЛУ старшей тетрады до тех пор, пока АЛУ младшей тетрады не закончит выполнение операции и не сформирует выходной сигнал переноса. Значит, для переносов обработка будет последовательной.

Статическое или динамическое (последовательностное)?

Во многих случаях выходные сигналы АЛУ напрямую определяются сигналами входными. То есть, АЛУ является комбинационным логическим элементом. Такое АЛУ и называется статическим.

Однако, последовательное АЛУ не может быть статическим. Обратите внимание, последовательное АЛУ не тождественно однобитному! Например, данные могут передаваться в АЛУ парами бит, всего 4 такта для байта. Такое АЛУ будет последовательным, но не однобитным. А выходной перенос, например, может формироваться лишь после обработки всей последовательности бит единицы информации.

Последовательное АЛУ для правильного формирования результата должно сохранять внутреннее состояние между тактами (шагами) выполнения операции. То есть, оно уже будет не комбинационным, а последовательностным логическим элементом. Такое АЛУ является динамическим.

Условные временные диаграммы работы статического (разрядность любая)  и динамического АЛУ. Иллюстрация моя
Условные временные диаграммы работы статического (разрядность любая) и динамического АЛУ. Иллюстрация моя

Видно, что для статического АЛУ выходные сигналы появляются с некоторой задержкой относительно входных сигналов. А для динамического АЛУ все немного сложнее. Да, выходные сигналы по прежнему формируются с некоторой задержкой. Но операция теперь полностью выполняется за несколько тактов. Причем выходной перенос формируется уже после полного выполнения операции над всеми разрядами. Динамическому АЛУ нужен источник тактовых импульсов.

Еще раз обращаю ваше внимание, что речь идет именно об АЛУ, а не о процессорах.

Посмотрите еще раз на последнюю иллюстрацию. Динамическое АЛУ здесь 8-разрядное, не смотря на то, что за один такт обрабатывается только один разряд.

В некоторых случаях на входах и выходе АЛУ, внутри АЛУ, имеются регистры-защелки для временного хранения обрабатываемой АЛУ информации. Например, это может потребоваться для процессоров с многофазной системой тактирования или процессоров с распараллеливанием выполнения команд.

Для выполнения операции в таких АЛУ требуется несколько шагов: запись данных в входные регистры, выдача кода операции, чтение выходного регистра. Такие АЛУ являются последовательностными, но не обязательно динамическими. Так как собственно операция может выполняться и параллельно.

Типы операций, набор операций

Поскольку устройство арифметико-логическое, разумно предположить, что оно выполняет логические и арифметические операции. При этом выполняемые операции зачастую просты, даже элементарны. А более сложные операции, которые можно разбить на несколько элементарных, выполняются уже процессором, на более высоком уровне. Это не обязательно так, но это самый распространенный случай.

Так же надо отметить, что информационные входы АЛУ (a и b) не обязательно равнозначны. Да и включение АЛУ в схему процессора в большинстве случаев не симметрично. Но это тема отдельного разговора.

Логические операции

Логические операции можно разделить на две условные группы: основную и расширенную. Список основных логических операций не велик:

  • НЕ, отрицание, инверсия. Эта операция требует один операнд. Поэтому она может представлена как две операции: НЕ(а) и НЕ(b).
  • ПОВТОР. Это просто передача выходного сигнала на выход, без каких либо изменений. Эта операция может показаться излишней, но это не так. В частности, занесение константы в регистр процессор выполняет именно с помощью этой операции АЛУ. Требует один операнд.
  • И. В особых пояснениях не нуждается. Требует два операнда.
  • ИЛИ. В особых пояснениях не нуждается. Требует два операнда.
  • ИСКЛЮЧАЮЩЕЕ ИЛИ. Тоже не требует особых комментариев, на первый взгляд. Однако, эта операция не так проста. По сути, ИСКЛЮЧАЮЩЕЕ ИЛИ это не только логическая операция, но и арифметическая. Как арифметическая она формирует полусумму операндов. Почему полусумму? Потому что перенос не учитывается. Чуть позже мы это рассмотрим подробнее.

Расширенная группа логических операций может включать в себя И-НЕ, ИЛИ-НЕ, И(a, НЕ(b)), ИЛИ(a, НЕ(b)), и им подобные. Эти операции не обязательно реализуются специально, нередко они получаются как побочный эффект от схемотехнических решений при построении АЛУ.

При логических операциях перенос не используется.

Арифметические операции

Основные арифметические операции так же просты:

  • Сложение.
  • Вычитание.
  • Увеличение. Инкремент, +1. По сути, это сложение. Но операция настолько востребована, что часто реализуется отдельно.
  • Уменьшение. Декремент, -1.
  • Смена знака. Смена знака числа не тождественна инверсии.

К расширенным арифметическим операциям относятся:

  • Умножение.
  • Деление.

Да, мы все еще со школы знаем, что умножение и деление, вместе с сложением и вычитанием, являются основными действиями арифметики. Но их аппаратная реализация сложна, поэтому далеко не все процессоры их поддерживают. А если и поддерживают, то не всегда на аппаратном уровне, может быть и микропрограммная реализация.

Реализация умножения и деления в АЛУ встречается не часто. Зачастую это отдельные блоки умножителей/делителей.

В специализированных случаях могут быть реализованы и дополнительные операции, которые позволяют облегчить выполнение более сложных, комплексных, операций. Но это не обязательно на уровне АЛУ.

В арифметических операциях переносы имеют важное значение. Так сложение отличается от исключающего ИЛИ тем, что учитывает переносы между разрядами.

Дополнительным моментом, который надо учитывать, является существование знаковых и беззнаковых чисел. Это не всегда влияет на схемотехнику АЛУ, собственно выполнение операций. Но часто требует дополнительных схемотехнических решений для формирования служебных признаков (флагов результата, например).

Сдвиги

А вот эти операции нередко выполняются не АЛУ, а отдельными сдвигателями, которые могут включаться на входах АЛУ, но вне собственно АЛУ. Тем не менее, иногда АЛУ может выполнять и простые сдвиги на один разряд вправо или влево.

Заключение (промежуточное)

Сегодня мы "окинули взглядом" самые общие вопросы, касающиеся АЛУ и его работы. Процессоры могут включать в себя несколько разных АЛУ, с разной функциональностью, разным набором выполняемых операций.

В следующей статье займемся его внутренним устройством. При этом будем рассматривать лишь статические АЛУ. Надеюсь, будет интересно.

До новых встреч!

Наука
7 млн интересуются