Когда вы отлаживаете МК, то у вас на виду текущее значение регистров и место где сейчас находится выполнение программы, можно в режиме реального времени изменять регистры и выполнять программу по шагам. В ПЛИС никаких регистров нет, а тем более программы, как же там происходит отладка? В данной статье мы покажем, как пользоваться встроенным логическим анализатором Quartus SignalTap. в качестве подопытной схемы выступит счетчик в коде Грея. На самом деле SignalTap предоставляет огромные возможности по отладке проектов. По сути дела он позволяет заглянуть внутрь микросхемы и посмотреть на временные диаграммы интересующих нас сигналов.
Код Грея — двоичный код, в котором две «соседние» (в упорядоченном, т.е. лексикографическом, наборе) кодовые комбинации различаются только цифрой в одном двоичном разряде. Наиболее часто на практике применяется рефлексивный двоичный код Грея, хотя в общем случае существует бесконечное множество кодов Грея со значениями цифр в разрядах, взятых из различных алфавитов. В большинстве случаев, под термином «код Грея» понимают именно рефлексивный бинарный код Грея.
Изначально предназначался для защиты от ложного срабатывания электромеханических переключателей. Сегодня коды Грея широко используются для упрощения выявления и исправления ошибок в системах связи, а также в формировании сигналов обратной связи в системах управления.
Реализация кода Грея на Verilog:
Verilog Code:
module gray_cnt( input wire clk, input wire nreset, output wire [SIZE-1:0]q ); parameter SIZE = 4; integer i; reg [SIZE-1:0]gray_cnt; reg [SIZE-1:0]bin; reg [SIZE-1:0]next_gray_cnt; always @* begin //convert gray-to-bin for (i=0; i<SIZE; i=i+1) bin[i] = ^(gray_cnt>>i); //increment binary bin=bin+1; //convert bin-to-gray next_gray_cnt = (bin>>1)^bin; end always @(posedge clk or negedge nreset) if(~nreset) gray_cnt <= 0; else gray_cnt <= next_gray_cnt; assign q=gray_cnt; endmodule
Вид получившегося модуля верхнего уровня:
Далее запускаем анализатор через меню Altera Quartus II Tools -> SignalTap Logic Analyzer. Открывается совершенно новое окно с множеством настроек и опций.
В этом окне можно выделить три основных области:
- Instance Manager- отвечает за параметры конкретной реализации SignalTap. Например можно узнать сколько анализатор занимает ресурсов FPGA.
- JTAG Chain Configuration- тут настраиваются параметры подключения к реальному устройству.
- Signal Configuration- предназначен для добавления сигналов, и настройки параметров захвата.
Рассмотрим Signal Configuration подробнее.
Можно отметить следующие настройки:
- Clock- Выбор сигнала тактовой частоты для анализатора.
- Sample depth- Количество выборок интересующих нас сигналов.
- Trigger- Тип триггера для начала захвата анализируемых сигналов, количество триггеров и позиция триггера внутри захваченных сигналов.
- Trigger In- если галочка отмечена, то анализатор начинает захват сигналов по срабатыванию триггера.
- Выбор сигнала, который будет служить триггером.
Далее, нажав на поле Double-click to add nodes, необходимо добавить интересующие нас сигналы. Делается это с помощью вот такого диалогового окна Node Finder:
Искать сигналы можно по имени используя маску, например, gray_cnt*. В этом случае в списке будут , gray_cnt[x], next_gray_cnt[x] и прочие gray_cnt*.
Обратите внимание на Filter. Можно ограничить выбор только входными/выходными контактами, или только регистры после фиттера, или искать среди всех сигналов проекта Design Entry (all names). Может так оказаться, что вы не найдете интересующего вас сигнала в списке. Значит в процессе компиляции он оказался оптимизированным и выброшенным из проекта. В этом случае в проект можно поставить "виртуальный пин" и смотреть сигнал не нем.
В нашем проекте нас в первую очередь интересует выход нашего счетчика Грея. Поэтому добавляем сигналы gray_cnt[0]-gray_cnt[3]. В качестве тактирующего сигнала логично взять сигнал clk, являющийся тактовым для счетчика. Количество выборок, ну пусть будет 128. По сути дела в микросхеме FPGA будет кроме нашего основного проекта работать еще проект анализатора. Он будет вкомпилирован и размещен в логических элементах той же ПЛИС, где-то рядом с основным проектом. Анализируемые сигналы будут складываться во внутренние блоки памяти и иногда выгружаться через JTAG программатор. Нужно понимать, что чем больше анализируемых сигналов мы выберем для захвата, тем больше нужно свободной памяти в ПЛИС. Иногда хочется посмотреть много сигналов сразу, но проект перестает помещаться в ПЛИС из-за SignalTap- ведь он так же занимает место в микросхеме. Тогда приходится либо уменьшать количество просматриваемых сигналов, либо сокращать количество захватываемых выборок.
После того, как все назначения сделаны нужно сохранить файл SignalTap пользуясь его меню. Автоматически вам будет предложено подключить SignalTap к проекту.
Вообще в свойствах текущего проекта Altera Quartus II есть специальные настройки, которые говорят, подключен ли к проекту SignalTap и какая именно конфигурация используется.
Через меню Assignments => Settings среды Quartus II мы попадаем в диалог настроек, где видим, что сейчас используется файл stp1.stp.
Вот теперь, не очень приятный момент - весь проект нужно перекомпилировать. Это как раз из-за того, что включая SignalTap мы фактически добавляем в проект специальный компонент, который будет захватывать анализируемые сигналы и передавать их через JTAG. После компиляции наш проект будет занимать в микросхеме ПЛИС больше места.
Запускаю анализатор SignalTap через меню Processing => Run Analysis или на клавиатуре F5.
Легко можно убедится что кодовые комбинации различаются только цифрой в одном двоичном разряде:
Code:
<span style="color: black; font-size: small;"> clk q[0] q[1] q[2] q[3] 0 0 0 0 0 1 1 0 0 0 2 1 1 0 0 3 0 1 0 0 4 0 1 1 0 5 1 1 1 0 6 1 0 1 0 7 0 0 1 0 8 0 0 1 1 9 1 0 1 1 10 1 1 1 1 11 0 1 1 1 12 0 1 0 1 13 1 1 0 1 14 1 0 0 1 15 0 0 0 1 </span>
Проект SignalTap для платы VE-EP4CE10E: signaltap_grey.zip