МАРСОХОД

Open Source Hardware Project

Что такое JTAG

JTAG - это аппаратный интерфейс для программирования, тестирования и отладки печатных плат. Об этом интерфейсе, уже много написано. Например, можно почитать здесь: http://ru.wikipedia.org/wiki/JTAG

Еще очень хорошее описание на английском языке можно найти на сайте http://www.fpga4fun.com/JTAG.html

Ну и конечно, компания Altera предоставляет исчерпывающую документацию по использованию JTAG и BST (Boundary Scan Test) в своих микросхемах FPGA и CPLD:

JTAG in Altera devices ( 369066 bytes )

На нашей плате Марсоход тоже есть разъем JTAG для подключения программатора UsbBlaster или ByteBlaster. Через этот разъем мы программируем нашу ПЛИС.

Попробую рассказать, что же такое JTAG своими словами.

Еще в 1980 году группа разработчиков Joint Test Action Group (JTAG) разработала спецификацию для тестирования межсоединений на плате: "boundary-scan testing". Позже эта спецификация была стандартизована как IEEE Std. 1149.1.

Печатная плата и много проводников

Представьте себе, что Вы разрабатываете плату скажем с 5 микросхемами и у каждой микросхемы 100-1000 контактов. Микросхемы соединены между собой тысячами соединений на плате. На заводе плата будет выпускаться партиями десятками тысяч экземпляров. Понятно, что часть плат после монтажа компонентов будет браком. Где-то не пропаяются контакты, где-то трещина в PCB или не получилось переходное отверстие между слоями платы и так далее. Как же все таки тестировать устройства?

Вот собственно первоначальное предназначение JTAG - предоставить производителям средство тестирования собранных устройств.

Производители микросхем обязывались выпускать JTAG совместимые микросхемы. Все микросхемы на плате соединялись специальным последовательным интерфейсом из 4х сигналов TDI, TDO, TMS, TCK.

Boundary Scan Chain

Каждый контакт микросхемы снабжается специальной логикой Boundary Scan Cell. Все эти ячейки Boundary Scan Cell всех микросхем на плате получаются объеденены в одну последовательную цепочку. Это позволяет по запросу с компьютера через интерфейс JTAG менять состояние почти любого вывода любой микросхемы, активизировать его как выход или как вход. Выход одной микросхемы выдает сигнал который передается по проводникам печатной платы и принимается входом другой микросхемы - так проверяется соединение на плате.

Внутри каждой микросхемы с JTAG есть специальный TAP контроллер (Test Access Port), который принимает последовательные команды и выполняет их. TAP контроллер управляет всеми ячейками Boundary Scan Cells. Кроме этого, через TAP контроллер можно выполнять всяческие специфические для каждой микросхемы команды.

Так, например, микросхемы компании Альтера можно: программировать CPLD, загружать образ в FPGA, считывать внутреннее состояние виртуальных пинов, использовать "внутренний цифровой осцилограф" SignalTap (для FPGA) и прочее. Для некоторых микросхем процессоров через JTAG и соответственно TAP контроллер можно вести пошаговую отладку программ, считывать состояния регистров процессора и встроенных контроллеров. В общем, довольно универсальный интерфейс.

Давайте посмотрим, как устроен TAP контроллер.
Работа TAP контроллера описывается вот таким автоматом (state-machine):

TAP (Test Access Port)
Кажется не понятным, но на самом деле все просто.
Интерфейс JTAG передает TAP контроллеру 3 сигнала TDI, TMS и TCK.
TCK - это тактовая частота, на которой работает интерфейс. Состояние контроллера меняется по фронту тактовой частоты TCK согласно состоянию линии TMS. Сигнал TMS определает в какое состояние переходит контроллер на следующем шаге.

Рассмотрим конкретную ситуацию.
Предположим мы находимся в начальном состоянии TEST_LOGIC/RESET. Если TMS=1, то при каждом новом импульсе тактовой частоты TCK мы так и будем оставаться в этом состоянии.

Если на вход микросхемы TMS подать ноль, то при очередном импульсе TCK контроллер переходит в новое состояние RUN_TEST/IDLE.

Если держать TMS=0, то мы так и будем оставаться в этом состоянии. Однако наша цель - это достичь два других возможных состояния CAPTURE_DR или CAPTURE_IR. Если мы попадем в эти состояния меняя TMS соответствующим образом, то дальше мы можем последовательно передать контроллеру либо команду (состояния SHIFT_IR) либо данные (SHIFT_DR).

Передача в контроллер выполняется через сигнал TDI в одном исз состояний SHIFT_IR или SHIFT_DR. Одновременно контроллер может отдавать уже свои данные через сигнал TDO.

