Gameduino: экран для ZX Spectrum Печать
Добавил(а) Алексей Сугоняев   

В этой статье описана разработка на аппаратуре FPGA Gameduino [1] экрана популярного некогда 8-битного компьютера ZX Spectrum.

[Цифровая схемотехника и ZX Spectrum]

Во времена своего советского детства мне очень сильно повезло познакомиться с цифровой схемотехникой по лабораторному практикуму (он публиковался в журнале "Радио") на основе 155 серии цифровых интегральных микросхем. Для подростка это был захватывающий мир бесконечных возможностей по синтезу автоматов. Можно было даже собрать свой собственный вычислитель, но... на практике микросхем хватало разве что поморгать светодиодом и погонять на 7-сегментном индикаторе обратный отсчет. Микросхемы, а особенно цифровые были тогда на вес золота и добывались со свалок, развалов цветного металла и из старой аппаратуры. Однако ощущение того, что на уровне логических схем можно сделать все, что "душа пожелает" сформировалось. К счастью, сейчас с компонентами и деталями стало проще. как выяснилось, роскошная аппаратура Gameduino (FPGA Xilinx SPARTAN-3A SC3S200A) позволяет разрабатывать интересные и высокотехнологичные изделия, если приложить немного усилий и любознательности. Надеюсь, эта статья поможет в освоении радиолюбителями схемотехники систем с FPGA.

Just for fun было решено воссоздать видеоподсистему ZX Spectrum - легендарного персонального компьютера, который был популярен в России и СНГ в конце восьмидесятых и в девяностых годах двадцатого века. Все необходимое для этого на плате Gameduino уже было - видеовыход VGA, выход звука, вход SPI, по которому можно передавать данные. Получился проект ZX-HDL-console, написанный на языке Verilog в среде Xilinx ISE WebPack 14.2.

ZXSpectrum48k ZXspectrum mb

[Основные параметры ZX-HDL-console]

Характеристики консоли соответствуют формату экрана компьютера ZX Spectrum, который наверняка еще многие помнят.

zx-screen ZX-Spectrum-colors

1. Тип отображения информации на экране - графический, спрайтовый.
2. Графическое разрешение - 256х192 точки. Экран также разделен на 32x24 знакоместа, для каждого из которых индивидуально может быть задан цвет фона и точек.
3. Глубина цвета - 8 цветов точки и 8 цветов фона в знакоместе 8х8 (всего 32x24 знакоместа на экране), можно также задавать повышенную яркость для каждого знакоместа.
4. Аппаратное мерцание каждого знакоместа с частотой 1.565 Гц за счет смены цветов точки и фона.
5. Бордюр, ограничивающий область вывода, позволяет заливку 8 цветами, на него можно также выводить цветные полосы (применяется при загрузке с магнитной ленты и в некоторых играх).
6. Одноразрядная цифровая линия вывода звуковых сигналов.
7. 40 МГц интерфейс SPI, через которые доступны на запись экран и порт FE ZX Spectrum. Причем передача может вестись со стороны хоста SPI (SPI master) в любое время, без блокировок на ожидание готовности.

Из стандартных VESA-видорежимов монитора лучше всего подошел (с точки зрения наименьших затрат аппаратуры при реализации в ПЛИС) 1280x1024, 75 Гц. Частота вывода пикселей составила 135 МГц. Ширина оригинального экрана ZX Spectrum пятикратно укладывалась в выбранный горизонтальный размер, высота - чуть более, чем 5 раз. Для сохранения пропорций исходного экрана решено было вывести каждую точку 4 раза по горизонтали и 4 раза по вертикали, т. е. квадратик 4х4 на экране монитора будет соответствовать 1 пикселю экрана ZX Spectrum. Область графики ZX получится 1024x768 точек, а оставшаяся часть экрана 1280x1024 будет отведена под бордюр, цвет которого задается портом FE.

Область графики экрана ZX и порт FE (звук, цвет бордюра) доступны на запись через высокоскоростной последовательный интерфейс SPI [2], синхронизируемый со стороны хоста SPI. Хостом (SPI master) может служить любой микроконтроллер, который имеет интерфейс SPI (например, ATmega32A, AT90USB647, AT91SAM7X512 или STM32F103RBT6). В будущем можно будет создать свой эмулятор ZX Spectrum с блэкджеком и всеми прелестями.

[Описание внутренней структуры логики ZX-HDL-console]

