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

книги / Математическая логика и теория алгоритмов. Анализ алгоритмов

.pdf
Скачиваний:
3
Добавлен:
12.11.2023
Размер:
8.87 Mб
Скачать

База входов y2y1x2х1 База выходов z1z2

Х0(1)

0 0 1 1

 

 

 

 

 

ХД(1)

0 0 1 0

конъюнкция x2

 

1

x

Z(1)

0 0 1 0

 

 

 

 

 

Х0(2)

0 1 0 0

конъюнкция y1

ХД(2)

0 1 0 0

Z(2)

0 0 1 1

 

 

 

 

 

Х0(3)

1 0 0 1

 

 

 

 

 

ХД(3)

0 0 0 1

конъюнкция

 

2x1

y

Z(3)

0 0 0 1

 

 

 

 

 

 

0 0 0 0

признак окончания массива

Рассмотрим, как производятся вычисления. Пусть входное слово y2y1x2х1 = 0100. Оно маскируется первой, основной маской (константой):

0100

&

0011 Х0 (1)

0000

x2х1

Далее результат сравнивается путем сложения по модулю 2 с дополнительной маской:

0000

0010 ХД (1)

0010 0

Результат ненулевой: это значит, что конъюнкция x2 x1 1. Действительно, из входного слова видно, что х2 = 0, x1 = 0. Это

71

же видно и из результатов маскирования первой константы. Авторая константа показывает, что x1 должен быть равен 0, х2 = 1. Поэтому третья маска (выходов) игнорируется. После вычисления первой конъюнкции Z (1) пока считается равной нулю. Продолжаем вычисления.

Берем вторую тройку масок:

0100

&

0100 Х0 (2)

0100

0100

0100 ХД (2)

0100 = 0

Результат нулевой, значит, конъюнкция y1 = 1, что очевидно (для нас, но не для микропроцессора). Поэтому выходному сигналу присваивается значение маски Z (2) = 0011

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

Микропроцессор продолжает вычисления:

0100

&

1001 Х0 (3)

0000

0000

0001 ХД (3)

0001 0

72

Рис. 3.9. Схема алгоритма PLA

Результат ненулевой, поэтому третья маска Z (3) игнорируется, и производится чтение следующей маски. Она оказывается нулевой, поэтому вычисление заканчивается. Алгоритм представлен на рис. 5.9.

3.6.АНАЛИЗ УНИВЕРСАЛЬНОЙ ПРОГРАММЫ РАСПОЗНАВАНИЯ ПОСЛЕДОВАТЕЛЬНОСТИ СРАБАТЫВАНИЯ ДВОИЧНЫХ ДАТЧИКОВ ДЛЯ МИКРОКОНТРОЛЛЕРА 80С51 В СИСТЕМЕ PROTEUS 7.2SP6

Необходимо проанализировать программу для микроконтроллера 80С51 (по алгоритму ПЛА) для реализации автомата распознавателя заданной последовательности срабатывания датчиков 0132. При правильной последовательности срабатывания датчиков должна производиться выдача сигнала 1 (z1) на нулевой разряд порта. В случае любого нарушения последовательности выдается сигнал 1 на первый разряд выходного вектора (z2). Итак, на вход автомата подается следующая последо-

73

вательность ab: 00 → 01 → 11 → 10. Построим первичную таблицу переходов-выходов (табл. 3.6).

Таблица 3.6 Первичная таблица переходов-выходов

№такта

 

Входнойсигналab

 

Выходнойсигнал

00

01

11

10

z1

z2

 

1

1

2

5

5

0

0

2

6

2

3

6

0

0

3

7

7

3

4

0

0

4

 

 

 

4

1

0

5

 

 

5

5

0

1

6

6

 

 

6

0

1

7

7

7

 

 

0

1

Здесь учтены все нарушения заданной последовательности, устойчивые такты подчеркнуты. Так же, как и ранее, не предусмотрен возврат автомата в исходное положение.

Получим минимизированную таблицу переходов-выходов

(табл. 3.7).

 

 

 

 

Таблица 3.7

Минимизированная таблица переходов-выходов

 

 

Входнойсигналab

 

 

№строк

 

 

 

00

01

11

 

10

 

 

1,5

1

2

5

 

5

2,6

6

2

3

 

6

3,4,7

7

7

3

 

4

Построим таблицу переходов-выходов автомата Мили

(табл. 3.8).

Код клетки – дизъюнкция двоичного кода строки и двоичного кода столбца.

Получим таблицу констант для программы ПЛА. Метод программируемой логической матрицы (ПЛА) является универсальным и унифицированным методом вычисления логических функций.