Обратите внимание, что из любого состояния можно вернуться в исходное состояние TEST_LOGIC/RESET если держать TMS=1 несколько тактов подряд.

Таким образом, через JTAG интерфейс в микросхему и ее TAP контроллер можно передавать разные команды и данные. Набор команд для каждых микросхем конечно свой и определяется производителем. Нас в первую очередь интересуют команды для программирования микросхем Альтера. Где бы их узнать?

На самом деле и это в общем не проблема. Среда разработки Altera Quartus может генерировать файлы в формате *.SVF. Это текстовый файл, который на специальном языке описывает последовательность действий для программирования микросхемы через JTAG/TAP. В принципе, есть некоторое описание языка SVF. Не знаю насколько это стандарт - вы можете его скачать у нас на сайте (

). В принципе там в текстовом файле SVF и так все довольно понятно интуитивно.

Если Вам нужен файл для программирования микросхемы Altera в формате *.SVF, то зайдите в меню среды Quartus Assignments\Device найдите и нажмите кнопку Device and Pin Options и увидите вот такое диалоговое окно:

 Настройки проекта Quartis II

Нужно установить флажок на Serial Vector Format File (*.svf).
Теперь после компиляции проекта у вас появится этот файл и вы сможете его внимательно посмотреть.

Вот фрагмент этого файла:


!
!CHECKING SILICON ID
!
SIR 10 TDI (203);
RUNTEST 93 TCK;
SDR 13 TDI (0089);
SIR 10 TDI (205);
RUNTEST 93 TCK;
SDR 16 TDI (FFFF) TDO (8232) MASK (FFFF);
SDR 16 TDI (FFFF) TDO (2AA2);
SDR 16 TDI (FFFF) TDO (4A82);
SDR 16 TDI (FFFF) TDO (0C2C);
SDR 16 TDI (FFFF) TDO (0000);


Из этого можно понять, что для того что бы проверить ID (тип) микросхемы перед прошивкой нужно:

  • передать в регистр команд IR 10ти битное число 0x203;
  • выждать паузу 93 такта;
  • передать данные в регистр DR из 13ти бит 0x0089;
  • передать в регистр команд IR десятибитное число 0x205;
  • выждать паузу 93 такта;
  • передавая 5 раз 16ти битное число 0xFFFF одновременно принимаем с TDO собственно ID 0x8232, 0x2aa2, 0x4A82, 0x0c2c и 0x0000

Вот эта последовательность и есть ID микросхемы платы Марсоход EPM240T100C5

  

Комментарии  

0 #16 Alucard 21.11.2014 14:39
Простите возможно за глупый вопрос, а можно ли объединить JTAG порты МК, ПЛИС, еще одной ПЛИС в один порт и проводить операции над ними разными программаторами ? (для МК - Jlink, а для ПЛИС - MBFTDI)
0 #15 Леха 26.05.2013 13:35
Цитирую nckma:

контроллер внутри jtag - это TAP контроллер и в нем 2 регистра IR и DR. В зависимости от записанной инструкции в IR данные регистра DR могут интерпретироват ься по разному.

Немного не так поняли мой вопрос. Хотелось больше конкретики)
Задача TAP'a - подключать нужный DR между TDI и TDO, в зависимости от введенной в IR команды. В задачах JTAG-интерфейса стоит не только это коммутация, конечно, но по-большей части именно она.
Вопрос в следующем: допустим ввели мы нужные конфигурационны е данных в DR, каким образом они из этого регистра записываются в память? А если еще более точно, то кто этим занимается: логика JTAG'а или отдельный контроллер?
0 #14 nckma 25.05.2013 04:53
Цитирую Леха:
Не расскажите о механизме программирования? Я так понимаю, что внутри ИС с JTAG'ом есть какой-то контроллер, в который через один из регистров JTAG'а передаются некоторые данные. Контроллер эти данные переваривает и осуществляет запись данных в память, к примеру, ПЛИСины. Т.е. JTAG по сути эмулирует некий протокол программирования на входе этого блока, примерно так же как осуществляется программирование микросхем flash-памяти не имеющих собственного JTAG'а но подключенных к ИС, в которой оный имеется. Так оно?

