Что такое Zynq? Краткий обзор
В далеком 2011 году компания Xilinx представила свои первые микросхемы SoC (System On Chip) — Zynq-7000. SoC Zynq сочетает в себе программируемую логику, процессорный модуль и некоторую периферию. Статья не является максимально полным описанием SoC Zynq, а лишь отражает те или иные характеристики, с которыми пришлось столкнуться при разработке устройств на базе SoC Zynq.
Содержание
1 Общие сведения
2 Порты
2.1 MIO
2.2 EMIO
2.3 GP
2.4 HP
2.5 ACP
3 Периферия
3.1 Static Memory Controller
3.2 Quad-SPI Flash Controller
3.3 SD/SDIO Controller
3.4 General Purpose I/O (GPIO)
3.5 USB Host, Device, and OTG Controller
3.6 Gigabit Ethernet Controller
3.7 SPI Controller
3.8 CAN Controller
3.9 UART Controller
3.10 I2C Controller
3.11 XADC Interface
4 Процессорный модуль
5 Программируемая логика
6 Производительность
6.1 Теоретическая
6.2 Практическая
6.2.1 Обработка сетевых пакетов
6.2.2 Производительность порта HP
7 Передача данных между процессорным модулем и программируемой логикой
8 Загрузка SoC
9 Проблемы
10 Создание файла конфигурации
11 Заключение
12 Используемые источники
1 Общие сведения
Структурная схема Zynq.
Каждый Zynq состоит из одного или двух ядер ARM Cortex-A9 (ARM v7), кэш L1 у каждого ядра свой, кэш L2 общий. Поддерживаемая оперативная память имеет стандарты DDR3, DDR3L, DDR2, LPDDR-2. Максимальный объем оперативной памяти равен 1 Гбайт (2 микросхемы по 4 Гбит). Максимальная тактовая частота оперативной памяти 525 МГц. Операционные системы: Standalone (bare-metal) и Petalinux. Процессорный модуль общается с внешним миром и программируемой логикой с помощью портов, объединенных в группы:
- MIO (multiplexed I/O);
- EMIO (extended multiplexed I/O);
- GP (General-Purpose Ports);
- HP (High-Performance Ports);
- ACP (Accelerator coherency port).
Схема интерфейсов Zynq.
Буквы S и M у порта обозначают соответственно Slave и Master.
Так как, в одном корпусе Zynq реализованы и процессорный модуль и программируемая логика, есть выводы, которые относятся к процессорному модулю и выводы, которые относятся к программируемой логике.
2 Порты
2.1 MIO
Порты MIO подключены к выводам процессора. С помощью MIO могут быть подключены следующие периферийные устройства процессорного модуля:
- USB-контроллер — 2 шт;
- Gigabit Ethernet контроллер — 2 шт;
- SD/SDIO контроллер — 2 шт;
- UART — 2 шт;
- CAN — 2 шт;
- I2C — 2 шт;
- SPI — 2 шт;
- GPIO. Все выводы можно использовать как выводы общего назначения.
Так же, к MIO могут быть подключены следующие устройства памяти процессорного модуля:
- QSPI контроллер;
- ONFI контроллер;
- SRAM/NOR контроллер.
Количество MIO портов равно 54 (за исключением некоторых микросхем в корпусе CLG225, там еще меньше). Поэтому все сразу включить не удастся. Для решения этой проблемы существует группа портов EMIO.
2.2 EMIO
EMIO представляет собой проброс периферийного устройства из процессорного модуля в программируемую логику и подключение периферийного устройства к выводам программируемой логики. Однако не все периферийные устройства можно перенести через EMIO, какие-то не переносятся совсем (USB), какие-то с изменением функциональности (Ethernet через EMIO имеет интерфейс GMII для подключения внешней микросхемы физического уровня). Между процессорным модулем и программируемой логикой по порту EMIO можно подключить 192 сигнала (64 входа и 128 выходов).
2.3 GP
Порты GP используют протокол Axi-Lite. Протокол подразумевает работу с данными шириной до 32 бит. За одну транзакцию осуществляется передача/прием данных, размером не больше 32 бит. Используется, как правило, для управления блоками в программируемой логике или при низкоскоростном обмене. Существует 2 порта Master и 2 порта Slave.
2.4 HP
Порты HP используют протокол AXI4. Протокол подразумевает работу с данными шириной 32 или 64 бита. Протокол поддерживает boost транзакции. За одну транзакцию осуществляется передача/прием произвольного размера данных. Используется, как правило, для организации высокоскоростного обмена данными между процессорным модулем и программируемой логикой. Существует 4 порта Slave.
Путь передачи данных с помощью порта HP
2.5 ACP
Порт ACP использует протокол AXI4. Протокол подразумевает работу с данными 64 бита. Протокол поддерживает boost транзакции. За одну транзакцию осуществляется передача/прием произвольного размера данных. Используется, как правило, для организации высокоскоростного обмена данными между процессорным модулем и программируемой логикой, причем данные дополнительно помещаются в L2 кэш. Существует один порт Slave.
Путь передачи данных с помощью порта ACP
3 Периферия
3.1 Static Memory Controller
SMC используется как контроллер памяти с технологией NAND или как контроллер памяти с параллельным интерфейсом. Поддерживает следующие типы памяти:
- NAND flash;
- NOR flash;
- асинхронная SRAM.
Контроллер памяти с технологией NAND характеризуется следующими пунктами:
- поддержка спецификации ONFI 1.0;
- поддержка микросхем памяти емкостью до 1 Гбайт;
- 1 бит ECC, считаемый аппаратно (используется в случае, если микросхема Flash-памяти не поддерживает ECC).
- 8 или 16 линий обмена данными и одна линия выбора микросхемы (Chip Select);
- асинхронный режим работы.
Контроллер памяти с параллельным интерфейсом характеризуется следующими пунктами:
- 8 линий обмена данными;
- 2 линии выбора микросхемы (Chip Select);
- 25 линий адреса;
- Асинхронный режим работы.
Подключение микросхемы NOR Flash с параллельным интерфейсом
Подключение микросхемы SRAM с параллельным интерфейсом
Подключение микросхемы NAND Flash
3.2 Quad-SPI Flash Controller
Реализует контроллер SPI для подключения внешних микросхем памяти по технологии NOR. Основные характеристики:
- поддержка Flash-памяти от Micron и Spansion;
- настраиваемая ширина шины (1x, 2x, 4x, 8x);
- тактовая частота до 100 МГц
Возможные режимы работы:
- один сигнал выбора микросхемы (Chip Select / Slave Select), 4 двунаправленных линии для данных;
- два сигнала выбора микросхемы (Chip Select / Slave Select), 8 двунаправленных линий для данных (параллельное включение);
- два сигнала выбора микросхемы (Chip Select / Slave Select), двунаправленных 4 линии для данных (общее включение);
- один сигнал выбора микросхемы (Chip Select / Slave Select), одна линия для передачи, одна линия для приема.
Одна микросхема, 4 двунаправленные линии для обмена данными
Две микросхемы, 8 двунаправленных линий обмена данными
Две микросхемы, 4 двунаправленные линии
Одна микросхема, каждая линия однонаправленная
3.3 SD/SDIO Controller
Заявлена поддержка устройств eMMC, но без гарантии, что все будет работать корректно (The Zynq-7000 SoC is expected to work with eMMC devices because the protocol is the same as SD, but this has not been extensively verified). Основные характеристики:
- поддержка спецификации SD Host Controller 2.0;
- поддержка карт стандартов SDHS и SDHC;
- поддержка стандарта MMC3.31;
- режим только Host;
- максимальная тактовая частота 50 МГц;
- режим SPI не поддерживается.
Подключение SD карты
3.4 General Purpose I/O (GPIO)
Каждый из портов можно использовать в следующе режиме:
- вход;
- выход;
- выход с третьим состоянием;
- вход, изменение данных на котором, генерирует прерывание.
Каждый порт можно перенастроить отдельно от других.
Структура блока GPIO
3.5 USB Host, Device, and OTG Controller
Требует внешнюю микросхему физического уровня с интерфейсом ULPI. Основные характеристики:
- поддержка интерфейса 2.0;
- до 12 конечных точек/ Endpoint (одна управляющая и 11 настраиваемых);
- OTG 1.3;
- все типы транзакций (Control, Bulk, Interrupt, Isochronous);
- поддерживаются режимы OTG, USB host, USB device.
Подключение контроллера USB
3.6 Gigabit Ethernet Controller
Требует внешнюю микросхему физического уровня с интерфейсом RGMII. Основные характеристики:
- поддержка работы со скоростями 10/100/1000 Мбит/с;
- поддержка режимов Full duplex и half duplex;
- подсчет контрольной суммы для IP, TCP, UDP в версиях протокола IPv4 и IPv6;
- Jumbo Frames не поддерживаются;
- Gigabit Half Duplex не поддерживается;
- поддержка VLAN;
- поддержка Wake-on-LAN.
У каждого контроллера есть свой интерфейс MDIO. Однако при использовании двух контроллеров нельзя использовать два MDIO интерфейса, поскольку они занимают одинаковые выводы MIO 52 и MIO 53. Возможно использование одного интерфейса, подключенного через MIO, а второго через EMIO.
Подключение сетевого контроллера.
3.7 SPI Controller
Основные характеристики:
- работа в режиме Master, Slave, Multi-Master;
- поддержка работы с тремя устройствами в режиме Master, по 3 линии SS (Slave Select);
- поддержка одновременной передачи и приема;
- тактовый сигнал до 50МГц при использовании MIO, до 25МГц при использовании EMIO;
- настраиваемые режимы фазы тактового сигнала и его полярности (CPHA, CPOL).
Фазы тактового сигнала и полярность
Подключение контроллера SPI в режиме Master
Подключение контроллера SPI в режиме Slave
3.8 CAN Controller
Основные характеристики:
- поддержка стандартов CAN 2.0A, and CAN 2.0B;
- поддержка кадров с длиной идентификатора в 11 и 29 бит;
- скорость до 1 Мбит/с.
Требует внешней микросхемы физического уровня.
3.9 UART Controller
Основные характеристики:
- настраиваемая скорость передачи;
- настраиваемое количество бит данных — 6, 7, 8;
- настраиваемое количество стоп бит — 1, 1.5, 2;
- контроль четности;
- передача данных в режимах Normal, Automatic Echo, Local Loopback, Remote Loopback.
Режимы работы контроллера UART
3.10 I2C Controller
Основные характеристики:
- скорость обмена до 400 Кбит/с;
- поддержка спецификации версии 2;
- работа в режиме Master и Slave.
3.11 XADC Interface
The Xilinx analog mixed signal module. Аналого-цифровой преобразователь. Имеет в своем составе 2 двенадцатиразрядных АЦП с частотой дискретизации 1 MSPS, аналоговый мультиплексор (до 17 внешних аналоговых каналов), и встроенные датчики температуры и напряжения микросхемы Zynq. Аналоговые входы поддерживают полосу пропускания сигнала до 500кГц при частоте дискретизации в 1 MSPS.
4 Процессорный модуль
Каждый Zynq, как уже было сказано выше, содержит в своем составе одно или два процессорных ядра. Максимальная тактовая частота ядер зависит от класса скорости микросхемы (Speed Grade) [1]. Возможно 5 классов скорости: -1, -1L, -2, -2L, -3. Классы с индексом L характеризуются пониженным напряжением питания.
Количество ядер и зависимость максимальной частоты от класса скорости микросхемы
5 Программируемая логика
Программируемая логика, используемая в Zynq основа на двух семействах FPGA: Artix-7 и Kintex-7. Artix позиционируется как менее производительное и с меньшим потреблением. Соответственно Kintex более производительно и с большим потреблением. На практике они различаются количеством доступных ресурсов и типом высокоскоростных приемопередатчиков (GTP со скоростью до 6,25 Гбит/с в Artix и GTX со скоростью до 12,5 Гбит/с в Kintex) [2].
Характеристики программируемой логики
LUT (Look-Up Tables) — используются для реализации логических функций.
BRAM (Block RAM) -используются для хранения данных. Размер одного BRAM = 36Кбит.
Примечание. Количество доступных GTP/GTX так же зависит от используемого корпуса. В таблице указано максимальное значение.
6 Производительность
6.1 Теоретическая
В таблицу ниже сведена теоретическая пропуская способность между процессорным модулем и программируемой логикой, а так же пропускная способность памяти. Следует понимать, производительность получена умножением тактового сигнала на ширину интерфейса и не отражает реальную картину передачи данных.
Теоретическая пропускная способность между процессорным модулем и программируемой логикой
Теоретическая пропускная способность каналов DMA в процессорном модуле
Теоретическая пропускная способность интерконнектов в процессорном модуле
Из таблицы следует вывод: память DDR или OCM не может быть полностью загружена одним устройством, исключая случаи использования низкой тактовой частоты для DDR. Пропускная способность чтения DDR ограничена на скорости 2840 Мбайт/с из-за использования Memory Interconnect[3].
6.2 Практическая
Производительность на практике, конечно, оказывается ниже, чем теоретическая. При разработке устройств на базе Zynq нас интересовала производительность обработки сетевых пакетов и производительность порта HP.
6.2.1 Обработка сетевых пакетов
Производительность обработки сетевых пакетов
При использовании схемы включения PL Ethernet, используется контроллер, реализованный в программируемой логике. Подключение приведено на схеме ниже. Подсчет контрольных сумм для протоколов IP, TCP, UDP выполняется ядром Axi Ethernet. Процессор используется для генерации и обработки сетевых пакетов. Для теста использовалась операционная система Petalinux с версией ядра 4.19. Замер выполнялся на плате ZC706, на которой установлена микросхема Z-7045 с классом скорости -2. Согласно таблице выше, процессорный модуль содержит 2 ядра и работает на тактовой частоте до 800МГц [4].
Подключение PL Ethernet
При использовании схемы включения PS EMIO, используется контроллер Ethernet, реализованный в процессорном модуле. Подключение приведено на схеме ниже. Подсчет контрольных сумм для протоколов IP, TCP, UDP выполняется ядром в процессорном модуле. Программируемая логика используется с целью преобразования интерфейсов для подключения внешней микросхемы физического уровня. Для теста использовалась операционная система Petalinux с версией ядра 4.6. Замер выполнялся на плате ZC706, на которой установлена микросхема Z-7045 с классом скорости -2. Согласно таблице выше, процессорный модуль содержит 2 ядра и работает на тактовой частоте до 800МГц [5].
Подключение PS EMIO
При использовании схемы включения PS MIO, используется контроллер Ethernet, реализованный в процессорном модуле. Подключение приведено на схеме ниже. Подсчет контрольных сумм для протоколов IP, TCP, UDP выполняется ядром в процессорном модуле. Подсчет контрольных сумм для протоколов IP, TCP, UDP выполняется ядром в процессорном модуле. Для теста использовалась операционная система Petalinux с версией ядра 4.0. Замер выполнялся на плате Zybo, на которой установлена микросхема Z-7010 с классом скорости -1. Согласно таблице выше, процессорный модуль содержит 2 ядра и работает на тактовой частоте до 667МГц.
Подключение PS MIO
Производительность сетевого контроллера в режиме Rx+Tx
Для теста использовалась операционная система Petalinux с версией ядра 4.14. Замер выполнялся на плате ZC706, на которой установлена микросхема Z-7045 с классом скорости -2. Согласно таблице выше, процессорный модуль содержит 2 ядра и работает на тактовой частоте до 800МГц [6].
Итого: если необходимо обеспечить обработку сетевых пакетов со скоростью 1Гбит/с, то Zynq не подходит для этой задачи.
6.2.2 Производительность порта HP
Теоретическая пропускная способность порта HP составляет 9,6Гбит/с. Для проверки пропускной способности использовалась плата Mini-ITX, на которой установлена микросхема Z-7100 с классом скорости -2. Согласно таблице выше, процессорный модуль содержит 2 ядра и работает на тактовой частоте до 800МГц. Операционная система Petalinux с версией ядра 3.19. Подключение приведено на схеме ниже.
Схема подключения для оценки скорости порта HP
Root Complex PCI-Express был реализован в программируемой логике с помощью ядра Axi PCIE. Процессорный модуль используется для обработки полученных пакетов. При таком подключении скорость чтения данных с флешки составляла чуть больше 100Мбайт/с.
При использовании порта HP для соединения двух микросхем Zynq по схеме ниже, скорость передачи данных скорость передачи достигает 2,5Гбит/с (ограничение блока Interface).
Схема соединения двух Zynq
Итого: порт HP позволяет организовать высокоскоростную передачу данных из процессорного модуля в программируемую логику и обратно.
7 Передача данных между процессорным модулем и программируемой логикой
Методы передачи данных
На диаграммах ниже серым цветом выделены блоки, которые участвуют в передаче данных.
Путь передачи данных через Master GP (CPU Programmed I/O)
Путь передачи данных через Master GP (PS DMAC)
Путь передачи данных через HP (PL AXI_HP DMA)
Путь передачи данных для ACP (PL AXI_ACP DMA)
Из всех возможных методов передачи данных между процессорным модулем и программируемой логикой, мы используем только 2: CPU Programmed I/O и PL AXI_HP DMA о которых будет рассказано в отдельной статье.
8 Загрузка SoC
После снятия сигнала сброса (PS_POR_B), процессорный модуль считывает со специальных входов режим загрузки и запускает на выполнение код BootROM. BootROM предназначен для начальной настройки системы, копирования следующего загрузчика в OCM (On Chip Memory) и передачи управления следующему загрузчику.
Возможные режимы загрузки:
- Quad-SPI;
- SD Memory Card;
- NAND;
- NOR;
- JTAG.
Хорошая статья от Xilinx, в которой перечислены виды загрузки и протестированные варианты www.xilinx.com/support/answers/50991.html
Если режим загрузки не JTAG, то BootROM ищет на устройстве загрузки следующий загрузчик — FSBL (First State Boot Loader). FSBL используется для дальнейшей настройки системы (инициализация DDR, инициализация MIO). Также, FSBL используется для загрузки файла конфигурации в программируемую логику, если это необходимо. Файл конфигурации считывается с устройства загрузки и через специальный интерфейс (PCAP) в режиме DMA передается в программируемую логику. После загрузки программируемой логики, FSBL ищет следующее приложение для передачи управления. Возможны несколько вариантов:
- следующего приложения нет, FSBL останавливается;
- следующее приложение — приложение пользователя (Bare Metal). Оно вычитывается в DDR, и ему передается управление;
- следующее приложение — U-BOOT. U-BOOT вычитывается в DDR и ему передается управление.
Таким образом, без процессорного модуля нельзя загрузить файл конфигурации в программируемую логику за исключением случая использования JTAG.
Временная шкала включения Zynq
Время выполнения BootROM сильно зависит от пропускной способности интерфейса устройства, на котором хранится файл конфигурации.
Сигнал INIT_B используется для указания, что начато конфигурирование программируемой логики (загрузка файла конфигурации).
Сигнал DONE используется для указания, что конфигурирование программируемой логики завершено.
Загрузка конфигурации в программируемую логику
9 Проблемы
При разработке устройств на базе Zynq столкнулись с несколькими проблемами. Возможно, в этом виновато плохое чтение документации.
- При работе с контроллером Ethernet, реализованном в процессорном модуле, напряжение питания банка должно быть +1,8В или +2,5В.
- При использовании Petalinux возможна загрузка только с использованием SD-карты.
- Не только Zynq, а вся седьмая серия от Xilinx (Artix, Kintex). Невозможно сформировать дифференциальный сигнал в банке с напряжением питания +3,3В.
10 Создание файла конфигурации
Как создать прошивку для Zynq? Для этого потребуется два инструмента от Xilinx: Vivado и Vitis. Так же добавим bare-metal приложение, которое передаст привет миру.
- Запустить Vivado. Создать проект для выбранной микросхемы. В примере будет использоваться плата Zybo, на которой установлена микросхема XC7Z010–1CLG400C.
- В меню слева (если его нет, то включить можно в View => Show Flow Navigator) выбрать Create Block Design => ввести имя файла => OK.
- В открывшемся окне Diagram нажать на »+» или воспользоваться сочетанием клавиш Ctrl + I. В появившимся окне выбрать блок Zynq7 Processing System.
- Вверху окна нажать на «Run Block Automation», появившимся окне нажать OK.
- Двойной клик на Zynq7 Processing System (или правой кнопкой и пункт Customize Block). Если создается прошивка для покупной платы, то в комплекте с ней есть xml или tcl файл с настройками процессорного модуля. Его можно загрузить через пункт Import XPS Settings и указав путь к файлу. Иначе, необходимо по принципиальной схеме на устройство выяснить, какие MIO используются и куда подключены, какой тип памяти DDR и выставить соответствующие настройки во вкладках Peripheral I/O Pins, MIO Configuration, Clock Configuration и DDR Configuration.
- В принципе, этого достаточно. Но если сейчас запустить синтез, Vivado выдаст критическую ошибку о неподключенном входе. Потому что по умолчанию включен вход GP0. Снова двойной клик на Zynq7 Processing System => PS-PL Configuration => Axi Non Secure Enablement => GP Master AXI Interface => снять галку с M AXI GP0 Interface => OK.
- File => Save Block Design. Вкладку можно закрыть.
- В вкладке Sources выбрать созданный файл, правый клик, Create HDL Wrapper. В окне выбрать нужный пункт (включить автообновление файла или нет, неважно), OK.
- В меню слева выбрать Generate Bitstream => Yes => OK.
- После некоторого времени появится окно «Bitstream Generation Completed», которое нужно закрыть.
- Необходимо создать каталог, в котором будут храниться FSBL и bare-metal приложение. Можно хранить их в папке с проектом или в другом месте.
- В Vivado File => Export => Export Hardware. Указать путь к созданному каталогу, галку Include bitsteam ставить не обязательно. В созданном каталоге появится файл .xsa
- Запустить Vitis (можно из Vivado => Tools => Launch Vitis), указать путь к каталогу с .xsa файлом.
- В Vitis File => New => Application Project. В поле Project Name задать, например, Zybo_fsbl, нажать Next, выбрать вкладку Create a new platform form hardware (XSA), нажать »+», указать путь к файлу .xsa, в поле Platform name ввести название, чтобы потом можно было отличить созданную платформу от платформ по-умолчанию, например ProcessingSystem_wrapper_hw, Next, снять галку Generate boot components => Next => в списке шаблонов выбрать Zynq FSBL => Finish.
- В окне слева (Explorer) развернуть каталог src, открыть файл main.c. Можно добавить define, чтобы видеть, что процессорный модуль запустился.
#define FSBL_DEBUG #include "fsbl.h" #include "qspi.h"
- Выбрать файл Zybo_fsbl, меню Project => Build Project.
- FSBL создан. Теперь приложение. File => New => Application Project. В поле Project Name задать, например, Zybo_hello, Next, во вкладке Select a platform from repository выбрать созданную ранее платформу ProcessingSystem_wrapper_hw, Next, Next, в списке шаблонов выбрать Hello World, Finish.
- Выбрать файл Zybo_hello, меню Project => Build Project.
- Приложение создано. Теперь необходимо собрать итоговый файл. В Vitis выбрать меню Xilinx => Create Boot Image. Оставить переключатель в положении Create new BIF file. В поле Output BIF file path с помощью кнопки Browse указать место хранение файла и имя файла.
- Выбрать выходной формат файла, mcs или bin и путь для хранения файла
- Нажать кнопку Add и указать путь к файлу Zybo_fsbl.elf (исполняемый файл FSBL). Он расположен в папке с проектом Zybo_fsbl, каталог Debug, остальные поля оставить без изменений.
- Нажать кнопку Add и указать путь к файлу bit. Если была установлена галка Include bitsteam, то bit файл можно найти в каталоге с файлом .xsa, далее каталог с названием платформы, далее каталог bitstream. Если галки не было, то bit файл расположен в каталоге проекта, каталог .runs, каталог impl_1. Остальные поля оставить без изменений.
- Нажать кнопку Add и указать путь к файлу Zybo_hello.elf, который расположен по аналогии с FSBL в каталоге Debug. Остальные поля оставить без изменений.
- Нажать кнопку Create Image. Файл конфигурации создан.
Если полученный файл конфигурации прошить в плату, подключиться монитором com-порта к отладочном порту Zynq, то в мониторе com-порта можно увидеть следующее:
Xilinx First Stage Boot Loader
Release 2019.2 Jun 26 2020-09:16:22
Silicon Version 3.1
Boot mode is QSPI
SUCCESSFUL_HANDOFF
FSBL Status = 0x1
Hello World
11 Заключение
Вывод: SoC Zynq подходит для решения задач, которые не требуют высокой производительности от процессорного модуля. Идеальный случай, когда алгоритм обработки данных реализован в программируемой логике, а процессорный модуль используется для загрузки данных, или обработки исключительных ситуаций, реализация которых трудоемка в программируемой логике.
12 Используемые источники
- www.xilinx.com/support/documentation/data_sheets/ds190-Zynq-7000-Overview.pdf
- www.xilinx.com/support/documentation/selection-guides/zynq-7000-product-selection-guide.pdf
- www.xilinx.com/support/documentation/user_guides/ug585-Zynq-7000-TRM.pdf
- xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842485/Linux+AXI+Ethernet+driver
- xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841613/XAPP1082+2017.4+Performance
- www.xilinx.com/support/answers/73065.html