Как уже упоминалось, видеоподсистема для ZX Spectrum разрабатывалась и отлаживалась для работы на аппаратуре Gameduino [1] (FPGA Xilinx SC3S200A).

gameduino top gameduino schematic

Устройство разделено на два независимых блока - формирование изображения на мониторе и ввод данных по SPI. Раздел между двумя этими блоками проходит на уровне памяти устройства - применяется память с двумя независимыми интерфейсами (так называемая двухпортовая память DPRAM). Поскольку память двухпортовая, то один из портов отдан на чтение содержимого экранного буфера для формирования изображения на экране монитора, а другой порт занят приемом порции данных, поступивших с SPI. Появилась возможность тактировать блоки своими источниками синхронизации: для экрана это частота вывода пикселя 135 МГц (вырабатываемая встроенным синтезатором частоты FPGA из частоты кварцевого генератора 25 МГц), а для приемника данных это входной сигнал тактов SPI. На рисунке показана упрощенная блок схема устройства (полная схема тут).

ZX-HDL-console-block-sch

Весь код состоит из модулей zx, GEN, RAMDP_2K8, SPI, написанных на языке Verilog. В модуле zx описана вся основная логика, GEN предназначен для получения тактовой частоты, модуль RAMDP_2K8 (DPRAM) предназначен для организации хранения данных экрана, модуль SPI предназначен для приема данных от хоста (SPI master) и декодирования протокола. Рассмотрим каждый модуль по отдельности.

[Модуль ZX]

Это самый большой модуль, и в нем описан основной алгоритм работы устройства отображения графической информации - видеоподсистемы. В начале определения модуля описаны его входные и выходные сигналы.

Параметр Описание
output reg HSync Горизонтальные синхроимпульсы. Сигнал для монитора.
output reg VSync Вертикальные синхроимпульсы. Сигнал для монитора.
output R0, R1, R2, G0, G1, G2, B0, B1, B2 Выходы на резисторный ЦАП, который дает сигналы R, G, B для монитора.
output AudioL, AudioR ШИМ для левого и правого канала звука.
input clk, sclk Тактовые сигналы. На clk подается 25 МГц от тактового генератора, а на sclk приходят такты SPI.

Все эти сигналы привязаны к ножкам микросхемы FPGA в файле zx.ucf (User Constraints File).

Согласно простейшим расчетам, требуемый объем памяти на графику растра составляет 256х192 = 49152 бит, или 6144 байта (в шестнадцатеричном виде 0x1800 байт). Этот объем памяти можно разделить на 3 блока по 2048 байт, а один блок 2 килобайт. Этот размер хорошо вписывается в одну из размерностей элементарного блока RAM (2Кх8) которыми располагает ПЛИС SC3S200A. Таким образом, вся битовая плоскость закрывается тремя стандартными блоками RAM. На атрибуты цветовой плоскости требуется меньше памяти - по одному байту на знакоместо, всего 32x24 = 768 знакомест, т. е. 768 байт. На него отведем еще один блок RAM 2Kx8, пусть до конца и не заполненный. Для того, чтобы просто читать данные из RAM, применен выходной мультиплексор. В ПЛИС любое объединение, если оно не связано с выходом на ножки (на IOB), не может быть проведено иначе - вход должен совершенно четко быть подключен к выходу, и этот факт контролируется синтезатором кода ПЛИС. Выходной мультиплексор будет управляться по входу выбора шины данных двумя старшими разрядами шины адреса RAM (ADDR).

Развертка экрана по горизонтали и вертикали выполнена с помощью двух линейных счетчиков hcnt и vcnt соответственно. Вход hcnt тактируется от частоты 135 МГц (выход модуля GEN) при формировании графики строки, а вход счетчика vcnt подключен на выход счетчика hcnt - как только счетчик hcnt достигает предельного значения, то происходит инкремент счетчика vcnt.

Чтобы разобраться с формированием адреса чтения из счетчиков точки hcnt и строки экрана vcnt, заглянем в стандарт VESA для режима 1280x1024х75Гц, и вынесем в табличку необходимые характеристики:

Наименование параметра Длительность (мс, мкс) Длительность в единицах растра, (pixels, lines) Константа (бит) Примечание
HBackPorch 1.837 мкс 248 pix 11’d248 Время снятия сигнала гашения, в начале строки.
HAddrTime 9.481 мкс 1280 pix   Длительность отображения информационной составляющей видеосигнала по кадру.
Hor Sync Start 9.6 мкс 1296 pix   Время от снятия сигнала гашения до прихода фронта сигнала синхронизации по строке.
HTotalTime 12.504 мкс 1688 pix 11’d1687 Время, необходимое для формирования одной строки растра, поступление спада сигнала синхронизации по строке.
VBackPorch 0.475 мкс 38 lines 11’d38 Время снятия сигнала гашения, в начале кадра.
VAddrTime 12.804 мс 1024 lines   Длительность отображения информационной составляющей видеосигнала по кадру.
Vert Sync Start 12.816 мс 1025 lines   Время от снятия сигнала гашения прихода фронта сигнала синхронизации по кадру.
VTotlaTime 13.329 мс 1066 lines 11’d1065 Время, необходимое для формирования кадра растра, поступление спада сигнала синхронизации по кадру.

По таблице можно определить необходимую разрядность счетчиков hcnt и vcnt: по 11 бит на каждый (2^11= 2048 точек). Счетчикам hcnt и vcnt потребуется синхронная загрузка 0 в тот момент, когда их значение будет равно 1687 и 1065, и поступит нарастающий фронт сигнала синхронизации clock (135 МГц). На рисунке представлена графически структура видеосигнала VESA 1280x1024 75Hz, она равноправна как для формирования строки, так и для формирования кадра, различаются они только значениями полей.

ZX-HDL-console-VESA-sync-time

Из рисунка видно, что начать формирования строки растра можно с интервала гашения, затем следует адресная часть видеобуфера, затем опять гашение, и в конце строки идет заключительный синхроимпульс. Что бы выделять из линейной развертки счетчика эти поля, достаточно 4 констант HBackPorch, HAddrVideo, HSyncStartTime, HTotalTime. Эти константы соответствуют следующим событиям, когда их значения достигает счетчик hcnt:

HBackPorch - на выход видеосигнала начнут поступать данные об отображаемом растре;
HAddrVideo - начнется гашение по строке линии видеосигнала будут иметь уровень GND;
HSyncStartTime - приходит фронт сигнала синхронизации по строке, на видео - гашение;
HTotalTime - производится синхронный сброс счетчика по строке.

Аналогичным образом формируется растр по вертикали, с помощью констант VBackPorch, VAddrVideo, VSyncStartTime, VTotalTime для счетчика vcnt:

VBackPorch - на выход видеосигнала будут поступать данные об отображаемом растре;
VAddrVideo - начнется гашение строки по кадру;
VSyncStartTime - приходит фронт сигнала синхронизации по кадру, на видео - гашение;
VTotalTime - производится синхронный сброс счетчика по кадру.

Некоторые значения счетчиков hcnt и vcnt соответствуют моментам времени формирования бордюра ZX Spectrum, поэтому необходимы еще 4 константы для выделения сигнала формирования бордюра TopBorder, LeftBorder, BottomBorder, RightBorder. На рисунке более наглядно представлены интервалы развертки и соответствующие им константы (кодирование полей видеосигнала 4-х разрядным кодом).

ZX-HDL-console-screen-layout

Для удобства учета вариантов наложения гашения, бордюра и видеосигнала все их возможные сочетания закодированы в 4-битный код. Старшие два бита кодируют сочетания вертикальных ограничителей (VBackPorch и VFrontPorch - 00,VTopBorder - 01,VVideo - 11,VBottomBorder-01) младшие два бита - горизонтальных ограничителей (HBackProch и HFrontPorch - 00, HLeftBorder - 01, HFrontVideo - 11, VRightBorder - 01). На рисунке видно, каким образом кодировались поля видеосигнала. 4-х битный код формируется компараторами из значений счетчика, и используется для работы как переключатель режима развертки. Переключатель дает команду подавать на видеовыход (на данные шины IRBG) либо гашение BLANK (черный IRBG=0000b), либо с регистра бордюра Border (соответствует битам цвета порта FE), либо непосредственно информация о цвете точки из экранной области. Необходимо обратить внимание на коррекцию констант, определяющих границы бордюра: для упрощения логики необходимо, чтобы эти значения констант были кратны 4, так как каждая отдельная точка графики ZX Spectrum отображается 4 раза по горизонтали и 4 раза по вертикали.

Получение адреса RAM из адреса точки экрана

