Микропроцессор своими руками. Часть 4.3. Как отладить встроенный в FPGA микроконтроллер?

№ 11’2006
PDF версия
В предыдущих частях статьи мы рассмотрели то, как можно отлаживать встроенные в FPGA микроконтроллеры, а также как работает порт JTAG. На сей раз нас интересует программно%аппаратная поддержка режима тестирования.

Все статьи цикла:

В предыдущих частях статьи мы рассмотрели то, как можно отлаживать встроенные в FPGA микроконтроллеры, а также как работает порт JTAG. На сей раз нас интересует программно%аппаратная поддержка режима тестирования.

Технические подробности аппаратных устройств сопряжения

Аппаратные устройства сопряжения для разных микросхем изготавливаются как самими производителями микросхем, так и независимыми производителями отладочных средств. Но, к сожалению, в первом случае аппаратные устройства сопряжения довольно сильно отличаются друг от друга. Причем нет однообразия даже в названиях устройств«Байт-Бластер», «Кабель № 3», «адаптер» и так далее. Традиционно такие устройства подключались на LPT-порт компьютера. На рис. 25–26 приведены схемы двух таких устройств. Первое предназначено для микросхем фирмы Xilinx, второе — для микросхем фирмы Altera [11]. Специально для данной статьи автором была сделана программа Jtag Tool, описание и способы работы с ней будут приведены далее. Программа Jtag Tool и ее исходные тексты могут быть свободно получены читателями с сайта автора. В таблицах 6–9 приведены характеристики аппаратных устройств сопряжения. Эти таблицы содержат названия переменных, которые используются в программе Jtag Tool. Так, например, сигналу DONE, изображенному на схеме, соответствует маска DONE_MASK, которая используется в программе Jtag Tool для работы с LPT-портом и указывает положение бита в байте, определяющего управление соответствующего сигнала.

Рис. 25. Схема аппаратного адаптера, называемого по документации фирмы Xilinx «Кабель № 3»
Рис. 26. Схема аппаратного адаптера, называемого по документации фирмы Altera ByteBlaster
Таблица 6. Сигналы и их описание для Cable3-Xilinx

Примечание:
1. Знак «=>» указывает направление передачи сигнала от LPT-порта к порту JTAG.
2. Знак «
Таблица 7. Параметры инициализации порта для Cable3-Xilinx

Таблица 8. Сигналы и их описание для ByteBlaster-Altera

Примечание:
6. Знак «=>» указывает направление передачи сигнала от LPT-порта к порту JTAG.
7. Знак «
Таблица 9. Параметры инициализации порта для Cable3-Xilinx

Из множества проектов различных JTAG-адаптеров, которые имеются как на сайтах с открытыми проектами, так и на сайтах коммерческих фирм, хочется представить вниманию читателей следующий проект — Chameleon, с ним можно ознакомиться на сайте фирмы Amontec [12]. Внимания читателей заслуживает и акселератор для адаптера Chameleon [13]. Данное изделие близко к тому, что делала фирма Xilinx для своих адаптеров, работавших через LPT-порт.
Производительность работы аппаратных устройств сопряжения
С развитием интерфейса USB производители микросхем стали предлагать аппаратные устройства сопряжения, работающие по этому интерфейсу. Но, к сожалению, вся информация о драйверах этих устройств и о возможности обращаться к ним из «самодельной» программы полностью закрыта, либо предоставляется только на коммерческой основе. Независимые производители отладочных средств неоднократно пытались «выправить» эту ситуацию, но, к сожалению, универсальные аппаратные устройства сопряжения более дороги и не получили такого же широкого распространения, как «фирменные» средства сопряжения. В таблице 10 приведены некоторые характеристики, позволяющие оценить производительность и стоимость аппаратных адаптеров, которые выпускают различные компании (по данным, представленным фирмой МТ-System).
Таблица 10. Сравнительные характеристики распространенных JTAG адаптеров

Теперь мы переходим к рассмотрению компонентов в FPGA, при помощи которых возможно осуществлять отладку проектов пользователя. Начнем с микросхем фирмы Xilinx.
Компонент BSCAN_SPARTAN3 для микросхем фирмы Xilinx рассмотрим на примере компонента, применяемого для микросхем серии SPARTAN3. Он представлен как Primitive: Spartan-3 Boundary Scan Logic Control Circuit, и его описание можно найти в документе [14]. На рис. 27 этот компонент изображен в виде «черного ящика». Описание блока BSCAN_SPARTAN3 — на рис. 28–29. Данные по выводам блока BSCAN_SPARTAN3 приведены в таблице 11. Главное, что необходимо отметить, так это то, что адреса команд, работающих с этими блоками, заданы жестко. Пользователь может использовать только две копии (instances) данного компонента в своем проекте. Но именно благодаря тому, что адреса фиксированы, блок содержит в своем составе дешифратор адресов, и пользователь имеет дело с двумя группами сигналоводной для логики, работающей по адресу USER1, и другой — по адресу USER2.

Рис. 27. Компонент Spartan-3 Boundary Scan Logic Control Circuit в виде «черного ящика»

