- PVSM.RU - https://www.pvsm.ru -
Всем привет!
Недавно возникла задача — ускорить загрузку FPGA. От появления питания до рабочего состояния у нас есть не более 100 мс. Поскольку чип не самый новый (Altera Cyclone IV GX), просто подключить к нему быструю флешку типа EPCQ не получается. И мы решили задействовать режим FPP (Fast Passive Serial), поставив снаружи CPLD Intel MAXV с FPL (Flash Parallel Loader). При старте CPLD загружает данные из флешки и формирует сигналы FPP на своих выходах.
Однако, перед тем, как совершить задуманное, собрали DIY-макет из того, что было под рукой, и взялись поэкспериментировать "на кошках". К сожалению, из-за соплей на плате пришлось снизить рабочие частоты, но суть работы FPP от этого не изменилась, зато отладка упростилась. О том, что получилось, и о том, как конфигурируется FPGA, я и решил написать в этой статье. Кому интересно, добро пожаловать под кат.

О чём я планирую рассказать:
Есть два типа загрузки FPGA — активный и пассивный. Активный подразумевает, что FPGA тактирует внешний flash и считывает оттуда прошивку. Пассивный — что есть некий хост (процессор, ПЛИС, контроллер), который загружает в FPGA прошивку.
Активный всем хорошо знаком, наверное: подключаем флешку EPCS/EPCQ, заливаем туда по JTAG прошивку и радуемся жизни, поскольку всю остальную работу по считыванию данных за нас сделает FPGA при включении питания.
Пассивный чуточку муторнее, поскольку требует реализации дополнительной логики: процессор должен откуда-то грузить прошивку, кто-то в него эту прошивку должен "положить", и т.д. Но пассивный режим зачастую быстрее. Например, в Cyclone IV в режиме Active Serial поддерживается DCLK 40 МГц и 1 бит данных, а в режиме FPP (Fast Passive Parallel) — 100 МГц и 8 бит данных, что в 20 раз быстрее.
Главные сигналы, которые отвечают за конфигурирование FPGA — это nCONFIG, nSTATUS, CONF_DONE:
Временная диаграмма в этих режимах не сильно отличается. Вот типовая для нашего случая — passive parallel [1]:

В ней происходит следующее:
Подробнее про конфигурирование см. здесь [1]
Выбор режима конфигурирования производится специальными ножками FPGA — MSEL. В разных семействах количество режимов отличается. Например, в Cyclone V выбирается режим компресии и режим шифрования прошивки [2] помимо Active/Passive. А в Cyclone IV — только Active/Passive и POR Fast/Standard

FPP (Fast Passive Serial) — это пассивный режим, в котором конфигурация загружается в FPGA словами (1 байт и больше) и синхронно, по тактам сигнала DCLK.
"Лёгкая версия" этого режима — это Passive Serial, где прошивка загружается побитово.
Для этого режима используются Dedicated pins, часть которых (старшие биты данных) впоследствии становится обычными I/O:
В чипах старших семейств (Stratix V, например) можно загружать прошивку по 2 (FPPx16) и по 4 (FPPx32) байта за такт.
Давайте посчитаем время загрузки FPGA в пассивном режиме. Началом будем считать появление на чипе напряжения (когда оно достигает определённого значения), а концом — появление сигнала CONF_DONE.
Укрупнённо время складывается из следующих этапов:
tPOR зависит исключительно от настроек MSEL. Естественно, там где время загрузки принципиально и схема питания позволяет, нужно устанавливать режим Fast (см. таблицы с MSEL выше).
С временем tCFG всё несколько хитрее, потому что оно зависит от:
Вот, что говорит документация о размере прошивки для Cyclone IV, Table 8-2 [1]:

