книги / Математическая логика и теория алгоритмов. Анализ алгоритмов
.pdfБаза входов 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