
- •Оглавление
- •Введение
- •Методы разработки алгоритмов и программ имитационных моделей комбинационных схем и последовательных автоматов с памятью
- •Методы разработки алгоритмов имитационных моделей комбинационных схем
- •Непосредственнее решение функций алгебры логики
- •Метод бинарных функций
- •Решение функции алгебры логики методом адресных переходов
- •Элементы памяти полупроводниковых устройств
- •Классификация триггерных устройств
- •Триггер как элементарный последовательный автомат
- •Наиболее популярные методы разработки алгоритмов и программ имитационных моделей с памятью
- •Асинхронные триггеры
- •Асинхронный 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.
Метод адресных переходов (табулирование функций)
Метод адресных переходов основан на табулировании функций --- замены функции таблицей из двух столбцов, первый из которых содержит все допустимые наборы значений входных переменных, а второй --- значение функции на соответствующем наборе. Для функций алгебры логики такая таблица называется таблицей истинности.
Алгоритм реализации метода следующий:
Составить таблицу истинности ФАЛ. Размер таблицы должен составлять
, где
— число входных переменных.
Задаться интерфейсом микропроцессорной системы. Этот шаг аналогичен шагу в предыдущем алгоритме, использующем метод непосредственного вычисления ФАЛ.
Записать последовательность мнемоник ассемблера, преобразующую набор входных переменных в адрес ячейки, содержащей значение функции на данном наборе.
Записать последовательность мнемоник ассемблера, возвращающую значение ФАЛ по заданному адресу.
Разместить тем или иным способом таблицу в памяти ОМЭВМ.
Достоинством метода является наименьшая вычислительная сложность среди трех методов, описываемых в настоящем пособии. Вычислительная сложность метода адресных переходов никак не связана с размером и сложностью моделируемой функции. Недостатком метода является расход памяти на таблицу истинности, который зависит как от числа входных переменных.
Размещать таблицу истинности в памяти ОМЭВМ можно несколькими способами. Двумя наиболее распространенными из них являются способы размещения в ОЗУ и в ПЗУ. В качестве примера будет использоваться способ размещения данных в ПЗУ, т.к. он более простой в реализации на архитектуре PIC. Способ размещения в ОЗУ описан в приложении В.
Преобразование набора входных величин в адрес производится на основе следующих соображений. Любой адрес в ОМЭВМ представляет собой двоичное число. Поэтому, если взять произвольную ячейку памяти и заменить значения её младших разрядов значениями входных переменных, получим смещение относительно начала таблицы. Если затем прибавить адрес нулевой ячейки таблицы к полученному смещению, то получим адрес ячейки в котором находится искомое значение функции.
Для способа хранения таблицы в ПЗУ это реализуется следующим образом:
movlw 1 ; Предположим, что входной набор дал
; смещение 1
fcall lookup_table
... ; <- здесь в регистре W находится
; значение функции на заданном наборе
lookup_table:
addwf pcl ; Прибавляем начальный адрес
; к смещению в регистре W
retlw 0 ; 0-я ячейка таблицы
retlw 0 ; 1-я ячейка таблицы
...
retlw 1 ; N-я ячейка таблицы
Подобную таблицу следует размещать как можно ближе к началу исходного текста --- для того, чтобы её начальный адрес получился как можно меньшим. Несоблюдение этого правила может привести к тому, что в результате вычисления адресного перехода регистр переполнится и переход будет осуществлен неверно. Например, пусть таблица расположена в ПЗУ по адресу 250 и содержит 64 ячейки. Допустим нам необходимо получить содержимое 20-й ячейки, имеющей адрес 270. Произойдет следующее
movlw 20
fcall lookup_table
... ; <- сюда программа не вернется
; вследствие потери управления
250: lookup_table:
250: addwf pcl ; pcl = 250;
; 250 + 20 = 14 (!)
251: retlw 0 ; 1-я ячейка таблицы
252: retlw 0 ; 2-я ячейка таблицы
...
270: retlw 1 ; 20-я ячейка таблицы
и переход будет осуществлен на адрес 14, а не на 270.
В качестве примера, реализуем ФАЛ
методом адресных переходов. ФАЛ будет иметь следующую таблицу истинности
a |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
b |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
c |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
f |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
Интерфейс аналогичен описанному в разделе 3.1, за исключением отсутствия входной переменной d.
#define IN_A PORTB, 0
#define IN_B PORTB, 1
#define IN_C PORTB, 2
#define IN_C 2
#define OUT_F PORTC, 0
Преобразование входного набора в смещение производится следующим образом:
OFFSET: equ H'20'
RESULT: equ H'21'
movlw 0
movwf OFFSET
btfsc IN_A
bsf OFFSET, 2
btfsc IN_B
bsf OFFSET, 1
btfsc IN_C
bsf OFFSET, 0
Получение значения ФАЛ по заданному смещению и формат таблицы истинности аналогичны вышеописанному.
movf OFFSET
fcall lookup_table
lookup_table:
addwf pcl
retlw 0
retlw 0
retlw 0
retlw 1
retlw 1
retlw 1
retlw 1
retlw 1
Последним шагом будет размещение после инструкции fcall кода записи значения функции в выходную переменную и перехода на начало алгоритма.
movwf RESULT
decfsz RESULT
goto OUT_0
goto OUT_1
OUT_0:
bcf OUT_F
goto main
OUT_1:
bsf OUT_F
goto main
Полный исходный текст примера приведен в приложении А.3.