Мучаем 5576ХС4Т - часть 'h29 - принимаем с ПЛИС изображение PNG

Apr 22, 2019 18:20

Часть 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 (пусть даже несжатый), а потом возьмёмся, наконец-то, за само несжатое изображение - как его получить с аналоговой камеры!

Такой способ работы "с конца" может показаться странным, но хотелось сначала убедиться, что мы можем доверять "каналу связи", а только потом использовать его для отладки аналоговой части, где нас может ждать много сюрпризов :)

странные девайсы, ПЛИС, работа

Previous post Next post
Up