Простой последовательный интерфейс «SINT» для связи двух ПЛИС, и не только
Интереса ради сделал максимально простенький комплект модулей: приемники, передатчики и те и другие с разным набором плюшек, реализующих простой самобытный протокол связи с манчестерским кодированием для связи 2х и более ПЛИС.
Представленные модули совместимы с шиной периферии (ШП) описанного в предыдущей статья «NMR» CPU ядра https://habr.com/ru/articles/769916/. Так передатчик «SIINT_TR» может напрямую выступать в качестве сериализатора шины периферии «NMR». Если не рассматривать возможные приложения к «NMR» — все равно довольно часто встречаются задачи, в которых необходимо связать между собой два и более ПЛИС, или ПЛИС и МК, при этом стандартные интерфейсы чем-то не устраивают. Вариантов почему могут не подходить стандартные интерфейсы довольно много, приведу лишь некоторые из собственного опыта, которые и послужили по сути ТЗ к проекту:
· Стандартный интерфейс, допустим UART, в сочетании с передатчиком, приемником, контроллером, обеспечивающим необходимый формат кадров и т.д. могут занимать довольно много логических элементов, что критично, когда целевая ИМС ПЛИС не очень большого объема и не очень оптимально трассируется… Например старые FPGA от ALTERA и их знаменитые аналоги…
· Отдельная история, когда нужно соединить сразу несколько ИМС ПЛИС, тогда проблема описанная ранее многократно увеличивается.
· Стандартные интерфейсы могут не подходить, когда есть ограничения по применяемой ЭКБ, или просто есть осознанное желание не использовать дополнительные интерфейсные микросхемы, или вообще необходимо свести к минимуму внешнюю рассыпуху, но при этом иметь возможность обеспечить, как связь между соседними ИМС, так и между платами и даже разнесенными блоками.
· Если нужен простой интерфейс, но с надежным аппаратным механизмом проверки целостности переданных/принятых данных.
· Если нужно иметь потенциальную возможность развив протокол используя тот же интерфейс и аппаратную часть организовать небольшую и относительно простую сеть*.
· И вот теперь все описанные хотелки, как и говорилось в первом пункте, нужно реализовать максимально компактно внутри ПЛИС.
Итак, после ночных раздумий и множественных дневных тестов родилась схема, показанная выше на рисунке 1, позволяющая реализовать все требования озвученные ранее. Конечно, когда стоит задача просто соединить две ПЛИСЫ внутри одной платы или рядом расположенных плат, то можно обойтись без неё, а просто соединить ножки ПЛИС (желательно через резистор рядом с передатчиком), внутренний протокол при этом менять ненужно. Однако если есть необходимость: соединить по витой паре два разнесенных устройства метров так на 50, или может быть даже на 100; нет возможности применить интерфейсные ИМС; существует напряженное ЭМ окружение; необходима гальваническая развязка — вот тогда схема с рисунка 1 будет как нельзя кстати.
Рисунок 1 — Схема соединения устройств с трансформаторной развязкой с использованием интерфейса «SINT»
Перейдем непосредственно к описанию модулей и протоколу связи. Интерфейс «SINT» основан на манчестерском кодировании. Передача ведется пакетами, состоявшими из 16-ти битной области открытых данных (по умолчанию поле адреса), непосредственно поля данных, содержащего 16 бит самих данных и 4 бита случайного шума, в конце пакета идут 16 бит CRC. Структура «SINT» пакета показана на рисунке 2. Существует вариант более простого «VSIINT_LT» интерфейса, также совместимого с ядром «NMR». Основное отличие состоит в отсутствие аппаратного кодирования и «зашумления» области данных.
Рисунок 2 –Структура пакета данных, отправленных по интерфейсу «SINT»
«SINT» пакет всегда начинается со стартового бита, который приемником считается как »1». Для работы приемнику необходимо знать каким был предыдущий полученный бит »0» или »1», поэтому стартовый бит всегда должен быть »1». По стартовому биту также определяется частота следования импульсов в пакете. Если быть точнее по длительности стартового бита определяется временной интервал, после которого необходимо захватить следующий бит данных со входа. Интерфейс является самотактирующимся, так как счетчик определяющий момент захвата данных обнуляется при каждом изменении уровня сигнала на входе, что позволяет не накапливается ошибке расхождения и нестабильности тактовых сигналов приемника и передатчика. CRC вычисляется без стартового бита и покрывает открытые и закрытые данные с учетом «шума».
Максимально достигнутая скорость передачи на линии протяженностью 50 метров составляла 10 Мбит/с, максимальная стабильная скорость составляла 5 Мбит/с при этом «относительно редко» возникали ошибки, но они детектируются посредством CRC. На скорости 2 Мбит/с ошибки при прочих равных внешних условиях обнаружены не были. Апробация интерфейса проходила в разных условиях и на разных ИМС ПЛИС, от 5578… до разных семейств cyclone и max. Если не лезть в максимальные скорости передачи то разницы между ними замечено не было.
Модули передатчика «SIINT_TR» и приемника «SIINT_RS» оптимизированы под любое поколение ПЛИС и не имеют привязки к архитектуре, verilog описание модулей приведено в архиве по ссылке в конце статьи. Модуль передатчика занимает примерно 180 логических элементов в зависимости от поколения ПЛИС, а приемника примерно 400. Передатчик по стартовому сигналу «WEP» захватывает данные с параллельных шин адреса и данных, выставляет флаг занятости и начинает преобразование данных и их последовательную передачу. Временные диаграммы совместной работы модулей передатчика и приемника показаны на рисунке 3, а тестовая схема на рисунке 4.
Рисунок 3 — Структура одного «SIINT» пакета (сигнала передатчика и приемника)
В процессе передачи пакета сначала формируется стартовый бит, далее пока передается адрес (открытые данные) происходит шифрование основных данных (16 бит + шум 4 бита), а пока передаются основные данные происходит вычисление CRC. Шифрующий полином данных может быть уникальным, и должен быть согласован между приемником и передатчиком (в примере представлен случайный вариант кодирования). Для CRC используется стандартный полином IBM-16. Приемник автоматически определяет частоту, на которой поступают данные и осуществляет их захват, декодирование и вычисление CRC. По завершению приема (согласно кол-ву полученных бит) выставляется флаг «WER» , если проверка на CRC пройдена положительно, то предварительно выставляется флаг «No_Error». В случае если прием данных был прерван ранее ожидаемого окончания пакета, после максимального доступного временного окна, модуль приемника сбрасывается и снова готов к приему нового пакета. Когда идет прием на выходе «RS_busy» приемника устанавливается высокий уровень.
На рисунке 4 представлена схема отражающая потенциальное соединение модулей передатчика и приемника, а так же она использовалась для первоначальной симуляции и отладки; стоит обратить внимание что приёмник «SIINT_RS» и передатчик «SIINT_TR» тактируются от разных сигналов. Модуль DIF_OUT может быть полезен когда на борту ИМС нет дифференциальных выводов.
Рисунок 4 — Схема моделирования интерфейса «SIINT», совместная работа передатчика и приемника
В архиве по ссылке https://disk.yandex.ru/d/XUI3MHO3z3TAIg содержатся все необходимые файлы для повторения, тестирования и использования в своих проектах описанного интерфейса, как в его полной версии, так и в облегченной версии без кодирования данных (VSIINT_{TR/RS}_LT).
* В следующей статье по теме планирую описать вариант реализации многосвязной сети с использованием в своей основе «SINT» интерфейс (материал почти готов нужно немного поработать напильником).
П.С.: SINT это первое поколение интерфейса, его со временем заменил на SIINT, но что бы не плодить сущности пусть второе и будет отправной точкой с лаконичным названием «Simple INTerface», а название модулей уж оставлю как есть.