Часть 0 - покупаем, паяем, ставим драйвера и софт Часть 1 - что это вообще за зверь? Часть 2 - наша первая схема! Часть 3 - кнопочки и лампочки Часть 4 - делитель частоты Часть 5 - подавление дребезга кнопки Часть 6 - заканчиваем кнопочки и лампочки Часть 7 - счетчики и жаба Часть 8 - передатчик UART Часть 9 - Hello, wolf! Часть 'hA - приёмник UART Часть 'hB - UART и жаба Часть 'hC - полудуплексный UART. Часть 'hD - МКО (МКИО, Mil-Std 1553) для бедных, введение.Часть 'hE - приёмопередатчик МКО "из подручных материалов" (в процессе)
Часть 'hF - модуль передатчика МКО Часть 'h10 - передатчик сообщений МКО Часть 'h20 - работа с АЦП ADC124s051 Часть 'h21 - преобразование двоичного кода в двоично-десятичный (BCD) Часть 'h22 - Bin2Bcd с последовательной выдачей данных Часть 'h23 - перемножитель беззнаковых чисел с округлением Часть 'h24 - перемножитель беззнаковых чисел, реализация Часть 'h25 - передаём показания АЦП на компьютер Часть 'h26 - работа над ошибками (быстрый UART) Часть 'h27 - PNG и коды коррекции ошибок CRC32 Часть 'h28 - передатчик изображения PNGЧасть 'h29 - принимаем с ПЛИС изображение PNG
Часть 'h2A - ZLIB и коды коррекции ошибок Adler32 Часть 'h2B - ускоряем Adler32 Часть 'h2C - формирователь потока Zlib Часть 'h2D - передаём сгенерированное PNG-изображение Часть 'h2E - делим отрезок на равные части Часть 'h2F - знаковые умножители, тысячи их! Часть 'h30 - вычислитель множества Мандельброта Часть 'h31 - ускоренные сумматоры Часть 'h32 - ускоренные счётчики (делаем часы) Часть 'h33 - ускоряем ВСЁ Часть 'h34 - ускоренные перемножители Часть 'h35 - умножители совсем просто Часть 'h36 - уравновешенный четверичный умножитель Наконец-то, прошьём хитрючую схему передатчика PNG в ПЛИС и посмотрим, что из этого получается.
Наконец, сохраняя "сырые данные" в файл .png, мы получаем картинку (именно так должна выглядеть МКС с 4 оптическими мишенями для видеосистемы стыковки, с расстояния 300 метров):
Что интересно, львиная доля приложений вообще игнорирует эти CRC-коды. Но важным исключением является Firefox - в той версии, что установлена, он не даёт спуску даже в IEND - если с CRC этого блока ошибка - вместо изображения мы получаем крестик.
Схема "верхнего уровня" на удивление проста:
Здесь PNGsender_release - схемотехнический блок, рассмотренный
в прошлой части, но из него мы удалили все "отладочные" выходы, так что осталось всего 3 провода!
ButtonDebounce - подавитель дребезга кнопки и по совместительству формирователь импульса длительностью в один такт. Его мы подробно рассмотрели в
части 5.
И мы не показали разве что делитель частоты, формирующий сигнал ce_1kHz, но это мы делали ранее. По сути, используем Custom_counter, рассмотренный
в части 7 После синтеза всего этого дела и прошивки в ПЛИС, остаётся только запустить
Termite (или другую похожую программу), настроить COM-порт: 921600 бод, 8 бит, бит чётности отсутствует, 1 стоповый бит (921600 bps, 8N1). Нажимаем кнопочку - и к нам приходит "файл" целиком. По счастью, формат PNG вполне себе "читаем" как в HEX, так и в ASCII - мы вполне себе видим маркеры PNG, IHDR, IDAT в начале, а также IEND в конце, чтобы понять: передано было всё.
Как это сохранить в файл - на удивление плохо продумано! Termite предлагает сохранение в текстовый файл ровно того, что мы видим на экране - либо ASCII-код, в котором "нечитаемые символы" заменяются на числа в квадратных скобках, либо HEX-код с "расшфировкой" справа.
Но можно зайти в настройки и там выбрать аддон - "log file". Указать путь к этому файлу, один раз нажать на кнопку - и выйти. Почему-то при выборе двоичного формата этот лог обрывается где-то посередине (у меня Termite 3.2), а вот если эту галочку сбросить, то всё нормально, не считая "заголовка" в начале работы. Когда мы удаляем его в HEX-редакторе, и сохраняем как .png - получаем вполне себе корректную картинку - ура.
Чтобы убедиться, что все биты переданы чётко, и CRC посчитался какой надо, можно скачать
pngcheck - "официальная" программа для проверки корректности png-файла, которая совсем не прощает ошибок, но зато говорит, где эти ошибки возникают!
Здесь мы "ручками" в HEX-редакторе исказили CRC к блоку IEND (верхние строки), а потом исправили этот CRC, но убили контрольную сумму Adler, которой оканчивается поток ZLIB в блоке IDAT. Получили ошибку Data error (-3) именно от ZLIB.
Итак, мы убедились, что можем передавать сколько-нибудь большие объёмы по UART на максимальной скорости безошибочно, а если ошибка возникнет - мы сможем её обнаружить благодаря CRC.
Осталось за малым - сформировать из несжатого изображения корректный поток ZLIB (пусть даже несжатый), а потом возьмёмся, наконец-то, за само несжатое изображение - как его получить с аналоговой камеры!
Такой способ работы "с конца" может показаться странным, но хотелось сначала убедиться, что мы можем доверять "каналу связи", а только потом использовать его для отладки аналоговой части, где нас может ждать много сюрпризов :)