AXI4 (Lite) Разъяснение узкого всплеска против не выровненного разрыва / Совместимость
В настоящее время я пишу мастер AXI4, который должен поддерживать AXI4 Lite (AXI4L).
Мой мастер AXI4 получает данные от 16-битного интерфейса. Это на Xilinx Spartan 6 FPGA, и я планирую использовать EDK AXI4 Interconnect IP, который имеет минимальную ширину WDATA 32 бит.
Сначала я хотел использовать узкий пакет, то есть AWSIZE = x"01" (2 байта в передаче). Однако я обнаружил, что в Справочном руководстве AXI UG761 от Xilinx говорится, что "узкие пакеты [поддерживаются], но [...] не рекомендуются". Предполагается, что невыровненные транзакции поддерживаются.
Это заставило меня задуматься. Скажем, я начинаю взрыв без выравнивания:
- AWLEN = x "01" (2 удара)
- AWSIZE = x"02" (4 байта в передаче ")
И сделайте следующее:
AX (32-bit word #0: send hi16)
XB (32-bit word #1: send lo16)
Где A, B - мои 16-битные слова, которые начинаются с не выровненного (выровненного по 2 байта) адреса. X означает, что WSTRB сброшен для указанных 16 бит.
- Поддерживается ли это или относится к категории "узкий пакет" даже через AWSIZE = x"02" (4 байта при передаче), в отличие от AWSIZE = x"01" (2 байта при передаче)?
Теперь, если бы это было только для AXI4, я бы, вероятно, не заботился бы об этом случае использования, потому что периферийные устройства AXI4 должны использовать сигналы WSTRB. Однако в справочном руководстве AXI UG761 говорится, что "[SXI4L] подчиненный интерфейс может игнорировать WSTRB (допустим, все байты действительны)".
Я читал здесь, что многие (но не все; и нет списка?) Периферийные устройства Xilinx AXI4L предпочитают игнорировать WSTRB.
- Означает ли это, что мне по существу запрещено делать узкие пакеты ("не рекомендуется"), а также невыровненные пакеты ("WSTRB можно игнорировать") или есть простой способ выгрузить часть работы по реализации из моего мастера в соединяться, гарантируя правильное поведение системы при доступе к периферийным устройствам AXI4L?
1 ответ
Ваш пример не узкий взрыв, а должен работать.
Причина, по которой узкий пакет не рекомендуется, заключается в том, что он дает неоптимальные характеристики. И узкопакетные, и данные по перестройке стоят в области и не рекомендуются ИМХО. Тем не менее, DRE имеет минимальную стоимость полосы пропускания, в то время как узкий пакет делает. Если ваш порт AXI имеет 32 Мбит / с 100 МГц, максимальная пропускная способность составляет 3,2 ГБ, если вы используете узкий пакет из 16 битов в 50% случаев, тогда ваша максимальная пропускная способность снижается до 2,4 Гбит (32 бит х 50 МГц + 16 бит х 50 МГц). Кроме того, я не уверен, что AXI-Lite поддерживает узкий пакет или преобразование данных.
В вашем примере есть 2 основных недостатка. Во-первых, для передачи 32 бит требуется 3 удара данных, что является худшим результатом, чем узкий пакет (я не думаю, что AXI достаточно умен, чтобы отменить последний пакет с WSTRB равным 0). Во-вторых, вы не можете записать более 2 16-битных данных за раз, что приведет к зависанию производительности вашей инфраструктуры AXI, если у вас есть много данных для передачи.
Лучший способ справиться с этим - объединить 16 бит вместе, чтобы сформировать 32 бита в вашем блоке. Затем вы буферизуете эти 32 бита и разбиваете их, когда вам достаточно. Это высокопроизводительный способ AXI.
Тем не менее, если вы получаете данные в 16-битном формате, вам лучше использовать AXI-Stream, который поддерживает 16-битный формат, но не имеет понятия адресов. Вы можете сопоставить AXI-Stream с AXI-4, используя IP-ядра Xilinx. Это может сделать AXI-Datamover или AXI-DMA. Оба делают то же самое (фактически, AXI-DMA включает в себя перехват данных), но AXI-DMA управляется через интерфейс AXI-Lite, в то время как перехват данных управляется через дополнительные потоки AXI.
В заключение отметим, что ядра Xilinx никогда не требуют узкой серии или DRE. Если вам требуется DRE в AXI-DMA, это выполняется ядром AXI-DMA, а не межсоединением AXI. Кроме того, эти ядра с открытым исходным кодом, так что вы можете проверить, как они работают легко.