Разработка микроконтроллера на Z80

Вперед, в прошлое!

Хочу предложить Вашему вниманию интегрированный контроллер для различных применений. Сделан он на основе очень старого 8-битного микропроцессора Zilog Z80. Целью было собрать плату с архитектурой и элементной базой близкой к микрокомпьютеру 80ых. Цели у данного мероприятия в современном мире нет никакой, просто хотелось понастольгировать и собрать устройство на крупных компонентах, в DIP-корпусах, получить реально большой и работающий девайс, который можно пощупать "внутри" осциллографом и мультиметром (а не только отладчиком) и который будет наглядно отражать архитектуру компьютерной системы. В заключение попрограммировать под ядро i8080/Z80 на ассемблере.

Процессор Z80:

Схема устройства

При разработке я пошел на некоторые упрощения, к примеру, использовал статическую память RAM одним чипом, а не целую горсть динамической, которая обычно устанавливалась в то время, в качестве ПЗУ стоит память EEPROM, в теории позволяющая перепрошить себя средствами самого процессора. В основе платы находится микропроцессор КР1858ВМ1, это отечественный клон легендарного Z80. Так же плата включает в себя 48 линий конфигурируемых портов ввода вывода, реализованных на 2х микросхемах К580ВВ55 (аналог i8255). Установлено 2 генератора: основной тактовый на 4МГц и вспомогательный, часовой, подключенный к линии прерываний.

Изначально очень хотелось сделать контроллер UART для данной платы, однако не нашел подходящих чипов для его реализации (К580ВВ51 требовал специфичного генератора К580ГФ24, плюс двойное питание, а все более современное показалось слишком сложным и "вычурным" на данной плате). Так же пришлось в целях упрощения отказаться от микросхем таймеров. Частично отсутсвие последних компенсируется часовым вспомогательным генератором.

Схема платы представлена на рис. 1 и 2. В ней все практически стандартно: процессор, память, порты ввода-вывода и вспомогательные цепи.


Рисунок 1 - Схема цифровых узлов

Рисунок 2 - Схема вспомогательных узлов

Рисунок 3 - Размещение компонентов на плате

На рис. 3 представлена разводка платы в CAD-среде. Несмотря на упрощения и оптимизации, плата получилась довольно большой. Для меня, занимавшегося до этого разработкой устройств на SMD-компонентах, это был своеобразный рекорд по площади платы. Разводка производилась в Specctra с последующей ручной правкой.


Рисунок 4 - Разводка платы

В качестве эксперимента плата была так же разведена в топологическом трассировщике TopoR. Результат довольно забавный, однако, если присмотреться местами ужасный: некоторые дорожки делают чуть ли не полный оборот вокруг платы.


Рисунок 5 - Разводка платы (TopoR)

Так же через некоторое время после того, как выложил данный отчет в паблик, пришло письмо от ООО "Эремекс" с вторым вариантом разводки платы в ToPoR. Он представлен на рис. 6. Стараются ребята, за что им спасибо. Опять все такой же непривычный глазу вид, но качество разводки намного улучшилось. Возможно сказалось, что используется более новая версия. Так же был дан совет: выбирать из вариантов разводки тот что с 25мм/переход (на сколько помню, Топор после разводки предлагает несколько вариантов, вот из них и надо выбирать), в нем и получается меньше петель.

В сравнении с Спекктрой: 12 переходных у Топора, против 63 у Спекктры и на 1 метр меньше суммарная длина дорожек.


Рисунок 6 - Разводка платы (TopoR, 2ой вариант)

Плата 2х слойная, оптимизирована на изготовление и пайку в домашних условиях (сам использовал для этого ЛУТ). Установлена ширина сигнальных дорожек 0.45мм, а для линий питания и вовсе 0.8мм. Минимальные зазоры около 0.3мм. Так как в домашних условиях металлизацию отверстий провести практически невозможно (во всяком случае мне неизвестна ни одна доступная технология), при сборке требуется припаивать компоненты с 2х сторон платы, но данное требование не относится к компонентам, закрывающим плату, таких как конденсаторы, коннекторы питания и некоторые другие: у них принудительно сделано.

