Интереса ради сделал максимально простенький комплект модулей: приемники, передатчики и те и другие с разным набором плюшек, реализующих простой самобытный протокол связи с манчестерским кодированием для связи 2х и более ПЛИС.

Представленные модули совместимы с шиной периферии (ШП) описанного в предыдущей статья «NMR» CPU ядра — Простое CPU ядро на ПЛИС. Так передатчик «SIINT_TR» может напрямую выступать в качестве сериализатора шины периферии «NMR». Если не рассматривать возможные приложения к «NMR» — все равно довольно часто встречаются задачи, в которых необходимо связать между собой два и более ПЛИС, или ПЛИС и МК, при этом стандартные интерфейсы чем‑то не устраивают. Вариантов почему могут не подходить стандартные интерфейсы довольно много, приведу лишь некоторые из собственного опыта, которые и послужили по сути ТЗ к проекту:

  • Стандартный интерфейс, допустим UART, в сочетании с передатчиком, приемником, контроллером, обеспечивающим необходимый формат кадров и т. д. могут занимать довольно много логических элементов, что критично, когда целевая ИМС ПЛИС не очень большого объема и не очень оптимально трассируется… Например старые FPGA от ALTERA и их знаменитые аналоги…

  • Отдельная история, когда нужно соединить сразу несколько ИМС ПЛИС, тогда проблема описанная ранее многократно увеличивается.

  • Стандартные интерфейсы могут не подходить, когда есть ограничения по применяемой ЭКБ, или просто есть осознанное желание не использовать дополнительные интерфейсные микросхемы, или вообще необходимо свести к минимуму внешнюю рассыпуху, но при этом иметь возможность обеспечить, как связь между соседними ИМС, так и между платами и даже разнесенными блоками.

  • Если нужен простой интерфейс, но с надежным аппаратным механизмом проверки целостности переданных/принятых данных.

  • Если нужно иметь потенциальную возможность развив протокол используя тот же интерфейс и аппаратную часть организовать небольшую и относительно простую сеть*.

  • И вот теперь все описанные хотелки, как и говорилось в первом пункте, нужно реализовать максимально компактно внутри ПЛИС.

Итак, после ночных раздумий и множественных дневных тестов родилась схема, показанная выше на рисунке 1, позволяющая реализовать все требования озвученные ранее. Конечно, когда стоит задача просто соединить две ПЛИСЫ внутри одной платы или рядом расположенных плат, то можно обойтись без неё, а просто соединить ножки ПЛИС (желательно через резистор рядом с передатчиком), внутренний протокол при этом менять ненужно. Однако если есть необходимость: соединить по витой паре два разнесенных устройства метров так на 50, или может быть даже на 100; нет возможности применить интерфейсные ИМС; существует напряженное ЭМ окружение; необходима гальваническая развязка — вот тогда схема с рисунка 1 будет как нельзя кстати.

Рисунок 1 – Схема соединения устройств с трансформаторной развязкой с использованием интерфейса "SINT"
Рисунок 1 – Схема соединения устройств с трансформаторной развязкой с использованием интерфейса "SINT"

Перейдем непосредственно к описанию модулей и протоколу связи. Интерфейс «SINT» основан на манчестерском кодировании. Передача ведется пакетами, состоявшими из 16-ти битной области открытых данных (по умолчанию поле адреса), непосредственно поля данных, содержащего 16 бит самих данных и 4 бита случайного шума, в конце пакета идут 16 бит CRC. Структура «SINT» пакета показана на рисунке 2. Существует вариант более простого «VSIINT_LT» интерфейса, также совместимого с ядром «NMR». Основное отличие состоит в отсутствие аппаратного кодирования и «зашумления» области данных.

Рисунок 2 –Структура пакета данных, отправленных по интерфейсу "SINT"
Рисунок 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» пакета (сигнала передатчика и приемника)
Рисунок 3 – Структура одного «SIINT» пакета (сигнала передатчика и приемника)

В процессе передачи пакета сначала формируется стартовый бит, далее пока передается адрес (открытые данные) происходит шифрование основных данных (16 бит + шум 4 бита), а пока передаются основные данные происходит вычисление CRC. Шифрующий полином данных может быть уникальным, и должен быть согласован между приемником и передатчиком (в примере представлен случайный вариант кодирования). Для CRC используется стандартный полином IBM-16. Приемник автоматически определяет частоту, на которой поступают данные и осуществляет их захват, декодирование и вычисление CRC. По завершению приема (согласно кол‑ву полученных бит) выставляется флаг «WER», если проверка на CRC пройдена положительно, то предварительно выставляется флаг «No_Error». В случае если прием данных был прерван ранее ожидаемого окончания пакета, после максимального доступного временного окна, модуль приемника сбрасывается и снова готов к приему нового пакета. Когда идет прием на выходе «RS_busy» приемника устанавливается высокий уровень.

На рисунке 4 представлена схема отражающая потенциальное соединение модулей передатчика и приемника, а так же она использовалась для первоначальной симуляции и отладки; стоит обратить внимание что приёмник «SIINT_RS» и передатчик «SIINT_TR» тактируются от разных сигналов. Модуль DIF_OUT может быть полезен когда на борту ИМС нет дифференциальных выводов.

Рисунок 4 – Схема моделирования интерфейса  «SIINT», совместная работа передатчика и приемника
Рисунок 4 – Схема моделирования интерфейса «SIINT», совместная работа передатчика и приемника