Рис. 28. Описание блока BSCAN_SPARTAN3 на VHDL

Рис. 29. Описание блока BSCAN_SPARTAN3 на Verilog
Таблица 11. Краткое описание выводов блока BSCAN_SPARTAN3

Информации об этом компоненте крайне мало. Но поскольку он в библиотеке числится как Primitive, можно утверждать, что это аппаратный блок, а следовательно, его применение в проекте не должно сокращать ресурсы, предоставляемые пользователю.
Компонент sld_virtual_jtag для микросхем фирмы Altera
У Altera дела обстоят несколько иначе. Компонент для связи с проектом пользователя называется sld_virtual_jtag [15]. Основное его отличие от ранее рассмотренного в том, что sld_virtual_jtag может иметь в одном проекте до 128 копий (instances). Для конфигурации данной мегафункции может быть использован MegaWizard Plug-In Manager, поставляемый фирмой Altera. В инструкции Megafunction User Guide, глава 2— Getting Started, на стр. 26–29 приведены примеры использования sld_virtual_jtag. Они выполнены на языках VHDL и Verilog. На рис. 30 — описание блока, получаемого при использовании в проекте копии функции sld_virtual_jtag. Данные по выводам блока sld_virtual_jtag приведены в таблице 12.

Рис. 30. Часть описания блока sld_virtual_jtag на VHDL
Таблица 12. Краткое описание выводов блока sld_virtual_jtag

Основное отличие блока sld_virtual_jtag от предыдущего в том, что это не аппаратный примитив, а макрос, и, следовательно, при использовании такого блока в проекте для него необходимо выделить ресурсы кристалла.
Более подробное описание входов/выходов, параметров и конфигурирования мегафункции sld_virtual_jtag достойно отдельной статьи, поэтому здесь мы остановимся и перейдем к описанию программного инструмента, предназначенного для облегчения изучения работы с портом JTAG.
Программный инструмент
После того, как в нескольких предыдущих журналах были опубликованы статьи о различных программных инструментах, облегчающих разработку проектов, автор получил несколько писем читателей с просьбами выслать им свои программы. Поэтому можно смело сказать о том, что интерес к таким программам есть. Что касается данного случая с отладкой проектов по порту JTAG, то без программной поддержки представить себе отладку просто невозможно. Автором был произведен поиск для выяснения того, какими программами пользуются для аналогичных целей. Кто-то использует скрипты, кто-то программы, запускающиеся из командной строки, а кто-то — визуальные оболочки. Поскольку использование специализированных скриптов для многих читателей вызовет определенные трудности, то пришлось остановиться на обычных программах с визуальными оболочками, аналогичных тем, что автор разрабатывал в предыдущих проектах. А так как цель данной статьи — обучение технологии работы с портом JTAG, то основное внимание было уделено тому, чтобы предоставить пользователю как можно больше информации о том, что делает программа, какими данными хост обменивается с портом.
Программа должна быть легко перестраиваемой, так, чтобы пользователь смог работать с разными аппаратными адаптерами и различными типами микросхем. Поскольку у аппаратных адаптеров, подключаемых к порту USB, нет единого или хотя бы похожего протокола, то за основу был взят аппаратный адаптер, подключаемый к порту LPT. И последнее требование, которое автор хотел реализовать, — это то, чтобы программа не нуждалась в инсталляции и не была связана с реестром. Такое построение программы особенно удобно в том случае, если вы хотите быстро произвести какие-либо действия на «чужой» машине. Например, вы приходите в стендовую, где находится проверяемое изделие, берете Flash-диск, подключаете его и сразу производите тестирование изделия.
Пользовательский интерфейс и действия, выполняемые программным инструментом — Jtag Tool
Что позволяет этот инструмент?
Программа выполнена как визуальная оболочка, она представляет собой одну форму, на которой расположен блокнот с 5-ю страницами. Файл инициализации находится в той же рабочей директории, откуда запускается сама программа. Для работы с LPT-портом используется известный драйвер GiveIO. Драйвер устанавливается пользователем по прилагаемой к программе инструкции. Все операции с портом выделены в отдельный класс, так что, при желании, читатель сможет заменить нижний уровень программы и использовать любой другой драйвер. Точно так же все действия с аппаратным адаптером выделены в отдельный класс, поэтому можно легко заменить работу с LPT-портом на действия с USB-портом. В реальных условиях микросхемы обычно включены в JTAG-цепочку. И число таких микросхем может быть достаточно велико. Однако для целей обучения достаточно иметь возможность выполнять следующие задачи: работать только с одной микросхемой в цепочке, определять общее число микросхем в цепочке и читать их ID.
И еще одно требование к формату данных для тестов. Как показывает практика, наиболее удобно для таких программных инструментов иметь формат тестов, совместимый со стандартными программами, например с Excel. При использовании Excel-совместимых данных сразу появляется возможность делать сортировки, обработки данных, облегчается редактирование и т. д. В качестве формата был выбран текстовый, где в качестве разделителя используется знак «;».
Итак, во-первых, данная программа позволяет подключить к LPT-порту любой аппаратный адаптер и произвести настройку его параметров. На второй странице блокнота находится окно ввода и отображения параметров аппаратного адаптера и LPT-порта. Для того чтобы указать программе, какие биты порта используются для ввода и вывода данных, пользователь должен ввести параметры маски. Они могут быть введены и затем показаны как в шестнадцатиричном виде, так и в двоичном. Если в этом окне ввести новое название аппаратного адаптера и нажать кнопку Save, то оно добавится к списку адаптеров, находящемуся в выпадающем списке комбобокса, а также параметры этого адаптера сохранятся в файле инициализации данной программы. Теперь пользователь имеет возможность выбрать из списка требуемый ему адаптер и, нажав на кнопку Load, произвести загрузку в программу новых параметров аппаратного адаптера. Кнопка ShowMyCable позволяет вывести на окно просмотра текущие параметры аппаратного адаптера. Внешний вид этой страницы показан на рис. 31. Окно просмотра данных находится на первой странице закладки. На это окно будут выводиться все данные, полученные программой, а также данные, выводимые самой программой в процессе работы. Внешний вид этой страницы показан на рис. 32.