На плате предусмотрено несколько джамперов. Первый блок джамперов отвечает за подключение сигнала к порту прерывания. Можно выбрать частоту генерации прерываний: 1Гц, 2Гц, 128Гц, 1024Гц (или вовсе отказаться от них). Отдельным джампером подключается линия контроля записи к микросхеме ROM. Так же можно выбрать источник тактирования самого микропроцессора, к примеру установить тактирование от часовой микросхемы, что дает удобную отладку. В обычном режиме она не требуется, однако при подключении ее к пину записи процессора становится теоретически возможным перезаписать EEPROM средствами самого процессора.

На плате предусмотрены индикаторы:

И есть набор кнопок:

В топологии платы есть одна проблема, точнее проблема с корпусами компонентов: у советских микросхем шаг выводов 2.5мм, у зарубежных 0.1 дюйма, т.е. 2.54мм. На разводке платы я применил на всех корпусах шаг 2.54мм. С компонентами в DIP-40 это выливается в проблему установки. В принципе, ручная формовка выводов микросхем позволяет установить микросхему, но чтобы не иметь данную проблему, было бы хорошо найти оригинальный i8055 и Z80A, хотя на фотографиях можно увидеть, что вместо i8055 я смог поставить советский аналог К580ВВ55, пришлось, правда немного посидеть с плоскогубцами.

В таблице представлен полный список компонентов платы:

НаименованиеКоличество (шт.)Ориентировочная цена (руб.)
КР1858ВМ1 (Z80A, 80A, T34ВМ1) DIP-40 1 70.00
КР580ВВ55 DIP-40 2 70.00
К176ИЕ12, без аналогов (1990-97г) 1 34.75
SN74HC139N (КР1564ИД14) DIP-16 1 8.47
SN74HC00N (КР1564ЛА3) DIP-16 2 11.60
UT6264CPCL-70LL DIP-28-600 UTRON 1 59.73
AT28C64B-15PU DIP-28-600 ATMEL 1 91.23
L7805CV (+5В, 1.5А) TO-220 1 22.03
TRL-28 DIP панель 28-контактная цанговая2 35.08
TRL-40 DIP панель 40-контактная цанговая2 39.83
TRS-16 DIP панель 16-контактная цанговая1 16.10
PLS-40 штырьевой разъем, однорядный 2 6.90
PLD2-1 5 1.50
PLD2-3 1 2.10
КМ5Б М47 22пФ, 10% 4 9.15
КМ5Б Н90 0.1 мкФ 1112.71
К50-35 имп. 3300 мкФ х 25В 105°C 2 20.34
К50-35 имп. 1 мкФ х 6.3-25В 105°C 4 10.34
С1-4 имп. 0.25 Вт, 5% 22 мОм 2 2.88
С1-4 имп. 0.25 Вт, 5% 510 кОм 2 2.88
С1-4 имп. 0.25 Вт, 5% 1.5 кОм 4 2.88
С1-4 имп. 0.25 Вт, 5% 680 Ом 3 2.88
FR4 100х200мм (1.5мм), стеклотекстолит 1 64.41
W005A диодный мост 1 15.00

Программирование

Привожу простую программу для бегущего огня на 1ом порту ввода-вывода.
; Адреса портов ввода вывода:
IO1_CONF:     EQU 00h
IO1_A:        EQU 01h

	ORG 0x0000
	LD  A, 01h           ; Конфигурирование ВВ55(1), 
	OUT (IO1_CONF), A    ; настройка PortA как выход.
	LD  A, 01h           ; Инициализируем порт.
loop:
	OUT (IO1_A), A       ; Вывод байта в порт.
	RLC A, 1             ; Циклический сдвиг влево.
	JP  loop             ; Бесконечный цикл.
	END

Для запуска примера требуется установить тактирование микропроцессора на 1-2Гц, так как в программе для простоты не сделаны необходимые задержки. В листинге 2 представлен вариант программы с работой через прерывание, для его работы должны быть поданы сигналы тактирования от 4Мгц и от часового генератора.

; Адреса портов ввода вывода:
IO1_CONF:     EQU 00h
IO1_A:        EQU 01h

	ORG 0x0000           
reset:
	DI                   ; Запрет прерываний.
	LD  SP, 08FFFh       ; Настройка стека.
	LD  A, 01h           ; Конфигурирование ВВ55(1),
	OUT (IO1_CONF), A    ; настройка PortA как выход.
	LD  A, 01h           ; Инициализируем порт.
	EI                   ; Разрешение прерываний.