Для вычисления адреса байта в RAM используются значения счетчиков hcnt и vcnt. Из-за особой организации адресного пространства экрана ZX Spectrum [3] необходимо сделать преобразование линейного адреса, который образуют счетчики {vcnt, hcnt} в адрес графики экрана. Напомню, что графический экран в адресном пространстве ZX Spectrum начинается с адреса 4000h, и заполнение его графикой при последовательном увеличении адреса байта RAM происходит слева направо вдоль строки, потом происходит перескок через 8 строк, снова идет формирование строки, потом еще перескок на 8 строк, и так до 1/3 экрана, потом снова идет возврат вверх, но уже на вторую строку, и так далее, пока не заполнится 1-я треть экрана. Далее по такому же закону заполняется вторая треть экрана, и затем последняя, далее идут атрибуты цвета. Процесс заполнения экрана наверняка помнят пользователи XZ Spectrum, когда загружали игры с магнитофона. Такая особенная организация адресного пространства экрана связана с тем, что в оригинальном ZX Spectrum разработчики применили динамическое ОЗУ (DRAM), которое требовало для работы обязательной регенерации. Процедура регенерация в DRAM заключается в переборе всех комбинаций адреса столбца (или адреса строки) в фиксированные интервалы времени (так называемый период регенерации). Регенерацию разработчики совместили с генерацией растра экрана ZX Spectrum, поэтому и получился такой сложный формат экрана.

Адрес графики RAM получается из линейного адреса {hcnt, vcnt} путем простой перестановки бит, как показано на рисунке.

ZX-HDL-console-INK-address-transform

Формула преобразования на языке Verilog выглядит так:

wire [4:0]ColumnAddr = hcnt[9:5] + 5'd21;
wire [7:0]RowAddr = vcnt[9:2] + 8'hD8;
wire [12:0]ADDRG = {RowAddr[7:6],RowAddr[2:0],RowAddr[5:3],ColumnAddr};

Здесь константы 5'd21 и 8'hD8 служат для приведения к нулю ColumnAddr (адрес байта вдоль строки) и RowAddr (адрес байта начала строки). Общий адрес байта графики (приведенный к нулю) получается на шине ADDRG.

Однако это пока только еще битовая плоскость, необходимо вычитывать из ОЗУ цветовые значение "чернил" и "бумаги". С этим в ZX все намного тривиальней - адрес абсолютно линеен и каждый считанный из ОЗУ экрана байт цветности соответствует группе точек 8х8. С ColumnAddr частью адреса ничего делать не придется там и так нужный нам период 8. А вот строки следуют друг за другом и часть адреса для строки надо делить на 8, т.е. убрать младшие три разряда RowAddr. Всего атрибутов квадратиками по 8х8 вмещается 24 по вертикали, для представления такого числа достаточно 5 разрядов шины. Совмещаем и получаем формулу линейного адреса для чтения атрибута из блока ОЗУ с данными о цвете:

wire [9:0]ADDRC = {RowAddr[7:3],ColumnAddr};

На рисунке показано получение адреса RAM для чтения цветового атрибута.

ZX-HDL-console-attribute-address-transform

Адрес ADDRG и ADDRC поступают каждый на адресную шину своего RAM, а данные о битовой плоскости и цвете так же раздельно поступают на свои регистры. 8-бит графической информации попадают в сдвиговый регистр pixshifter в момент, когда сигнал WR разрешает параллельную запись данных. Разрешающий сигнал WR соответствует появлению во всех 5 младших разрядах счетчика по строке hcnt лог. 1. Десятичное значение 31 будет появляться в 5 младших разрядах hcnt в тот момент, когда на экране высвечивается завершающий 8-ой бит графической информации. Все остальное время pixshifter сдвигает информацию, выделяя в старшем бите текущее состояние пиксела: 1 пиксел черный, 0 пиксел белый. Сигнал сдвига SH активизируется в момент появления 1 в двух младших разрядах hcnt (действует коэффициент отношения точки реального экрана к точке в экране ZX = 1:4). В этот момент по приходу фронта сигнала синхронизации необходимо выдвинуть очередной бит графической плоскости в старший разряд. Кроме того, при записи байта из битовой плоскости в регистр текущих атрибутов так же считываются данные о цвете из соответствующего блока RAM. Далее из регистра атрибутов выделяется цвет точки и цвет фона, и через мультиплексор поступает на входы ЦАП сигналов цветности RGB. Управляется мультиплексор выходом 8-ого бита с сдвигающего регистра pixshifter. Если бит 8 равен 1, то на вход ЦАП подключается значение цвета точки, и наоборот - если точки нет и бит 8 равен нолю, то поступает цвет фона.