Рис. 31. Окно для ввода и индикации параметров аппаратного адаптера и для работы с LPT-портом

Рис. 32. Окно, на которое выдаются данные мониторинга и результаты работы теста
Во-вторых, третья страница блокнота (рис. 33) предназначена для обработки BSDL-файлов и хранения результатов этой обработки. Пользователь указывает программе BSDL файл той микросхемы, с которой он хочет работать. Программа выделяет из этого файла коды команд сканирования и их разрядность. Выделенные параметры пользователь имеет возможность сохранить, и далее, при запуске программы, все параметры будут подгружаться автоматически.

Рис 33. Окно для индикации параметров, выделенных из BSDL-файлов и комбобокса, задающего уровень мониторинга программы
Кроме тех элементов управления и индикации, о которых было сказано выше, на данной странице присутствует еще один очень важный элемент управления — это комбобокс, который позволяет пользователю выбрать уровень мониторинга процесса тестирования.
Для того чтобы пользователь мог подробно изучить обмен данными с портом JTAG, предусмотрен мониторинг «на уровне битов порта» (рис. 34). Здесь приведена только небольшая часть трассировки команды Get ID.

Рис. 34. Пример работы в режиме «на уровне битов порта»
Для того чтобы перейти на мониторинг «ступенью выше», предусмотрен режим «на уровне битов» (рис. 35). Мониторинг также установлен «на уровне битов». На этом рисунке приводится трассировка команды Get ID.

Рис. 35. Пример работы в режиме «на уровне битов»
Более высокий уровень — «на уровне команд сканирования» (рис. 36). Мониторинг проводится «на уровне команд сканирования». На этом рисунке приводится трассировка команды Get ID.

Рис. 36. Пример работы в режиме «на уровне команд сканирования»
Еще более высокая «ступень» — «на уровне макрокоманд». В этом режиме на мониторинг выведется только следующая строка «тест — 1 Get ID». В этой строке будет указан лишь текущий номер теста и выполненная команда. Таким образом, можно выбрать требуемый уровень детализации мониторинга, вплоть до полной отмены вывода информации на окно мониторинга, что необходимо при работе с логическими анализаторами или другими аппаратными средствами, критичными ко времени исполнения тестов.
В четвертом окне (рис. 37) пользователь формирует тесты, и затем они выполняются. Слева находится таблица, в которую помещаются команды и их параметры, а справа расположены органы управления, необходимые для работы с этим окном. В рамке «Команда–данные» расположены два комбобокса, при помощи верхнего можно выбрать тип команды, а при помощи нижнего — конкретное действие. Например, выбрав на верхнем комбобоксе тип команды— TapIrScan, в нижний загружается список из следующих действий: TapIrScan, Addr=USER1, Addr=USER2, Addr=Bypass, Addr=ID, Addr=USERCODE. Если выбрана радиокнопка Set, то по двойному клику по таблице данные из нижнего комбобокса будут записаны в таблицу. Если же выбрана радиокнопка Get, то данные из таблицы будут записаны в этот же комбобокс. Кнопка +5 Rows добавляет к таблице еще 5 строк.

