Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ВС для ГОС (ПИ) / Котельников - Вычислительные машины, системы и сети

.pdf
Скачиваний:
290
Добавлен:
25.04.2015
Размер:
4.07 Mб
Скачать

 

+Uпит

 

+Uпит

 

 

 

 

 

 

R

 

 

Uвых

Uвых

 

 

 

U1

U2

U1

U2

 

а

б

Рис. 3.10. Вентиль ИЛИ-НЕ: а – схема на переключателях; б – схема на транзисторах

Чтобы понять, почему реализуются именно такие функции, можно воспользоваться известным нам правилом, что выходное напряжение является инверсным к току. Проанализируйте, для каких U1, U2 ток течет, а для каких нет.

Задание. Составить таблицы истинности для этих вентилей.

U1

U2

Uвых (И-НЕ)

Uвых (ИЛИ-НЕ)

 

 

 

 

0

0

 

 

 

 

 

 

0

1

 

 

 

 

 

 

1

0

 

 

 

 

 

 

1

1

 

 

 

 

 

 

Задание. Нарисовать схемы вентилей AND, OR и XOR.

Обозначения пяти основных вентилей на электрических схемах приведены на рис. 3.11а – российский стандарт (ГОСТ 2.743-91) и на рис. 3.11б

зарубежный стандарт (ANSI/IEEE Std 91-1984).

71

НЕ (NOT)

 

 

И-НЕ (NAND)

 

ИЛИ-НЕ (NOR)

И (AND)

 

 

ИЛИ (OR)

 

Исключающее

 

 

 

 

 

 

ИЛИ (XOR)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

&

 

 

 

1

 

 

 

&

 

 

1

 

 

 

=1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

а

б

Рис. 3.11. Основные вентили:

а – российский стандарт; б – зарубежный стандарт

Вентили И и ИЛИ получаются путем подключения инверторов к выходам вентилей И-НЕ и ИЛИ-НЕ. Таким образом, вентили И-НЕ и ИЛИ-НЕ требуют по два транзистора, а вентили И и ИЛИ – по три. Поэтому в большинстве компьютеров используются вентили И-НЕ и ИЛИ-НЕ. (На практике все вентили выполняются несколько сложнее, но вентили И-НЕ и ИЛИ-НЕ все равно проще, чем вентили И и ИЛИ.) Вентили могут иметь более двух входов (до восьми) и в этом случае называются 3И-НЕ, 4И-НЕ и т. д.

3.3.2. Реализация булевых функций

Чтобы реализовать булевы функции на вентилях, используют формульное задание функций.

Пример. Реализовать булеву функцию (см. пример в параграфе 2.3):

f x, y, z x y z x y z x y z .

72

x

y

z

x

y

z

 

 

 

 

 

 

x y z

 

x

 

 

 

 

 

 

 

 

 

 

 

x y z

f x, y, z

y

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

x y z

 

z

 

 

 

 

 

 

Рис. 3.12. Реализация функции f x, y, z (вертикальные линии проведены для удобства изображения)

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

3.3.3. Использование вентиля AND в качестве ключа

Рассмотрим двухвходовой вентиль AND. Обозначим его входы так, как приведено на рис. 3.13.

Вход данных

Выход

Вход

управления

Рис. 3.13. Двухвходовой вентиль AND

Таблица истинности этого элемента:

Вход управления

Вход данных

Выход

 

 

 

0

0

0

 

 

 

0

1

0

 

 

 

1

0

0

 

 

 

1

1

1

 

 

 

73

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

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

3.3.4. Использование вентиля XOR в качестве управляемого инвертора

По аналогии с предыдущим параграфом рассмотрим двухвходовой вентиль XOR (рис. 3.14).

Вход данных

Выход

Вход

управления

Рис. 3.14. Двухвходовой вентиль XOR

Таблица истинности вентиля XOR:

Вход управления

Вход данных

Выход

 

 

 

0

0

0

 

 

 

0

1

1

 

 

 

1

0

1

 

 

 

1

1

0

 

 

 

При Управлении = 0 на выходе повторяются входные данные, а при Управлении = 1 выход является инверсным ко входу. Таким образом, элемент XOR при нулевом сигнале управления работает как повторитель, а при единичном – как инвертор, т. е. является управляемым инвертором.

3.3.5. Преобразователи кодов

Шифратор (coder, CD) преобразователь, в котором при подаче сигнала на один из входов на выходе появляется двоичный код этого входа (рис. 3.15).

Если в шифраторе n выходов, то он имеет 2n входов.

74

Таблица истинности шифратора:

Входы

Y1

Y0

 

 

 

Х0

0

0

 

 

 

Х1

0

1

 

 

 

Х2

1

0

 

 

 

Х3

1

