Изучаем САПР Altera Quartus II / Intel Quartus Prime, язык описания аппаратуры Verilog HDL и кое-что про VHDL. Программируем FPGA Altera / Intel Cyclone III, Cyclone IV, MAX II, MAX10. Экспериментируем с платами разработчика FPGA серии Марсоход, Марсоход2, Марсоход3. А еще разбираемся с FPGA Gowin.
На неделе мне задали вопрос, на который я к своему стыду не смог сразу ответить: "Как стартует RISC-V процессор и как обрабатывает прерывания?". Попробую на него ответить хотя бы сейчас. Но! Мне кажется, чтобы по настоящему разобраться в этом вопросе было бы хорошо пройти отладчиком по шагам весь старт и инициализацию RISC-V SoC. Только так, на деле, можно понять особенности системы команд процессора и нюансы запуска.
Чтобы пройти отладчиком запуск процессора мне нужно этот отладчик подключить к системе на кристалле. Вообще-то я что-то такое уже делал, когда запускал систему с процессором MIPSfpga - тогда к нашей FPGA плате Марсоход3 (Altera MAX10) был подключен дополнительный второй FTDI программатор, через который велась отладка MIPSfpga SoC. Программное обеспечение и HW при этом были в связке GDB -> OpenOCD -> FTDI -> FPGA Altera MAX10.
Честно говоря, сейчас мне не хотелось бы связываться с платами. Могу ли я дебажить с GDB систему RISC-V SoC работающую в симуляторе Verilator? Почему бы и нет? Скорее всего могу. Как это сделать? Пока не знаю, но давайте попробуем.
В предыдущей статье я писал, что у нас появилась новая плата расширения Ethernet 1Gbit и к ней был сделан относительно простой тестовый проект для платы Марсоход3GW2. В этой работе FPGA плата могла принимать UDP пакеты и отправлять UDP пакеты. Этим проектом мы проверили работоспособность нашего шилда Ethernet. Однако, существенный недостаток был в том, что передать пакет в плату можно было только отправляя broadcast широковещательные пакеты. Это пакеты "всем", что создает излишний трафик во всей локальной сети. Дело в том, что компьютер с которого отправляются пакеты не знает физического адреса платы, MAC адреса. Даже если я знаю IP адрес своего устройства этого недостаточно, чтобы осуществлять прямую передачу от клиента к серверу.
Чтобы сделать передачу UDP пакета с компьютера на нашу FPGA плату по всем правилам нужно реализовать ARP протокол, Address Resolution Protocol. Любое устройство в локальной сети имеет в своих драйверах таблицу ARP. В этой таблице хранится соответствие IP адреса его MAC адресу. Когда какая ни будь программа посылает пакет в сеть, стек драйверов ОС прежде всего проверяет в своей таблице известен ли MAC адресата. Если известен, то пакет тут же отправляется на известный MAC адрес. А если MAC неизвестен, то сперва отправляется широковещательный запрос ARP всем устройствам в сети "У кого есть вот такой IP?" и устройство с этим IP адресом должно откликнуться и прислать ARP ответ "Это мой IP, а вот мой MAC адрес". После этого, компьютер, получив ответ уже знает MAC и может действительно послать пакет адрасату. Новый известный MAC адрес помещается в таблицу MAC адресов, и при повторной передаче следующих пакетов ARP протокол уже не используется, ведь физический адрес клиента уже известен.
Сейчас я хочу усовершенствовать наш Ethernet проект для FPGA платы Марсоход3GW2 и добавить поддержку ARP протокола. Наша плата FPGA теперь будет делать следующее: на неё (конкретно на её статический IP платы) теперь можно будет послать UDP пакет и этот пакет
зажигает светодиоды платы согласно принятому байту из UDP пакета;
управляет вращением шагового двигателя с заданной скоростью согласно принятому значению из UDP пакета.
Стенд для испытаний этого проекта показан на фото в начале статьи. На плате расширения Ethernet есть 4 выхода io16, io17, io18 и io19 они идут на драйвер двигателя L298N к которому уже подключен шаговый моторчик.
Я беру недорогой гигабитный Ethernet коммутатор и подключаю к нему UTP5 патч кордами мой ноутбук и нашу FPGA плату Марсоход3GW2 (Gowin FPGA). Сделаем простой тестовый FPGA проект с шилдом Ethernet. Попробуем принимать и отправлять пакеты данных.
Разработали новую плату расширения - это гигабитный Ethernet.
Её можно использовать совместно с нашими платами с FPGA Gowin Марсоход3GW2, с FPGA MAX10 Альтеры Марсоход3 / Марсоход3бис и Марсоход2 (Cyclone III) / Марсоход2бис (Cyclone IV),
На плате установлена микросхема Realtek 8211E. Это так называемый трансивер, то есть одновременно и передатчик и приёмник (transciever, transmitter + receiver). Микросхема обеспечивает совместимость со стандартами 10Base-T, 100Base-TX, 1000Base-T IEEE 802.3. Чип Realtek обеспечивает физический уровень приема (PHY) и передачи Ethernet пакетов через кабель CAT5 UTP. При этом, микросхема достаточно умна, чтобы обнаруживать и исправлять ошибки приёмопередачи связанные с перекрестными помехами и эхо сигналами в кабеле. Так же эта микросхема автоматически обнаруживает прямой и перекрестный кабель.
Передача данных между PHY Realtek 8211E и FPGA осуществляется через интерфейс RGMII, Reduced Gigabit Media Independent Interface.
Файлы дизайна нашей платы в KiCad 6 выложены на гитхаб. Тут есть и схема и PCB платы и в папке doc есть документация на саму микросхему Realtek.
Это ещё один проект - ревизия ранее созданного. Я когда-то уже делал управление машинкой из браузера, теперь хочу его повторить. Идея проекта очень простая, но интересная:
на машинку устанавливаем смартфон с ОС Андроид;
на смартфоне запускаем Web Server, который напишем на питоне;
клиент подключается с ноутбука к серверу на смартфоне и получает HTML страницу с двумя окнами: окно видео с камеры смартфона и окно с кнопками управления;
кнопки управления это Старт, Стоп, Назад, Налево, Направо, кликая мышкой в браузере на эти кнопки клиент посылает запрос на Web сервер;
Web сервер принимает запросы от клиента и воспроизводит короткий аудио файл с синусоидой, все звуки разной частоты;
смартфон подключим к АЦП FPGA платы, и плата сможет оцифровывать сигнал и распознавать частоту звука;
каждой частоте звука сопоставлена команда на шаговые двигатели Марсохода: соответственно ехать вперёд или назад, остановиться или поворачивать налево или неправо.
таким образом, оператор ноутбука в браузере может и видеть картинку с камеры смартфона и управлять куда Марсоходу ехать.
Есть несколько причин, почему я взялся повторить те старые проекты. Во-первых, теперь я буду делать Марсоход на универсальном шасси, напечатанном на 3D принтере. Во-вторых, теперь я сделаю проект на другой плате, на Марсоход3GW2 с микросхемой FPGA Gowin и тут у меня есть АЦП, я смогу надежно распознавать звуковые команды со смартфона. И в-третьих, к сожалению, тот мой давнишний проект сегодня уже невозможно точно воспроизвести. Тогда я использовал на смартфоне приложение SL4A - Scripting Layer For Android. Эта программа позволяла мне запускать питоновский скрипт на смартфоне. А сейчас SL4A нет в Android Google Play. Да и вообще, этот проект SL4A давно заморожен и врядли вы сможете им воспользоваться.. Ну не погибать же хорошей идее! Сегодня придётся запускать питоновскую программу как-то иначе, дальше расскажу как.
Подробнее...