Например, для чипа EP4CGX75 максимальный размер прошивки без компресии составляет 22.010.888 бит = 2.751.361 байт. Если предположить, что внешний хост готов работать на частоте 100 МГц, то на загрузку максимальной прошивки потребуется 2.7e6 / 100e6 = 0.027 секунды = 27 миллисекунд. А если использовать компрессию, то это время можно снизить примерно вполовину, получив меньше 15 мс!
Однако, чтобы получить частоту DCLK = 100 MHz, нужно суметь прочитать прошивку как минимум на такой же частоте. Один из вариантов, предлагаемых Intel/Altera — использовать для этой цели CPLD MAX II/V. С одной стороны CPLD читает Flash, с другой — пишет в FPGA.
И для этой задачи в коллекции готовых IP-ядер есть Flash Parallel Loader [3]. Это ядро поддерживает набор Flash-чипов с разными интерфейсами (QSPI, NxQSPI, CFI, etc...), позволяя не только прочитать из них прошивку, но и записать её, подключившись по JTAG.
Также оно позволяет записывать во Flash не одну прошивку, а несколько, организуя таким образом "откат" к стабильному образу в случае проблем с update'ом.
Более подробно смотри datasheet [3].
Мы выбрали режим Flash Programming & FPGA Configuration и в качестве Flash-ки — EPCQ. Это позволяет нам уложиться в требуемое время загрузки и иметь при этом возможность как прошить Flash по JTAG, так и прошить EPCQ с использованием другого хоста.
Скриншоты настроек, которые мы использовали:



Прошивка CPLD занимает 1267 LE и практически на 100% занимает EPM1270F256C5 (MAX II) или 5M1270ZT144C5 (MAX V). Без опции прошивки Flash (скажем, если какой-то другой host может это сделать) ресурсов используется существенно меньше и появляется запас — 754 LE.
Вот схема включения CPLD:

Как работает FPL (примерный алгоритм):
Давайте посмотрим, какую производительность мы можем "выжать" из описанной конфигурации с одним EPCQ. Для этого нужно немного представлять, как EPCQ работает.
EPCQ (продвинутая версия EPCS) — это NOR-flash, которая имеет SPI-интерфейс для большинства команд и для некоторых команд — QuadSPI. Читается очень быстро, а пишется и стирается крайне неторопливо.
Команды (стирание, чтение, запись) всегда поступают во flash по обычному SPI, а дальше поведение флешки зависит от команды. Например:
См. например, описание flash macronix [4]
Максимальная производительность EPCQ на чтение достигается при использовании всех четырёх битов на максимальной частоте с DDR. Однако, при этом временные характеристики меняются нелинейно:

То есть throughput будет в приведённых в примере выше случаях следующим:
Есть флешки и пошустрее, например S25FL064L [5], в них частота не падает при увеличении разрядности чтения. Поэтому для "выжимания максималки" лучше ориентироваться на них.
Если пересчитать режимы 4READ/4DTREAD во время, необходимое для вычитывания нашей прошивки для Cyclone IV, то получается 78 мс / 55 мс. Напомню, что для того, чтобы "успеть" за FPP, нужно уложиться в 27 миллисекунд (см. выше).
Получается, что bottleneck-ом в нашей задаче является интерфейс чтения прошивки, а не сам FPP. И если бы требовалось получить не 100 мс, а существенно меньше, то нам бы пришлось использовать две флешки EPCQ. Но для нашего случая хватит и обычного режима 4READ.
Список поддерживаемых EPCQ приведён в документации на PFL, раздел 1.2.1 [3].
Любопытно, что Intel/Altera не так давно отказались от выпуска своих EPCQ и теперь официально вместо своих поддерживают Micron'овские [6].
Чтобы соединить теорию с практикой мы взяли в руки то, что было:
Чипы подключили по следующей схеме:

На слепыше навесным монтажом припаяли QSPI-флешку и получился макет:

После прохождения небольшого квеста (см. доку, раздел 1.4.1 [3]) по созданию прошивки, которая используется для заливки в EPCS через PFL (link) мы взялись измерять "времянки". При создании прошивки обратите внимание, что нужно указывать CFI-flash, как целевой, даже если используется EPCQ.
Увы, из-за навесного монтажа и "бороды", рабочая частота FPL получилась равной 6.25 МГц, а на EPCS уходит 25 МГц. Этот clock мы отрегулировали при помощи опции "Ratio between input clock and DCLK", установив значение 8 (input clock = 50 МГц). Вот как выглядит эпюра клоков FPP (синий) и EPCQ (жёлтый): видно, что на каждый такт FPP приходится два такта EPCQ DCLK, потому что разрядность FPP в два раза выше, чем EPCQ (8 против 4).

