Автор: Пользователь скрыл имя, 23 Ноября 2012 в 10:03, курс лекций
Конечные автоматы и такие связанные с ними конструкции как линейные грамматики и регулярные выражения относятся к важнейшим понятиям информатики. Различные варианты конечных автоматов и близкие им математические объекты служат для описания и анализа технических устройств, различных систем и процессов, программ и алгоритмов. Теория автоматов является одним из старейших разделов теоретической информатики.
В читаемом курсе рассматриваются цифровые автоматы как теоретическая основа проектирования аппаратных средств ЭВМ последовательного типа. В этом случае принято рассматривать цифровой автомат как совокупность операционного автомата (исполнительного устройства) и управляющего автомата (собственно конечного автомата), образующих операционное устройство.
Теория автоматов. Введение.
Теория автоматов. Арифметика ЦВМ
Теория автоматов. Системы счисления
Теория автоматов. Конечные цифровые автоматы.
В последнем случае в псевдознаковом разряде частного оказывается 1, которая и означает переполнение разрядной сетки.
Пусть С=А/В, А=-0,10101, В=0,11010. Дополнительные модифицированные коды делимого и делителя равны соответственно: Пример деления приведен в таблице 11.
Таблица 11 Деление двоичных чисел с фиксированной запятой без восстановления остатка со сдвигом текущего остатка
СМ |
РгС |
СТ |
Комментарии |
00,00000 +11,01011 11,01011 +00,11010 00,00101 |
- - - - - - |
6 |
СМ:=0, РгА:= , РгВ:= ТП:=0, СТ:=6, |
СМ:=СМ+РгА, | |||
|
SgСМ=SgРгВ? НЕТ. Следовательно, СМ:=СМ+РгВ, | ||
- - - - - 0 |
5 |
SgСМ=SgРгА? НЕТ. Следовательно, РгС[5]:=0, СТ:=СТ-1, | |
00,01010 +11,00110 11,10000 |
- - - - 0 - |
СТ=0? НЕТ. Следовательно, РгС:=L(1) РгС, СМ:=L(1) CM, | |
SgСМ=SgРгВ? ДА. Следовательно, | |||
- - - - 01 |
4 |
SgСМ=SgРгА? ДА. Следовательно, РгС[5]:=1, СТ:=СТ-1, | |
11,00000 +00,11010 11,11010 |
- - -01 - |
СТ=0? НЕТ. Следовательно, РгС:=L(1) РгС, СМ:=L(1) CM, | |
SgСМ=SgРгВ? НЕТ. Следовательно, СМ:=СМ+РгВ, | |||
- - - 011 |
3 |
SgСМ=SgРгА? ДА. Следовательно, РгС[5]:=1, СТ:=СТ-1, | |
11,10100 +00,11010 00,01110 |
- - 011 - |
СТ=0? НЕТ. Следовательно, РгС:=L(1) РгС, СМ:=L(1) CM, | |
SgСМ=SgРгВ? НЕТ. Следовательно, СМ:=СМ+РгВ, | |||
- - 0110 |
2 |
SgСМ=SgРгА? НЕТ. Следовательно, РгС[5]:=0, СТ:=СТ-1, | |
00,11100 +11,00110 00,00010 |
- 0110 - |
СТ=0? НЕТ. Следовательно, РгС:=L(1) РгС, СМ:=L(1) CM, | |
SgСМ=SgРгВ? ДА. Следовательно, | |||
- 01100 |
1 |
SgСМ=SgРгА? НЕТ. Следовательно, РгС[5]:=0, СТ:=СТ-1, | |
00,00100 +11,00110 11,01010 |
01100 - |
СТ=0? НЕТ. Следовательно, РгС:=L(1) РгС, СМ:=L(1) CM, | |
SgСМ=SgРгВ? ДА. Следовательно, | |||
011001 |
0 |
СТ=0? ДА. Выход из цикла. Проверяем переполнение разрядной сетки: РгС[0]=1? НЕТ. Следовательно, переполнение разрядной сетки отсутствует. | |
Далее определяем значение знака частного. SgAÅSgB=1, следовательно, полученный результат необходимо инвертировать, используя при этом сумматор. Окончательно частное будет иметь вид: [mc ]д =1.00111. |
Результат деления получается одинаковым, если сдвигать остатки от деления влево или сдвигать делитель вправо. В первом случае при делении необходимо использовать модифицированные коды, так как при сдвиге текущего остатка влево может возникнуть переполнение разрядной сетки сумматора. Которое исчезнет при следующем подсуммировании делителя. Во втором случае использовать модифицированные коды не надо, так как переполнение разрядной сетки возникнуть в принципе не может, поскольку в сложении всегда участвуют числа с разными знаками.
Рассмотрим
пример деления двоичных чисел с
фиксированной запятой без
Пусть С=А/В, А=-0,10101, В=0,11010. Дополнительные модифицированные коды делимого и делителя равны соответственно: Пример деления приведен в таблице 12.
Таблица 12 Деление двоичных чисел с фиксированной запятой со сдвигом делителя без восстановления текущего остатка
СМ |
РгВ |
РгС |
СТ |
Комментарии |
0,00000 00000 +1,01011 00000 1,01011 00000 +0,11010 00000 0,00101 00000 |
0,11010 00000 |
- - - - - - |
6 |
СМ:=0, РгА:= , РгВ:= ТП:=0, СТ:=6, |
СМ:=СМ+РгА, | ||||
|
SgСМ=SgРгВ? НЕТ. Следовательно, СМ:=СМ+РгВ, | |||
- - - - - 0 |
5 |
SgСМ=SgРгА? НЕТ. Следовательно, РгС[5]:=0, СТ:=СТ-1, | ||
0,00101 00000 +1,10011 00000 1,11000 00000 |
0.01101 00000 |
- - - - 0 - |
СТ=0? НЕТ. Следовательно, РгС:=L(1) РгС, РгВ:=R(1) РгВ, | |
SgСМ=SgРгВ? ДА. Следовательно, | ||||
0,00110 10000 |
- - - - 01 |
4 |
SgСМ=SgРгА? ДА. Следовательно, РгС[5]:=1, СТ:=СТ-1, | |
1,11000 00000 +0,00110 10000 1,11110 10000 |
- - -01 - |
СТ=0? НЕТ. Следовательно, РгС:=L(1) РгС, РгВ:=R(1) РгВ, | ||
SgСМ=SgРгВ? НЕТ. Следовательно, СМ:=СМ+РгВ, | ||||
- - - 011 |
3 |
SgСМ=SgРгА? ДА. Следовательно, РгС[5]:=1, СТ:=СТ-1, | ||
1,11110 10000 +0,00011 01000 0,00001 11000 |
0,00011 01000 |
- - 011 - |
СТ=0? НЕТ. Следовательно, РгС:=L(1) РгС, РгВ:=R(1) РгВ, | |
SgСМ=SgРгВ? НЕТ. Следовательно, СМ:=СМ+РгВ, | ||||
- - 0110 |
2 |
SgСМ=SgРгА? НЕТ. Следовательно, РгС[5]:=0, СТ:=СТ-1, | ||
0,00001 11000 +1,11110 01100 0,00000 00100 |
0,00001 10100 |
- 0110 - |
СТ=0? НЕТ. Следовательно, РгС:=L(1) РгС, РгВ:=R(1) РгВ, | |
SgСМ=SgРгВ? ДА. Следовательно, | ||||
- 01100 |
1 |
SgСМ=SgРгА? НЕТ. Следовательно, РгС[5]:=0, СТ:=СТ-1, | ||
0,00000 00100 +1,11111 00110 1,11111 01010 |
01100 - |
СТ=0? НЕТ. Следовательно, РгС:=L(1) РгС, РгВ:=R(1) РгВ, | ||
SgСМ=SgРгВ? ДА. Следовательно, | ||||
011001 |
0 |
СТ=0? ДА. Выход из цикла. Проверяем переполнение разрядной сетки: РгС[0]=1? НЕТ. Следовательно, переполнение разрядной сетки отсутствует. | ||
Далее определяем значение знака частного. SgAÅSgB=1, следовательно, полученный результат необходимо инвертировать, используя при этом сумматор. Окончательно частное будет иметь вид: [mc ]д =1.00111. |
Для реализации рассмотренной схемы деления понадобятся два регистра и сумматор с двойной точностью. Все остальные структурные элементы операционного автомата те же, что и при делении со сдвигом текущего остатка.
Деление всегда выполняется на сумматоре
инверсного кода (дополнительного или
обратного). Операционный автомат,
выполняющий деление двоичных чисел с
плавающей запятой, является составной
частью процессора, который решает также
задачи умножения и сложения. Выбор схемы
деления зависит от способа реализации
умножения с плавающей запятой. Так как
быстродействие процессора зависит от
наличия необходимого количества регистров
в сверхбыстрой регистровой памяти процессора,
целесообразно выбирать обе схемы таким
образом, чтобы для них использовались
одни и те же регистры с соответствующими
направлениями сдвигов.
Перевод выполняется за n+1 такт, где n – число двоичных разрядов, обеспечивающих точность перевода такую же, как у исходного десятичного числа. Необходимое сило разрядов может быть определено из выражения
где k – число разрядов десятичного числа, определяющее его точность.
Чтобы определить алгоритм перевода числа из системы счисления с основанием q в систему счисления с основанием p, запишем числоAq в виде разложения по степеням 2:
Aq=a1p-1+a2p-2+…+anp-n=p-1(a1+
(1)
Полученное выражение есть схема Горнера, определяющая последовательность действий при переводе.
Умножая Aq на p, получим смешанную дробь, целая часть которой будет равна первой цифре числа в системе счисления с основанием q. Далее, умножая дробную часть получившегося числа A’q на p, будем получать в целой части получающейся смешанной дроби значения очередных цифр в системе счисления с основанием р. При этом, если q>p, то цифры числа в новой системе счисления будут сразу получаться правильными. Если же p>q, то целая часть смешанной дроби, получающейся в результате умножения q-ичной правильной дроби на основание новой системы счисления будет представлять очередную цифру р-ичного числа кодовой последовательностью в q-ичной системе счисления. Из выражения (1) следует следующий алгоритм перевода правильной дроби из кода Д1 в двоичную систему счисления, представленный в табл. 1Примем значение исходного числа равным А10=0.13710. Число необходимых двоичных разрядов не меньше (3/lg2), т.е. больше или равно 10. Следовательно, необходимо принять число тактов равным 11 для последующего округления результата. В коде Д1 наше число будет иметь вид: А10= 0001 0011 0111. Умножение на 2 соответствует сдвигу регистра, в котором хранится число А на один разряд влево. Исходное число в коде Д1 хранится в РгА, Двоичный код записывается в РгВ последовательно разряд за разрядом, начиная со старшего разряда, путем сдвига РгВ влево. В таблице, представляющей алгоритм перевода, будем также записывать результат умножения десятичного числа на 2 в десятичной системе счисления (столбец А10), чтобы контролировать результат выполнения операций сдвига и коррекции в коде Д1. Таблица также содержит столбец СТ, в котором учитывается число уже выполненных тактов. Критерием завершения операции перевода является СТ=0.
Таблица 13 Перевод правильных дробей из кода Д1 в двоичную систему счисления
РгВ |
РгА |
А10 |
CT |
Комментарии |
***** ****** |
0.00001 0011 0111 |
0.137 |
11 |
Загрузить [A] в РгА. СТ:=11, РгВ:=0, |
***** *****0 |
0.0010 0110 1110 |
0.274 |
РгВ[10]:=РгА[0], РгА:=L(1)РгA, | |
0.0010 0111 0100 |
Выполнить коррекцию в тетрадах. Сравнить полученный результат с вычисленным значением А10. | |||
***** ****0* |
0.0100 1110 1000 |
0.548 |
10 |
РгВ[10]:=РгА[0], РгВ:=L(1)РгВ, РгА:=L(1)РгА, СТ:=СТ-1, |
0.0101 0100 1000 |
Выполнить коррекцию тетрад. | |||
***** ***00* |
0.1010 1001 0000 |
1.096 |
9 |
РгВ[10]:=РгА[0], РгВ:=L(1)РгВ, РгА:=L(1)РгА, СТ:=СТ-1, |
1.0000 1001 0110 |
Выполнить коррекцию тетрад | |||
***** **001* |
0.0001 0010 1100 |
0.192 |
8 |
РгВ[10]:=РгА[0], РгВ:=L(1)РгВ, РгА:=L(1)РгА, СТ:=СТ-1, |
0.0001 1001 0010 |
Выполнить коррекцию тетрад | |||
***** *0010* |
0.0011 0010 0100 |
0.384 |
7 |
РгВ[10]:=РгА[0], РгВ:=L(1)РгВ, РгА:=L(1)РгА, СТ:=СТ-1, |
0.0011 1000 0100 |
Выполнить коррекцию тетрад | |||
***** 00100* |
0.0111 0000 1000 |
0.768 |
6 |
РгВ[10]:=РгА[0], РгВ:=L(1)РгВ, РгА:=L(1)РгА, СТ:=СТ-1, |
0.0111 0110 1000 |
Выполнить коррекцию тетрад | |||
****0 01000* |
0.1110 1101 0000 |
1.536 |
5 |
РгВ[10]:=РгА[0], РгВ:=L(1)РгВ, РгА:=L(1)РгА, СТ:=СТ-1, |
1.0101 0011 0110 |
Коррекция тетрад | |||
***00 10001* |
0.1010 0110 1100 |
1.072 |
4 |
РгВ[10]:=РгА[0], РгВ:=L(1)РгВ, РгА:=L(1)РгА, СТ:=СТ-1, |
1.0000 0111 0010 |
Коррекция тетрад | |||
**001 00011* |
0.0000 1110 0100 |
0.144 |
3 |
РгВ[10]:=РгА[0], РгВ:=L(1)РгВ, РгА:=L(1)РгА, СТ:=СТ-1, |
0.0001 0100 0100 |
Коррекция тетрад | |||
*0010 10110* |
0.0010 1000 1000 |
0.288 |
2 |
РгВ[10]:=РгА[0], РгВ:=L(1)РгВ, РгА:=L(1)РгА, СТ:=СТ-1, |
Коррекция тетрад не требуется | ||||
00100 01100* |
0.0101 0001 0000 |
0.576 |
1 |
РгВ[10]:=РгА[0], РгВ:=L(1)РгВ, РгА:=L(1)РгА, СТ:=СТ-1, |
0.0101 0111 0110 |
Коррекция тетрад | |||
00101 011000 |
0.1010 1110 1100 |
1.152 |
0 |
РгВ[10]:=РгА[0], РгВ:=L(1)РгВ, РгА:=L(1)РгА, СТ:=СТ-1, |
1.0001 0101 0010 |
||||
00100 011000 + 1 00100 011001 |
СТ=0? ДА Выход из цикла. Округление СМ:=СМ+1, | |||
ШД:=РгB[0:10] – выдача результата в шину данных (ШД). |
Результат получается отбрасыванием младшего разряда суммы после округления.
Таким образом схема операционного автомата должна содержать двенадцатиразрядный РгА, одиннадцатиразрядный РгВ, счетчик числа циклов СТ и сумматор для выполнения округления. В этом случае нет необходимости в использовании полного двоичного сумматора. Поэтому можно применить комбинационную схему, выполняющую подсуммирование 1 в младший разряд полученного двоичного числа. Следует иметь в виду, что запятая в данном случае фиксирована слева от старшего разряда.
Коррекции в коде Д1 при сдвиге влево выполняются:
В любом случае коррекция в коде Д1 состоит в подсуммировании +6 к тетраде, требующей коррекции. При коррекции формируется символ переноса в старшую тетраду. Поэтому запись цифры из целой части дроби в коде Д1 в РгВ [10] следует производить после выполнения коррекции.
Так как код Д1 имеет веса разрядов 8-4-2-1, двоичная запись десятичной цифры, получающейся в результате умножения двоичного числа на 10, будет получаться непосредственно в ходе работы алгоритма. Чего нельзя сказать про коды Д2 и Д4.
Чтобы понять принцип работы алгоритма, рассмотрим пример обратного перевода числа 0.137 из двоичной системы счисления в десятичную.
Таблица 14 Перевод правильной дроби из двоичной системы счисления в код Д1
0.0010 0100 ´ 1010 0.010001100 +001.0001100 0001.010111100 |
Умножаем «столбиком» заданное двоичное число на 10, записанное в двоичной системе счисления. Все символы, находящиеся слева от старшего разряда, складываясь, образуют двоичный код Д1 десятичной цифры. Старшая десятичная цифра равна 0001=1 | |
0.010111100 ´ 1010 0.010111100 +001.011110000 0011.10101100 |
Умножаем дробную часть полученного произведения на 10, складываем частичные произведения. Получаем вторую цифру десятичной дроби в коде Д1: 0011=3. | |
0.101011 ´1010 1.010110 +101.011000 0110.101110 |
Третья цифра десятичной дроби равна 0110=6. Таким образом, результат перевода равен 0.136. Несовпадение с исходным числом (0.137) – погрешность перевода, обусловленная ограниченностью разрядной сетки, принятой в вычислениях. |