четверг, 10 октября 2013 г.

Псевдо-UART на ПЛИС

Для задач контроля нижнего уровня классическим каналом связи является последовательный (Serial) интерфейс. В отличие от МК в ПЛИС отсутствует интерфейс UART, но его несложно реализовать самому без использования сторонних закрытых библиотек и даже без применения VHDL, а чисто аппаратно. Данный проект является демонстрацией схемотехнического формирования кодограммы общей длиной 60 бит (0...59), согласно формату UART на 3 фрейма 19200/8/n/1 и передачи с ПЛИС через конвертор ADM3202 по последовательному порту RS-232 или через конвертор ADM485/ADM2486 (последний с гальванической развязкой) по интерфейсу RS-485 для дальнейшей диагностики. 

На видео сциллограммы сняты непосредственно на выходе конвертора ADM3202, уровни RS-232:



Структурно основной модуль 'UART_TX' включает следующие макроблоки:
  1. RS-TRIGGER.
  2. DIV-SUM.
  3. Формирователь кодограммы BP0-19, BP20-39, BP40-59.
  4. Генератор NTI, задающий скорость данных передачи UART.
ОПИСАНИЕ РАБОТЫ

 Принцип передачи основан на формировании кодограммы из трех последовательных фреймов формата UART с таймаутами. При этом, одиночный фрейм включает:
  1. ST - стартовый бит, всегда нулевой.
  2. N - биты данных (общей длиной 5, 6, 7, 8, 9).
  3. P - бит паритета (чет по XOR от D0...Dn, нечет по XOR от D0...Dn и 1 или нет).
  4. SP - стоп-бит (1 или 2), всегда единичный.
  5. Фрейм всегда начинается и заканчивается состоянием IDLE единичного уровня, длительность которого определяет таймаут между посылками фреймов (пакетов) UART.
По приходу импульса запуска IZ положительной полярности защелкивается RS-триггер, разрешающий счет тактовых импульсов макроблоку DIV-SUM. Макроблок DIV-SUM осуществляет сдвиг начала кодограммы от импульса запуска на заданный интервал, и реализован на классическом счетчике и Flip-Flop триггере c асинхронными сбросами. По срабатыванию триггера с выхода макроблока DIV-SUM дается разрешение на работу счетчика, который формирует длительность каждого импульса (бита) в кодограмме по приходу (фронту) тактовых импульсов NTI. Период тактовых импульсов NTI подобран таким образом (из входной частоты TI = 38.3568 MГц внешнего тактового генератора), чтобы за одну секунду передать 19200 бит.

Расчет следующий:
  1. Пусть частота внешнего тактового генератора равна 38.3568 MHz, что эквивалентно периоду следования импульсов 26.071 нс.
  2. Необходимо добиться скорости в 19200 бод = 19200 бит/сек, что соответствует 10^6/19200 ~ 52 мкс на один разряд (бит) фрейма UART.
  3. Общий коэффициент деления генератора NTI равен 52 мкс / 26.071 нс = 1994.
  4. Генератор тактов NTI привязан по сбросу к сигналу запуска IZ для синхронности.
  5. Формирователь кодограммы представляет собой не что иное, как преобразователь параллельного кода в последовательный. Принцип работы данного преобразователя очень прост - по заданной комбинации со счетчика производится логическое умножение заданного кода на заданный сигнал (единичный бит), т.е. для каждого из 0...59 битов задана соответствующая комбинация кода со счетчика, далее все сигналы складываются по ИЛИ. Таким образом, для каждого момента времени на выходе схемы сложения будет присутствовать свой бит из параллельного кода. Для того, чтобы в остальные моменты времени за пределами начала и конца кодограммы на выходе формирователя кодограммы присутствовал единичный уровень (то самое состояние IDLE или отсутствие сигнала RX/TX), разрешение прохождения реализуется схемой "И-НЕ" по разрешению счета с выхода макроблока DIV-SUM. Сам исходный сигнал последовательного кода предварительно инвертируется, чтобы сохранить его состояние на выходе схемы "И-НЕ". Для того, чтобы обеспечить синхронность передачи последовательного кода и исключения "дрючков" переключения из-за разности задержек, на выходе осуществлена перепривязка FD-триггером к тактовым импульcам NTI. По коду 60 = 00111100 схемой дешифратора по "И" формируется общий сброс всех макроблоков и счетчика для окончания (запрета) кодограммы, и перекидывающий RS-триггер в начальное состояние до прихода следующего импульса запуска.
ОСОБЕННОСТИ РЕАЛИЗАЦИИ
  1. Для уменьшения наводок и влияния помех, разводка печатной платы должна выполняться с одним сплошным слоем металлизации, блокировочными керамическими емкостями около питающих пинов. Все назадействованные пользовательские пины I/O посажены внутри ПЛИС на землю и сконфигурированы как выходы.
  2. Все счетчики и триггеры асинхронные.
  3. Длина таймаутов (количество IDLE битов) выбрана равной длине DATA-пакета.
ЛИЦЕНЗИОННОЕ СОГЛАШЕНИЕ

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

ПРОЕКТ

p.s.: читайте продолжение материала "Реализация приема в синхронном и асинхронном режиме на ПЛИС"

Комментариев нет:

Отправить комментарий

В комментариях уважайте собеседника, внимательно читайте посты и не додумывайте. Просьбы и предложения из разряда: «можно ваш Skype/Viber/телефон», «напишите мне в vk/FB», а также другие им подобные — игнорируются. Выход новых версий ПО, внешняя ссылка, переставшая работать с течением времени и т.п. не является основанием для претензий. Желающие спокойно подискутировать и высказаться — Welcome. Желающие спонсировать блог — Donate. Нарушение этих простых правил ведет к бану и удалению комментариев без предупреждения.