June 9th, 2021

QuatCore

"16-битный" приёмник UART - окончание

Где-то неделю назад мы попробовали сделать приёмник UART, который, получив один стартовый бит, пытался получить 2 байта подряд без дополнительной синхронизации. Когда передатчиком RS485 выступал дешёвый USB-"свисток" на основе CH340C без кварца, "не взлетело", на один бит мы "съехали" на втором байте.

Можно "свалить" всё на негодный передатчик (и это, в общем-то, справедливо), но попробуем всё-таки сделать более "всеядный" приёмник, который и такой сигнал примет и не подавится. И как обычно, попытаемся сделать верилоговский модуль настолько простым и компактным, насколько это возможно.

Collapse )



Работает!

Сначала передаёт в байтовом режиме "ПрЮвет", затем начинает давать "дамп памяти" в 16-битном режиме (см 16-битный передатчик UART-окончание), а потом просто ждёт 16-битной посылки и тут же ретранслирует её назад.

Как видно, если я действительно посылаю 2 символа, ровно они и возвращаются. Попытался послать 3 символа - получил мусор, это нормально, передатчик макета начал посылку, пока ещё не окончилась передача с компьютера, вот и вышла коллизия.

А вот когда я послал 1 байт - не получил никакого ответа, зато на следующие 2 байта получил ровно их, т.е "восстановление" от случайно переданного байта действительно работает.

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

Впрочем, можно пойти и дальше, и также "аппаратно" реализовать уровень "пакетов", т.е наш приёмник проанализирует заголовок на предмет "нам ли адресован этот пакет", проверит также CRC в конце пакета, и только если всё правильно - пнёт процессор, чтобы не сильно его отвлекать от работы.
QuatCore

"Часы реального времени" для QuatCore

На мой приборчик должны каждые 100 мс прибывать сообщения "синхронизации со словом данных" по МКО (Mil-Std 1553), в которых будет передаваться число от 0 до 99, "номер текущего вычислительного такта". Просто по возрастанию, и после 99 последует 0. Тем самым, мы сможем обозначить время в интервале 10 секунд.

Получая кадр изображения, мы должны будем зафиксировать метку времени, когда он был получен (скорее даже "середину экспозиции", т.е какому моменту будут соответствовать те параметры сближения, что мы получили). По протоколу, это будет 16-битное число в формате UQ7.9, то есть беззнаковое с фиксированной запятой. Старшие 7 бит - это тот самый "номер вычислительного такта", от 0 до 99, но благодаря младшим битам можно будет отметить момент времени с точностью до ≈ 200 мкс, этого вполне достаточно, учитывая, что просто на считывания кадра с матричного фотоприёмника 1205ХВ014 будет уходить 10 мс, это при ПЛИС, "разогнанной" до 50 МГц (пока у меня 25 МГц), ну может 5 мс, если дойти до 100 МГц, и это уже предельное значение для этого фотоприёмника.

Вот думаю сделать отдельный модулёк, который будет вести счёт времени в этих 16 битах (используя обычную тактовую частоту), синхронизироваться по слову данных, а также отмечать момент получения кадра.

Collapse )

Как именно его "прикрутить" к остальному проекту - ближе к делу посмотрим. Не хочется из-за такой мелочи расширять мультиплексор шины данных QuatCore, он и так здоровенный. Лучше бы ближе к информационному обмену воткнуть...