
- •Оглавление
- •Введение
- •Методы разработки алгоритмов и программ имитационных моделей комбинационных схем и последовательных автоматов с памятью
- •Методы разработки алгоритмов имитационных моделей комбинационных схем
- •Непосредственнее решение функций алгебры логики
- •Метод бинарных функций
- •Решение функции алгебры логики методом адресных переходов
- •Элементы памяти полупроводниковых устройств
- •Классификация триггерных устройств
- •Триггер как элементарный последовательный автомат
- •Наиболее популярные методы разработки алгоритмов и программ имитационных моделей с памятью
- •Асинхронные триггеры
- •Асинхронный 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.
Вызов подпрограммы
В некоторых случаях удобно бывает выполнять один и тот же фрагмент кода из разных мест программы. Команды безусловного перехода goto для этого недостаточно, потому что нужно возвращаться именно в то место, откуда был произведен переход. Для этого используется связка fcall..return (1) или fcall..retlw (2). Отличием (1) от (2) является то, что инструкция return только возвращает управление на инструкцию, следующую за fcall, а retlw в дополнение к этому может возвратить какую-либо константу. Последняя также используется для организации lookup-таблиц.
fcall subprogram ; 1
movlw 0 ; 4
subprogram:
movlw 1 ; 2
return ; 3
В приведенном примере инструкции выполнятся в порядке, обозначенном в комментариях.
Использование среды mplab
Для проверки программ на учебных микропроцессорных комплектах рекомендуется использование среды MPLAB.
Рис. 2.3. Окно программы MPLAB IDE
Подготовка к набору программы
Перед началом работы с программой в среде MPLAB необходимо выбрать пункт меню File → New. Открывшийся файл необходимо сохранить с расширением .asm. Для этого следует вызвать пункт меню File → Save As. Маршрут сохраняемого файла должен содержать только английские буквы и не содержать пробелов. После этого можно приступить к набору текста.
Также необходимо указать MPLAB тип используемого микроконтроллера. Для этого необходимо выбрать пункт меню Configure › Select Device... и в открывшемся диалоговом окне (рис. 1.8.) выбрать тип устройства. В данном случае это PIC16F873A.
Рис. 2.4. Выбор типа микроконтроллера
Компиляция и запуск программы
Для запуска программы на учебном микропроцессорном комплекте ее следует транслировать в машинный код и загрузить полученный код в микропроцессорный комплект. Для трансляции следует выбрать пункт меню Project → Quickbuild, для загрузки в микропроцессорный комплект сначала следует выбрать средство отладки Pickit2 (Debugger → Select Tool →5 Pickit 2) а затем запустить программу (Debugger →Run).
В случае, если программа работает не так как ожидалось, можно воспользоваться пошаговым режимом выполненя. Для этого вместо команды на запуск (Debugger →Run), следует отдать команду шаг (Debugger →Step Over). При этом отладчик выполнить ровно одну инструкцию и остановится. Для выполнения следующего шага команду следует повторить.
Моделирование комбинационных автоматов
Метод непосредственного вычисления фал
Метод непосредственного вычисления ФАЛ заключается в повторении естественного алгоритма человеческого мышления, который используется для вычисления любых сложных выражений (арифметических, булевых и иных подобных). Естественный алгоритм содержит следующие шаги:
– Разбить сложное выражение на элементарные выражения.
– Определить последовательность вычисления элементарных выражений с учетом скобок, имеющихся в изначальном сложном выражении и приоритета операторов.
– Вычислить все элементарные выражения в порядке, установленном в пункте 2.
Достоинством метода является его относительная простота для понимания. Недостатками метода являются 1) потребность в дополнительном объеме памяти для хранения промежуточных результатов. 2) вычислительная сложность, прямо пропорциональная размеру моделируемой функции.
В качестве примера,
вычислим значение выражения
Для этого разобьём его на элементарные
выражения и определим порядок их
выполнения:
После чего поэтапно вычислим элементарные выражения и получим результат.
Метод непосредственного вычисления ФАЛ, применяемый для ОМЭВМ отличается от естественного тем, что в нем дополнительно решаются проблемы памяти. Человек при вычислении выражения не задумывается о том, куда сохраняются промежуточные результаты и каким образом об этих результатах узнают остальные, программист же должен явно указывать, в какую ячейку памяти записывать промежуточные результаты и с помощью каких устройств микропроцессорная система будет сообщаться с внешним миром. С учетом изложенного, алгоритм для ОМЭВМ принимает следующий вид:
Разбить сложное выражение на элементарные выражения.
Определить последовательность вычисления элементарных выражений с учетом скобок, имеющихся в изначальном сложном выражении и приоритета операторов.
Для каждого из элементарных выражений выделить ячейку памяти, в которой будут храниться результаты его вычисления.
Определить интерфейс микропроцессорной системы: то через какие устройства, она будет сообщаться с внешним миром. В самом простом случае это означает задаться битами портов ввода, откуда будет производиться чтение входных переменных и битами портов вывода, куда будет выводиться результат вычисления ФАЛ.
Для каждого из элементарных выражений записать последовательность мнемоник ассемблера, которая производит необходимые вычисления. Полученные последовательности расположить в файле исходного текста в соответсвии с установленным в пункте 2 порядком вычисления элементарных выражений.
В качестве примера напишем программу, вычисляющую следующую ФАЛ:
Элементарные операции вычисления этого выражения, а также порядок их выполнения примут следующий вид:
Как видно, выражение содержит 4 элементарных, поэтому для промежуточных результатов выделим 4 ячейки памяти и присвоим им имена EXPR_1 .. EXPR_4:
#define EXPR_1 H’20’
#define EXPR_2 H’21’
#define EXPR_3 H’22’
#define EXPR_4 H’23’
Определимся с интерфейсом: пусть переменным a, b, c, d соответствуют биты 0, 1, 2, 3 порта PORTB, а выходной переменной f — 0-й бит порта PORTC.
#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
Теперь запишем, в соответствии с установленным ранее порядком, последовательности мнемоник, вычисляющие каждое из элементарных выражений:
Элементарное
выражение 1 (
):
movlw 1
btfss IN_A
movlw 0
btfsc IN_B
iorlw 1
movf EXPR_1
Элементарное
выражение 2 (
):
movlw 1
btfss IN_C
movlw 0
btfsс IN_B
iorlw 0
movf EXPR_2
Элементарное
выражение 3 (
):
movlw 1
btfss EXPR_2
movlw 0
btfss IN_D
andlw 0
movf EXPR_3
Элементарное
выражение 4 (
):
movlw 0
btfss EXPR_1
movlw 1
btfss EXPR_3
andlw 1
movf EXPR_4
К вышенаписанному коду нужно добавить вывод результата (который получается в ячейке EXPR_4) в порт вывода.
btfss EXPR_4
bcf OUT_F
btfsc EXPR_3
bsf OUT_F
Полный исходный текст примера приведен в приложении A.1.