Из любого описания популярных ПЛИС известно, что для хранения их конфигураций используются специальные микросхемы — конфигураторы.
В комментариях меня поправили, что потихоньку набирают популярность и ПЛИС, где этого не требуется, но пока многие разрабатывают на классике, где нужен конфигуратор, и это надо учитывать.
Например, Altera Cyclone использует чипы EPCS. Ниже представлена схема типичной макетной платы с кристаллом семейства Cyclone IV. На нем мы видим конфигуратор EPCS16. Все бы ничего, но традиционно эти конфигураторы довольно дорогие, поэтому хотелось бы использовать что-нибудь подешевле.
Подробности в подробном тексте ниже.
Если вам очень интересно, но лень читать столько писем, то можно упростить задачу, посмотрев подробное 20-минутное видео.
Итак, вернемся к нашей проблеме.
Если мы повернём в руках ту же макетную плату с кристаллом семейства Cyclone IV, то увидим очень удивительную вещь.
Вот она, ПЛИСина, а вот ПЗУ конфигурации:
Как ни странно, это не EPCS, а обычная 25-я флешка.
Такие флешки стоят дешево и продаются довольно много.
Но, как говорится, не все йогурты одинаково полезны.
В частности, наши клиенты были рады купить подобные флешки, припаять их к плате и получить глобальную проблему.
Заходим в программатор, загружаем подготовленный к прошивке файл, начинаем прошивать и получаем ошибку:
Вот сообщение об ошибке:
Ошибка (209025): Невозможно распознать идентификатор кремния для устройства 1. Идентификатор кремния устройства отличается от его идентификатора JTAG. Убедитесь, что все кабели надежно подключены, выберите другое устройство или проверьте питание целевой системы.
Убедитесь, что контакты устройства подключены и настроены правильно.
Идентификатор устройства не распознан.
То есть флешка имеет неизвестный с точки зрения кварта идентификатор.
В частности, мы приобрели у наших клиентов кристаллы 25П32, которые вообще не поддерживаются в принципе, но в жизни может быть и более приземленная ситуация.
В частности, на фото выше припаяна флешка от ST, и она определяется как МИКРОН.
Китайские продавцы могут маркировать что-то другое, но когда партия куплена и не работает, что можно сделать? Я зашёл на форумы.
Все русскоязычные, которые нам удалось проверить, были полны рассуждений о том, каких поставщиков и что следует брать, чтобы не столкнуться с подобной проблемой.
Но в нашем случае покупать новую партию никто не захотел.
В англоязычных источниках нам удалось найти только одну статью с решением, но в современной среде Quartus Prime это решение не будет работать «в лоб».
Поэтому мы взялись задокументировать эту проблему для современной среды, на русском языке и в видеоформате.
Итак, как вообще программируется шина ПЗУ? В ПЛИС добавлена специальная конфигурация, позволяющая получить доступ к флешке через JTAG. А затем, используя эту конфигурацию, мы загружаем данные.
Получается, что мы можем сделать подобную конфигурацию, которая даст нам доступ к флешке и позволит прошивать ее независимо от ID, и нам не придется писать ни строчки собственного кода, и все утилиты будут использоваться из пакета Quartus Prime (или Qiartus II, который использует более старые версии среды разработки).
То есть нам предстоит сделать 3 шага: Сделайте конфигурацию, которая доходит до флешки.
Напишите файл, описывающий флешку.
Шить.
Давай сделаем это.
Начнем с разработки собственной «прошивки» (она же конфигурации), не написав ни строчки нашего кода.
Заходим в Квартус:
Создадим новый проект:
Назовем его, скажем, флешером:
Это имя следует запомнить — оно нам понадобится позже.
Создадим пустой проект, моя семья — Cyclone IV E, кристалл, используемый в проекте, такой:
Так.
Когда мы закончим создание проекта, нажмите «Готово».
Проект создан.
Как уже говорилось, мы не пишем ни строчки собственного кода.
Но вам все равно нужно заставить среду что-то сделать.
Для этого заходим в Инструменты – Конструктор платформ.
Вот оно загружено.
Конкретно у меня в этой плате кварц 60 Гц, поэтому подкорректирую настройки частоты:
То, что я делаю сейчас, мы делаем один раз для каждой платформы.
То есть, если выпускается какая-то плата, то для нее этот загрузчик подойдет для любого проекта.
Кварц я подготовил – теперь устанавливаем процессор.
В библиотеке слева находим «Процессоры и периферия», «Встроенные процессоры» и далее — Процессор Nios II:
Выберите его и нажмите «Добавить».
В открывшемся окне в свойствах выберите Nios II/e, потому что он абсолютно бесплатен и не требует никакой лицензии.
Ошибки говорят нам, что векторы не настроены.
Мы не будем ничего программировать для этого процессора.
Поэтому просто направляем векторы в первую доступную локацию из списка:
Нам очень важно, чтобы в процессоре был работающий JTAG-модуль:
После наших манипуляций ошибки ушли.
Процессор готов.
Нажмите «Готово» и идите дальше.
Теперь переходим к основным функциям.
Здесь есть конфигураторы:
Раскрываем список конфигураторов - ближе к концу находим EPCS - наши конфигураторы:
Оставляем все по умолчанию:
Теперь начинаем их соединять.
Мы передаем тактовые сигналы обоим модулям и передаем сигнал сброса обоим модулям.
Мы также передаем сигнал сброса, поступающий от оборудования JTAG — debug_reset_request — на оба модуля.
Затем мы передаем data_master обоим модулям.
Инструкция_master передается только отладчику.
И еще пропускаем запрос на прерывание:
Далее переходим к внешним ножкам – внешним.
Ээкспортируйте их, дважды щелкнув поле «Двойной щелчок для экспорта»:
Для простоты я назову его epcs, чтобы длина была короче:
Теперь обычным движением руки назначаем базовые адреса:
И назначаем прерывания:
Автоматически присвоенный адрес нашему флеш-контроллеру — 0x800 — следует запомнить:
Оно нам еще понадобится.
А все остальное в принципе сделано и будет работать.
Сейчас это очень важно, так как мы не собираемся писать ни строчки нашего кода, чтобы имя процессорной системы совпадало с названием проекта.
Наш проект был флешером.
Сохраняем систему, называем ее флешером:
Именно тогда наш топовый модуль будет иметь именно этот процессор, и поэтому нам ничего делать не придется.
Наш следующий шаг:
Оставляем все по умолчанию, потому что просто используем то, что уже готово:
Давайте закончим:
Появилось сообщение о том, что нужно не забыть добавить файл в проект:
Давайте добавим.
Перейдите в «Проект» — «Добавить/удалить файлы в проекте»:
Находим наш файл на компьютере.
Вот он, наш файл-прошивальщик с расширением qsys.
Добавил это:
Теперь давайте сделаем приблизительную компиляцию:
Оно закончилось успешно.
Теперь, когда оно прошло, можно дать выводы.
Перейдите в Планировщик пинов:
Ножки JTAG нам назначать не надо — назначаем ножки флешки.
Для каждой микросхемы, для каждого случая они разные.
В принципе, можно посмотреть документацию к микросхеме или вашей плате.
Например, вот двенадцатая нога DCLK:
Я уже подготовил список — мы просто пройдемся по нему.
Итак, epcs_data0, LOCATION: PIN13, epcs_dclk – PIN12, epcs_sce – PIN8, epcs_sdo – PIN6. А конкретно на платах наших клиентов тактовая частота — PIN24, reset_n — PIN88.
Ноги были назначены.
Приступим к компиляции.
Ошибки даны:
Все потому, что я сделал вид, что забыл сделать очень важную настройку.
Теперь мы подключили флешку к сервисным линиям.
Причем, после завершения настройки, некоторые из этих строк вообще недоступны, а некоторые используются в служебных целях.
Поэтому нам выдали сообщения о том, что у нас конфликт:
Чтобы это исправить, перейдите в «Назначения» — «Устройство»:
Варианты устройства и контактов:
Здесь мы выбираем контакты двойного назначения.
И в конце программирования мы просим вас сделать все эти строки обычными строками ввода-вывода:
Нажмите «ОК» и запустите компилятор.
И все получилось.
Итак, первый шаг завершен.
У нас есть конфигурация, через которую мы можем получить доступ к флешке.
Теперь наша задача сделать файл, с помощью которого система распознает нашу флешку.
Перейдем ко всем программам, Intel FPGA (для старых версий это будет Altera), Nios II Command Shell.
Вот мы и заходим в каталог, где мы только что все собрали.
При этом не забываем, что слеши здесь должны быть не обратными, а прямыми, и что полученный файл flasher.sof находится в каталоге output_files:
Теперь начинаем произносить магические заклинания.
Итак, нам необходимо влить вновь сформированную конфигурацию.
Для этого пишем: nios2-configure-sof flasher.sof
и нажмите Enter:
Файл загрузился – теперь у нас есть доступ к флешке.
Для того, чтобы определить все, что касается доступа к флешке, нам необходимо запустить следующую программу: nios2-flash-программист --epcs --base=0x800--debug. где 0x800 — тот самый адрес, который был автоматически присвоен блоку epcs и который нужно было запомнить.
Нажмите Ввод:
Что он нам сказал? Он пытался исследовать местность, которую мы назвали.
И по смещению 0 по адресу 800 я ничего не нашел.
По адресу с00 он нашел то, что нам нужно:
Теперь мы запоминаем не просто базовый адрес 800, а конкретный адрес с00 — в дальнейшем будем работать с ним.
Он нашел флешку, ее идентификатор 202016, но сказал, что понятия не имеет, что с ней делать, потому что не знает ее.
Вот документация к нашей флешке:
Ее полный идентификатор — 202016 — именно это она возвращает в ответ на команду, запрашивающую ее код.
Значит всё правильно - правильная флешка нашлась.
Он нам говорит, что должен быть файл с разделом EPCS-202016. Удивительный.
Редактировать – Марк.
Выберите ее имя и скопируйте его в буфер обмена.
Создайте файл ovr.txt и раздел с именем, которое вы только что скопировали:
В документации к нашей флешке в разделе Карта памяти мы видим, что она состоит из 64 секторов.
Размер каждого сектора составляет 64 КБ (от 0000 до FFFF).
Итак, файл конфигурации, который мы только что создали, должен выглядеть так:
64 сектора по 64 КБ или 65536 байт каждый.
Второй шаг готов.
У нас есть файлы flasher.sof и ovr.txt, в которых содержится конфигурация флешки.
Перейдем к третьему шагу.
Напомню, что рабочим проектом был USB16_my. А файл для прошивки назывался Test1.sof. Копируем в него flasher.sof и ovr.txt. Сейчас мы завершили все подготовительные этапы – приступаем к непосредственным боевым действиям.
Чтобы подчеркнуть отсутствие связи между подготовкой и работой, я снова зайду в терминал, как если бы это происходило на следующий день, через неделю, месяц или в любое время после завершения подготовки.
Первое, что нам нужно сделать, это сгенерировать выходной файл.
Потому что файл sof в ПЗУ не записывается - записывается немного другой файл.
Для его формирования пишем:
Полученный файл — Test1.flash:
Теперь чисто формально пришла очередь действий, которые должны совершить сборщики досок.
Прежде всего, они должны скачать наш прошивальщик таким же образом, а именно:
После чего должны прошить ПЗУ:
Собственно, это все.
Проблема решена, флешка прошита - можно пользоваться, хотя в основном пути говорилось о несовпадении ID номеров.
И совершенно не нужно покупать дорогие конфигураторы или искать, у какого поставщика есть 25-е флешки с совместимыми идентификаторами.
Подготовили «прошивальщик» под нашу конкретную плату (и любые другие, где такой же кристалл и Reset с генератором подключены к одному и тому же пину), подготовили текстовый файл для конфигуратора, а затем залили «прошивку» с помощью утилит, входящих в комплект поставки стандартной среды Quartus Prime (они также шли в комплекте со средой Quartus II).
Теги: #plis #FPGA #plis #fgpa #FPGA
-
Гонконг
19 Oct, 24 -
Новости От Ea Для Любителей Sim-Игр
19 Oct, 24 -
Проверка Соединения: Рация От Xiaomi
19 Oct, 24 -
Crm С Человеческим Лицом
19 Oct, 24 -
Zeromq Глава 2: Введение В Сокеты
19 Oct, 24