Вот так выглядит эпюра напряжения питания (жёлтый) и сигнала CONF_DONE(синий) в режиме Standard POR и без компрессии: видно, что общее время загрузки составляет 780 мс.

Между появлением питания и сигналом nSTATUS, сигнализирующем о готовности чипа принимать конфигурационные данные проходит около 100 мс:

А если включить режим Fast (меняем просто MSEL, см. таблицу выше), то POR происходит за считанные миллисекунды и загрузка уже занимает ~680 мс:

И последний шаг — включаем компресcию. Для этого ставим галочки в Quartus при добавлении файла прошивки в PFL и переключаем MSEL (в Cyclone IV MSEL трогать не надо). И получаем совсем другую картину:

По сравнению с исходным вариантом без сжатия и Fast POR имеем выигрыш в два раза — около 400 мс.
Давайте посчитаем, сходятся ли измерения, сделанные при помощи осциллографа, с расчётами. Время tPOR считаем равным нулю, т.к. используем Fast POR. Поэтому нам остаётся только посчитать, насколько время загрузки ~680 мс сходится с размером прошивки и частотой FPP DCLK.
Размер прошивки нашего Cyclone V равен ~4 Мегабайтам (32 Мегабита). Тактовая частота FPP DCLK составляет 6.25 МГц. За такт передаётся 8 бит, то есть 1 байт. Поэтому расчётное время равно 4/6.25 = 0.64 секунды. Вуа-ля!
Если мы пропорционально увеличим частоту FPP DCLK, например в 8 раз — до 50 МГц, то получим время 80 мс. А если включим ещё и компрессию, то и того меньше.
Теоретически ПЛИС может загрузиться за десятки миллисекунд, по нашим расчётам для Cyclone IV — примерно за 30 мс. Однако необходимо учитывать, что для этого хост, загружающий в FPGA данные, как и Flash, из которого данные грузятся, должны соответствовать по пропускной способности.
В более свежих чипахш FPGA флешку EPCQ можно подключить напрямую и использовать активный режим, а если в дизайне нет возможности перейти на новое семейство, то есть возможность поставить внешний loader и использовать пассивный режим. Для этого и используется Flash Parallel Loader, который мы использовали в нашем макете.
При описанном подходе с FPL и одной EPCQ вполне реально приблизить время загрузки FPGA к 50 мс.
Всем, кто дочитал до конца можно ставить памятник большое спасибо!
Автор: paulig
Источник [9]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/shemotehnika/280208
Ссылки в тексте:
[1] passive parallel: https://www.altera.com/en_US/pdfs/literature/hb/cyclone-iv/cyiv-51008.pdf
[2] режим компресии и режим шифрования прошивки: https://www.altera.com/documentation/sam1403481100977.html#sam1403478726172
[3] Flash Parallel Loader: https://www.altera.com/en_US/pdfs/literature/ug/ug_pfl.pdf
[4] описание flash macronix: http://www.macronix.com/Lists/Datasheet/Attachments/6636/MX25L6445E,%203V,%2064Mb,%20v1.8.pdf
[5] S25FL064L: http://www.cypress.com/file/326426/download
[6] вместо своих поддерживают Micron'овские: https://www.altera.com/support/support-resources/knowledge-base/component/2018/how-do-i-enable-micron-s-mt25q-support-for-eol-of-epcq---256mb--.html?cq_ck=1522223941654
[7] древний kit от Terasic: https://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=183&No=215&PartNo=1
[8] N25Q256A13EF840: https://www.micron.com/~/media/documents/products/data-sheet/nor-flash/serial-nor/n25q/n25q_256mb_3v.pdf
[9] Источник: https://habr.com/post/358638/?utm_campaign=358638
Нажмите здесь для печати.