Конфигурирование FPGA

FPGA, CPLD

Postby TS-Labs » Sat, 25.01.2014 07:11:34

Пишу по свежей памяти, как Робинзон Крузо, привет тебе мой неведомый читатель.

1. Битстрим.
ФПГА (в дальнейшем речь идет в основном о Cyclone II) требует заливки конфы в виде битстрима. Битстримы бывают нежатые и жатые. Жатие слабое, но все равно бинари весят в 3 раза меньше. Во столько же раз меньше время заливки. Формат битстрима указывается где то в начале бинаря, ФПГА его распознает автоматически, независимо от режима конфигурации.

2. Режим конфигурации.
Нас интересуют два режима: Active Serial и Passive Serial.
При AS чип сам генерит нужные клок и команды для серийной флэшки и ничего делать не надо. Тока припаяй зашитую флэшку, дал питалово, само все сделалось. На TSXB так происходит при включении и ресете карты через управляющий порт.
При PS требуется подать на чип со стороны заливающего девайса импульс старта конфигурации (nCONFIG) и дрочить клок (DCLK), подавая серийную дату (DATA0) до окончания бинаря либо появления 1 на CONF_DONE. На TSXB так происходит при заливке конфы на включенном девайсе из юзерской проги.
Эти 2 режима конфигурации выбираются сигналом MSEL0. И сигнал это совсем не прост.
Во1х, он латчится по переднему фронту nCONFIG и выбирает таким образом собственно дальнейший режим конфигурирования.
Во2х, в рабочем режиме он управляет состоянием лап ASDO и NCSO: если MSEL0=0 то какбэ режим AS и лапы недоступны юзеру из конфы и находятся в weak 3.3V. При MSEL0=1 режим какбэ PS и лапы работают как простые IO. (Ох, скока ж я с этим наебался, пока понял...) Кроме того, в квартусе есть настройка (Device -> Device and Pin Options -> Configuration Configuration Scheme -> Active/Passive Serial). Эта настройка влияет только на то, может ли юзер использовать лапы ASDO и NCSO в дизайне (требуется выбрать Passive Serial) или можно ли задействовать лапы для JTAG IP для работы с флэшем, например SFL (требуется выбрать Active Serial).
В3х, в мануале написано, что атата подавать на MSEL выходы МК или чего другого и не написано почему. И действительно, глючит. Решается последовательным резистором малого номинала. У меня стоит 100 Ом.

Отдельно надо рассказать про Active Serial конфигурацию. Исследования с осциллографом показали что в Cyclone II это происходит так:
1. cmd Read status (00000101),
2. cmd Read silicon ID (10101011),
3. cmd Fast read (00001011, 4x00) - очень хорошо, потому что позволяет использовать максимальную частоту SPI-флэша.
Частота клока примерно 12.6мгц при MSEL = 00.

3. Конфигурационные лапы.
Флэшу для работы нужны сигналы ФПГА:
NCSO - чип селект,
DCLK - клок,
DATA0 - выход даты флэша,
ASDO - вход даты флэша, по нему идут команды и их параметры.
Про ASDO и NCSO я писал выше, а DCLK и DATA0 юзеру доступны не напрямую, а только через модуль cycloneii_asmiblock. Эта схема пофиксана в Cyclone III, где юзеру доступны все эти пины как IO.

4. Заливка флэша через JTAG.
Работает следующим образом. По джтагу ФПГА конфигурится специальной конфой, которая дает доступ до лап флэша через опять же джтаг. Данная конфа содержит модуль мегавизарда под названием SFL (Serial Flash Loader), включающий вышеупомянутый модуль cycloneii_asmiblock. По умолчанию эта конфа называется Factory default enhanced SFL image и является одним из многочисленных примеров долбоебизма авторов Квартуса. Долбоебизм заключается в том, что все IO в данной конфе назначены выходами с лог.0. Чем это чревато, рассказывать не надо, поскольку многие сигналы имеют активное состояние в лог.0.
Слава яйцам, можно сделать свой проект, содержащий SFL, но в нем уже назначить лапы в weak 3.3V. После этого в программаторе нужно приаттачить флэш девайс, выбрать для него файл *.jic и шить.

5. Собственно флэш.
Можно юзать любой из SPI-флешей, кои являются примером гениальности и простоты дизайна. Все команды удобны и исчерпывающи. Количество перезаписей - 100 тыщ. Если использовать жатый битстрим, то вместо 240кБ тратится только 70-150, остальное - храни что хочешь, хоть ПЗУшки, хоть настройки, хоть картинки.
Сами EPCSxx от альтеры юзать можно, но они дороговаты и не верх по скорости.

6. Конфигурационные бинари.
Очередной кретинизм альтеровцев заключается в том, что в отличие от команд и параметров флэша, где биты идут в порядке 7..0, в конфигурационных битстримах они идут 0..7. И казалось бы, сгенери бинарь, в котором биты идут в порядке 7..0, а чо в этих битах - кого это волнует. А нет, в бинаре биты лежат "правильно", в результате каждый байт надо переворачивать перед высылкой в серийную дату.
Следующий кретинизм в том, что жатые битстримы квартус генерит только и исключительно для *.rbf (сырой битстрим какбэ для PS мода, хотя прекрасно катит и для прошивки во флэш). Для прошивки через джтаг требуется создать конвертером файл *.jic, который принимает на вход только и исключительно *.sof и интел *.hex. А вот софы этот мудак генерит только нежатые. Остается только преобразовать жатый rbf в хекс. Но, новые две беды.
а. Если из софа байты при создании бинаря кладутся как есть (а шьются зеркально), то для хекса байты заботливо переворачиваются, чтоб внутри флэша выглядеть как 7..0. Поэтому, если мы хотим преобразовать rbf в hex и зашить его, нам надо rbf перевернуть. Visual Studio в помощь.
б. Припадочный конвертер умеет работать только с интел-хекс, а тот поддерживает только диапазон 64кБ. Т.е. результирующий бинарь еще и требуется рарезать на куски по 64кБ и добавить в виде нескольких HEX-ов.
User avatar
TS-Labs
 
Posts: 5018
Joined: Thu, 26.07.2012 01:29:56

Postby AndyD » Tue, 15.12.2015 16:46:17

Попалась хорошая статейка на эту тему
http://acvarif.info/artplis/comments_ar ... l#artplis3
User avatar
AndyD
 
Posts: 277
Joined: Thu, 21.05.2015 21:32:38


Return to HDL

Who is online

Users browsing this forum: No registered users and 1 guest

x