![](/user_photo/_userpic.png)
книги / Математическая логика и теория алгоритмов. Анализ алгоритмов
.pdf![](/html/65386/197/html_BlbMZ2n6JK.OCqL/htmlconvd-1mvQx571x1.jpg)
База входов 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
![](/html/65386/197/html_BlbMZ2n6JK.OCqL/htmlconvd-1mvQx573x1.jpg)
Рис. 3.9. Схема алгоритма PLA
Результат ненулевой, поэтому третья маска Z (3) игнорируется, и производится чтение следующей маски. Она оказывается нулевой, поэтому вычисление заканчивается. Алгоритм представлен на рис. 5.9.
3.6.АНАЛИЗ УНИВЕРСАЛЬНОЙ ПРОГРАММЫ РАСПОЗНАВАНИЯ ПОСЛЕДОВАТЕЛЬНОСТИ СРАБАТЫВАНИЯ ДВОИЧНЫХ ДАТЧИКОВ ДЛЯ МИКРОКОНТРОЛЛЕРА 80С51 В СИСТЕМЕ PROTEUS 7.2SP6
Необходимо проанализировать программу для микроконтроллера 80С51 (по алгоритму ПЛА) для реализации автомата распознавателя заданной последовательности срабатывания датчиков 0132. При правильной последовательности срабатывания датчиков должна производиться выдача сигнала 1 (z1) на нулевой разряд порта. В случае любого нарушения последовательности выдается сигнал 1 на первый разряд выходного вектора (z2). Итак, на вход автомата подается следующая последо-
73
![](/html/65386/197/html_BlbMZ2n6JK.OCqL/htmlconvd-1mvQx574x1.jpg)
вательность 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
![](/html/65386/197/html_BlbMZ2n6JK.OCqL/htmlconvd-1mvQx575x1.jpg)
Таблица 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
![](/html/65386/197/html_BlbMZ2n6JK.OCqL/htmlconvd-1mvQx579x1.jpg)
Окончание табл. 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
![](/html/65386/197/html_BlbMZ2n6JK.OCqL/htmlconvd-1mvQx580x1.jpg)
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