Рис. 37. Окно программы, в котором пользователь формирует тесты
Непосредственно под рамкой «Команда – данные» расположены две кнопки, при помощи которых пользователь может загрузить или сохранить набранный тест.
Теперь рассмотрим те элементы, при помощи которых пользователь управляет ходом выполнения теста. Для того чтобы указать программе, с какой строки необходимо выполнять тест, пользователь должен навести указатель мыши на требуемую строку таблицы и произвести один клик. При этом строка будет выделена синим цветом. Если теперь пользователь нажмет кнопку Step, то программа выполнит тот тест в таблице, который выделен синим цветом. После выполнения теста будет выделена синим цветом следующая строка в таблице. При повторном нажатии на кнопку Step будет выполнен следующий шаг. И если работа ведется в первых трех строках таблицы, то будет произведено выделение следующей строки, то есть, можно сказать, что синяя полоска сместится вниз на одну позицию. А вот начиная с четвертой строки таблицы, кроме выделения следующей строки, одновременно вверх на одну строку сдвигается сама таблица. Это сделано для того, чтобы пользователь мог видеть, какие тесты уже были выполнены и какие сейчас предстоит выполнить. Если пользователь хочет изменить порядок выполнения тестов, например, вернуться на несколько тестов назад или пропустить несколько тестов, то ему для этого достаточно просто произвести выделение (см. выше) той строки, с которой он хочет продолжить работу.
Кнопка New Cycle переводит выделение на первую строку теста и обнуляет системные переменные так, чтобы пользователь мог начать новый цикл тестирования.
В центре рамки «Управление» расположены кнопки, позволяющие запустить выполнение тестов в автоматическом режиме. Для этого пользователь имеет возможность выбрать время для паузы при выполнении тестов. Далее, при нажатии на кнопку Auto Run программа запускает таймер, который имитирует нажатие кнопки Step. На кнопке Auto Run изменится надпись, появится Stop, и нажатие на эту кнопку приводит к остановке тестирования после выполнения текущей строки теста. Если же выполнение тестов завершается, то программа вновь меняет надпись на кнопке (Stop на Auto Run) и после этого выводит сообщение о том, что тестирование завершено на такой-то строке. Кроме этого, аналогичная надпись выводится в окне мониторинга.
Но для работы с большими по объему тестами этого может быть мало. Для удобства пользователя сделаны еще три кнопки. Set BP— установить точку останова, Del BP — убрать точку останова и Del All BP — убрать все точки останова. Для того чтобы установить точку останова, необходимо выделить нужную строку и нажать кнопку Set BP. Аналогичные действия надо выполнить, чтобы снять точку останова. На рис. 37 в строке № 5 показана установленная точка останова. Кнопка Del All BP позволяет быстро очистить весь тест от точек останова. Точки останова вызывают останов тестирования только при автоматическом тестировании. При этом выделится та строка, которая еще не выполнялась.
Для облегчения составления тестов были использованы некоторые идеи Доменика Раша (Dominic Rath) из его открытого проекта Open On-Chip Debugger (www.openocd.berlios.de/web). Также учитывался опыт работы с микросхемами фирмы FTDI и их FTCJTAG DLL. Все это привело к тому, что программа выполнена так, что она формирует сигналы для управления ТАР-контроллером автоматически. Она автоматически выполняет и все действия, необходимые для перевода ТАР-контроллера из одного состояния в другое.
Формирование тестов упрощено до предела. Поэтому пользователю достаточно лишь указать то действие, которое он хочет выполнить, то есть прочитать ID микросхемы, выполнить команду сканирования регистра команд (IrScan) или команду сканирования регистра данных (DrScan). Для команды IrScan пользователь должен ввести адрес, по которому должно производиться сканирование. Этот адрес будет загружен в регистр адресов ТАР-контроллера микросхемы, так что последующее обращение по команде DrScan будет работать с данными, находящимися по указанному адресу. Программа позволяет работать не с абсолютными адресами, а с символьными именами адресов регистров. Это сделано, чтобы упростить процедуру ввода адресов, а для этого необходимо в верхнем комбобоксе, который находится в рамке «Команда–данные», из выпадающего меню выбрать пункт TapIrScan. Тогда в нижний комбобокс загрузится список адресов ТАР-контроллера, и именно тех адресов, которые были выделены из BSDL-файла, описывающего микросхему пользователя: Addr=USER1, Addr=USER2, Addr=Bypass, Addr=ID, Addr=USERCODE. В том случае, если в BSDL-файле не будет обнаружено адресов регистров под названиями USER1 и USER2, эти адреса пользователь может ввести вручную в окне номер 3 и произвести сохранение введенной информации.
Если для команды IrScan необходимо указать адрес, то, соответственно, для команды DrScan необходимо только указать данные, которые будут загружаться в микросхему. Также необходимо указать «длину» слова данных. Конечно, если записывать данные в виде строки битов — «01100111», то длина такой строки вычисляется достаточно просто. Но ведь для некоторых проектов длина регистра в проекте пользователя, находящемся в FPGA, может быть достаточно большой, поэтому, в таком случае, для получения более компактной формы записи будет удобней пользоваться шестнадцатиричной формой представления. А поскольку длина регистра пользователя может быть и не кратна 8, то тут и возникает потребность во введении параметра, указывающего на длину данных.
Еще один важный параметр, который необходимо ввести в таблицу, — это то состояние ТАР-контроллера, которое он должен принять по окончании выполнения данного теста. Программа имеет внутреннюю переменную, хранящую номер текущего состояния ТАР-контроллера. Программа проверяет, можно ли начать выполнять команду из текущего состояния. Если определено, что выполнение команды из текущего состояния невозможно, программа сначала выполняет переход в то состояние ТАР-контроллера, которое будет являться исходным для выполнения данной команды. После выполнения команды программа аналогичным образом выполнит переход в то состояние ТАР-контроллера, которое будет задано пользователем в таблице как конечное состояние для завершения теста. Таким образом, для большинства команд IrScan конечным состоянием автомата ТАР-контроллера можно принять состояние Shift-DR. Для того чтобы упростить эту процедуру, необходимо в верхнем комбобоксе, который находится в рамке «Команда–данные», из выпадающего меню выбрать пункт TapEndState. Тогда в нижний комбобокс загрузится список состояний ТАР-контроллера, которые предлагаются пользователю: Run-Test/Idle, Test-Logic-Reset, Shift-IR, Shift-DR, Update-DR. Что же касается команд DrScan, то для них можно выбрать конечным состоянием автомата ТАР-контроллера состояние Update-DR— в том случае, если за этим тестом последует еще один тест с командой DrScan или при последующей остановке тестирования, может быть выбрано состояние Run-Test/Idle. Если же этот тест последний и автомат надо перевести в выключенное состояние, то необходимо выбрать состояние Test-Logic-Reset.
Для того чтобы еще более упростить формирование тестов, можно модернизировать программу так, чтобы было можно устанавливать состояние ТАР-контроллера, которое он должен принять по окончании выполнения данного теста, автоматически. Для этого всего лишь надо проанализировать таблицу и выяснить, какой будет следующий тест. Если текущий тест последний, то это значит, что его конечным состоянием должно быть Test-Logic-Reset. Если следующий тест — IrScan, то, естественно, надо делать переход в состояние Shift-IR. И, аналогично, если следующий тест — DrScan, то, точно так же, надо делать переход в состояние Shift-DR.
И последний, четвертый пункт. Для того чтобы пользователь смог развивать данную программу, в пятом окне выполнен фрагмент, предназначенный для визуального отображения характеристик нескольких микросхем, включенных в JTAG-цепочку (рис. 38). Нажав на кнопку «Создать», пользователь создает на форме набор кнопок, соответствующий числу, введенному пользователем. При прохождении указателя мыши по этим кнопкам программа выдает подсказку (хинт), текст которой соответствует надписи на кнопке.

