В состав комплекта ПО Altera Quartus II входит логический анализатор SignalTap.
Его использование возможно только с микросхемами FPGA, которые имеют встроенные блоки памяти. В микросхемах CPLD встроенной памяти нет, поэтому и использовать этот мощный инструмент, например, с первой платой Марсоход было нельзя.
Сейчас, когда у нас в руках есть новая плата Марсоход2 с ПЛИС Cyclone III, я могу рассказать как пользоваться этим анализатором.
На самом деле SignalTap предоставляет огромные возможности по отладке проектов. По сути дела он позволяет заглянуть внутрь микросхемы и посмотреть на временные диаграммы интересующих нас сигналов.
Итак, запускаем анализатор через меню Altera Quartus II Tools => SignalTap Logic Analyzer. Открывается совершенно новое окно с множеством настроек и опций.
Посмотрим самое важное, я отметил на изображении окна самые нужные элементы управления:
1) Кнопки запуска анализатора.
2) Выбор и настройка программатора. Я использую USB JTAG программатор MBFTDI (в Марсоход2 он реализован прамо на плате). Программатор используется для передачи анализируемых данных из микросхемы в компьютер.
3) SOF Manager - позволяет загрузить в FPGA образ откомпилированного проекта прямо из среды SignalTap
4) Окно со списком сигналов, которые нас интересуют для анализа. Сюда можно добавлять интересующие нас сигналы из разрабатываемого проекта и удалять не нужные.
5) Выбор сигнала тактовой частоты для анализатора.
6) Количество выборок интересующих нас сигналов.
К сожалению, настроек Signal Configuration у анализатора много. Пришлось проскроллить это окошко вниз и сделать еще один снимок с экрана, чтобы показать опции триггера:
7) Тип триггера для начала захвата анализируемых сигналов, количество триггеров и позиция триггера внутри захваченных сигналов.
8) Trigger In - если галочка отмечена, то анализатор начинает захват сигналов по срабатыванию триггера.
9) Выбор сигнала, который будет служить триггером.
В полях 4, 5, 9 нужно выбирать сигналы из текущего проекта. Делается это с помощью вот такого диалогового окна Node Finder:
Искать сигналы можно по имени используя маску, например, *_en*. В этом случае в списке будут clk_en, cnt_en и прочие *_en.
Обратите внимание на Filter. Можно ограничить выбор только входными/выходными контактами, или только регистры после фиттера, или искать среди всех сигналов проекта Design Entry (all names). Может так оказаться, что вы не найдете интересующего вас сигнала в списке. Значит в процессе компиляции он оказался оптимизированным и выброшенным из проекта. В этом случае в проект можно поставить "виртуальный пин" и смотреть сигнал не нем.
Чтобы сделать объяснения более понятными рассмотрим конкретный пример.
Берем первый проект для платы Марсоход2. В этом проекте вход FTDI_DB0 умышленно соединен с выходом FTDI_DB1. Причем, эти контакты микросхемы Cyclone III идут к микросхеме FTDI, реализующей кроме всего прочего виртуальный последовательный порт через USB. Таким образом, сигналы FTDI_DB0 и FTDI_DB1 - это RX и TX последовательного порта. Когда мы соединяем их проводом в нашем проекте мы отправляем входной сигнал сразу на передачу. Что приняли, то и отправляем.
Предположим, я хочу посмотреть на этот сигнал с помощью анализатора.
Я добавил сигнал FTDI_DB0 в список анализируемых. Затем решил, что для захвата этого сигнала мне хватит частоты в 32 раза меньше, чем входная 100Мгц. Поэтому я тактовую частоту для анализа взял со счетчика проекта LPM_COUNTER, выход q[4]. Количество выборок, ну пусть будет 1024 (1К). По сути дела в микросхеме FPGA будет кроме нашего основного проекта работать еще проект анализатора. Он будет вкомпилирован и размещен в логических элементах той же ПЛИС, где-то рядом с основным проектом. Анализируемые сигналы будут складываться во внутренние блоки памяти и иногда выгружаться через JTAG программатор. Нужно понимать, что чем больше анализируемых сигналов мы выберем для захвата, тем больше нужно свободной памяти в ПЛИС. Иногда хочется посмотреть много сигналов сразу, но проект перестает помещаться в ПЛИС из-за SignalTap - ведь он так же занимает место в микросхеме. Тогда приходится либо уменьшать количество просматриваемых сигналов, либо сокращать количество захватываемых выборок.
Теперь важный момент - это триггер. Мне нужно, чтобы анализатор начинал захват по какому-то событию - это и есть триггер. В нашем случае - пусть триггер будет этот же самый сигнал последовательного порта RX, в проекте это вход FTDI_DB0. Я делаю назначение - анализатор должен начать захвать, когда сигнал FTDI_DB0 перейдет из логической единицы в ноль.
После того, как все назначения сделаны нужно сохранить файл SignalTap пользуясь его меню. Автоматически вам будет предложено подключить SignalTap к проекту.
Вообще в свойствах текущего проекта Altera Quartus II есть специальные настройки, которые говорят, подключен ли к проекту SignalTap и какая именно конфигурация используется.
Через меню Assignments => Settings среды Quartus II мы попадаем в диалог настроек, где видим, что сейчас используется файл stp1.stp
Вот теперь, не очень приятный момент - весь проект нужно перекомпилировать. Это как раз из-за того, что включая SignalTap мы фактически добавляем в проект специальный компонент, который будет захватывать анализируемые сигналы и передавать их через JTAG. После компиляции наш проект будет занимать в микросхеме ПЛИС больше места.
Если раньше первый проект для платы Марсоход2 занимал всего 88 логических элемента ПЛИС, то теперь целых 548! Кроме того, теперь занято 1024 бита памяти - как раз те, которые используются анализатором для захвата анализируемого сигнала. Ну жалеть место не будем, его у нас в FPGA еще много.
Теперь пробуем.
Из SignalTap загружаем откомпилированный образ проекта SOF в плату Марсоход2. Запускаем на компьютере программу терминала PUTTY и открываем последовательный порт, принадлежащий плате Марсоход2, у меня это COM9. На самом деле плата Марсоход2 подключена одним физическим кабелем USB к компьютеру. Однако, по этому проводу одновременно работают два протокола: протокол программатора JTAG MBFTDI (с ним работает анализатор SignalTap) и протокол виртуального последовательного порта (с ним работает терминал PUTTY).
Запускаю анализатор SignalTap через меню Processing => Run Analysis или на клавиатуре F5. Анализатор переходит в состояние ожидания события триггера.
И действительно - мы ничего не передаем в последовательный порт и значит FTDI_DB0, который у нас RX не меняется. Теперь в консоли термминала PUTTY нажмем клавишу "5". Терминал отправит код символа "5" 0x35 в последовательный порт, в анализаторе тут же сработает триггер и он нам покажет захваченный сигнал RX во всей его красе:
В последовательном интерфейсе младшие биты передаются первыми.
Точно так же можно анализировать и более сложные сигналы и шины. Например, посмотрим, как работает счетчик в том же "первом проекте" для платы Марсоход2.
В список анализируемых сигналов добавляю сигналы счетчика LPM_COUNTER, а именно:
1) lpm_counter:inst15|q
2) lpm_counter:inst15|aclr
3) lpm_counter:inst15|cnt_en
Частоту анализатора устанавливаю из входного пина CLK100MHZ.
Триггером назначаю сигнал разрешения счета lpm_counter:inst15|cnt_en - по сути это вход кнопки KEY1 платы Марсоход2.
Теперь сохраняем настройки SignalTap в файл stp1.stp. Перекомпилируем проект. Из SignalTap анализатора загружаю SOF в чип Cyclone III. Светодиоды на плате моргают - счетчик в чипе работает. Нажимаю кнопочку KEY1, счет останавливается. Запускаю анализатор и он подвисает ожидая события триггера. Тут я бросаю кнопочку на плате и вот - в анализаторе срабатывает триггер и он показывает записанные сигналы:
Вот как все тут наглядно видно - после появления сигнала разрешения счета cnt_en счетчик начинает считать!
Подробнее...