Конфигурирование Cyclone V из S25FL128S — проблемы и решение

Подбирая флешку для Cyclone V или Cyclone 10 LP для платы с минимальными габаритами, можно прийти к решениям от Micron, Macronix или Cypress. Я остановился на последней компании и конкретной флешке — S25FL128S, которая есть во вполне удобном корпусе WSON-8 (только 3,3 В IO) или в FBGA-24 с дополнительным пином VCCIO для установки уровней IO (но 3,3 В всё равно нужны для ядра флешки). Так вот, вроде ничего не предвещало беды, эта флешка даже официально поддерживается программатором в Intel Quartus 18.0 и выше, но не работает с Cyclone V …

B86-0

Итак, как я проверял работу флешек с различными циклонами.

Cyclone 10 LP

Здесь всё просто, подключаем к ПЛИС флешку так (обратите внимание на DATA0\DATA1 — они должны быть перекрёстны):

B86-1

Генерируем JIC файл:

B86-2

Да, не забываем отключить проверку EPCS\EPCQ ID в расширенных опциях:

B86-3

Далее, перед тем как прошить, в настройках программатора ставим галочку на снятии защиты EPCS\EPCQ перед прошивкой или очисткой:

B86-4

Прошиваем как обычную EPCS, верифицируется флешка успешно. Сбрасываем питание и вуаля: Cyclone 10 LP прекрасно стартует. Проблем и вопросов никаких нет.

Cyclone V

Подключение: всё ещё проще, 6 линий напрямую, никаких подтяжек и перекрестий линий:

B86-5

Генерируем JIC файл (также нужно отключить проверку ID EPCS, да, не имеет разницы, Active Serial или Active Serial x4):

B86-6

И прошиваем:

B86-7

Всё успешно:

B86-8

В консоли никаких ошибок:

B86-9

Сбрасываем питание и ничего. ПЛИС не конфигурируется. Странно, может я ошибся в подключении, но прошитая флешка верифицируется успешно, так что нет, подключено верно. Да, вот гид по подключению от Cypress — Connecting Cypress SPI Flash to Configure Altera FPGAs.

Ещё вариант — неправильная подача питаний (PLL раньше ядра например или IO сильно позже всего остального), поэтому и не стартует… но уже пересмотрены все соединения, уровни и тайминги осциллографом, и вопросов не возникло, как проверить работоспособность платы в этом случае? Отпаять S25FL128S и припаять на проволоке EPCS64N (можно даже DATA2, DATA3 к флешке не подключать, а её HOLD и WP посадить на питание, как видно, это было на заглавной фотографии статьи).

Аналогично генерируем JIC файл для EPCS64N (которую припаял на проволочках вместо S25FL128S), который прошивается и верифицируется успешно. Сбрасываем питание и ПЛИС конфигурируется успешно! Ну что же, проблема явно в том, как прошита флешка.

Решение 1

Поискав решения, вначале я обратил внимание на довольно редкий (как оказалось) документ 002-00498_0B_V — Altera Cyclone V and FL-S-3, описывающий решение проблемы. Если пересказать вкратце, то:

  1. С завода в конфигурационных регистрах CR1 флешек S25FL128S и S25FL127S задана задержка (Latency Code) LC0\LC1 = 0x00, которую необходимо поменять на 0x10, т.к. с завода идёт задержка для частот < 80 МГц, а Cyclone V конфигурируется на 100 МГц.
  2. Создать файл quartus.ini с кастомной флешкой для программатора (только вот примера я не нашёл нигде, а в описании говорится, пишите в поддержку Quartus, удачи), в которой можно выставить значения dummy clock (в списке, представленном программатором нельзя менять эти значения, они залочены).
  3. Генерируем JIC файл.
  4. Прошиваем как обычно, встроенным в Quartus программатором.
  5. Profit!

Только вот сходу первые два пункта как-то не ясно, как сделать, особенно с файлом quartus.ini — никакого примера, шаблона мне так и не удалось найти (буду очень благодарен, если кто-нибудь поделится в комментариях или в ЛС).

В итоге этим путём я таки не пошёл…

Решение 2

Следующее решение — это более советуемый по форумам документ, так же от Cypress  — In-System Programming for Cypress SPI Flash on Altera® FPGA Board. Не сразу, но это решение у меня заработало. Опишу вкратце шаги и возможные проблемы.

Прошивать флешку мы будем через NIOS с флеш-контроллером EPCS, а к процессору мы подключаться будем по JTAG. Поэтому необходимо создать дополнительный проект (один раз), в котором будет практически только файл Platform Designer’a, и ни строчки HDL кода от вас не потребуется (ну разве что SDC файл простой описать).

Создаём проект в Quartus, добавляем в Platform Designer процессор NIOS (E-варианта достаточно) и Legacy EPCS\EPCQx1 Flash Controller:

B86-10

Примечание: запоминаем базовый адрес флеш-контроллера, он пригодится далее. 

В параметрах NIOS вектора ставим на Absolute:

B86-11

А также обязательно должна быть включена отладка по JTAG, иначе мы до него не достучимся:

B86-12

В параметрах флеш-контроллера включаем Reset Request:

B86-13

Да, важный момент со сбросом! Сигнал Debug Reset Request от NIOS обязательно подключаем к сбросу флеш-контроллера, иначе флешка НЕ БУДЕТ определяться.

B86-14

Примечание: у меня от Blaster’a так же подключен Soft Reset к плате, и я его использую в проекте — подключил на него Reset Input. Если у вас сброс не заведён, тогда можно Reset Input не выводить наружу, а подключить на него внутренний сигнал Debug Reset Request от NIOS.

