PROTEQ — протокол обмена по мультигигабитными линиям для ПЛИС Xilinx

в 22:58, , рубрики: Песочница, метки:

Современные ПЛИС содержат мультигигабитные линия связи и существует большое количество протоколов для обмена. Однако при ближайшем рассмотрении применять стандартные протоколы в ПЛИС не всегда удобно. Например, для ПЛИС Xilinx доступны реализации PCI Express, RapidIO, Aurora; у каждого из них есть недостатки. PCI Express и RapidIO работают с кодировкой 8/10 что сразу ограничивает пропускную способность. Aurora может работать с кодировкой 64/66, но не обеспечивает восстановление данных после сбоя. С учётом недостатков стандартных протоколов и особенностей применения я решил реализовать свой протокол обмена. Название PROTEQ досталось по наследству от предыдущего проекта, для которого была высказана похожая идея восстановления данных после сбоя.

Итак, исходные данные:
• аппаратура — модуль FMC106P, две ПЛИС Virtex 6 LX130T-2 и LX240T-1; Описание здесь: insys.ru/products/fmc/fmc106p
• скорость передачи — 5 Гбит/с
• число линий — 8
• источник данных — АЦП, нет возможности приостановить передачу
• двунаправленный обмен данными
• требуется реализовать восстановление данных после сбоя
• кодировка — 64/67

Основная идея — реализовать постоянную повторную передачу данных до прихода подтверждения о принятом пакете.

Рассмотрим реализацию одной линии:

PROTEQ — протокол обмена по мультигигабитными линиям для ПЛИС Xilinx - 1

На передатчике реализованы четыре буфера. Источник данных обнаруживает свободный буфер и записывает в него данные. Запись идёт в строгом порядке 0,1,2,3; Узел передачи также по кругу опрашивает флаг заполнения буфера и начинает передавать данные из заполненных буферов. Когда от приёмника приходит подтверждение приёма, то буфер помечается свободным. При большом потоке данных подтверждение успевает прийти до передачи всех буферов и передача идёт на максимальной скорости. При маленьком потоке узел передачи успеет отправить повторный пакет, но он будет отброшен на приёмной стороне. На приёмнике также реализованы четыре буфера. В заголовке пакета находится номер буфера и пакет сразу отправляется в буфер назначения. В таком решении есть очень большая опасность. Если будет испорчен номер буфера, то возможно будут испорчены два пакета — и текущий пакет и уже принятый пакет. Что бы этого избежать в пакете используются две контрольные суммы — одна идёт сразу за заголовком, вторая — в конце пакета.

Для увеличения скорости может быть реализована передача по нескольким линиям. Узел prq_transceiver_gtx_m1 может работать с числом линий от 1 до 8. Для каждой линии ширина шины данных 32 бита. При использовании 8 линий общая ширина шины данных — 256 бит. Узел prq_transceiver_gtx_m1 обеспечивает только обмен пакетами фиксированной длины. Длина пакета всегда 256 слов. Для более удобной работы реализован узел prq_connect_m1; Он включает в себя два FIFO для передатчика и выход на FIFO со стороны приёмника.

Расчётная скорость обмена для восьми линий на частоте 5 ГГц:
5000000000 * 64/67 * 256/260 * 8 / 8 /1024 / 1024 = 4484,7 Мбайт/с

Именно эта скорость достигнута на модуле. Ошибки периодически возникают, но они исправляются протоколом.
Интересно сравнить эффективность PROTEQ с PCI Express v2.0 реализованном на этой же ПЛИС. Оба протокола используют восемь линков на скорости 5 Гбит/с. Максимальная скорость обмена составляет:

5000000000/8/1024/1024*8 = 4768 Мбайт/с

Эффективность PROTEQ:

4484/4768 = 0.94; т.е. 94% от максимальной скорости линии.

PCI Express обеспечивает скорость 3200 Мбайт/с

3200/4768 = 0.67; т.е. 67% от максимальной скорости линии.

Конечно главная причина низкой эффективности PCI Express v2.0 это применение кодировки 8/10;

Интересно также сравнить занимаемые ресурсы ПЛИС для реализации протоколов. На рисунке представлены области которые занимает PCI Express и PROTEQ со сравнимой функциональностью.

PROTEQ — протокол обмена по мультигигабитными линиям для ПЛИС Xilinx - 2

Проект PROTEQ доступен как OpenSource на сайте ds-dev.ru/projects/proteq

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js