В архиве по ссылке содержатся все необходимые файлы для повторения, тестирования и использования в своих проектах описанного интерфейса, как в его полной версии, так и в облегченной версии без кодирования данных (VSIINT_{TR/RS}_LT).

* В следующей статье по теме планирую описать вариант реализации многосвязной сети с использованием в своей основе «SINT» интерфейс (материал почти готов нужно немного поработать напильником).

П.С.: SINT это первое поколение интерфейса, его со временем заменил на SIINT, но что бы не плодить сущности пусть второе и будет отправной точкой с лаконичным названием «Simple INTerface», а название модулей уж оставлю как есть.

Комментарии (16)


  1. vk6677
    26.10.2023 03:45
    +1

    Хорошая статья. Ethernet 10Base-T тоже можно реализовать на ПЛИС достаточно просто (Манчестер 2, развязка через трансформатор, соединение типа "звезда"). Но, скорее всего потребуется больше логических элементов и более "жирная" ПЛИС.


    1. Megobari
      26.10.2023 03:45

      Однозначно большее количество логических элементов уйдёт.


  1. Xitsa
    26.10.2023 03:45

    А что подразумевается под шифрованием полиномом?


    1. Xitsa
      26.10.2023 03:45

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


      1. Sukhachev_KIR Автор
        26.10.2023 03:45
        +2

        Да совершенно верно, механизм такой же, как в циклическом кодировании - ну CRC короче и задавая связи формально можно получать разное основание кодирования, но это скорее фича))) я если честно, пользовался в 99% модулями без кодирования, так и быстрее и меньше места занимает.


  1. RV3EFE
    26.10.2023 03:45

    Интересно, спасибо. В моей практике при связи ПЛИС с ПЛИС или с контроллером, не говоря про скоростную шину, почти всегда нужно было иметь двунаправленный интерфейс.

    Скорость хорошая получилась, сильно круче uart, но оно и понятно;)


  1. zatim
    26.10.2023 03:45
    -1

    Вопрос по схеме: как детектируется отрицательная полуволна входного сигнала с трансформатора? С положительной все понятно, она в диапазоне питания плисины. Отрицательная ниже нуля. Или там включена аппаратная подтяжка к плюсу питания?


    1. Sukhachev_KIR Автор
      26.10.2023 03:45

      А она не нужна – отрицательная полуволна это по сути «0», сигнал на входе ПЛИС должен быть как из википедии. Схема с диодами нужна чтобы трансформатор не насыщался. Т.Е. если выкинуть всё: и трансформаторы и диодики с резисторами и соединить ПЛИС напрямую, то канал будет работать, и если добавить все вот это (что на схеме), то канал связи будет работать так-же.


      1. zatim
        26.10.2023 03:45

        Получается и вход SI- не нужен, раз на нем всегда 0?


      1. zatim
        26.10.2023 03:45

        Так нужен вход SI- или нет? Я спрашиваю не затем чтобы вас подколоть или унизить, хочу повторить ваш дизайн.


  1. sdy
    26.10.2023 03:45
    +1

    50м, 10Мб/с ? проще было взять SFP медные, было бы интересней и проще для повторения. Может попробовать запилить на SFP с медью обычной?


    1. Sukhachev_KIR Автор
      26.10.2023 03:45

      Да, конечно, можно было-бы, но задачи такой не стояло))) целевая стабильная скорость: 1МБ - 2 МБ/с – без чего-либо сложнее диода в обвязке и кусочка проволоки на феррите неизвестной марки. Претензий никаких нет, ни на топовую скорость, ни на идеальный протокол, но в моем опыте оказалось ни раз полезно. И если вдруг кому пригодится - а тут есть готовое и весьма отлаженное решение с открытым кодом) вот  


  1. cujos
    26.10.2023 03:45

    имхо проще 8b10b поднять на rs485 и трансформаторах

    там стабильные 10 Mbit(на 12.5 МГц) причем на сотни метров, а еще их можно поверх питания кидать


    1. Sukhachev_KIR Автор
      26.10.2023 03:45

      Может быть, я не спорю, но, а как например соединить N ПЛИСов по 485 без внешних драйверов и только на резисторах? Просто в моей практике берешь стандартный интерфейс – чего нет в железе, а значит берешь внешнее железо.

      Про дистанции (50М) я пишу лишь то, что испытывал сам и оно работало), да и опять же я ни на что не претендую))) стандартные интерфейсы существую много лет, и десятков лет, и они явно во многом лучше... (я, если все пойдет по плану, потом буду выкладывать, тут, свои реализации стандартов), но а пока вот это)))


      1. cujos
        26.10.2023 03:45
        +1

        так цепочкой соединяется и все, два терминала на концах

        из аналогов: hiperface dsl, endat 3, biss line, scs openlink

        документация открытая только для biss line,и только для мастера, но в принципе физика там везде rs485 + 8b10b на частотах от 7 до 12.5


  1. Megobari
    26.10.2023 03:45

    Насколько я понял, фишка именно в минимальном количестве схем обвязки, в отсутствии внешних трансиверов и покупных микросхем.
    Понятно, что 8b10b реализуется проще, примерно 30/15 LUT сериализатор/десереализатор будут занимать, что ещё компактнее чем у автора, но тоже имеет место быть.

    От меня плюс!