1

 

 

 

По таблице истинности можно вывести логические функции Y0 и Y1:

 

 

 

 

 

Y0 = X1 X3;

 

Y1 = X2 X3

 

 

 

X0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

X1

 

 

 

 

Y0

 

 

X0

CD

Y0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

X1

 

Y1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

X2

 

 

 

 

 

 

 

 

 

 

X2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Y1

 

 

X3

 

 

 

 

 

 

 

 

 

 

 

 

X3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

а

 

 

 

 

б

 

 

 

 

 

 

 

 

 

 

 

Рис. 3.15. Шифратор 42 (4 входа 2 выхода):

а – реализация на вентилях; б – обозначение на схемах

Дешифратор (decoder, DC) – преобразователь, в котором при подаче двоичного кода на вход на соответствующей выходной линии появляется сигнал (рис. 3.16).

Таблица истинности дешифратора:

Входы

 

Выходы

 

 

 

 

 

 

 

Х1

Х0

Y3

Y2

Y1

Y0

 

 

 

 

 

 

0

0

0

0

0

1

 

 

 

 

 

 

0

1

0

0

1

0

 

 

 

 

 

 

1

0

0

1

0

0

 

 

 

 

 

 

1

1

1

0

0

0

 

 

 

 

 

 

75

Логические функции имеют вид:

 

 

 

 

Y0 X 0 X1 ;

Y1 X 0 X1 ;

Y2 X 0 X1 ;

Y3 X 0 X1 .

X0

X0 X1 X1

 

 

 

 

 

 

Y0

 

 

 

 

 

 

X0

DC

Y0

X0

 

Y1

X1

 

Y1

 

 

 

 

 

 

 

 

Y2

 

 

 

 

 

 

 

 

 

 

Y3

X1

 

Y2

 

 

 

 

 

 

 

 

 

 

Y3

 

 

 

 

а

 

 

б

 

 

Рис. 3.16. Дешифратор 24:

 

 

 

а – реализация на вентилях; б – обозначение на схемах

 

 

3.3.6. Коммутаторы

Мультиплексор (multiplexer, MUX) схема, обеспечивающая передачу информации, поступающей по нескольким входам на один выход. Выбор входной линии осуществляется при помощи адресных входов (рис. 3.17).

Если в мультиплексоре n адресных линий, то максимальное количество входов может быть 2n.

Четыре вентиля AND используются в этой схеме в качестве ключей. Сигналы на двух нижних входах каждого вентиля AND являются управляющими и определяют, будет ли проходить на выход сигнал данных с верхнего входа. Две адресные линии А0 и А1 кодируют 2-битное число (0..3), которое указывает, какая из четырех входных линий данных D0D3 должна соединяться с выходом F. Каждый вентиль AND запускается определенной комбинацией адресных входов.

76

D0

 

 

 

 

 

D0

MUX

 

 

D1

 

D1

 

D2

 

 

 

 

 

F

D3

F

 

 

 

 

 

D2

 

A0

 

 

 

 

 

 

A1

 

D3

 

 

 

A0

 

 

 

A1

 

 

 

 

а

 

б

Рис. 3.17. 4-входовой мультиплексор:

а – реализация на вентилях; б – обозначение на схемах

Демультиплексор (demultiplexer, DMX) – схема, обеспечивающая передачу информации, поступающей по одному входу на один из нескольких выходов. Выбор выходной линии осуществляется при помощи адресных вхо-

дов (рис. 3.18).

D DMX F0

F1

A0

F2

A1

F3

Рис. 3.18. Демультиплексор

Задание. Построить схему демультиплексора из вентилей самостоятельно (аналогично мультиплексору).

3.3.7. Двоичная арифметика

Переполнение и перенос

Основной проблемой при выполнении арифметических операций в компьютере является переполнение (overflow) – ситуация, когда ответ не помещается в отведенную для него ячейку памяти (выходит за пределы допу-

77

стимого диапазона). Переполнение нужно строго контролировать, иначе при вычислениях могут появиться неверные ответы.

Ситуации переполнения при арифметических операциях с беззнаковыми и со знаковыми типами данных принципиально отличаются.

За переполнение при операциях с беззнаковыми типами данных в процессоре отвечает специальная ячейка памяти размером 1 бит, которая называется флаг переноса (carry flag, CF). Если флаг переноса равен 1, значит в результате последней выполненной арифметической операции над беззнаковыми данными произошло переполнение.

Переполнение при операциях со знаковыми типами данных в процессоре контролируется флагом переполнения (overflow flag, OF)1. Если флаг переполнения равен 1, то в результате последней выполненной арифметической операции над знаковыми данными произошло переполнение.

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

