Опубликован: 03.04.2013 | Доступ: свободный | Студентов: 351 / 28 | Длительность: 34:17:00
Специальности: Разработчик аппаратуры
Лекция 2:

Междисциплинарный характер компьютерных проектов

1.6. Обобщенная схема организации вычислений

В машине Тьюринга можно выделить два уровня управления, один из которых связан с исполнением текущей инструкции "программы", а другой - с инициализацией самой инструкции или "чтением" самой программы, то есть с перемещением управляющего устройства по ленте. В реальных ЭВМ перемещение курсора машины Тьюринга заменено смещением указателя адреса по разделу памяти программ ( P- область ОЗУ) конечного объема. Аналогично и для перемещения по таблице управления устройства управления машины Тьюринга, которое в процессорах с микропрограммным управлением заменено модификацией адреса в постоянном запоминающем устройстве микропроцессора. Поэтому общая процедура выполнения инструкций программы имеет вид: "Делай то, что расположено по указателю адреса … в P- области ОЗУ над тем, что расположено по указателю адреса … в D- области ОЗУ" (рис. 1.13).

Общая схема работы процессора

Рис. 1.13. Общая схема работы процессора

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

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

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

  • символ (цифра) обозначает предмет или явление;
  • число или упорядоченная последовательность символов выражает количественные соотношения между предметами или явлениями;
  • код представляет упорядоченные последовательности символов.

Например, двоичная последовательность 1011 в ЭВМ может интерпретироваться:

  • как код операции по 13 адресу ПЗУ микропрограмм;
  • как целое число 13 без знака;
  • как отрицательное целое число -3;
  • как отрицательное дробное число -0,375, и т. п.

Но система преобразований булевой алгебры ЭВМ выбрана таким образом, чтобы выполненные над двоичной последовательностью инструкции не зависели от правил интерпретации переменных на входе и выходе ЭВМ. По этой причине даже знаковые разряды чисел "складываются" в дополнительных кодах по правилам значащих разрядов: число - 3 в дополнительном коде - 1101, а число -2 в дополнительном коде - 1110. Поэтому сложение кодов этих чисел в двоичной системе счисления имеет вид:

е^+ 1 0 0
х_2 1 1 1 0
x_1 1 1 0 1
\sum 1 1 0 1 1

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

e^+ = \begin{cases}
x_2 * x_1, & \text{если } e^- = 0, \\
x_2 + x_1(t), & \text{если } e^- = 1.
\end{cases} \\
\sum = \begin{cases}
\overline{x_2} * x_1 + x_2 * \overline{x_1}, & \text{если } e^- = 0, \\
\overline{x_2} * \overline{x_1}  + x_2 * x_1, & \text{если } e^- = 1. \\
\end{cases}

Здесь e^+, e^- и \sum - соответственно "единица переноса" в последующий разряд, "единица переноса" предыдущего разряда и "сумма" текущего разряда, а *, + и \overline{x} - соответственно булева операция "И", "ИЛИ" и "ОТРИЦАНИЕ".

Таким образом, входные данные ЭВМ сначала представляются в двоичном коде, далее над ними выполняются булевы преобразования,результаты которых интерпретируются ("трактуются") на выходе ЭВМ.

Следует иметь в виду, что правила интерпретации двоичных кодов чисел на входе ЭВМ существенно изменяют и систему преобразований булевых функций в самой ЭВМ. В нашем примере подразумевалась классическая позиционная система счисления, в которой "вес" i -го разряда для целых чисел определяется по правилу: w_i = 2^{i-1}. Однако это не единственная позиционная система счисления; для сравнения рассмотрим числа Фибоначчи и отвечающие им правила выполнения арифметических действий [37].

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

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

Обозначим через \varphi_1(l) количество пар кроликов по истечении l месяцев с начала размножения ( l=0, 1, 2, 3, … ). Тогда при l > 2 количество пар кроликов можно определить по рекуррентному соотношению: \varphi_1(l-1) + \varphi_1(l-2)

В этом соотношении начальные условия зависят от "зрелости" кроликов в начале размножения:

  • \varphi_1(0) = 1; \varphi_1(1) = 2 - для зрелой пары,
  • \varphi_1(0) = \varphi_1(1) = 2 - для незрелой пары.

Тогда последовательности чисел Фибоначчи запишутся:

  • а) 1, 2, 3, 5, 8, 13, 21, 34, … - для зрелой пары,
  • б) 1, 1, 2, 3, 5, 8, 13, 21, 34, … - для незрелой пары, то есть эти последовательности разнятся только на первом шаге.