Всё, с Platform Designer закончено. Назначаем пины:

B86-15

Ну и для полной красоты описываем клоки и false path для JTAG:

B86-16

Далее переходим к параметрам выбранной ПЛИСы:

B86-17

Открываем опции:

B86-18

И обязательно выставляем режим Active Serial x1:

B86-19

Без этого проект не скомпилируется, т. к. у флеш-контроллера тогда не будет доступа к пинам флешки (на Cyclone V более делать ничего не надо, на других сериях иногда надо прямо указать ещё, что они могут использоваться как GPIO).

Ну и если у вас подтянут вывод INIT_DONE и не задействован как GPIO, убираем варнинг о том, что INIT_DONE необходимо задействовать:

B86-20

Компилируем. Мы получили SOF файл (в моём случае — NIOSProg.sof), копируем его в папку (к примеру, C:\FPGA_Prog\), в которой так же соберём все дополнительные файлы для прошивки. Копируем туда второй SOF файл реального проекта, который требуется зашить во флешку (в моём случае это test.sof, который содержит счётчик, тактируемый от внешних 50 МГц, и 2 старших бита подключены на светодиоды для проверки работоспособности).

Создаём в папке с SOF файлами текстовый документ nios2-flash-override.txt, добавляем в него строки с описанием нашей флешки:

[EPCS-012018] # Cypress SPI Flash S25FL128S
sector_size = 65536
sector_count = 128

EPCS-012018 здесь расшифровывается как 0x01 — ID производителя, 0x20 — старший байт ID флешки, 0x18 — младший байт ID флешки.

Открываем Nios II Command Shell (Quartus Prime 1x.x), теперь требуется залить из командной строки нашу прошивку-программатор, потом проверить доступность флешки, сформировать файлы прошивки из sof файла проекта и прошить флешку. Поехали!

Переходим в рабочую папку:

cd /cygdrive/c/FPGA_Prog/

Примечание: т.к. здесь используется bash эмулятор, то и пути необходимо соответственно модифицировать, как видим, C:\FPGA_Prog\ превратился в /cygdrive/c/FPGA_Prog/. Да, к слову, в принципе эта консоль не нужна, если вы используете для разработки в качестве ОС только windows, тогда можно все утилиты вызывать напрямую и написать собственный скрипт, в котором будут и пути привычные, и никакого bash. Здесь bash консоль используется просто как прослойка.

Конфигурируем ПЛИС нашим прошивальщиком:

nios2-configure-sof -d 1 NIOSProg.sof

Примечание: аргумент -d 1  показывает, какую ПЛИС в цепи JTAG конфигурировать, в данном случае первую и единственную.

ПЛИС отконфигурирована успешно:

B86-21

Проверяем, доступна ли флешка и корректно определяется ли по базовому адресу 0x1000 (это и есть тот базовый адрес флеш-контроллера из Platform Designer):

nios2-flash-programmer —epcs -–base 0x1000 —debug

У вас должно быть нечто подобное:

B86-22

Флешка найдена по фактическому адресу 0x1400. Запоминаем его.

Если у вас вот такая картина:

B86-23

То основные варианты, что у вас не так, следующие:

  • базовый адрес флеш-контроллера неверен;
  • некорректно подключен флеш-контроллер к NIOS;
  • не заведён Debug Reset Request от NIOS на флеш-контроллер;
  • проблемы в схеме (неверно подключена флешка) или замыкание на плате.

Примечание: к слову, встречал на форумах, что кому-то помогали решения в духе даунгрейда версии Quartus или банальной перезагрузки ПК, но это уже скорее последние методы на уровне магии, когда прям совсем всё перепробовал.

Теперь формируем файл для прошивки из SOF файла. Для EPCS (x1) варианта это следующая команда:

sof2flash —epcs —debug —input=test.sof —output=test_s.flash

Рядом с SOF файлом должен появится файл test_s.flash.

Для EPCQ (x4) варианта это следующая команда:

sof2flash —epcq128 —debug —input=test.sof —output=test_q.flash

Рядом с SOF файлом должен появится файл test_q.flash.

Теперь прошиваем полученный FLASH файл во флешку, команда для EPCS:

nios2-flash-programmer —epcs -–base 0x1400 —override nios2-flash-override.txt test_s.flash

Прошивка прошла успешно:

B86-24

Аналогичное действие, только для EPCQ:

nios2-flash-programmer —epcs -–base 0x1400 —override nios2-flash-override.txt test_q.flash

Теперь можно верифицировать флешку, для EPCS варианта это следующая команда:

nios2-flash-programmer —epcs -–base 0x1400 —verify —override nios2-flash-override.txt test_s.flash

Всё записалось верно:

B86-25

Верификация флешки, только для EPCQ:

nios2-flash-programmer —epcs -–base 0x1400 —verify —override nios2-flash-override.txt test_q.flash

Можно сбросить питание и убедиться, что ПЛИС конфигурируется успешно:

B86-26

С одним «НО» — только в EPCS (x1) варианте. Как и что бы я не пытался делать, в EPCQ (x4) режиме у меня ПЛИС не конфигурируется, хотя прошивается и верифицируется успешно. Есть единственное непроверенное предположение, что это таки связанно с Latency Code значением, которое я явно не менял в конфигурационном регистре флешки, прошивая её через NIOS. Если у вас есть мысли или решение этого «НО», буду рад, если подскажете в комментариях или ЛС.

А на этом всё, спасибо, что прочитали! Удачи. ;)

Ссылки

Реклама

Добавить комментарий

Please log in using one of these methods to post your comment:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google photo

Для комментария используется ваша учётная запись Google. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s