Арифметико-логическое устройство

 

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

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

 

Рис. 2.17 - Структура АЛУ

 

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

Рассмотрим, как выполняется команда вычитания на примере микрокон­троллера Microchip PIC. Вместо вычитания одного числа из другого, проис­ходит добавление отрицательного числа:

А - В = А + (-В).

где отрицательное число -В представляется в дополнительном коде. Чтобы получить дополнительный код отрицательного двоичного числа, необходимо инвертировать значение каждого бита, а затем прибавить единицу:

Если есть схема преобразования отрицательных чисел в дополнительный код, то нет необходимости использовать схему вычитания. Достаточно иметь в составе АЛУ сумматор, который реализует вычитание с помощью следую­щей замены:

.

Этот метод выполнения вычитания может вызвать некоторые затрудне­ния при анализе полученного результата, если учитывать флаг переноса, ус­танавливаемый в результате сложения и вычитания.

В «классических» АЛУ, которые имеют сумматор и вычитатель, часто ис­пользуется общий флаг «переноса-заема». Этот флаг устанавливается в 1, когда результат сложения больше, чем 00FFh или результат вычитания меньше нуля. В обоих случаях флаг используется для указания того, что значение 8-и старших бит результата зависят от результата, полученного при операции над 8-ю младшими битами.

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

 

0077h – 0055h = 0077h + (-0055h) = 0077h + 00AAh + 1 = 0122h

 

Результат получился больше, чем 00FF, что приводит к установке флага переноса I в младшем бите старшего байта (флаг переноса/заема в этом слу­чае не равен 1). Младшие восемь бит равны 22h (что и ожидалось) - это значение будет записано в качестве результата в приемник

Следующий пример иллюстрирует ситуацию, когда большее число вычи­тается из меньшего числа:

 

0055h – 0077h = 0055h + (-0077h) = 0055h + 0088h + 1 = 00DEh

 

В этом примере младшие 8 разрядов представляют число 22 в дополни­тельном коде (что и ожидалось), а бит переноса в старший байт (флаг пере­носа) равен 0. такой как ожидалось. В «классическом» АЛУ для данного при­мера результат также будет иметь значение 00DEh , но установится флаг заема-переноса равный 1.

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

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

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