Обобщенные числа Фибоначчи \varphi_p учитывают разные периоды ( p ) созревания молодых пар и разные коэффициенты размножения.

Связь чисел Фибоначчи с последовательностью двоичных "весовых" коэффициентов достаточно проста и определяется условием "мгновенного" созревания молодых пар p = 0. Тогда \varphi_0(l) = 2 \varphi_0(l-1); \varphi_0(0) = 1 и поэтому \varphi_0(l) = 2^l, то есть последовательность "весовых" коэффициентов класси-ческой позиционной двоичной системы счисления: 1, 2^1, 2^2, 2^3, …, 2^l.

Если p = 1, то получим классический ряд чисел Фибоначчи, а если p = \infty, то есть процесс созревания молодой пары кроликов приобрел бесконечный характер, то в случае взрослой пары только она и размножается: \varphi_{\infty}(l) = l+1, а в случае новорожденной пары \varphi_{\infty}(l) = 1 const.

Как и в любой позиционной системе счисления, представление деся тичных чисел в базисе Фибоначчи имеет вид X_n = \sum_i{x_i * w_i}, но w_i = \varphi_1(i), а не 2^{i-1}:

l 0 1 2 3 4 5 6 7 8 9 10
\varphi_1(l) 1 1 2 3 5 8 13 21 34 55 89
X_1=33 0 1 0 1 0 1 0 1 0 0 0
Х_2=32 0 0 0 1 0 1 0 1 0 0 0

В нашем примере X_1 = 33 = 21+8+3+1, а X_2 = 32 = 21+8+3.

В системе Фибоначчи число считается нормализованным, если в нем нет смежных "единичных разрядов". Например, число 5 = 01011 считается ненормализованным, так как в его правых, младших разрядах подряд стоят две "единицы", которые можно заменить одной "единицей" в ближайшем, старшем разряде: 01011 = 01100 = 10000 = 5.

В арифметике Фибоначчи арифметические действия выполняются только над нормализованными числами. В частности, сложение выполняется по следующей схеме:

X_1=33 0 0 0 1 0 1 0 1 0 1 0
Х_2=32 0 0 0 1 0 1 0 1 0 0 0
\Sigma^1 0 0 1 0 1 0 1 0 0 1 0
е^1 0 0 0 0 0 1 0 1 0 1 0

Здесь "единица переноса" "раздваивается" и, как обычно, учитывается при суммировании старшего разряда, а также размещается со сдвигом на 2 разряда в частной единице переноса e^1.

Полученная частная сумма \Sigma^1 и частная "единица переноса" e^1 имеют нормализованное представление, поэтому на втором шаге их можно сложить:

\Sigma^1 0 0 1 0 1 0 1 0 0 1 0
e^1 0 0 0 0 0 1 0 1 0 1 0
\Sigma^2 0 0 1 0 1 1 1 1 1 0 0
e^2 0 0 0 0 0 0 0 0 0 0 0 1

Результат суммирования получился ненормализованным и его надо привести к нормализованному виду. Нормализация проводится начиная со старшей группы разрядов, где стоят подряд как минимум две "единицы":

\Sigma^2 0 0 1 0 1 1 1 1 1 0 0
\Sigma^3 0 0 1 1 0 0 1 1 1 0 0
\Sigma^4 0 1 0 0 0 0 1 1 1 0 0
\Sigma^5 0 1 0 0 0 1 0 0 1 0 0
\varphi_1(l) 89 55 34 21 13 8 5 3 2 1 1

Нормализованный результат имеет вид: 01000100100 = 55+8+2 = 65, и его можно использовать в дальнейших вычислениях.

Отсюда, система булевых преобразований в одноразрядном сумматоре Фибоначчи имеет вид: \Sigma_i. = х_1 \oplus y_i. и e_i = х_i * у_i.

Таким образом, аппаратные затраты сумматора Фибоначчи гораздо меньше классического "булевого" сумматора, но процедура суммирования чисел Фибоначчи носит итеративный характер и требует циклической процедуры нормализации промежуточных операндов. Представление чисел в системе Фибоначчи требует большей разрядной сетки, чем классическое булево представление, так как "вес" разряда в последнем случае нарастает по самому быстрому экспоненциальному закону. Однако такую избыточность можно использовать для повышения обнаружения ошибок арифметических действий и повышения отказоустойчивости ЭВМ Фибоначчи [37].