74

Таблица 3.8 Таблица переходов-выходов автомата Мили

Кодсостояния

 

 

ab

 

 

 

 

 

 

Y2Y1

00

01

 

11

10

 

 

 

 

 

 

00H

01H

 

03H

02H

 

 

 

 

 

00

00

01

 

00

00

 

 

 

 

 

 

00

00

 

10

10

 

 

 

 

 

 

04H

05H

 

07H

06H

 

 

 

 

 

01

01

01

 

11

01

 

 

 

 

 

 

10

00

 

00

10

 

 

 

 

 

 

0CH

0DH

 

0FH

0EH

 

y2 y1

(t

1)

 

11

11

11

 

11

11

 

 

 

 

z1z2

 

 

10

10

 

00

01

 

 

 

 

 

 

 

 

 

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

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

Пусть база входного слова имеет вид y2y1(t)ab, база выходного слова – y2y1 (t + 1) z2z1.

Ниже приведена таблица констант, которая получена на основе таблицы переходов выходов

TABL:

db 0FH,01H,04H, db 0FH,02H,02H, db 0FH,03H,02H, db 0FH,04H,06H, db 0FH,05H,04H, db 0FH,07H,0CH, db 0FH,06H,06H,

75

db 0FH,0СH,0EH,

 

db 0FH,0DH,0EH,

 

db 0FH,0FH,0CH,

 

db 0FH,0EH,0DH,

00H

Рассмотрим подробнее, как они получены, на примере первой тройки констант. Первая константа 00FH одинакова для всех конъюнкций: существенны младшие 4 разряда разрядов, так как база входного слова y2y1(t)ab. Код клавиши занимает 2 младших разряда, затем идут два разряда, хранящие для кода состояния памяти автомата.

Следующие константы – код клетки с ненулевым содержимым (например, 01H). Последнюю константу получают следующим образом. Берут содержимое клетки, объединяют числитель и знаменатель и переводят его в шестнадцатеричный код:

0001 0100 04H. Аналогично получают остальные константы.

Последняя константа 00H – признак окончания, конец массива. Ниже приводится текст программы с необходимыми ком-

ментариями на языке ASM 51, реализующий алгоритм ПЛА:

P1 EQU 90H

; определение порта Р1

P2 EQU 0A0H

; определение порта Р2

Begin: MOV A, P1

; Считываем ab и заносим

 

в аккумулятор А

ANL A, #03h

; Маскируем ab

MOV R1, A

; ab в R1

MOV A, R3

; Внутреннее состояние в R3

ORL A, R1

; Получаем полное входное слово

MOV R1, A

; Полное входное слово в R1

MOV R2,#0

; Обнуляем R2 в нем выход

MOV DPTR,#TABL

; Указатель на массив констант

CLR A

; Очищаем аккумулятор

MOVCA,@A+DPTR

;ЗагружаемХ0(i)вА

MOV R0,A

; Х0(i) в R0

Next: MOV A, R0

; Х0(i) в A

76

ANL A,R1

; Маскируем входное слово Х0(i)

MOV R0,A

; Результат в R0

CLR A

; Очищаем аккумулятор

INC DPTR

; Инкрементируемрегиструказатель

MOVCA,@A+DPTR

;ЗагружаемХD(i)вА

XRL A,R0

; Сложение по модулю 2

 

; с предыдущим результатом

INC DPTR

; Инкремент регистра указателя

JNZ Check

; Переход если ноль

CLR A

; Очищаем аккумулятор

MOVCA,@A+DPTR

;ЗагружаемZ(i)

ORL A,R2

; выходное слово

MOV R2,A

; Сохраняем результат в R2

Check: CLR A

; Очищаем аккумулятор

INCDPTR

;Инкрементируемрегиструказателя

MOVCA,@A+DPTR

;ЗагружаемХ0(i +1)

MOV R0,A

; Х0(i + 1) в R0

JNZ Next

; Переход по нулю

MOV A,R2

; Выход в R2

ANL A,#0CH

; Выделяем y2(t + 1)y1(t + 1)

MOV R3,A

; Результат в R3

MOV P2, R2

; Вывод на Р2

JMP Begin

 

TABL:

 

db 0FH,01H,04H,

 

db 0FH,02H,02H,

 

db 0FH,03H,02H,

 

db 0FH,04H,06H,

 

db 0FH,05H,04H,

 

db 0FH,07H,0CH,

 

db 0FH,06H,06H,

 

db 0FH,0СH,0EH,

 