Как работает аппаратное мерцание - смена цвета точки и цвета фона

Поменять местами цвета фона и чернил можно только задействовав в атрибуте признак мерцания знакоместа. В оригинальном ZX это было сделано в основном для аппаратного мерцания текстового курсора, однако эта возможность используется во многих программах для привлечения внимания к различным элементам картинки. Для того, что бы сменить соответствие между цветом фона и точки, периодический сигнал с счетчика мерцания blinkcnt через разрешающий элемент, зависящий от значения бита Flash в регистре атрибутов, заводится на элемент "исключающее или" вместе с значением 8 бита сдвигового регистра pixshifter. Если на выходе счетчика мерцания blinkcnt лог. 1, то информация о графике точки инвертируется, а если лог. 0, то информация о графике точке не изменяется. Так как сигнал на выходе blinkcnt имеет частоту примерно 1.56 Гц, то период мерцания получается равным 0.64 cек.

[Модуль памяти RAMDP_2K8]

Экземпляры этого модуля используются для хранения данных экрана. Один модуль хранит 2 килобайта данных. Всего используются 4 экземпляра модуля: ram0, ram1, ram2 для хранения графики экрана ZX Spectrum, и ram3 для хранения атрибутов цвета, повышенной яркости и мигания знакоместа. Реализация модуля ram взята готовая, из шаблонов кода, предоставленных Xilinx. Был взят шаблон из меню Edit -> Language Templates... -> Verilog -> FPGA -> RAM / ROM -> Block RAM -> Spartan-3A -> Dual-Port (Matched Port Widths) -> 2k x 8 + 1 Parity bit (RAMB16_S9_S9).

[Модуль GEN]

GEN это название модуля в котором определены DCM и настройки клока (сокращенно GEN от слова GENerator). Модуль также был получен из шаблонов Language Templates, и он задействован в коде zx.v строчкой:

GEN gclk(.CLKIN_IN(clk), .CLK_OUT(clock));

Тут все просто: указано, что создан gclk - экземпляр модуля GEN, и при создании ему переданы параметры .CLKIN_IN(clk) и .CLK_OUT(clock). Точка тут означает, что используются внутренние имена модуля CLKIN_IN и CLK_OUT, а имя в скобках - это передаваемое в модуль соединение (шина или одиночный проводник). Смысл следующий - на вход модуля подается частота clk (а это входной сигнал модуля zx, тактовая частота 25 МГц), а на выходе получается тактовая частота, которая попадает на wire clock. Провод clock широко используется для тактирования формирования картинки на экране в коде модуля zx. Полученная тактовая частота clock зависит от параметров DIV_BY и MULT_BY в теле модуля zxgen.v и вычисляется по следующему выражению:

clock = (clk/DIV_BY) * MULT_BY = (25 / 5) * 27 = 135 (МГц)

[Модуль SPI]

Для связи с внешним миром (для доступа в адресное пространство экрана и управления портом FE ZX Spectrum) предназначен интерфейс SPI [2], который вынесен в отдельный модуль. На рисунке показана диаграмма состояний автомата SPI, иллюстрирующая процесс приема данных (для получения подробностей см. исходный код Verilog [4]).

ZX-HDL-console-SPI

Модуль SPI также отвечает за декодирование протокола, предназначенный для передачи данных экрана и порта FE ZX Spectrum. Для протокола предусмотрен специальный 4-байтный заголовок, с которого всегда начинается передача. За заголовком идут полезные данные - либо содержимое RAM для области экрана (можно передать и весь экран целиком), либо байт для записи в порт FE. Перед выдачей заголовка выборка SPI переходит из лог. 1 в лог. 0, что сигнализирует о начале передачи. При передаче последнего байта выборка возвращается обратно в состояние лог. 1.

ZX-HDL-console-SPI-packet

Заголовок (байты BH0..BH3), блок данных (байты b0..bN-1) идут друг за другом без пауз, в сплошном непрерывном потоке байт.

Формат заголовка

Заголовок - это слово из 4 байт, лежащее в памяти в формате little-endian, младший байт идет первым в памяти, и передается первым. В терминах SPI сначала передается младший байт слова, а последним передается старший байт слова. Далее идет описание этих 32 бит слова заголовка, в описании биты расположены от старшего бита к младшему.

