Входной и выходной сигналы целесообразно хранить в регистрах, где они будут дожидаться запроса МП на чтение при вводе и запроса внешнего устройства (фронта синхросигнала) при выводе кода. Таким образом требуется наличие четырёх 8‑ми битных регистров.
Всего же требуется адресовать 10 устройств ввода\вывода. При этом задействуются биты А0‑А3. Запишем адреса внешних устройств в табл. 3.
Таблица 2. Адреса внешних устройств
N | Внешний сигнал | Адрес |
1 | Входной сигнал | 0001:0000 |
2 | 0011:0010 | |
3 | 0101:0100 | |
4 | 0111:0110 | |
5 | Выходной сигнал | 1001:1000 |
Обращение к тому или иному внешнему сигналу в зависимости от его адреса осуществим с помощью демультиплексора 555ИД7 1-8 и дополнительных логических элементов. На вход демультиплексора подаются биты А0‑А2. Бит А3 отвечает за то, осуществляется ли адресация к портам ввода или вывода.
Рассмотрим случай адресации к младшему байту порта ввода данных или вывода. Обозначим
– сигнал с выхода демультиплексора №0, – сигнал, который подаётся на регистр, отвечающий за приём входного кода, – сигнал, отвечающий за запись в регистр выходного кода. Составим таблицу истинности (табл. 2). При этом необходимо помнить, что у активный уровень (подключается к входу ), а – сигнал положительной логики (подключается к входу ).Таблица 3. Таблица истинности
0 | 0 | 0 | 0 |
1 | 0 | 1 | 1 |
0 | 1 | 1 | 0 |
1 | 1 | 1 | 0 |
Используя СКНФ, СДНФ и теорему де Моргана, запишем логические функции:
, .
Очевидно, что демультиплексор активируется, когда происходит цикл обращения к внешним устройствам ( ) и хотя бы один из сигналов или
равен нулю..
Сокращённая схема подключения устройств ввода\вывода изображена на рис. 3.
Общий вид МПС достигается совмещением рис. 1–3 на одном и соединением магистралей (шины данных, адреса и управления).
Рисунок 3. Проектирование устройств ввода\вывода
В соответствии с заданием программа разрабатывается на Ассемблере с использованием системы команд выбранного процессора.
Логически программа состоит из двух частей:
· основная часть программы для задания констант;
· программа обработки прерывания – получения входного шестнадцатибитного кода, выполнение математической операции и выдача шестнадцатибитного кода – результата математической операции:
. (1)Интеграл и дифференциал считаются по приближённым формулам:
·
·
.В данных выражениях
– период внешнего синхросигнала. В расчётах этот множитель участвовать не будет, а результат будет выдаваться пропорционально его значению.В системе команд процессора Z80 нет операции умножения, поэтому умножение осуществляется с помощью операций сложения и сдвига. Операция умножения восьмибитных чисел в тексте программы выполнена в виде процедуры MUL8_8. В данной процедуре представлен один из вариантов умножения байтов – умножение младшими разрядами вперёд со сдвигом частичной суммы вправо.
Расположение операндов:
– множимое, – множитель, – двухбайтный результат, используется в качестве счётчика регистр L.Операция умножения шестнадцатибитных чисел построена на операции умножения восьмибитных чисел и выполнена в виде процедуры MUL16_16. Метод вычисления 32‑х битного результата представлен на рис. 4.
Рисунок 4. Схема умножения 16-битных чисел
Т.к. входной код, равно как и константы, могут быть отрицательным числом, записанным в дополнительном коде, необходимо контролировать знак произведения. При этом все отрицательные сомножители входят в произведение по модулю, а знак произведения изменяется на противоположный, если сумма минусов, стоявших перед сомножителями, равна 1 (младший бит равен 1).
Расположение операндов в памяти:
– множимое, – множитель, причём коэффициент всегда располагается на месте множителя.Четырёхбитный результат помещается в память, начиная с адреса, указанного перед процедурой в парном регистре H-L.
Поскольку коэффициенты ПИД-регулятора по заданию постоянны, то нет смысла хранить их со знаком и при каждой операции умножения заново выделять знак и инвертировать при необходимости. Целесообразно хранить модули коэффициентов в одних ячейках памяти (KP, KI, KD), а знаки – в специальной ячейке памяти (далее «знаковой ячейке»), устройство которой представлено на рис. 5. Старшая тетрада является незначащей. Младшие четыре бита отвечают за отрицательность соответсвующего элемента, причём 1 означает, что соответсвующий коэффициент изначально отрицательный. В изображённом случае все коэффициенты положительны, кроме KP. Биты трёх коэффициентов остаются постоянными с момента запуска программы.
Рисунок 5. Организация знаковой ячейки
Значение же коэффициента E (
) изменяется не только при поступлении нового значения. Эта ячейка отвечает также за знак разности при приблизительном подсчёте дифференциала. Поэтому дифференциал целесообразно считать в последнюю очередь.Проверка знака произведения осуществляется в самой процедуре умножения. Т.к. множимое представляет собой либо
, либо разность , то ему однозначно соотстветствует младший бит ячейки памяти SIGN. С другой стороны необходимо знать, какой именно из коэффициентов участвует в произведении, чтобы потом определить его знак. Для этого используется другая ячейка памяти «ячейка номера» – NUMBER. В неё вносится номер: 1 соответствует КР, 2 – KI, 3 – KD. Во время процедуры значение этой ячейки полностью определяет, какой именно из коэффициентов участвует в произведении, поэтому перед выполнением процедуры умножения необходимо присвоить какое-либо значение из трёх.Программа для вычисления (1) требует обращения к ОЗУ. Расположение данных в ОЗУ представлено в табл. 4.
Таблица 4. Использование ОЗУ
№ | Адрес | Переменная | Примечание |
1 | 8003: 8002:8001: 8000 | INT_SUM | Интегральная сумма |
2 | 8004 | Sign | Знаковая ячейка |
3 | 8005 | Number | Ячейка номера |
4 | 8007: 8006 | PE | Предыдущее значение (число со знаком) |
5 | 8009: 8008 | СE | Текущее значение (число со знаком) |
6 | 800B: 800A | KP | Модуль |
7 | 800D: 800C | KI | Модуль |
8 | 800F: 800D | KD | Модуль |
WC (Workcell) – рабочие ячейки, необходимые для временного хранения результатов процедуры MUL16_16 и отдельных частей суммы (1). Далее записывается смещение относительно ячейки WC с адресом 8010. | |||
9 | 8011: 8010 | WC+1: WC+0 | Множимое (блок 2: 1 на рис. 4): текущее значение , разность |
10 | 8013: 8012 | WC+3: WC+2 | Множитель (блок 4: 3): коэффициент |
11 | none | WC+4 | Умерший товарищ |
12 | 8015: 8014 | WC+6: WC+5 | Блок 1×3 |
13 | 8017: 8016 | WC+8: WC+7 | Блок 2×3 |
14 | 8019: 8018 | WC+10: WC+9 | Блок 1×4 |
15 | 801B: 801A | WC+12: WC+11 | Блок 2×4 |
16 | 801F:801E:801D: 801C | WC+16: WC+15:WC+14: WC+13 | Результат умножения |
17 | 8023: 8022:8021: 8020 | WC+20: WC+19:WC+18: WC+17 | Результат умножения и |
18 | 9FFF | ST_PT | Вершина стека |
Программно переполнение (результат (1) превышает 32 бита) контролируется в трёх случаях: