Инструменты пользователя

Инструменты сайта


doc:doclist:jtagisc

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
doc:doclist:jtagisc [2020/02/24 22:40]
vasco [BSDL файл]
doc:doclist:jtagisc [2020/02/25 19:25] (текущий)
vasco [Интерфейс JTAG]
Строка 92: Строка 92:
   *    * 
 В обрывках литературы который выдал поиск в Google встречается различие между задержками //"​WAIT TCK 1"// и //"​WAIT 3.0e-4//"​. Суть его в том, что когда указано //"​WAIT TCK 1"//, то это требование именно подать тактовый сигнал. Т.е. если бы было написано //"​WAIT TCK 100"//,​ то необходимо было бы подать 100 тактовых периодов на вывод TCK интерфейса JTAG. В отличие от этого, задержка //"​WAIT 3.0e-4//"​ - это всего лишь временной интервал. В обрывках литературы который выдал поиск в Google встречается различие между задержками //"​WAIT TCK 1"// и //"​WAIT 3.0e-4//"​. Суть его в том, что когда указано //"​WAIT TCK 1"//, то это требование именно подать тактовый сигнал. Т.е. если бы было написано //"​WAIT TCK 100"//,​ то необходимо было бы подать 100 тактовых периодов на вывод TCK интерфейса JTAG. В отличие от этого, задержка //"​WAIT 3.0e-4//"​ - это всего лишь временной интервал.
 +
 +В машине состояний JTAG, которую мы рассмотрим дальше,​ наличие лишнего такта TCK не имеет никакого смысла. Возможно требование к TCK это нечто из расширения ISC, поскольку большинство инструкций ISC в BSDL файле заканчивается так. Поэтому при реализации обмена мы этот такт оставим.
 +
 +Аналогично расшифровывается чтение памяти,​ например верификация того, что память стерта:​
 +<​code>​
 + "​FLOW_BLANK_CHECK " &
 +    "​INITIALIZE"​ &
 +      "​(ISC_READ ​                   WAIT TCK 1  16:​DFFF*0000,​ 2:​2*0) ​ "&  ​
 +      "​(ISC_ADDRESS_SHIFT 23:000000 WAIT TCK 1)" &
 +      "​(ISC_READ  ​               WAIT TCK 1 18:​3FFFE*FFFFF)"​ &
 +     "​REPEAT 249999 " &
 +      "​(ISC_READ ​                   WAIT TCK 1 18:​3FFFE*FFFFF),"​ &
 +</​code>​
 +
 +  * **"​ISC_READ ​ WAIT TCK 1"** - Подается команда с лишним тактом
 +    * **16:​DFFF*0000,​ 2:2*0** - Читается 16-битный ответ и еще 2 бита CRC. Используется маска //AND 0000//, что говорит о том, что чтение служебное (пустое) - данные никак не проверяются.
 +  * **"​ISC_ADDRESS_SHIFT 23:​000000 ​ WAIT TCK 1"** - Выставляется начальный адрес.
 +  * **"​ISC_READ ​ WAIT TCK 1"** - Запись инструкции чтения.
 +    * **18:​3FFFE*FFFFF** - Читается 18-битное слово памяти,​ которое должно быть равно 3FFFE (стертое значение 0xFFFF с CRC). Маска на считанное значение FFFFF.
 +  * **"​REPEAT 249999"​** - Повторить 249999 раз.
 +
 +Остальные функции можно посмотреть в самом BSDL файле. Под описанием функций представлены операции,​ которые выполняются с микросхемой программатором. Каждая операция состоит из нескольких функций. Мы рассмотрели сейчас только функции PROC_PROGRAM(array) и PROC_BLANK_CHECK:​
 +
 +<​code>​
 +attribute ISC_ACTION of EPC4Q100 : entity is
 +  "​VERIFY_IDCODE = (TEST_VERIFY_IDCODE),"​ &   
 +  "​PROGRAM =       ​(TEST_VERIFY_IDCODE RECOMMENDED,"​ &
 +                    "​PROC_ENABLE,"​ &
 +                    "​PROC_ERASE,"​ &
 +                    "​PROC_BLANK_CHECK,"​ &  ​
 +                    "​PROC_PROGRAM(array),"​ &
 +                    "​PROC_VERIFY(array),"​ &  ​
 +                    "​PROC_PROGRAM_DONE,"​ &
 +             "​PROC_VERIFY(donebit),"​ &  ​
 +                    "​PROC_DISABLE),"​ &
 +  "​VERIFY =        (TEST_VERIFY_IDCODE RECOMMENDED,"​ &
 +                    "​PROC_ENABLE,"​ &
 +                    "​PROC_VERIFY(array),"​ &
 +                    "​PROC_VERIFY(donebit),"​ & 
 +                    "​PROC_DISABLE),"​ &
 +  "ERASE =         ​(TEST_VERIFY_IDCODE RECOMMENDED,"​ &
 +                    "​PROC_ENABLE,"​ &
 +                    "​PROC_ERASE,"​ &
 +                    "​PROC_BLANK_CHECK,"​ &  ​
 +                    "​PROC_DISABLE),"​ &
 + "​BLANK_CHECK =    (TEST_VERIFY_IDCODE RECOMMENDED,"​ &  ​
 +                    "​PROC_ENABLE,"​ &                    ​
 +                    "​PROC_BLANK_CHECK,"​ &               
 +                    "​PROC_DISABLE),"​ &                  ​
 + "​VERIFY_DONEBIT = (TEST_VERIFY_IDCODE RECOMMENDED,"​ &
 +                    "​PROC_ENABLE,"​ &
 +                    "​PROC_VERIFY(donebit),"​ & 
 +                    "​PROC_DISABLE),"​ &
 + "​PROGRAM_DONE =   ​(PROC_ENABLE,"​ &
 +                    "​PROC_PROGRAM_DONE,"​ & 
 +                    "​PROC_DISABLE)";​
 +</​code>​
 +====Интерфейс JTAG====
 +Из BSDL файла мы узнали что в 5576РС1У есть внутренние регистры и для доступа к ним есть набор инструкций. Встает вопрос - что с этим делать,​ куда и как это все подавать?​ Для этого необходимо рассмотреть машину состояний JTAG и понять как она работает.
 +
 +В общем-то моя многолетняя фобия перед JTAG оказалась напрасной. Это достаточно простой последовательный интерфейс для записи инструкций и значений во внутренние регистры. Что там дальше делать с этими инструкциями и регистрами решает внутреннее устройство микросхемы. Назначение JTAG осуществить транзакцию,​ к дальнейшему он уже отношения не имеет. ​
 +
 +Основным регистром является регистр BoudaryScan который бывает длиной в сотни бит и позволяет тестировать выводы микросхемы в готовом устройстве. Есть так-же регистр ByPass длиной в один бит, который позволяет пропускать транзакции сквозь микросхему в следующие микросхемы объединенные в одну Jtag цепь (DaisyChain). Бывают всякие специализированные регистры. Например,​ как мы уже знаем, в 5576РС1У есть регистры ISC через которые происходит программирование микросхемы.
 +
 +**Линии JTAG:**
 +  * TCK - тактовый сигнал,​ весь "​экшн"​ происходит по возрастающему фронту этого сигнала.
 +  * TDI - по фронту TCK уровень на данном выводе записывается в текущий сдвиговый регистр внутри микросхемы.
 +  * TDO - одновременно с защелкиванием бита TDI в сдвиговый регистр,​ из этого регистра выдвигается бит на вывод TDO.
 +  * TMS - сигнал перемещения по машине состояний JTAG.
 +  * TRST - опциональный сигнал сброса подключенного устройства,​ в микроконтроллерах обычно подключается к выводу Reset.
 +
 +{{doc:​doclist:​jtagregupdate.png}}
 +
 +Про TDI и TDO полагаю понятно,​ что они подключаются с двух сторон внутреннего сдвигового регистра. Данные от TDI вдвигаются в регистр,​ а из регистра синхронно данные выдвигаются в линию TDO. Но поскольку регистров внутри устройства может быть несколько,​ то необходим способ выбора того регистра с которым будут работать линии TDI и TDO. Для этого предназначен автомат состояний и перемещение по этому автомату происходит с помощью сигнала TMS. Сразу стоит сказать,​ что TDI и TDO подключаются к внутреннему регистру только в состояниях **Shift-DR** и **Shift-IR**. Поэтому чтобы записать / считать регистры необходимо в автомате состояний дошагать до Shift-DR или ShiftIR соответственно.
 +
 +**IR** - это регистр инструкций. Он один и он выбирает который внутренний регистр будет подключен к линиям TDI и TDO в состоянии Shift-DR. Например записав в IR инструкцию ISC_ADDRESS_SHIFT,​ а в DR записав значение адреса мы переключим в 5576РС1У текущий активный адрес. Посмотрим как это осуществить по машине состояний JTAG.
 +
 +{{doc:​doclist:​jtagstates.png}}
 +
 +//​(Картинка из шикарного видео, где наглядно расказывается про Jtag - [[https://​www.youtube.com/​watch?​v=PhaqHKyAvR4|YouTube - TechSharpen,​ "JTAG TAP Controller Tutorial"​]])//​
 +
 +При работе по JTAG обычно выбирают "​парковочное"​ состояние - это то состояние в которое возвращается автомат между транзакциями. Обычно это либо состояние Idle, либо Select-DR. Select-DR подходит,​ потому что из него можно попасть и в ветвь DR и в ветвь IR. Но состояние Idle лучше тем, что в нем можно подать импульс TCK при TMS=0, который ничего не изменит,​ т.к. автомат останется в том-же Idle. А нам как раз необходим один лишний такт TCK для реализации выражения //"​WAIT TCK 1"// из файла BSDL. Состояние Reset не подходит под парковочное,​ потому что при выходе в reset к линиям TDI и TDO подключается регистр по умолчанию,​ а это обычно ByPass или BoundaryScan.
 +
 +Выставление внутреннего адреса происходит в два этапа - запись инструкции ISC_ADDRESS_SHIFT в IR и запись самого адреса через регистр DR. Запись инструкции по автомату состояний происходит так:
 +
 +<​code>​
 +//​допустим мы находимся в состоянии idle, тогда подаем
 +TMS   Idle
 +1:    -> Select-DR
 +1:    -> Select-IR ​             // Дошли до ветки инструкций
 +0:    -> Caprute-IR
 +0:    -> Shift-IR ​              // Перешли в состояние сдвига бит IR
 +0:    TDI[0] -> reg ->​TD0[0] ​   // Начинаем побитно сдвигать инструкцию в регистр IR
 +0:    ...                       // ISC_ADDRESS_SHIFT (0100001110),​ 10 bit
 +0:    TDI[9] -> reg ->​TDO[9] ​   // На TDO выдвигаются биты предыдущего значения IR
 +1:    -> Exit-IR
 +1:    -> Update-IR ​             // Значение сдвигового регистра записалось в регистр инструкций. ​
 +                                // Теперь к линиям TDI и TDO подключен регистр ISC_Address[23]
 +0:    -> Idle                   // Возвращаемся в Idle
 +0:    -> Idle                   // В Idle делаем дополнительный такт TCK - "WAIT TCK 1"
 +</​code>​
 +
 +two beer...
 +
 +**Диаграмма программирования слова** (кликабельно):​
 +{{doc:​jtag:​flowprogram.png}}
 +
 +  * Красными линиями на фронтах TCK выделены служебные такты на перемещение по машине состояний JTAG. 
 +  * Синими линиями выделены биты данных задвигаемые через линию TDI во внутренние регистры.
 +  * Сдвиг последнего бита совмещен с переходом на состояние Exit1, поэтому линия покрашена разноцветно.
 +  * Фиолетовым цветом выделен служебный такт "WAIT TCK 1".
 ====SVF файл==== ====SVF файл====
doc/doclist/jtagisc.1582569617.txt.gz · Последние изменения: 2020/02/24 22:40 — vasco