db 0FH,0DH,0EH,

 

db 0FH,0FH,0CH,

 

db 0FH,0EH,0DH,

00H

END

 

77

Как видно из программы, в регистре R1 хранится входное слово, в регистре R2 – выходное слово, в регистре R3 – внутреннее состояние автомата. Оценим сложность реализации автомата (табл. 3.9).

Таблица 3.9

Сложность реализации автомата

Метка

Команда

Байт

Циклов

1

Begin:

MOVA,P1

2

1

2

 

ANLA,#03h

2

1

3

 

MOVR1,A

1

1

4

 

MOVA,R3

1

1

5

 

ORLA,R1

1

1

6

 

MOVR1,A

1

1

7

 

MOVR1,A

1

1

8

 

MOVR2,#0

2

1

9

 

MOVDPTR,#TABL

3

2

10

 

CLRA

1

1

11

 

MOVCA,@A+DPTR

1

2

12

 

MOVR0,A

1

1

13

Next:

MOVA,R0

1

1

14

 

ANLA,R1

1

1

15

 

MOVR0,A

1

1

16

 

CLRA

1

1

17

 

INCDPTR

1

2

18

 

MOVCA,@A+DPTR

1

2

19

 

XRLA,R0

1

1

20

 

INCDPTR

1

2

21

 

JNZCheck

2

2

22

 

CLRA

1

1

23

 

MOVCA,@A+DPTR

1

2

24

 

ORLA,R2

1

1

25

 

MOVR2,A

1

1

26

Check:

CLRA

1

1

27

 

INCDPTR

1

2

28

 

MOVCA,@A+DPTR

1

2

29

 

MOVR0,A

1

1

30

 

JNZNext

2

2

31

 

MOVA,R2

1

1

78

Окончание табл. 3.9

Метка

Команда

Байт

Циклов

32

 

ANLA,#0CH

2

1

33

 

MOVR3,A

1

1

34

 

MOVP2,R2

1

1

35

 

JMPBegin

1

2

 

 

 

 

 

 

 

Итого

42байт

286циклов

Да ещё 33+1 = 34 байта таблицы. Всего 76 байт. Оценим время вычислений.

Оно зависит от размера таблицы и входного набора. До метки «Next:» 14 циклов, далее идёт цикл по таблице, если все конъюнкции актульны (истинны), чего, конечно, никогда не бывает, получаем от Next: до JNZ Next 26 машинных циклов. Умножаем на число конъюнкций (у нас 11), получаем 286 циклов. Да ещё после JNZ Next до JMP Begin – 6 циклов.

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

В заключение приведём изображение схемы программной реализации распознавания кода после получения последнего набора 10 (рис. 3.10).

Рис. 3.10. После получения последнего набора загорелся светодиод Z1 (пароль введен, замок открылся)

79

3.7.ПРОГРАММА РАСПОЗНАВАНИЯ ПОСЛЕДОВАТЕЛЬНОСТИ ВВОДИМЫХ

СКЛАВИАТУРЫ СИМВОЛОВ*

Внастоящее время в так называемых встроенных системах, широко используемых в «интернете вещей», для программирования контроллеров, реализующих достаточно сложные алгоритмы, используются языки высокого уровня. Рассмотрим пример программной реализации (на языке высокого уровня) конечного автомата, описанного выше. Программа распознаёт вводимый с клавиатуры пин-код 0132. При этом сам код в программе отсутствует, он определяется логическим преобразователем, заданным константами.

Программа реализации конечного автомата на языке СИ

#include <stdio.h>

Задание массива констант для

#include <stdlib.h>

кода 0132

//#define _CRT_SECURE_NO_WARNINGS

 

typedef struct {

 

unsigned char A1;

 

unsigned char A2;

 

unsigned char A3;

 

} A_type;

 

A_type A[24]=

 

{

 

{0x0f,0x01,0x04},

 

{0x0f,0x02,0x02},

 

{0x0f,0x04,0x06},

Длина массива (24) условная,

{0x0f,0x05,0x04},

{0x0f,0x07,0x0c},

рассчитана на максимальное

{0x0f,0x0d,0x0E},

количество констант.

{0x0f,0x0f,0x0c},

 

{0x0f,0x0e,0x0d},

 

{0,0,0}};

 

unsigned int x=0x0;//Input Vector

 

unsigned char y=0x0;//Memory

 

unsigned char z=0x0;//Output Vector

 

unsigned char T=0x0;//Temporal

 

* В написании и отладке программы участвовали доценты О.В. Гончаровский и М.В. Кавалеров.

80