Теория автоматов

Автор: Пользователь скрыл имя, 23 Ноября 2012 в 10:03, курс лекций

Описание работы

Конечные автоматы и такие связанные с ними конструкции как линейные грамматики и регулярные выражения относятся к важнейшим понятиям информатики. Различные варианты конечных автоматов и близкие им математические объекты служат для описания и анализа технических устройств, различных систем и процессов, программ и алгоритмов. Теория автоматов является одним из старейших разделов теоретической информатики.
В читаемом курсе рассматриваются цифровые автоматы как теоретическая основа проектирования аппаратных средств ЭВМ последовательного типа. В этом случае принято рассматривать цифровой автомат как совокупность операционного автомата (исполнительного устройства) и управляющего автомата (собственно конечного автомата), образующих операционное устройство.

Содержание

Теория автоматов. Введение.
Теория автоматов. Арифметика ЦВМ
Теория автоматов. Системы счисления
Теория автоматов. Конечные цифровые автоматы.

Работа содержит 1 файл

ta.doc

— 1.01 Мб (Скачать)

 

В последнем случае в  псевдознаковом разряде частного оказывается 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.


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

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

Алгоритмы перевода чисел из системы  счисления с основанием p в систему счисления с основанием q

Перевод правильной дроби из кода Д1 в двоичную систему счисления

Перевод выполняется за n+1 такт, где n – число двоичных разрядов, обеспечивающих точность перевода такую же, как у исходного десятичного числа. Необходимое сило разрядов может быть определено из выражения

 где k – число разрядов десятичного числа, определяющее его точность.

Чтобы определить алгоритм перевода числа из системы счисления с основанием q  в систему счисления с основанием p, запишем числоAq в виде разложения по степеням 2:

Aq=a1p-1+a2p-2+…+anp-n=p-1(a1+p-1(a2+…+p-1(an+0))…).

(1)

Полученное выражение есть схема Горнера, определяющая последовательность действий при переводе.

Умножая Aq на p, получим смешанную дробь, целая часть которой будет равна первой цифре числа в системе счисления с основанием q. Далее, умножая дробную часть получившегося числа Aq на 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. при получении недопустимой тетрады;
  2. в младшей тетраде при наличии передачи единицы из младшей тетрады в старшую,
  3. коррекция в тетраде выполняется только один раз; т.е., если при коррекции возникает перенос в старшую тетраду, он не требует коррекции.

В любом случае коррекция в коде Д1 состоит в подсуммировании +6 к  тетраде, требующей коррекции. При  коррекции формируется символ переноса в старшую тетраду. Поэтому запись цифры из целой части дроби в коде Д1 в РгВ [10] следует производить после выполнения коррекции.

Перевод правильной дроби из двоичной системы счисления в код Д1

Так как код Д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) – погрешность перевода, обусловленная ограниченностью разрядной сетки, принятой в вычислениях.

Информация о работе Теория автоматов