Рис. 38. Пример реализации фрагмента программы, показывающего соединение нескольких микросхем в цепочку
Поскольку среди команд тестирования есть команда определения числа микросхем в цепочке, то пользователь сам сможет доработать программу, связав определение числа микросхем с последующим рисованием соответствующего числа кнопок.
И в заключение необходимо сказать еще несколько слов о том, что данная программа не представляет собой завершенный коммерческий продукт. Она предназначена только для того, чтобы пользователь смог сделать самые первые шаги. Поэтому были предприняты меры по упрощению составления тестов. Программа не была рассчитана на работу с граничным сканированием. Поэтому здесь реализован только режим IrScan, но нет команд Sample/Preload. Однако пользователь может сам доработать данное программное обеспечение до требуемых ему задач.
Но здесь необходимо обратить внимание читателя на следующий момент. Все фирмы, разработчики средств тестирования, всегда пишут отом, что JTAG-тестирование — это передовая технология, и тут все просто и нет нерешенных проблем. Да, для компаний, использующих данную технологию десятилетиями, возможно, это и так. Но для тех, кто только начинает работать с технологией использования порта JTAG, необходимы совершенно другие «правила игры».
Помните о том, что технология работы с портом JTAG — это не совсем безобидно и легко. Да, без сомнения, эта технология значительно облегчает жизнь пользователя. Но только при одном условии: порт JTAG и все, что с ним связано, — аппаратные адаптеры, кабели, питание и пр.—все это должно работать безотказно! Посмотрите в начало этой статьи. А именно туда, где было написано о последовательном продвижении тестов от центра к периферии. Всегда помните о том, что хотя ваше тестирующее оборудование исправно и проверено, но сама цепь JTAG, та цепь, по которой передаются тестовые сигналы, находится на проверяемой плате, и она, эта цепь, тоже может быть источником ошибок. Если цепочка бит, сдвигаемая в порт, может достигать «в длину» до десятков тысяч бит, то при сбое 1 бит на 1000 бит вы никогда не получите правильного результата! Мало того, в результате сдвига неверной последовательности вы можете случайным образом выдать воздействие на внутренние регистры микросхемы или на ее выводы. А это, в свою очередь, может привести к отказу самой микросхемы или той периферии, которая управляется данной микросхемой. Поэтому необходимо принимать определенные меры безопасности при работе с портом JTAG.
Как работает программа?
Блок-схема с названиями файлов, входящих в программу приведена на рис. 39.

Рис. 39. Блок-схема программы Jtag Tool
В левой части рисунка показаны файлы, сгруппированные по выполняемым ими функциям. Это загрузка и сохранение данных инициализации и данных для таблиц, работа со строковыми функциями, выполнение функций, необходимых для инициализации работы всего приложения. С правой стороны показаны взаимосвязи между файлами, которые используются при работе с портом. В том случае, если возникнет необходимость подключить к программе другой аппаратный адаптер, например, работающий через USB, программа может быть легко доработана путем введения в нее еще одного класса, выполняющего аналогичные функции, но уже через USB-порт.
Что касается работы нижних уровней программы, работающих с портом, то здесь особо описывать нечего. В качестве драйвера порта был использован GiveIO. Управление битами порта ведется при помощи набора масок, которые вводятся пользователем. Этот набор масок ассоциируется с конкретным типом аппаратного адаптера. Таким образом, программа может быть легко настроена на различные реализации аппаратных адаптеров. На уровне класса MyTAP программа выполняет следующие функции:

Такая функция производит сдвиг до восьми бит данных в порт и читает, соответственно, до восьми бит данных из порта. Функции передается параметр, указывающий, сколько бит надо обработать, а также строка комментариев и параметр, определяющий уровень мониторинга. Уровни мониторинга и примеры работы программы с ними были приведены выше.
Теперь давайте рассмотрим то, как программа выполняет управление ТАР-контроллером в микросхеме пользователя. Для того чтобы выполнить переходы из одного состояния автомата в другое, в программе предусмотрен набор переменных и таблица, определяющая, какие и сколько бит должно быть выдано в порт. Всего ТАР-контроллер имеет 16 состояний. Но переходы возможны только из определенных состояний и лишь в другие определенные диаграммой переходов состояния. Более того, для упрощения было принято, что в программе не будет использован ряд переходов и ряд состояний. Это позволяет существенно сократить таблицу переходов. Но, вместе с тем, это требует предварительной проверки. Пользователю разрешено выполнять переходы в следующие состояния: Test-Logic-Reset, Run-Test/Idle, Shift-DR, Pause-DR, SI — Shift-IR, PI — Pause-IR, Update-DR, Update-IR. После проверки того, что требуемое пользователю состояние разрешено, программа извлекает из таблицы число импульсов, которые необходимо выдать в порт, и данные, представляющие собой закодированную последовательность из нулей и единиц, которые будут выданы в порт JTAG.
Теперь вкратце опишем последовательность шагов при начале тестирования изделия. Будем считать, что сам компьютер, который выполняет тестирование, исправен. Далее переходим к проверке его LPT-порта. Можно напомнить и о том, что в LPT-порт можно записать данные и считать их. После правильного выполнения этих процедур мы точно будем знать, что порт у нас есть и он управляется компьютером. Теперь мы можем перенести «точку опоры» на один шаг ближе к проекту пользователя, а именно в сам LPT-порт. Теперь мы считаем, что порт точно исправен и, если не будут выполняться следующие тесты, то это значит, что не выполняет свои функции оборудование, находящееся за LPT-портом. Проверим наличие аппаратного адаптера. Для этого в аппаратном адаптере обычно используется перемычка, передающая сигнал с одного контакта порта на другой. Если этот тест проходит, то это значит, что аппаратный адаптер подключен к порту. В адаптерах фирмы Altera аналогичная перемычка была сделана не напрямую с контакта на контакт, а через микросхему, используемую для передачи сигналов порта. После выполнения тестирования по этому каналу передачи тестовых данных можно было сделать вывод о том, что микросхема исправна и на нее подано питающее напряжение. В аппаратном адаптере фирмы Xilinx для проверки питающего напряжения используется отдельный вход LPT-порта. Вся хитрость в проверке питающего напряжения заключается в том, что перед проверкой напряжения необходимо записать в этот бит LPT-порта 0. Если эти тесты выполняются, то теперь «точку опоры» можно перенести еще дальше — непосредственно на порт JTAG, находящийся на плате пользователя. Теперь мы должны определить то, насколько качественно выполнена сама JTAG-цепочка на плате. Для этого у программы в файле инициализации есть два параметра — максимальное число микросхем в цепочке и тестовая последовательность из нулей и единиц. По умолчанию или по сбросу все микросхемы должны находиться в режиме Bypass. Но для того чтобы надежно провести тестирование, выполним следующие действия. Подадим на вход TMS проверяемой микросхемы сигнал уровня 1 и выдадим 5 тактовых импульсов TCK. Это переведет ТАР-контроллер в состояние RunTest/Idle, что эквивалентно сбросу контроллера в исходное состояние. Затем отметим, что код команды Bypass состоит только из одних единиц. А это значит, что, выдавая последовательность единиц по команде IrScan, мы переведем все микросхемы в JTAG-цепочке в режим Bypass. Представим, что длина команды Bypass в битах будет не более 20 бит (реальное значение — от 4 до 11 бит). Максимальное число микросхем на плате пользователя мы получим из параметра MaxChipNumber. Для того чтобы гарантированно перевести все микросхемы в такое состояние, программа должна выдать по команде IrScan последовательность из 20* MaxChipNumber единиц. Теперь можно проверять число микросхем на плате и одновременно определять качество работы JTAG-цепочки. Сформируем такую последовательность данных — справа несколько нулей, потом добавляем к ним слева тестовую последовательность из нулей и единиц и затем, опять же слева, добавляем к полученной последовательности нули. Число этих нулей должно быть не менее, чем число микросхем в JTAG-цепочке. Полученная строка должна выглядеть примерно так: 0……00000010010101101110. Здесь для наглядности тестовая последовательность выделена жирным шрифтом. Теперь выполним команду DrScan и пропустим нашу тестовую последовательность через проверяемую плату. И сравним полученную строку с той строкой— тестовой последовательностью, которую мы сдвигали. Если вся JTAG-цепочка работает исправно, то в полученной строке будет содержаться фрагмент из нулей и единиц, соответствующий тестовой последовательности. Причем этот фрагмент будет смещен вправо (отставать) на число позиций, соответствующее числу микросхем в цепочке. Это происходит потому, что в режиме Bypass каждая микросхема, находящаяся в цепи JTAG, представляет собой только один триггер, и на нем информация, поступающая на вход TDI, задерживается только на один такт и передается далее на выход TDO. Вот таким способом можно программно определить число микросхем в JTAG-цепочке. Далее этот тест необходимо провести несколько раз и проверить результаты его работы. Если результаты совпадают, то это значит, что цепь TDI — TDO и TCK — работает исправно. Далее для того чтобы убедиться, что все работает исправно, можно провести чтение ID у микросхем. Если мы уже убедились, что данные ID читаются правильно, то можно утверждать, что чтение информации из микросхемы работает и на плате припаяна именно та микросхема, которую мы и ожидали увидеть.
Если же все тесты, описанные выше, проходят без ошибок, то можно считать, что порт JTAG работает исправно. Вот только теперь можно приступать к тестированию проекта пользователя. Итак, переносим «точку опоры» еще на один шаг ближе к проекту пользователя.
Проектирование аппаратной части
Что касается проекта в «железе», то здесь основное внимание будет уделено именно стыку проекта пользователя с портом JTAG. Что же касается узла, производящего отладку микроконтроллеров, то о нем речь пойдет позже. Итак, хост, JTAG-порт и связь с проектом пользователя.
Теперь рассмотрим рис. 40, где данные компоненты представлены в виде блок-схем. Начнем с самого понятного разработчику, а именно с той части, которая выделена голубым цветом и представляет собой логику отладочного блока пользователя. Эта логика находится в FPGA, там же, где и проект пользователя. И с этой логикой, на первый взгляд, все понятно. Ее можно «написать» самому, отсимулировать и, затем, скомпилировать. А вот JTAG-порт — это же аппаратная часть чипа, и детального описания ее работы нет. Есть только очень приблизительное описание работы порта. Ну а хост — это немного программ и аппаратный LPT или USB-порт. А ведь инженер-аппаратчик привык видеть все в виде осциллограмм или их симуляций. Вот поэтому автор предлагает воспользоваться еще одним небольшим проектом, сделанным им для данной статьи. Это симуляция описанных выше устройств, выполненная в среде ModelSim и написанная на языке Verilog. Основная цель данного проекта — помочь читателю увидеть последовательность смены состояний автомата ТАР-контроллера в виде осциллограмм. Этот проект будет являться базой для «отладочного проекта».