loop:
	JP  loop             ; Бесконечный цикл.

	; Процедура обработки прерывания:
	DS  0x0038-$        ; Формируем смещение в бинарном образе.
	ORG 0x0038           ;
int:
	OUT (IO1_A), A       ; Вывод байта в порт.
	RLC A, 1             ; Циклический сдвиг влево.
	RETI                 ; Возврат из процедуры обработки прерываний.
	END

Для компиляции ассемблерных программ я использовал свободный компилятор ассемблера z80asm. Он распространяется в исходных кодах и без проблем собирается под Windows при помощи MinGW+msys.

Карта памяти для данных и портов ввода-вывода представлена в таблице 1. Можно только прокомментировать следующую особенность: в областях помеченных как Reserved на самом деле идет циклическое повторение предыдущих областей, так как старшие линии адреса просто не задействованы и их значения ингнорируются. Однако, логично не пользоваться данной особенностью.

Памяти программ установлено не много - всего 8кБ, а вот оперативной памяти не мало даже по меркам современных 8-битных микроконтроллеров ARV/PIC, те же 8кБ, хотя без переделок можно установить микросхему на 16кБ.

Адресное пространство ввода-вывода:

0x00-0x03     - ВВ55(1)
0x04-0x07     - ВВ55(2)
0x08-0xFF     - reserved
0x0100-0xFFFF - reserved

Адресное пространство кода-данных:

0x0000-0x1FFF - ПЗУ (EEPROM)
0x2000-0x7FFF - Зарезервировано
0x8000-0x9FFF - ОЗУ (SRAM)
0x9000-0xFFFF - Зарезервировано

На каждую микросхему порта ввода-вывода приходится 4 адреса, они имеют следующие значения:

0x00, 0x04 - [Conf] Конфигурационный регистр порта ввода-вывода
0x01, 0x05 - [PortA] Регистр порта A
0x02, 0x06 - [PortB] Регистр порта B
0x03, 0x07 - [PortC] Регистр порта C

При этом регистр конфигурации имеет следующий формат: (взять и DS).

Отладка и проверка контроллера

Проверку функционирования платы можно разбить на следующие этапы:

  1. Правильность и качество монтажа.
  2. Электрические проверки на КЗ в цепях питания.
  3. Проверка работы тактовых генераторов.
  4. Проверка генерации сигналов сброса.
  5. Проверка генерации сигнала выборки первой команды на шине.
  6. Генерация HALT сигнала (означает корректное проведение выборки команды).
  7. Тест портов ввода-вывода.
  8. Тест для проверки ОЗУ.

После этого плату можно признать полностью функционирующей.

Стоит упомянуть, что при сборке я провел эксперимент с лужением сплавом Розе в кипятке. По этой причине плата полностью покрыта припоем.

Я при сборке не стал сразу распаивать плату полностью. Начал с цепей питания, проверил что все в порядке, распаял генераторы, проверил, что есть генерация, после этого впаял панельку под процессор и минимальные цепи обвязки. Здесь уже было посложнее, пришлось проверить осциллографом, происходит ли попытка выборки инструкции из внешней памяти. Когда убедился что все в порядке, распаял оставшиеся цепи обвязки процессора (кнопки и т.д.). После этого стал ставить память. Сначала ПЗУ, затем ОЗУ. После этого можно было попробовать работу ПЗУ и залить первую микропрограмму. Убедившись, что все в порядке, распаял все оставшиеся компоненты.

Итоговый вид собранной конструкции представлен на рис. 7. К сожалению, на фотографии плата в несколько подпорченном виде: с нее сняты некоторые комплектующие в цепях питания.


Рисунок 7 - Как все это выглядит

Материалы по теме

  1. Проект PCAD платы контроллера
  2. Проект PCAD платы контроллера (разводка ToPoR-ом, 2ой варинат)
  3. Тестовая программа контроллера
  4. Используемый ассемблер Z80
  5. Шаблоны для изготовления платы (формат PDF)
  6. Документация на процессор Z80
  7. Документация на процессор Z80 (перевод)
  8. Документация на контроллер ввода-вывода i8255
  9. Документация на чип EEPROM
  10. Документация на чип RAM
  11. Типовая схема АОН-а на Z80

О сайте

Подборка статей и отчетов о различных математических и электронных экспериментах.

Подробнее