контроллер внутри jtag - это TAP контроллер и в нем 2 регистра IR и DR. В зависимости от записанной инструкции в IR данные регистра DR могут интерпретироват ься по разному.
0 #13 Леха 24.05.2013 10:49
Не расскажите о механизме программировани я? Я так понимаю, что внутри ИС с JTAG'ом есть какой-то контроллер, в который через один из регистров JTAG'а передаются некоторые данные. Контроллер эти данные переваривает и осуществляет запись данных в память, к примеру, ПЛИСины. Т.е. JTAG по сути эмулирует некий протокол программировани я на входе этого блока, примерно так же как осуществляется программировани е микросхем flash-памяти не имеющих собственного JTAG'а но подключенных к ИС, в которой оный имеется. Так оно?
0 #12 Ю р и й 28.04.2013 12:18
Для старта из ПЗУ существует другой механизм.
Есть специально предназначенные для этого ПЗУ (EPCS)
Которые подключаются к определенным пинам. Зашивать их можно через JTAG. У нас они есть на шилдах - http://marsohod.org/forum/index.php?option=com_kunena&func=view&catid=3&id=947&Itemid=2
0 #11 reklouzer 28.04.2013 11:16
То есть внутри любой ПЛИС Альтера (например Циклон 3) есть TAP контроллер, с которым соединены несколько выводов микросхемы (вроде 4), а SVF файл это и есть файл, содержащий команды для контроллера ТАР и данные конфигурации ПЛИС??? И соответственно. чтобы конфигурировать ПЛИС с ПЗУ, необходимо записать SVF файл на ПЗУ и при включении питания как-то инициировать передачу данных с ПЗУ на ТАР контроллер, а после завершения конфигурации остановить передачу данных???
0 #10 Toxa 28.01.2013 11:57
шикарно! сама FPGA конфигурится за секунду и все работает, светодиод моргает, как ему и положено) но вот флешь не прошивается почему то, импакт зараза кривые svf генерит. он их банально не дописывает! буду разбираться, как что заработает, сразу отпишусь. большое спасибо за помощь, благодарен аж очень)
+1 #9 nckma 28.01.2013 07:19
Цитирую Toxa:
что за ограничение не менее 10 бит на регистр команд IR? зачем оно нужно? т.к. исходники скомпилить нечем, то в mbftdi.exe дебаггером убрал это ограничение, но команда все рано выполняется не корректно, плиса xc3s50an молчит. если есть возможность, то исправьте программку :cry: специально для этого купил программатор, не выбрасывать же его от горя в окно((((

Попробуйте новую версию mbftdi:
http://marsohod.org/index.php/downloads/doc_download/129--usb-mbftdi--14
В разделе загрузки.
+1 #8 nckma 27.01.2013 18:21
Цитирую Toxa:
что за ограничение не менее 10 бит на регистр команд IR? зачем оно нужно? т.к. исходники скомпилить нечем, то в mbftdi.exe дебаггером убрал это ограничение, но команда все рано выполняется не корректно, плиса xc3s50an молчит. если есть возможность, то исправьте программку :cry: специально для этого купил программатор, не выбрасывать же его от горя в окно((((

Думаю, это можно починить. Постараюсь сделать завтра.
0 #7 Toxa 27.01.2013 00:05
что за ограничение не менее 10 бит на регистр команд IR? зачем оно нужно? т.к. исходники скомпилить нечем, то в mbftdi.exe дебаггером убрал это ограничение, но команда все рано выполняется не корректно, плиса xc3s50an молчит. если есть возможность, то исправьте программку :cry: специально для этого купил программатор, не выбрасывать же его от горя в окно((((
0 #6 Ruslan 07.09.2012 16:47
А что за регистры IR и DR ? Как присвоить им значение ???
Или это текущее состояние TDI ?
:-?
0 #5 Юрий Киселёв 13.01.2012 16:30
Цитирую coocos:
В какой момент нужно считывать TDO?

TDO выставляется JTAG-контроллер ом по заднему фронту TCK.
0 #4 nckm_ 11.07.2011 05:51
Цитирую MK2:
Прочитал про SignalTap, стало мега интересно
Кристалл должен поддерживать эту технологию или оно в виде ip блока идет ?

SignalTap может использоваться со всеми FPGA Алтеры, но, к сожалению, не с CPLD. Это из-за того, что в CPLD нет блоков памяти, где могли бы накапливаться выборки сигналов. Технология отладки с SignalTap действительно очень интересная.
0 #3 MK2 10.07.2011 09:52
Прочитал про SignalTap, стало мега интересно
Кристалл должен поддерживать эту технологию или оно в виде ip блока идет ?
-1 #2 nckm_ 23.05.2011 13:44
Цитирую coocos:
В какой момент нужно считывать TDO?

я в своей программе читаю TDO после установки TCK в 1
Надеюсь, что это правильно.
+1 #1 coocos 23.05.2011 09:55
В какой момент нужно считывать TDO?

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


Защитный код
Обновить


GitHub YouTube Twitter
Вы здесь: Начало Статьи о разном Что такое JTAG