Рис. 40. Блок-схема проекта симуляции работы хоста, JTAG-порта и логики пользователя,
выполненная в среде ModelSim и написанная на языке Verilog
Основой проекта является именно узел ТАР-контроллера, который вместе с регистрами и другими дополнительными узлами образует модель JTAG-порта. Для того чтобы выдавать на JTAG-порт последовательность импульсов, в проекте используется блок tester. Этот узел выполнен как task. Для упрощения формирования последовательностей импульсов, выдаваемых узлом tester, воспользуемся результатами работы программного инструмента, описанного выше. Загрузим или сформируем тест чтения ID из микросхемы, установим мониторинг «на уровне битов» и запустим тест на выполнение. Даже при выключенном аппаратном адаптере мы получим в окне мониторинга трассировку теста. Ее можно использовать, чтобы задать параметры для task. На рис. 41 приведен фрагмент кода для симуляции режима чтения ID из микросхемы. Закомментированные строки, выделенные зеленым цветом, — это часть трассировки, взятая как результат работы программного инструмента. Строки черного цвета — то, что будет выполнять симулятор. Для упрощения чтение ID выполняется не за 32 такта, а только за 8.

Рис. 41. Фрагмент кода для симуляции режима чтения ID из микросхемы. Закомментированные строкизеленого цвета. Это часть трассировки, взятая как результат работы программного инструмента. Строки черного цвета — то, что будет выполнять симулятор
Теперь более подробно можно рассмотреть структуру самого JTAG-порта. На рис. 42 приведена его блок-схема.