ZX-HDL-console-SPI-packet-header

бит 31, W (Write): означает чтение (0) или запись (1). Значение 0 зарезервировано для возможного использования в будущем. Пока всегда в бите 31 будет 1, что означает запись в экран или в порт FE (в зависимости от бита I).
бит 30, I (I/O): означает выбор адресного пространства Z80. Если 0, то это обычная память (RAM). Если 1, то порты ввода/вывода (I/O). Порты ввода вывода используются для вывода бордюра и звука (порт FE, адрес 0x00FE).
биты 29..16: NNNNNNNNNNNNNN, 14-битный размер передаваемого блока в байтах.
биты 15..0: AAAAAAAAAAAAAAAA, 16-битный стартовый адрес памяти или портов ввода/вывода, куда адресован передаваемый блок. Адрес абсолютный, т. е. к примеру первый байт экрана имеет адрес 0x4000.

Формат блока данных

Блок данных - это последовательный поток байт, идущих друг за другом, самый первый передаваемый байт имеет адрес AAAAAAAAAAAAAAAA, следующий байт имеет адрес AAAAAAAAAAAAAAAA+1, и так далее, до последнего байта. Минимальный размер блока может быть 0 байт (NNNNNNNNNNNN=0=0x0000), максимальный размер блока 16380 байт (NNNNNNNNNNNN=4095=0x0FFF). В тестовой программе SPI master [5] для передачи экрана целиком будет использоваться NNNNNNNNNNNN=1728=0x06C0 (размер блока данных 6912 байт).

Если считать весь блок данных вместе с заголовком, то минимально может передаваться 4+0 = 4 байта (только заголовок, блок данных имеет нулевую длину, т. е. отсутствует), а максимально может передаваться 4+16380 = 16384 байта. В нашем тесте весь блок данных экрана вместе с заголовком будет размером 4+6912 = 6916 байт.

Отслеживание начала передачи

Как уже упоминалось ранее - заголовок, блок данных, и все байты идут друг за другом без пауз, в сплошном потоке байт. Для отделения заголовка (начала передачи) задействован сигнал выборки CS SPI. Переход CS из 1 в 0 будет означать начало заголовка, а переход из 0 в 1 - окончание передачи блока.

[SPI master]

Для проверки работы ZX-HDL-console была сделана тест-программа [5], генерирующая пакеты данных на интерфейсе SPI. Программа работает на микроконтроллере ARM7 AT91SAM7X512 Atmel, установленном на макетной плате AT91SAM7X.

AT91SAM7X-ZX-Spectrum-screen-test-121002

Файлы экранов записаны на карту памяти SD (в папку scr), и могут быть выведены как слайд-шоу на монитор, подключенный к ZX-HDL-console. Карта памяти SD подключена к SPI1 микроконтроллера (в разъем U6 UEXT макетной платы AT91SAM7X), а ZX-HDL-console подключена к SPI0 (для этого на макетное поле распаян еще один разъем с такой же цоколевкой для SPI), т. е. в тест-программе задействовано сразу два интерфейса SPI.

Тест-программа имеет простой текстовый интерфейс управления со встроенной подсказкой по командам. Подключиться к интерфейсу можно через стандартный RS232 (коннектор J6 DBGU макетной платы AT91SAM7X) или через виртуальный USB COM-порт (мини USB коннектор J3). В качестве программы управления можно использовать любой терминальный клиент (HyperTerminal, TerraRerm, putty, SecureCRT и т. п.).

ZX-HDL-console-SPI-master-scr-slideshow ZX-HDL-console-SPI-master-help ZX-HDL-console-SPI-master-info

В заключение приведены несколько фото работающего проекта совместно с SPI master AT91SAM7X [5].

ZX-HDL-console-100 1409 ZX-HDL-console-100 1430 ZX-HDL-console-100 1500
ZX-HDL-console-100 1526 ZX-HDL-console-100 1534 ZX-HDL-console-100 1535

[Чем прошить SPARTAN-3A]

Чтобы логика ZX-HDL-console заработала на платке Gameduino, нужно залить скомпилированную прошивку в память микросхемы FLASH AT45DB041D-SU, подключенной к FPGA Xilinx SPARTAN-3A SC3S200A (и микросхема FLASH, и FPGA SC3S200A установлены на плате Gameduino). Это можно сделать через через специальный JTAG кабель. Он бывает двух видов - подключающийся либо через LPT, либо через USB. С кабелем JTAG (и LPT, и USB) работает утилита Xilinx iMPACT, которая входит в пакет программ Xilinx ISE WebPack 14.2.

