- •Оглавление
- •Введение
- •Методы разработки алгоритмов и программ имитационных моделей комбинационных схем и последовательных автоматов с памятью
- •Методы разработки алгоритмов имитационных моделей комбинационных схем
- •Непосредственнее решение функций алгебры логики
- •Метод бинарных функций
- •Решение функции алгебры логики методом адресных переходов
- •Элементы памяти полупроводниковых устройств
- •Классификация триггерных устройств
- •Триггер как элементарный последовательный автомат
- •Наиболее популярные методы разработки алгоритмов и программ имитационных моделей с памятью
- •Асинхронные триггеры
- •Асинхронный rs-триггер
- •Асинхронные s-, r- и e-триггеры
- •Асинхронный d-триггер
- •Асинхронные т-триггеры
- •Асинхронные jk-триггеры с импульсным управлением
- •Асинхронные потенциально управляемые jk-триггеры
- •Синхронные (тактируемые) триггеры
- •Синхронный rs-триггер
- •Синхронный d-триггер
- •Синхронный jk-триггер
- •Универсальные d- и jk-триггеры
- •Примеры схем, построенных с применением jk-триггера к155тв1
- •Пример разработки имитационной модели триггерного устройства
- •Непосредственное решение уравнений, описывающих работу триггерной установки
- •Использование графа состояний триггерного устройства для разработки алгоритма
- •Применение таблицы переходов для решения поставленной задачи
- •Реализация дискретных устройств на микроконтроллерах pic16
- •Введение в программирование микроконтроллеров pic16
- •Краткие сведения об архитектуре микроконтроллеров pic16 и принципе их работы
- •Язык ассемблера pic16
- •Команды пересылки
- •Арифметические команды
- •Булевы операции
- •Битовые операции
- •Операции условного, безусловного переходов и вызова подпрограмм
- •Общий вид программы и типовые приемы программирования
- •Битовая арифметика
- •Ветвление
- •Вызов подпрограммы
- •Использование среды mplab
- •Моделирование комбинационных автоматов
- •Метод непосредственного вычисления фал
- •Метод бинарных функций
- •Метод адресных переходов (табулирование функций)
- •Приложение а. Исходные тексты примеров а.1. Применение метода непосредственного вычисление фал
- •А.2. Применение метода бинарных программ
- •А.3. Применение метода адресных переходов а.3.1. Способ размещения таблицы в пзу
- •А.3.2. Способ размещения таблицы в озу
- •А.4. Модуль hdw_init
- •Приложение б. Краткий справочник инструкций pic16
- •Библиография
- •Имитационное моделирование дискретных устройств
- •620034, Екатеринбург, ул. Колмогорова, 66.
Метод бинарных функций
Метод бинарных функций предлагает поэтапный способ решения задач путем их разбиения на более простые, причем сложность каждой из последних должна быть строго меньше исходной. В случае с вычислением ФАЛ можно поступить следующим образом. Предположим, что нам известно значение одной из переменных ФАЛ. Тогда, подставив это значение в функцию ее можно упростить. В качестве пример возьмем ФАЛ
Допустим мы
узнали, что
.
Тогда
Если же мы
узнали, что
,
то
Задача распалась на 2 подзадачи, сложность каждой из которых строго меньше исходной. В случае, если какая-либо из подзадач не является тривиальным выражением (т.е. по-прежнему содержит входные переменные), к ней следует снова применить описанные манипуляции: взять какую-либо из переменных, сначала задаться её нулевым значением, упростить, затем задаться единичным и т.п.
Таким образом, метод бинарных программ позволяет свести сколь угодно сложную ФАЛ к набору тривиальных задач. Алгоритм реализации этого метода для ОМЭВМ cостоит из 2 стадий:
Составить граф бинарных переходов:
Выбрать любую из переменных в составе ФАЛ.
Задаться единичным значением переменной, подставить его в исходную ФАЛ, упростить.
Задаться нулевым значением переменной, подставить его в исходную ФАЛ, упростить.
Отразить полученные расчеты в графе.
В случае, если какая-либо из полученных в результате упрощения ФАЛ не является тривиальной, применить к ней этот алгоритм, начиная с пункта (a).
На основе полученного графа, составить программу.
Задаться интерфейсом микропроцессорной системы. Этот шаг аналогичен шагу в предыдущем алгоритме, использующем метод непосредственного вычисления ФАЛ.
Расставить метки. По одной для единичного и нулевого результата функции и по одной для каждой вершины графа бинарных переходов.
Под метками единичного и нулевого результата записать последовательность мнемоник ассемблера, записывающую в выход единицу и нуль соответсвенно и осуществляющую безусловный переход к начальной вершине графа.
Под метками вершин записать последовательность мнемоник ассемблера, осуществляющую условные переходы по исходящим ребрам вершины.
Достоинством метода являются: 1) пониженная по сравнению с методом непосредственного вычисления ФАЛ вычислительная сложность 2) отсутствие потребности в месте для хранения промежуточных результатов. Недостатком метода является его относительная сложность и трудоемкость составления графа бинарных переходов.
В качестве примера вычислим ту же ФАЛ, что и в разделе 2.2.1:
Допустим,
что
.
Тогда
Допустим, что
.
В таком случае
Отразим это в графе бинарных переходов:
Далее рассмотрим
аналогичным образом рассмотрим левое
выражение
:
:
Граф примет вид:
Теперь можно
поступить двояко: 1) начать рассматривать
правую ветку исходной ФАЛ
или 2) выражение
.
Рассмотрим вариант 1).
:
:
Граф примет вид:
Рассмотрим выражение .
:
:
Осталось выражение d, применение метода к которому тривиально и здесь не приводится. Готовый граф бинарных переходов примет вид:
Этот граф решает поставленую задачу. Тем не менее, можно заметить, что проверка переменной b осуществляется 2 раза. Действительно, если начать с рассмотрения переменной b, то получим более оптимальный вариант, в котором максимальное число проверок переменных будет снижено.
Итак, граф бинарных переходов получен. Перейдем ко второму этапу. Программу будем составлять на основе первого полученного графа.
Интерфейс аналогичен описанному в разделе 3.1
#define IN_A PORTB, 0
#define IN_B PORTB, 1
#define IN_C PORTB, 2
#define IN_D PORTB, 3
#define OUT_F PORTC, 0
Расставим метки:
out_1:
out_0:
check_a:
check_b1:
check_b2:
check_c:
check_d:
Запишем код для единичного и нулевого результатов:
out_1:
bsf OUT_F
goto check_a
out_0:
bcf OUT_F
goto check_a
Запишем условные переходы под каждой из вершин:
check_a:
btfsc IN_A
goto check_b1
goto check_b2
check_b1:
btfsc IN_B
goto out_1
goto check_c
check_b2:
btfsc IN_B
goto out_1
goto out_0
check_c:
btfsc IN_C
goto out_1
goto check_d
check_d:
btfsc IN_D
goto out_1
goto out_0
Полный исходный текст примера приведен в приложении Б.
