- •Декомпозиция задачи ввода данных в озу
- •Структуры данных
- •Разработка структуры данных программы для ввода данных в озу
- •Алгоритмизация программы
- •Подходы к алгоритмизации
- •Иерархическая организация алгоритма
- •Алгоритмизация программы для ввода данных в озу
- •1. Модуль "Тестовый контроль озу по шд" (dTstContr)
- •2. Модуль "Тестовый контроль озу по ша" (aTstContr)
- •3. Модуль "Вывод сообщений об ошибках" (ErMesOut)
- •4. Модуль "Ввод режимов" (ModeInput)
- •5. Модуль "Вывод сообщения о типе ввода" (InTpMesOut)
- •6. Модуль "Ввод с клавиатуры" (KbdInput)
- •7. Модуль "Контроль ввода с клавиатуры" (KbdInContr)
- •8. Модуль "Преобразование очередной цифры" (NxtDigTrf)
- •9. Модуль "Формирование информации" (InfoForm)
- •10. Модуль "Формирование массивов отображения" (DispForm)
- •11. Модуль "Вывод числовой информации" (NumInfOut)
- •12. Модуль "Функциональная подготовка" (FuncPrep)
- •3.4.4. Кодирование программы
- •Реализация логических конструкций структурного программирования
- •Кодирование программы для ввода данных в озу
- •3.4.5. Тестирование и отладка программы
- •3.4.6. Занесение программы на рабочий носитель
- •3.4.7. Оформление документации на программу
- •3.5. Проектирование аппаратных средств
- •3.5.1. Схемотехническое проектирование процессора
- •3.5.2. Схемотехническое проектирование памяти
- •Банкирование памяти
- •Организация банков памяти
- •Проектирование запоминающих устройств
- •3.5.3. Схемотехническое проектирование интерфейса
- •Организация ввода/вывода данных
- •3.5.4. Тестирование и настройка аппаратных средств
- •Тестирование статическими сигналами
- •Свободный прогон микропроцессора
- •3.6. Комплексная отладка микропроцессорной системы
- •Заключение
- •Список рекомендуемых источников
Разработка структуры данных программы для ввода данных в озу
Пример 3.3.
Разработать структуру данных программы работы устройства для ввода данных в ОЗУ.
Из статической модели этой программы (см. примеры 3.1, 3.2 и рис. 3.14, 3.15) следует, что данные в ней представлены следующими наборами:
1) "Сообщения о режимах";
2) "Образ клавиатуры";
3) "Очередная цифра";
4) "Адрес";
5) "Буферные данные";
6) "Данные в ОЗУ";
7) "Массивы отображения";
8) "Итоговые ошибки".
При разработке структуры данных целесообразно представлять их в виде, обеспечивающем простейшую реализацию выделенных программных модулей. При этом рациональный способ организации данных определяется формой представления входной и выходной информации устройства и функциями программных модулей.
Результаты разработки структуры данных программы для ввода данных в ОЗУ, полученные с учетом этого, приведены в табл. 3.1.
Из статической модели программы следует, что набор данных "Сообщения о режимах" включает в себя признаки, характеризующие режим работы, тип вводимой числовой информации и необходимость модификации адреса.
Очевидно, что информация о режиме может иметь лишь два значения ("Ввод"/"Просмотр"), что позволяет представить ее в виде флагового байта Mode с указанным кодированием.
Таблица 3.1
Структура данных программы для ввода данных в ОЗУ
Наименова- |
Символь- |
Формат |
Кодирование данных |
Примечание |
|||||||
ние данных |
ное имя |
данных |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
|
Сообщения о режимах: |
|
|
|
|
|
|
|
|
|
|
|
Режим |
Mode |
Флаговый байт |
0 1 |
0 1 |
0 1 |
0 1 |
0 1 |
0 1 |
0 1 |
0 1 |
"Ввод" "Просмотр" |
Тип ввода |
InType |
Флаговый байт |
0 1 |
0 1 |
0 1 |
0 1 |
0 1 |
0 1 |
0 1 |
0 1 |
"Адрес" "Данные" |
Инкремент адреса |
AddrInc |
Флаговый байт |
0 1 |
0 1 |
0 1 |
0 1 |
0 1 |
0 1 |
0 1 |
0 1 |
Пассивно "+1" |
Декремент адреса |
AddrDec |
Флаговый байт |
0 1 |
0 1 |
0 1 |
0 1 |
0 1 |
0 1 |
0 1 |
0 1 |
Пассивно "1" |
Образ клавиатуры |
KbdImage |
Массив байтов |
– – – – |
– – – – |
– – – – |
– – – – |
1 1 1 1 |
1 0 1 1 |
1 1 1 1 |
1 1 1 1 |
строка 0 строка 1 строка 2 строка 3 |
Очередная цифра |
NextDig |
Байт |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
Цифра "6" |
Адрес |
Addr |
Слово |
|
|
|
|
0 |
1 |
1 |
0 |
Младший байт |
|
|
|
|
|
|
|
|
|
|
|
Cтарший байт |
Буферные данные |
BufData |
Байт |
|
|
|
|
0 |
1 |
1 |
0 |
|
Данные |
RAMData |
Массив |
|
|
|
|
|
|
|
|
Объём |
в ОЗУ |
|
байтов |
|
|
|
|
|
|
|
|
64 |
|
|
|
|
|
|
|
|
|
|
|
Кбайт |
Массивы отображения: |
|
|
|
|
|
|
|
|
|
|
|
Отображение |
DataDisp |
Массив |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
Младшая цифра |
данных |
|
байтов |
0 |
0 |
0 |
0 |
|
|
|
|
Старшая цифра |
Отображение |
AddrDisp |
Массив |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
Младшая цифра |
адреса |
|
байтов |
0 |
0 |
0 |
0 |
|
|
|
|
Средняя цифра |
|
|
|
0 |
0 |
0 |
0 |
|
|
|
|
Средняя цифра |
|
|
|
0 |
0 |
0 |
0 |
|
|
|
|
Старшая цифра |
Итоговые ошибки: |
|
|
|
|
|
|
|
|
|
|
|
Пустая клавиатура |
EmpKbd |
Флаговый байт |
0 1 |
0 1 |
0 1 |
0 1 |
0 1 |
0 1 |
0 1 |
0 1 |
Непустая Пустая |
Ошибка ввода с клавиатуры |
KbdErr |
Флаговый байт |
0 1 |
0 1 |
0 1 |
0 1 |
0 1 |
0 1 |
0 1 |
0 1 |
Нет ошибки Ошибка |
Ошибка ОЗУ по ШД |
RAMErrD |
Флаговый байт |
0 1 |
0 1 |
0 1 |
0 1 |
0 1 |
0 1 |
0 1 |
0 1 |
Нет ошибки Ошибка |
Ошибка ОЗУ по ША |
RAMErrA |
Флаговый байт |
0 1 |
0 1 |
0 1 |
0 1 |
0 1 |
0 1 |
0 1 |
0 1 |
Нет ошибки Ошибка |
Аналогично, информация о типе ввода также может иметь лишь два значения ("Адрес"/"Данные") и представлена флаговым байтом InType. При одновременном нажатии кнопок "Адрес" и "Данные" на пульте (см. рис. 3.5) будем считать режим ввода неизменяющимся.
Информация о модификации адреса может иметь три значения: сохранение, инкрементирование и декрементирование адреса. Поэтому эта информация представлена в табл. 3.1 двумя флаговыми байтами AddrInc и AddrDec. При пассивном значении обоих флагов адрес не изменяется. При активном значении одного из флагов выполняется соответствующая модификация адреса. При одновременном нажатии кнопок "+1" и "1" на пульте (см. рис. 3.5) будем считать адрес неизменяющимся.
Набор данных "Образ клавиатуры" содержит информацию о состоянии клавиатуры. Предположим, что 16-ричная клавиатура имеет матричную организацию размером 4 4. Нажатая клавиша изображается в этом наборе нулевым битом, а ненажатые клавиши единичными (см. рис. 3.44). Таким образом, состояние набора данных KbdImage в табл.3.1 соответствует цифре "6".
Набор данных "Очередная цифра" содержит двоичный код очередной цифры, введенной с клавиатуры. Пусть этот код располагается в младшей тетраде байта NextDig, а его старшая тетрада будет обнулена.
Набор данных "Адрес" содержит адрес ячейки памяти для записи или считывания данных. В режиме ввода адреса содержимое этого набора формируется из цифр, вводимых с клавиатуры. При этом для отображения адреса в режиме бегущей строки справа налево очередная цифра включается в его младшую тетраду со сдвигом всех предыдущих цифр на тетраду влево. Этот факт отражен включением введенной цифры "6" в младшую тетраду набора Addr. Символ "" в табл. 3.1 обозначает произвольное значение двоичной цифры. Таким образом, адрес может принимать значения из диапазона 0...FFFFh. При модификации адреса содержимое этого набора инкрементируется или декрементируется в соответствии с указанием.
Набор "Буферные данные" содержит некоторые данные. В режиме ввода данных содержимое этого набора формируется аналогично набору "Адрес" в режиме ввода адреса. В режиме просмотра данных в набор BufData включается байт из ячейки памяти с адресом, содержащимся в наборе Addr.
Набор "Данные в ОЗУ" содержит массив введенных данных объемом до 64 Кбайт, формирование которого является основной целью решаемой задачи.
Набор данных "Массивы отображения" включает в себя массивы "Отображение данных" и "Отображение адреса". Каждый байт этих массивов содержит распакованный код цифры, отображаемой в соответствующем разряде знакосинтезирующего дисплея. Отображаемая цифра находится в младшей тетраде этих байтов, старшая тетрада которых равна нулю. Этот факт отражен в младшем байте массивов DataDisp и AddrDisp, остальные байты которых имеют тот же формат, но представлены в обобщенном виде.
Набор данных "Итоговые ошибки" содержит сообщение о состоянии клавиатуры (Пустая/Непустая), необходимое для предотвращения сдвига цифр в режиме ввода при ее пассивном состоянии (при отсутствии нажатых клавиш), а также сообщения об ошибке ввода с клавиатуры и ошибках тестового контроля ОЗУ по шинам адреса и данных. Очевидно, что все они могут иметь лишь два значения, что позволяет представить их флаговыми байтами EmpKbd, KbdErr, RAMErrA и RAMErrD соответственно.
Символьные имена всех наборов данных фактически являются адресами, по которым они расположены в памяти. Выбранные имена отображают содержательный смысл соответствующих наборов.
Дальнейшее проектирование программы заключается в переходе от ее статической модели к динамической, т. е. к ее алгоритмическому описанию.