Рис. 42. Блоксхема JTAG-порта и логики пользователя
В состав порта входят ТАР-контроллер, Регистр Инструкций, Декодер Адреса Инструкций, регистры Bypass, IDCODE, BoundaryScan и другие регистры. Кроме того, в состав порта входят два мультиплексора выходных данных и вспомогательный узел, формирующий сброс. На регистры и ТАР-контроллер поступают тактовые импульсы ТСК. Кроме того, на ТАР-контроллер поступает сигнал TMS. Входные данные — TDI — поступают на регистры. Теперь давайте посмотрим на то, как это работает. (Для справки читатель может посмотреть раздел статьи «Переходы, которые необходимо выполнить при работе с командами», см. КиТ № 10`2006.) Если сигнал TMS удерживать на входе более пяти тактов синхрочастоты, то ТАР-контроллер выполнит сброс своей логики и будет находиться в состоянии Test-Logic-Reset. Далее, поступающие на ТАР-контроллер импульсы ТСК и сигнал TMS переведут его в другие состояния. При получении инструкции в состоянии Shift_IR, ТАР-контроллер пройдет через состояние Update_IR. Во время сдвига инструкции из JTAG-порта, через его выход TDO, будут выдвигаться данные. При этом полученная инструкция будет сохранена и ее код поступит на дешифратор инструкций. Он выберет, какой из регистров будет скоммутирован на выход TDO. В этот же регистр будут грузиться данные при работе ТАР-контроллера в состоянии Shift_DR. Результат работы симулятора при чтении ID представлен на рис. 43. Желтыми цифрами в верхней части рисунка обозначены периоды времени, соответствующие «task’ам», которые на рис. 41 показаны черным цветом. Желтым шрифтом на поле симуляции обозначены состояния ТАР-контроллера. Последовательность переходов из одного состояния в другое показана желтыми стрелками.

Рис. 43. Симуляция работы JTAG-порта при чтении ID из микросхемы
Рассмотрим фазы сдвига инструкции, которые на рис. 43 показаны голубыми цифрами. Импульсы, отмеченные цифрами 1–5, соответствуют переходам в состояние Shift_IR. Само состояние Shift_IR обозначено цифрой 6. По окончании этого состояния автомат переходит через состояния 6, в состояния, обозначенные как 7–11, к состоянию Shift_DR. Состояние Shift_DR обозначено числом 12. По окончании работы с данными происходит переход автомата через состояние 13 в состояние Run_Test/Idle.
Голубым числом 14 показано формирование импульса «Сброс», который вырабатывает счетчик числа импульсов на входе TMS. При достижении заданного уровня, а именно пяти импульсов, счетчик останавливается и выдает на свой выход сигнал «Сброс». Этот сигнал используется логикой сопряжения JTAG-порта с логикой пользователя.
Голубым числом 15 показано формирование импульса разрешения выборки, котрый вырабатывается в соответствии с тем адресом, который был загружен в ТАР-контроллер по команде IR-Scan. Часть из этих сигналов также используются логикой сопряжения JTAG-порта с логикой пользователя.
Для упрощения симуляции предлагаемый автором проект не содержит «логики пользователя». К ней автор относит те сдвиговые регистры и регистры хранения информации, которые необходимы пользователю для работы его отладочного узла. Кроме собственно узлов, преобразующих последовательный интерфейс в параллельный, пользователю еще понадобятся дополнительные узлы привязки асинхронного (с точки зрения системной синхрочастоты в проекте пользователя) проекта пользователя к своей, системной синхрочастоте. То есть к той синхрочастоте, на которой работает весь остальной проект пользователя.
Проект в FPGA
Прежде чем предлагать что-то свое, необходимо дать читателям познакомиться с тем, что уже сделано и уже доступно для самостоятельного изучения.
Вот материал, представленный фирмой 3S. Он представляет интерес, в первую очередь, для «любителей» продукции фирмы Xilinx.

Using the JTAG Interface as a General-Purpose Communication Port. by Derek Wallace Silicon and Software Systems. www.s3group.com. Xcell Online, Second Quarter 2005;
GNAT PROJECT. GNAT Example for Xilinx Spartan™-3 Starter Kit. Document Number: INT2004_57b_DD01. Silicon & Software Systems Ltd. www.s3group.com;
General-purpose Native jtAg Tester (GNAT), www.s3group.com/design_expertise/fpga/.

И, конечно, надо сослаться на материалы, представленные фирмой Altera.
Учебные проекты по Virtual JTAG находятся по адресу:

www.altera.com/literature/ug/ug_virtual_jtag_design_example_1.zip;
www.altera.com/literature/ug/ug_virtual_jta g_design_example_2.zip.

Продолжение следует
Фраза, конечно же, банальная, но все же. Хорошо было бы сначала сделать все проекты, написать все фрагменты статьи, отредактировать все картинки и только потом отдавать все в печать. Но жизнь показывает, что так работать невозможно — получается слишком большое отставание от жизни. Поэтому приходится делать все одновременно. И статью, и проекты к ней. Часть проектов уже выполнена — например, проект в Verilog’е и софтовый инструмент. Часть еще предстоит сделать. Поэтому, как и предупреждал автор в начале статьи, возможны некоторые задержки с выполнением остальных проектов. «Марафон» получился длительный, поэтому прошу вас, уважаемый читатель, отнестись к этому с пониманием. Надеюсь, что все задуманное удастся выполнить, а потому — продолжение следует…
Литература

www.amontec.com JTAG Interface: Common Pinouts amt_ann003 (v1.1) Application Note.
EIA/JEP106, JEDEC Publication 106, Standard Manufacturer’s Identification Code.
UG-BBII81204-1.1, www.altera.com
Chameleon POD Block Diagram. www.amontec.com/chm_block_diagram.shtml
Акселератор для адаптера Chameleon. www.amontec.com/jtag_accelerator.shtml
Spartan-3E Libraries Guide for HDL Designs.
sld_virtual_jtag Megafunction. User Guide. Altera Corporation. June 2006.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *