Я уже писал, как собрать процессор MIPSfpga для платы Марсоход3 и как в ней запускать программы для MIPS.

На этом видео показанно, как можно вести отладку программ прямо в плате, прямо в процессоре MIPSfpga.

Ниже в статье подробные разъяснения и иллюстрации всего этого процесса. Многое из того, что здесь написано повторяет инструкцию из вот этой статьи "MIPSfpga и внутрисхемная отладка" от Stanislav Zhelnio, SparF на хабрахабре, но уже применительно к плате Марсоход3.

Итак, что нужно сделать, чтобы настроить отладчик программ для MIPSfpga?

1) Берем проект MIPSfpga c github:
git clone https://github.com/marsohod4you/mipsfpga-plus.git
И открываем его в среде САПР Intel Quartus Prime Lite. у меня версия v17.0, но возможно это не очень важно. Проект уже адаптирован для платы Марсоход3 с ПЛИС MAX10 10M50SAE144C8GES.
Для использования аппаратного отладчика его нужно "включить" в проекте. Для этого нужно зайти в меню квартуса Assignments => Settings, далее Compiler Settings => Verilog HDL Input. Здесь нужно добавить определение для MFP_EJTAG_DEBUGGER = 1. Вот так:

Теперь перекомпилируем проект.

2) Подключение платы Марсоход3 к компьютеру. Тут есть важный нюанс.
Отладка программ в MIPSfpga ведется через аппаратный интерфейс eJTAG на базе микросхемы FTDI. На самой плате Марсоход3 уже встроен программатор FTDI и казалось бы вот можно его использовать. Но не все так просто. На нашей плате есть микросхема FT2232H и она имеет два интерфейса: один интерфейс обычно используется для загрузки проектов ПЛИС, а второй используется, как последовательный порт, который связывает ПК и ПЛИС платы. То есть уже есть два интерфейса и они заняты.

Самое простое решение - это подключить внешний FTDI программатор - и это возможно с нашей платой.
Нужно переставить джамперы на плате вот так:

marsohod3 jumpers

И в освободившиеся пины вставить программатор MBFTDI:

подключение второго программатора к плате ПЛИС

Теперь можно подключить плату к компьютеру двумя кабелями USB2 и вот задача уже почти решена.

3) Пункт 2 этой инструкции довольно прост, но.. так делать не надо. Если подключить плату сразу двумя кабелями к ПК, то, во-первых, в диспетчере устройств появится 4 последовательных порта - это две микросхемы FTDI каждая по два интерфейса:

dev mgr2

А во-вторых, в квартусе будет найдено сразу два программатора и абсолютно не понятно какой из них выбирать использовать:

progr2

Именно по этому действовать нужно следующим образом:

4) Подключаем, только плату Марсоход3 одним кабелем USB2 в первый штатный разъем USB на плате. По этому кабелю плата получает питание.

first usb

 

5) Запускаем программу Zadig (http://zadig.akeo.ie/), с помощью которой можно подменять драйвера USB устройств.

Поскольку пока плата Марсоход3 сейчас подключена только одним кабелем, то Zadig находит только одну микросхему FTDI на шине USB2 и показывает только два ее интерфейса. Сейчас мы не можем запутаться - так как подключена только один программатор. Выбираем именно нулевой интерфейс единственного программатора MBFTDI и заменяем ему драйвер на WinUSB - нужно нажать кнопку Replace Driver.

zadig

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

В диспетчере устройств останется один последовательный порт.

6) После замены драйвера на канале "ноль" платы теперь уже можно подключить второй кабель USB2 к плате Марсоход3.

two usb

Теперь, если запустить программатор квартуса, то он найдет второй и сейчас единственный программатор MBFTDI, а первый он не увидит, так как у него заменен драйвер:

progr1

Выбираем доступный единственный доступный программатор и загружаем ПЛИС платы нашим собраным проектом MIPSfpga.

7) Теперь нужно запустить сервер OpenOCD. OpenOCD - это On-Chip-Debuger. Его можно взять вот здесь: http://openocd.org/getting-openocd/

Подготовьте для него вот такой конфигурационный файл mipsfpga_ftdi.cfg:


#
# OpenOCD config for using FT2232D that is directly connected
# to FPGA as MIPSfpga EJTAG debugger
# Any FTDI USB IC with MPSSE support (required) can be used
#
# 2017, Stanislav Zhelnio
#

# ##########################################################
# interface part
# ##########################################################

# interface, transport and channel setup
# (use zadig to install WinUSB driver instead of FTDI one)
interface ftdi
transport select jtag

ftdi_channel 0
ftdi_vid_pid 0x0403 0x6010

# ftdi MPSSE initial value and direction
# for detailed description of Magic Numbers look at
# connection table and FTDI AppNote AN_108:
# chapter 2.1 Data bit Definition
ftdi_layout_init 0x0018 0x081b

# special signals
# described in OpenOCD User’s Guide:
# chapter 8.2 Interface Drivers (ftdi)
# chapter 9 Reset Configuration
# nTRST is not used
ftdi_layout_signal nSRST -data 0x0010 -oe 0x0020
ftdi_layout_signal LED -ndata 0x0800 -oe 0x0800

# speed setup
# decrease when errors
adapter_khz 10000

# ##########################################################
# target part
# ##########################################################

# reset delays
# described in OpenOCD User’s Guide:
# chapter 9 Reset Configuration
adapter_nsrst_delay 100
jtag_ntrst_delay 100

# reset sygnal config
# nSRST is directly connected to MIPSfpga (~SI_ColdReset) wire
reset_config srst_only separate srst_nogate srst_push_pull

# To check connection and scan EJTAG chain uncomment this
# and comment all that is bellow then 'shutdown' command.
# Use IDCODE value to detect connection errors:
# IDCODE that was set in RTL config should be identical
# to -expected-id result in 'shutdown' output.
# The IDCODE structure is described in EJTAG Specification:
# chapter 6.5.1 Device Identification (ID) Register

#shutdown

# tap connector and target creation
# change -expected-id to your IDCODE value
# for other arguments see at OpenOCD User’s Guide
jtag newtap auto0 tap -expected-id 0x000f1005 -irlen 5 -ircapture 0x1 -irmask 0x1f
#target create auto0.tap mips_mAptiv -endian little -chain-position auto0.tap
target create auto0.tap mips_m4k -endian little -chain-position auto0.tap

# tap configuration
# change params acording to compile and memory settings
# for details see at OpenOCD User’s Guide
auto0.tap configure -work-area-phys 0xa0003ff00 -work-area-size 256 -work-area-backup 1

# EJTAG scan perion
mips32 scan_delay 20000

# run the debugger process and wait for gdb connection
init


Теперь запустите терминал cmd.exe и из него сервер отладчика вот так:
>openocd -f mipsfpga_ftdi.cfg

Мы увидим следующее:

ocd start

Очень важно, что сервер OpenOCD нашел наш чип с ID 0x000f1005. Этот ID задается в проекте FPGA.

8) Вот мы и добрались до собственно отладки.
Запускаем новый терминал cmd.exe. Далее запускаем GDB и ведем отладку:
>mips-mti-elf-gdb -q program.elf
(gdb) target remote localhost:3333
(gdb) set endian little
(gdb) monitor reset halt
(gdb) load
(gdb) b main
(gdb) c

Можно ходить по шагам, ставить точки останова, смотреть состояние переменных программы, смотреть содержимое памяти.

dbg

Краткий список команд отладчика GDB можно посмотреть здесь: http://users.ece.utexas.edu/~adnan/gdb-refcard.pdf

Таким образом, мы получили полноценный аппаратный отладчик для системы MIPSfpga.

При этом, у нас есть три канала MIPSfpga к нашим хост компьютером:

  • отладчик программ работает через 1й программатор MBFTDI на плате Марсоход3, через интерфейс 0, протокол eJTAG;
  • последовательный порт через 1й программатор MBFTDI на плате Марсоход3, через интерфейс 1;
  • программатор ПЛИС и/или инструмент для просмотра сигналов в проекте ПЛИС SignalTap через второй внешний программатор MBFTDI.

Ну и напоследок я хотел бы остановиться на вопросе как вернуть оригинальный драйвер FTDI на тот интерфейс, где я поставил драйвер WinUSB с помощью программы Zadig. Здесь ничего сложного нет. В диспетчере устройств нужно найти это USB устройство, по нему правой кнопкой мыши, и в меню выбираем Uninstall Device. Появится новое диалоговое окно и там есть галочка что-то вроде "Delete driver software..":

uninst

Нажимаем Uninstall. Теперь отключаю плату от кабеля USB и подключаю вновь - все драйвера на месте.

 

PS: видеодемонстрация всего здесь написанного содержит аудиотрек Audiobinger /Good Morning/

 


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