Поэтому не существует разных машинных команд для сложения/вычитания знаковых и беззнаковых типов, команды в том и другом случае используются одинаковые – ADD (addition) для сложения и SUB (subtract) для вычитания. При этом в процессоре одновременно формируются оба флага CF и OF по разным правилам и программист может контролировать тот или другой флаг в зависимости от того, с каким типом данных в настоящий момент идет работа.

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

Флаг переноса CF отвечает за переполнение при операциях с беззнаковыми типами, флаг переполнения OF отвечает за переполнение при операциях со знаковыми типами; вычисляются эти флаги по-разному, одновременно и независимо друг от друга2.

1Реализуются флаги переноса и переполнения в виде разрядов специального регистра процессора – регистра флагов (о регистрах речь в пособии пойдет ниже). Хорошие отладчики в разных средах программирования обычно позволяют просматривать состояния флагов переноса и переполнения.

2Не должно вводить в заблуждение терминологическое несоответствие – флаг переполнения OF, несмотря на название, отвечает только за переполнение при работе со знаковыми типами данных. Флаг переноса CF не всегда равен переносу из старшего разряда и на самом деле отвечает за переполнение при действиях с беззнаковыми типами данных.

78

Сложение беззнаковых типов данных

Правило 1. При сложении чисел, представленных в беззнаковых типах

данных, переполнение возникает в том случае, если есть перенос из старше-

го разряда результата.

Рассмотрим различные варианты сложения на примере 4-разрядного беззнакового типа с диапазоном [0..15].

Сложение без переполнения (без выхода результата из диапазона):

(+4)

+

0

1

0

0

(+5)

+

0

1

0

1

(+3)

0

0

1

1

 

(+10)

1

0

1

0

(+7)

 

0

1

1

1

(+15)

 

1

1

1

1

 

CF = 0

 

 

 

 

CF = 0

 

 

Поскольку перенос из старшего разряда результата отсутствует, то флаг переноса CF = 0 и беззнакового переполнения нет, поэтому ответы оказываются верными.

Сложение с переполнением:

(+4)

+ 0

1

0

0

(+15)

+ 1

1

1

1

(+12)

1

1

0

0

 

(+15)

1

1

1

1

(0)

1 0

0

0

0

(+14)

1 1

1

1

0

 

CF = 1

 

 

 

 

CF = 1

 

 

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

Сложение знаковых типов данных

Правило 2. При сложении чисел, представленных в знаковых типах

данных, переполнение возникает в том случае, если складываются два числа

с одинаковыми знаками, а знак результата противоположен знаку слагаемых.

79

Напомним, что за знак отвечает старший бит числа.

Следствие из правила 2: знаковое переполнение не может возникнуть при сложении чисел с разными знаками.

Примеры будем разбирать также в 4-разрядном, но уже знаковом типе данных с диапазоном [–8..+7].

Сложение без переполнения (жирным выделены старшие знаковые разряды чисел):

(+4)

+

0

1

0

0

(+7)

+

0

1

1

1

 

(–8)

+

1

0

0

0

( 6)

+

1

0

1

0

(+3)

 

0

0

1

1

 

(–5)

 

1

0

1

1

 

(+7)

 

0

1

1

1

 

(–2)

 

1

1

1

0

(+7)

 

0

1

1

1

(+2)

1

0

0

1

0

 

(–1)

 

1

1

1

1

 

(–8)

1

1

0

0

0

 

OF = 0

 

 

 

 

OF = 0

 

 

 

 

OF = 0

 

 

 

 

OF = 0

 

 

Заметьте, что, несмотря на наличие во втором и четвертом примерах переноса из старшего разряда, результат знакового сложения оказывается правильным и флаг OF = 0. Это ещё раз подтверждает тот факт, что знаковое и беззнаковое переполнения возникают независимо друг от друга.

Сложение с переполнением:

(+4)

+

0

1

0

0

(+7)

+

0

1

1

1

 

(–8)

+

1

0

0

0

 

(–5)

+

1

0

1

1

(+4)

 

0

1

0

0

 

(+2)

 

0

0

1

0

 

(–2)

 

1

1

1

0

 

(–4)

 

1

1

0

0

(–8)

 

1

0

0

0

 

(–7)

 

1

0

0

1

(+6)

1

0

1

1

0

(+7)

1

0

1

1

1

 

OF = 1

 

 

 

 

OF = 1

 

 

 

 

OF = 1

 

 

 

 

OF = 1

 

 

В каждом из последних примеров срабатывает Правило 2 и имеет место ситуация переполнения, следовательно, ответ получается неверным.

Замечание. При сложении чисел, представленных в знаковых типах данных, может применяться альтернативное правило переполнения: пере-

полнение возникает, когда перенос в старший разряд отличается от переноса из старшего разряда.

Примеры (с переполнением):

80