Логический анализатор SignalTap.

Altera SignalTap

В состав комплекта ПО Altera Quartus II входит логический анализатор SignalTap.
Его использование возможно только с микросхемами FPGA, которые имеют встроенные блоки памяти. В микросхемах CPLD встроенной памяти нет, поэтому и использовать этот мощный инструмент, например, с первой платой Марсоход было нельзя.

Сейчас, когда у нас в руках есть новая плата Марсоход2 с ПЛИС Cyclone III, я могу рассказать как пользоваться этим анализатором.


На самом деле SignalTap предоставляет огромные возможности по отладке проектов. По сути дела он позволяет заглянуть внутрь микросхемы и посмотреть на временные диаграммы интересующих нас сигналов.

Итак, запускаем анализатор через меню Altera Quartus II Tools => SignalTap Logic Analyzer. Открывается совершенно новое окно с множеством настроек и опций.

Altera SignalTap Logic Analyzer

Посмотрим самое важное, я отметил на изображении окна самые нужные элементы управления:

1) Кнопки запуска анализатора.
2) Выбор и настройка программатора. Я использую USB JTAG программатор MBFTDI (в Марсоход2 он реализован прамо на плате). Программатор используется для передачи анализируемых данных из микросхемы в компьютер.
3) SOF Manager - позволяет загрузить в FPGA образ откомпилированного проекта прямо из среды SignalTap
4) Окно со списком сигналов, которые нас интересуют для анализа. Сюда можно добавлять интересующие нас сигналы из разрабатываемого проекта и удалять не нужные.
5) Выбор сигнала тактовой частоты для анализатора.
6) Количество выборок интересующих нас сигналов.

К сожалению, настроек Signal Configuration у анализатора много. Пришлось проскроллить это окошко вниз и сделать еще один снимок с экрана, чтобы показать опции триггера:

signaltap2

7) Тип триггера для начала захвата анализируемых сигналов, количество триггеров и позиция триггера внутри захваченных сигналов.
8) Trigger In - если галочка отмечена, то анализатор начинает захват сигналов по срабатыванию триггера.
9) Выбор сигнала, который будет служить триггером.

В полях 4, 5, 9 нужно выбирать сигналы из текущего проекта. Делается это с помощью вот такого диалогового окна Node Finder:

SignalTap NodeFinder

 

Искать сигналы можно по имени используя маску, например, *_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 и какая именно конфигурация используется.

 

Quartus II Settings, SignalTap

Через меню Assignments => Settings среды Quartus II мы попадаем в диалог настроек, где видим, что сейчас используется файл stp1.stp

Вот теперь, не очень приятный момент - весь проект нужно перекомпилировать. Это как раз из-за того, что включая SignalTap мы фактически добавляем в проект специальный компонент, который будет захватывать анализируемые сигналы и передавать их через JTAG. После компиляции наш проект будет занимать в микросхеме ПЛИС больше места.

Quartus II Project Size

Если раньше первый проект для платы Марсоход2 занимал всего 88 логических элемента ПЛИС, то теперь целых 548! Кроме того, теперь занято 1024 бита памяти - как раз те, которые используются анализатором для захвата анализируемого сигнала. Ну жалеть место не будем, его у нас в FPGA еще много.

Теперь пробуем.

Из SignalTap загружаем откомпилированный образ проекта SOF в плату Марсоход2. Запускаем на компьютере программу терминала PUTTY и открываем последовательный порт, принадлежащий плате Марсоход2, у меня это COM9. На самом деле плата Марсоход2 подключена одним физическим кабелем USB к компьютеру. Однако, по этому проводу одновременно работают два протокола: протокол программатора JTAG MBFTDI (с ним работает анализатор SignalTap) и протокол виртуального последовательного порта (с ним работает терминал PUTTY).

Запускаю анализатор SignalTap через меню Processing => Run Analysis или на клавиатуре F5. Анализатор переходит в состояние ожидания события триггера.

SignalTap Waiting

И действительно - мы ничего не передаем в последовательный порт и значит FTDI_DB0, который у нас RX не меняется. Теперь в консоли термминала PUTTY нажмем клавишу "5". Терминал отправит код символа "5" 0x35 в последовательный порт, в анализаторе тут же сработает триггер и он нам покажет захваченный сигнал RX во всей его красе:

Serial Port Rx 0x35 code

В последовательном интерфейсе младшие биты передаются первыми.

Точно так же можно анализировать и более сложные сигналы и шины. Например, посмотрим, как работает счетчик в том же "первом проекте" для платы Марсоход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, счет останавливается. Запускаю анализатор и он подвисает ожидая события триггера. Тут я бросаю кнопочку на плате и вот - в анализаторе срабатывает триггер и он показывает записанные сигналы:

Счетчик в SignalTap

Вот как все тут наглядно видно - после появления сигнала разрешения счета cnt_en счетчик начинает считать!

 

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