ЭМУЛЯТОР ПЗУ
С. БЕЛЯЕВ, Д. ЧЕРНЫХ, г. Тамбов
Описываемый в статье эмулятор вместе с компьютером может на время отладки программного обеспечения микропроцессорного устройства заменить его ПЗУ. Это позволит оперативно корректировать программу, экономя время, которое иначе было бы потрачено на перепрограммирование РПЗУ. Эмулятор работает сравнительно медленно, так как в нем нет собственной оперативной памяти. Но по той же причине он прост и дешев.
Одна из проблем, возникающих при разработке микропроцессорной аппаратуры - отладка записываемой в ПЗУ программы. Обычно для этой цели используют так называемые репрограммируемые ПЗУ (РПЗУ) со стиранием информации ультрафиолетовым облучением. Поскольку любое изменение программы приводит к необходимости стирать РПЗУ и заново записывать в него информацию, отладка отнимает много времени. К тому же после 10-25 циклов, с каждым из которых надежность хранения данных уменьшается, микросхему приходится заменять. Таким образом, творческая работа омрачается нудным механическим процессом перезаписи, не говоря уже о финансовой стороне вопроса - РПЗУ с ультрафиолетовым стиранием недешевы.
Решить проблему поможет эмулятор, принципиальная схема которого показана на рис. 1. Вместо микросхемы ПЗУ емкостью до 64 Кбайт в предназначенную для нее панель отлаживаемого устройства вставляют вилку ХР1. В зависимости от типа ПЗУ может измениться только порядок подключения проводов эмулятора к контактам вилки (приведенный на схеме соответствует микросхеме 27512 емкостью 64 Кбайт).
Puc.1Вилку ХР2 соединяют с розеткой параллельного порта LPT1 любого IBM-совместимого персонального компьютера (ПК). Так как порт предназначен в основном для передачи данных внешнему устройству (принтеру), он имеет 12 выходных и всего пять входных линий. Это вынуждает мультиплексировать принимаемый компьютером 16-разрядный адрес ПЗУ, что, конечно, сказывается на скорости эмуляции.
Эмулятор состоит из следующих функциональных блоков: тактового генератора (DD1.1-DD1.2), синхронизатора тактовых импульсов (DD2.2, DD3.1), устройства запуска (DD2.1), счетчика импульсов (DD4), формирователя импульсов записи блоков адреса (DD1.5, DD3.3), регистра данных (DD5) и мультиплексора адреса (DD6, DD7).
Работа начинается с приходом от микропроцессорного устройства низкого уровня сигнала CS на вход S (вывод 4) триггера DD2.1 (временные диаграммы сигналов изображены на рис. 2).
Puc.2Последний переходит в состояние, соответствующее логической 1 на прямом выходе (вывод 5), соединенном с входом D (вывод 12) триггера DD2.2. По спаду тактового импульса (это обеспечивает инвертор DD1.4) логическая 1 появляется и на выходе (вывод 9) DD2.2, разрешая прохождение тактовых импульсов на выход элемента DD3.1. Их подсчитывает счетчик DD4, выходные сигналы двух младших разрядов которого управляют мультиплексорами адреса DD6 и DD7. Адрес ПЗУ передается в ПК четырьмя четырехразрядными группами: А0-A3, А4-А7, А8-А11, А12-А15. Для его приема служат входы ERROR, SLCT, АСК, РЕ параллельного порта.
Счетчик DD4 охвачен обратными связями таким образом, что его коэффициент пересчета равен 5. Именно столько периодов тактовых импульсов занимает цикл эмуляции. В первых четырех импульсы с выхода элемента DD3.4, поступая на вход BUSY порта LPT одновременно с переключением мультиплексоров, синхронизируют процедуру чтения адреса компьютером. В пятом периоде компьютер выдает на выходы DATA1-DATA8 байт данных, который должен находиться в эмулируемом ПЗУ по заданному адресу. Этот байт заносится в регистр DD5. По окончании периода триггер DD2.1 возвращается в исходное состояние. Правда, последнее произойдет лишь при условии, что сигнал CS к этому моменту закончился. В противном случае описанный цикл повторится.
Эмулятор собран на двусторонней печатной плате, чертеж которой показан на рис. 3. На плате предусмотрены группы контактных площадок Х1-Х4, к которым припаивают провода, идущие к вилкам ХР1 и ХР2.
Рис.ЗВместо микросхем, указанных на принципиальной схеме, допустимо использовать их функциональные аналоги из любых серий ТТЛ или ТТЛШ (К155, К555, КР1533, КР531). При замене микросхемы DD1 может потребоваться подборка элементов тактового генератора (R1, R3, С2), от частоты повторения импульсов которого зависит скорость эмуляции. Устанавливать частоту выше 100 кГц не рекомендуется, так как это может привести к сбоям.
Вилку ХР1 можно изготовить из неисправного РПЗУ со стиранием ультрафиолетовым облучением. Разбив прозрачное окно, следует удалить тонкие проводники, соединяющие кристалл с контактными площадками корпуса. Провода кабеля припаивают к внешней части выводов с таким расчетом, чтобы они не мешали вставлять бывшую микросхему в панель.
Описанный выше алгоритм работы эмулятора требует перевода микропроцессорного устройства в пошаговый режим. Он удобен для первого "прогона" программы и начальных этапов ее отладки. Чтобы работать в непрерывном режиме, необходимо дополнить эмулятор устройством синхронизации, собрав его по схеме, показанной на рис. 4. Оно предназначено для микропроцессора КР580ВМ80А с тактовым генератором КР580ГФ24 и было испытано на компьютере "Радио-86РК". Для микропроцессоров других типов в синхронизатор возможно потребуется внести изменения.
Puc.4В таблице приведена процедура эмуляции ПЗУ компьютером с максимальной скоростью. Она написана на языке АССЕМБЛЕРа, встроенного в систему программирования Borland Pascal, и предназначена для использования в программах, разрабатываемых с помощью этой системы. Глобальной переменной pDATA типа pointer в главной программе должно быть присвое-
но значение адреса первого элемента массива байтов, содержащего образ эмулируемого ПЗУ. Обмен данными идет с максимальной скоростью за счет минимизации числа обращений к памяти ПК и использования для временного хранения данных регистров процессора (обращение к памяти занимает в несколько раз больше времени, чем операция регистр-регистр).Procedura EmulateFast;
assembler ;
asm
cli
mov dx, 379h
Ids bx, pDATA
{Приникаем А0-A3 в cl}
@@Byte1:in al, dx shl al, 1 jc @@Byte1 mov cl, al
@@Povt1:in al, dx shl al, 1 jnc @@Povt1
{Принимаем А4-А7 в ch)
@@Byte2:in al, dx shl al, 1 jc @@Byte2 mov ch, a1
@@Povt2:in al, dx shl al, 1 jnc @@Povt2
{Принимаем А8-А11 в ah}
@@Byte3:in al, dx shl al, 1 jc @@Byte3 mov ah, a1
@@Povt3:in al, dx shl al, 1h jnc @@Povt3
{Прием А12-А15 в al)
@@Byte4:in al, dx shl al, 1 jc @@Byte4
{Вычисляем 16-разрядный адрес}
and ax, 0f0f0h shr ah, 1 shr ah, 1 shr ah, 1 shr ah, 1 add ah, a1 and cx, 0f0f0h shr cl, 1h shr cl, 1h shr cl, 1h shr cl, Ih add ch, c1 mov al, ch mov si, ax
{Выводим байт данных}
mov al,[bx][si] dec dx out dx, al inc dx jmp @@Byte1 end;
Особенность описываемой процедуры в том, что она представляет собой бесконечный цикл и ради ускорения работы запрещает все прерывания, в том числе от клавиатуры. Таким образом, прекратить эмуляцию можно только, нажав на кнопку "RESET" ПК или выключив его питание. Исключен и вывод на экран монитора ПК какой-либо информации о работе отлаживаемого устройства. Устранить эти недостатки под силу программисту средней квалификации, но лишь ценой замедления работы процедуры.
Законченную программу эмуляции ПЗУ для операционной системы MS DOS читатели могут найти на официальном сайте журнала "Радио" в Интернете (www.paguo.ru).
Ключами, заданными в командной строке или в конфигурационном файле, устанавливают режим эмуляции, выбирают файл с образом эмулируемого ПЗУ. Приоритет командной строки выше, чем конфигурационного файла. Предусмотрены следующие ключи:
-sf - самая быстрая эмуляция (используется рассмотренная выше процедура);
-sns - режим, несколько медленнее предыдущего, так как предусмотрен опрос клавиатуры и выход нажатием клавиши [Esc];
-sp - самый медленный режим. На экран монитора выводится адрес каждой ячейки ПЗУ, к которой обращается отлаживаемое устройство, и данные из нее. Отображается также процесс чтения четвертей адреса. Это удобно на начальных этапах отладки микропроцессорного устройства, поскольку позволяет следить за ходом выполнения его программы;
-f имя_файла - задает имя файла с образом ПЗУ;
/у - отключает контроль равенства длины файла образа ПЗУ информационной емкости последнего;
/? - выводит на экран справку о режимах работы эмулятора.
Нажатие клавиши [F2] останавливает текущий процесс считывания адреса и переводит программу в режим ожидания нового.
Образ ПЗУ представляет собой двоичный файл, в котором последовательно, в порядке возрастания адресов, начиная с нулевого, записаны все байты, хранимые в эмулируемом ПЗУ, - коды команд и данных отлаживаемого микропроцессорного устройства. Учтите, что пропуски в последовательности адресов недопустимы. В файл должны быть записаны и значения, находящиеся в неиспользуемых ячейках.
Такой файл может быть создан с помощью кроссассемблера TASM, если вызвать его командной строкой
TASM.EXE -85 -g3 PROG.ASM
Здесь ключ -85 устанавливает тип процессора (8085), для которого предназначена транслируемая программа PROG.ASM, a -g3 задает вывод результата в двоичном виде. Полученный в результате трансляции файл PROG.OBJ может служить образом ПЗУ для эмулятора.
Радио 6/2000, с.27-29.