Xilinx JTAG Parallel Download Cable (LPT)

xilinx lpt JTAG xilinx lpt JTAG schematic

Такой кабель можно собрать самому. Схема взята из официального руководства Xilinx JTAG Programmer Guide [6]. Сигналы кабеля с коннектора JTAG Header: VCC, GND, TCK, TDO, TDI TMS нужно подключить к соответствующим сигналам разъема JTAG X2X3, установленного на плате Gameduino [1]. Недостатком кабеля LPT JTAG является неактуальность разъема LPT, так как его на современных компьютерах уже не встретишь, и низкая скорость работы.

Platform Cable USB II

Этот кабель JTAG намного удобнее и практичнее, так как подключается через USB. Официально кабель называется Platform Cable USB II (Part Number HW-USB-II-G), и шьет почти все микросхемы Xilinx (Virtex-6, Virtex-5 FX, Virtex-5 LX, Virtex-5 SX, Virtex-4, Virtex-II Pro, Virtex-II, Virtex-E, Virtex, Spartan-6, Spartan-3A, Spartan-3A DSP, Spartan-3AN, Spartan-3E, Spartan-3, Spartan-II, Spartan-IIE, Spartan, CoolRunner-II, CoolRunner XPLA3, Platform FLASH, XC18Vxx Series, XC9500, XC9500XL, XC9500 XV). Совсем не обязательно покупать оригинальный кабель от Xilinx, на ebay.com можно найти намного дешевле китайский аналог, который работает точно так же (ключевые слова для поиска Xilinx Platform Cable USB Compatible FPGA CPLD JTAG).

xilinx usb JTAG Platform Cable USB II Xilinx Platform Cable USB Compatible FPGA CPLD JTAG ebay

[Словарик]

CPLD Complex Programmable Logic Device, дословно переводится как сложное программируемое логическое устройство, по смыслу это то же самое, что и ПЛИС. Обычно под CPLD понимаются микросхемы сложнее, чем PAL (Programmable Array Logic), но проще, чем FPGA. В CPLD и PAL, в отличие от FPGA, обычно применяется встроенная энергонезависимая память для хранения логики.

DCM Digital Clock Manager, модуль управления тактовой частотой. Специальная схема внутри FPGA, которая отвечает за формирование тактовой частоты для работы логики.

DPRAM Dual Port RAM, двухпортовое ОЗУ. Специальная память с двумя физическими интерфейсами доступа к содержимому.

FPGA, ПЛИС Field Programmable Gate Array, Программируемая Логическая Интегральная Схема - специальная микросхема, предназначенная для создания произвольной цифровой схемы, логика которой программируется пользователем. Совместно с FPGA обычно применяется внешняя энергонезависимая память для хранения логики. Логика также может загружаться из внешнего интеллектуального устройства (микроконтроллер).

IOB Input-Output Block, блок ввода-вывода, специальная схема в FPGA, которая отвечает за конфигурацию выводов микросхемы.

HDL Hardware Description Language, язык описания аппаратуры. Общее название всех языковых средств, которые применяются для разработки FPGA и CPLD. К HDL-языкам относятся самые популярные языки Verilog и VHDL.

RAM, ОЗУ Random Access Memory, или Оперативное Запоминающее Устройство.

SPI Serial Peripheral Interface, последовательный периферийный интерфейс. Подробнее см. [2].

Verilog Си-подобный язык описания логики, применяемый для разработки содержимого FPGA.

VESA Video Electronics Standards Association - организация, занимающаяся разработкой стандартов вывода видеоинформации. В этой статье под аббревиатурой VESA подразумеваются стандартные видеорежимы для компьютерных мониторов.

[Ссылки]

1. Gameduino: игровой адаптер для микроконтроллеров.
2. Интерфейс SPI.
3. Организация экрана ZX Spectrum site:zxdesign.info.
4. 121108ZX-HDL-console-pub.zip - исходный код Verilog-проекта ZX-HDL-console (Xilinx ISE WebPack 14.2), фотографии, документация.
5. AT91SAM7X: работа с портом SPI в режиме master.
6. Xilinx JTAG Programmer Guide pdf site:xilinx.com - руководство по программированию чипов FPGA Xilinx через интерфейс JTAG.