JTAG의 소개 및 원리 4편
등록: 2001-07-25 15:02:06
이제 우리는 JTAG의 진짜 동작 원리를 알아야 합니다. 이 강좌 이후가 JTAG를 어떻게 사용할수 있는 지를 알수 있죠. 다시 한번 정리해 보죠
Boundary-Scan Cell은 다음과 같은 내부적 연결 단자가 있읍니다. (강좌 4탄 그림 참조)
ShiftDR SO (Scan Out) Mode
| ^ |
┏━━━━ |━━━━━━━━ |━━━━━━━━| ━━━┓
┃ | | | ┃
┃ | | +V+-+ ┃
PI--------→*-----|-----------------|-------------→| M |--------→PO
(Data ┃ | | | | U | ┃ (Data
In) ┃ | V Sift Register | +→| X | ┃ Out)
┃ | +-+-+ +------+ | +------+ | +---+ ┃
┃ +-→| M |---→|1D Q |--+→|1D Q |--+ ┃
┃ | U | | | | | ┃
┃ +-→| X | +→|>C1 | +→|>C1 | ┃
┃ | +---+ | +------+ | +------+ ┃
┃ | | | Sift Register ┃
┃ | | | ┃
┃ | | | ┃
┃ | | | ┃
┗━ |━━━━━| ━━━━━ |━━━━━━━━━━━━┛
| | |
SI (Scan In) ClockDR UpdateDR
PI |
Parallel Input |
|
Parallel Output |
SI |
Scan Input |
SO |
Scan Output |
SiftDR |
PI 단자로 입력된 신호를 Sift Register로 인가할것인지 아니면 PO쪽으로 인가할 것인지를 결정합니다. |
ClockDR |
쉬프트 레지스터로 인가된 PI신호를 랫치하여 기억 시켜 놓을지를 결정합니다. |
UpateDR |
쉬프트 레지스터로 기억된 상태를 PO쪽에 인가시킬 것인지를 결정합니다. |
Mode |
쉬프트 레지스터에서 나온 출력을 PO에 인가 할것인지 아니면 PI쪽에서 온 출력을 PO에 인가 할 것인지를 결정합니다. |
외부에는 TAP라고 하는 단자가 있읍니다. 이단자는 다음과 같이 정의 되어 있습니다.
TDI |
Test Data In |
TDO |
Test Data Out |
TMS |
Test Mode Select |
TCK |
Test Clock |
TRST |
Test Reset |
여러분은 여기서 이상한 점을 알 것입니다.
Boundary-Scan Cell과 TAP 사이의 단자들은 서로 매칭이 되지 않는다는 것 입니다. 그렇다면? 여기에는 무언가가 숨겨져 있읍니다. 이것이 무엇일까요?...
그것이 강좌 5탄에서 그렸던 JTAG 블럭도에 표시되어 있는 TAPC (TAP Controller) 라는 것이 숨겨진 바로 그놈입니다. 이 TAPC는 TMS와 TCK의 제어를 받습니다. 그리고 TAPC의 단자들과 Boundary-Scan Cell의 단자들(SiftDR, ClockDR, UpateDR, Mode 단자)과 연결되어 있는 것이지요. JTAG의 내부에는 Boundary-Scan Cell 이외에 여러가지가 내장되어 있읍니다. 우선 강좌 5탄에 그렸던 그림을 다시 그려보죠...
┌────────────────────┐
│ ■→■→■→■→■→■ │
│ ↑ ↓ │
│ ■ ┏━━━━━━┓ ■ │
│ ↑ ┃ 로직 코어 ┃ ↓ │
│ ■ ┃ +----+ ┃ ■ │
│ ↑ ┃ | | ┃ ↓ │
│ ■ ┃ ■→■→■ ┃ ■ │
│ ↑ ┃ | +----+ | ┃ ↓ │
│ ■ ┃ |특정로직| ┃ ■ │
│ ↑ ┗━━━━━━┛ ↓ |\ │
│ | | | *----→| | │
│ | | +---------→| | │
TDI □---*-**-----*---□-------------→| |----□ TDO
│ | | ByPass +-→| | │
│ | | Register |+→| | │
│ | | || |/ │
│ | | +----------------+ || │
│ | +->| Identification |-+| │
│ | | Register | | │
│ | +----------------+ | │
│ | | │
│ | +-----------------+ | │
│ +--->| Instruction |-+ │
│ | Register | │
│ +-----------------+ │
│ ▲ │
│ ┃ │
│ +--------------+ │
TMS □--------> | TAP | │
TCK □--------> | Controller | │
│ +--------------+ │
│ ↑ │
└─────────□──────────┘
TRST
이그림 자주 이용될겁니다. 꼭 꼭 기억 해주세요..
그림을 보면 제가 아직 설명하지 않은 것들이 있죠? 그것이 무엇인지를 이제는 설명할 떄가 된것 같습니다. 가장 하단에 TAP Controller이것은 무엇일까요? 이 놈이 JTAG의 핵심이라고 할수 있죠 일면 TAPC라고 합니다. 이놈은 나머지를 모두 제어하죠... 그래서 이놈은 다음에 논의하기로 합시다.
Instruction Register |
이놈은 내부에 4비트로 구성되어 있읍니다. 한글로 직역하면 명령 기억 장소 인데, 이놈에 의해서 TDI와 TDO가 어디에 연결될지를 결정합니다. |
Identification Register |
이놈은 총 32비트로 구성되어 있죠.. JTAG를 사용하는 장치(디바이스)에 대한 정보가 기억되어 있읍니다. 이 레지스터를 이용하여 해당 칩셋이 어떤 것인지를 알아낼수 있읍니다. 제가 JTAG의 동작을 설명할때 가장 먼저 접근할 놈이 이놈입니다. |
ByPass Register |
이놈은 말 그대로 TDI를 TDO로 바로 연결시켜 버리는 놈입니다. 물론 TCK를 한클럭 소모하기는 하지만요. 이것은 여러 CPLD가 연결되어 있을때 접근 속도를 효율적으로 하기 위한 놈이죠... 물론 나중에 설명할 겁니다. |
그 다음이 Boundary-Scan Cell Register죠. 이것이 우리가 그동안 접근 공부한 놈이죠. 물론 JTAG가 궁극적으로 접근하려는 놈이기도 하죠...
이젠 TAPC를 설명할때가 되었네요... TAPC를 모르면 JTAG를 모르는 것과 진배 없읍니다. 이놈을 이해해야만 하므로 여러분은 정신 바짝 차리고 잘 읽어야 합니다. TAPC는 TMS와 TCK를 이용하여 제어가 되는데 제가 TAPC의 동작방식을 이해한후 감탄을 안할수가 없었읍니다. 우선 이것을 이해하기 전에 여러분은 KELP의 자료실에서 JTAG 시뮬레이션 프로그램을 다운 받으신후에 실행하신후, 이 강좌를 계속 읽어 주시기를 부탁 드립니다. 그래야 이해가 빨리 될수 있거든요...
TAPC는 내부에 자기 상태를 갖습니다. 이 상태에 따라 무엇을 할것인가를 결정합니다. 우선 상태도를 그려 볼까요...
저에 고생은 또 시작 될것 같네요....
+------------+
| Test-Logic |<-----------------------------------------------------+
| Reset | |
+------------+ |
| 0 |
V |
+------------+ 1 +------------+ 1 +------------+ 1|
| Run-Test/ |--------->| Select- |------------->| Select- |--+
| IDLE | ^ | DR-Scan | | IR-Scan |
+------------+ | +------------+ +------------+
^ | | 0 | 0
| | | |
| | V V
| | 1 +------------+ 1 +------------+
| | +---| Capture-DR | +---| Capture-IR |
| | | +------------+ | +------------+
| | | | 0 | | 0
| | | | | |
| | | V | V
| | | +------------+ <-+ | +------------+> <-+
| | +---->| Shift-DR | 0 | +---->| Shift-IR | 0 |
| | | | +------------+---+ | | +------------+---+
| | | | | 0 | | | 0
| | | | | | | |
| | | | V | | V
| | | | +------------+ 1 | | +------------+ 1
| | | +-> | Exit1-DR |-----+ | +-> | Exit1-IR |-----+
| | | +------------+ | | +------------+ |
| | | | 0 | | | 0 |
| | | | | | | |
| | | V | | V |
| | | +------------+ <-+ | | +------------+> <-+ |
| | | | Pause-DR | 0 | | | | Pause-IR | 0 | |
| | | +------------+---+ | | +------------+---+ |
| | | | 0 | | | 0 |
| | | | | | | |
| | | V | | V |
| | | 0 +------------+ | | 0 +------------+ |
| | +-----| Exit2-DR | | +-----| Exit2-IR | |
| | +------------+ | +------------+ |
| | | 0 | | 0 |
| | | | | |
| | V | V |
| | +------------+ | +------------+ |
| | | Update-DR |<----+ | Update-IR |><----+
| | +------------+ +------------+
| | 1 | 0 | 1 | 0 |
| +-----------+----|----------------------+ |
+-----------------------------+----------------------------+>
다 그렸네요... 푸하하하하....
자 이것이 TAPC가 가질수 있는 모든 상태도 입니다. 상태도라는 것이 무엇이냐? 음... 이걸 제가 설명하기에는 시간 낭비라서 그냥 진행하지요...
우선 하드웨어적으로 JTAP를 리셋 시키려면, TRST단자를 LOW로 떨어뜨리고 약간의 시간이 지나면 TAPC와 그와 관련된 모든 상태가 초기화 됩니다. 초기화가 되면 TAPC는 Test-Logic Reset 상태가 됩니다. 자 여기서 TMS단자와 TCLK단자에 신호를 주면 TAPC의 상태가 변화가 생깁니다.
우선 어떻게 신호를 주면 되는 지 보죠...
JTAG의 신호 다이어 그램은 다음과 같습니다.
____ ____
TCLK _↑ ↓____| |____
: : (### : 데이타)
TDI/TMS -<###>-:---------------
:
TDO -----<###>-------------
그림에 보듯이 TDI나 TMS를 원하는 상태로 인가한후, TCLK를 LOW 상태에서 HIGH로 올리면 해당 상태가 JTAG내부로 인가되지요. JTAG내부에 있는 TDO를 외부에 인가하려면 TCLK를 HIGH에서 LOW로 인가하면 됩니다. 그러므로 TCLK가 한클럭 즉 LOW에서 HIGH로 다시 LOW로 되면, TDI와 TMS값이 내부로 적용되고 TDO값이 외부로 배출되는 것입니다. 저는 이것을 TAP Accept싸이클이라고 부르겠읍니다.(이건 제가 임으로 붙인 이름이므로 정식명칭이 아님을 밝힙니다. ) 이 동작으로 TAP의 모든 동작을 제어하게 됩니다. 외부에서 연결 시켜서 동작 시키는 방식은 간단하지요?
자 그럼 위 상태도에서 TAPC가 Test-Logic Reset 상태로 되어 있다고 합시다. 이 상태를 Capure-IR상태까지로 이동시키려면 어떻게 해야 할까요.. TAPC의 상태는 TDI값과는 무관합니다. 단지 TMS와 TCLK를 조작하면 상태를 이동시킬수 있읍니다.
우리 한번 해보죠.. 이거 할때 우리는 단순 무식해져야 합니다. ^^;
위 그림에서 Test-Logic Reset에서 Capure-IR까지의 상태를 이동시키려면 다음과 같은 상태로 변해가야 합니다.
- Test-Logic Reset
- Run-Test/Idle
- Select-DR-Scan
- Select-IR-Scan
- Capure-IR
자 그럼 미로추적을 시작해보죠...
- 1상태에서 2상태로 갈려면, TMS를 0(LOW)를 주고 한클럭 주면 됩니다. (TAP Accept 싸이클) 여기서 한클럭 준다는 것은 TCLK를 "Low → High → Low"로 한다는 것이죠.
- 2상태에서 3상태로 갈려면, TMS를 1(HIGH)를 주고 한클럭 주면 됩니다.
- 3상태에서 4상태로 갈려면, TMS를 1(HIGH)를 주고 한클럭 주면 됩니다.
- 4상태에서 5상태로 갈려면, TMS를 0(LOW)를 주고 한클럭 주면 됩니다.
뭐 쉽죠? 그럼 Capure-IR에서 Run-Test/Idle로 이동하려면 어떻게 하여야 할까요?
- Capture-IR
- Exit1-IR
- Update-IR
- Run-Test/Idle
이렇게 가면 됩니다. (가장 최단 코스죠 ^^)
- 1상태에서 2상태로 갈려면, TMS를 1(HIGH)를 주고 한클럭 주면 됩니다.
- 2상태에서 3상태로 갈려면, TMS를 1(HIGH)를 주고 한클럭 주면 됩니다.
- 3상태에서 4상태로 갈려면, TMS를 1(HIGH)를 주고 한클럭 주면 됩니다.
- 4상태에서 5상태로 갈려면, TMS를 0(LOW)를 주고 한클럭 주면 됩니다.
이렇게 상태를 변화 시키면 됩니다. 각각의 상태는 TAPC가 무언가를 하게 됩니다. 여기서 중요한것은 TAPC가 어떤 상태로 되어 있든 Test-Logic-Reset상태로 이동하려면, TMS를 1(HIGH)로 주고 6클럭만 주면 됩니다. 그러면 어떤 경우이든 Test-Logic-Reset이 됩니다. 한번 직접 한번 미로 테스트를 해보세요... 맞나 틀리나...
자 우선 각 TAPC의 상태에 대하여 알아 봅시다. 각 상태가 하는 것이 무엇을 하는 것인지... 대부분의 상태는 무언가를 수행하는 기능은 없읍니다. 단지 원하는 상태까지 도달하기 위한 중간 상태역활이 대부분이죠. 각 상태에 대한 설명을 간단하게 하죠...
Test-Logic-Reset |
TAPC 및 JTAG와 관련된 모든 내용을 초기화 합니다. 동시에 상태 시작점이기도 합니다. |
Run-Test/Idle |
JTAG를 동작상태로 진입시키고 TAP를 통하여 적용한 내용이 각 장비에 영향을 끼치게 합니다. |
Select DR-Scan |
명령 레지스터에 의해 선택된 Boundary-Scan Cell에 제어를 할것인가 아닌가에 대한 중간 상태 값입니다. 상태 변이용 중간 상태이지 특별히 하는 기능은 없읍니다. |
Capture DR |
명령 레지스터에 의해 선택된 Boundary-Scan Cell의 PI단자 값을 내부 시프트 레지스터쪽으로 적용되게 합니다. 즉 현재 상태를 쉬프트할수 있게 준비하는 기능입니다. |
Shift DR |
명령 레지스터에 의해 선택된 Boundary-Scan Cell의 내부 값을 SO에 출력 시키고 SI값을 내부에 적용할수 있게 합니다. 이 상태로 있을때 TCLK값을 한 클럭 줄때마다 TDI값이 명령 레지스터에 의해 선택된 Boundary-Scan Cell의 SI에 연결되고 SO의 값이 TDO에 연결됩니다. |
|
상태 변이용 중간 상태이지 특별히 하는 기능은 없읍니다. |
Pause DR |
상태 변이용 중간 상태이지 특별히 하는 기능은 없읍니다. |
|
상태 변이용 중간 상태이지 특별히 하는 기능은 없읍니다. |
Update DR |
명령 레지스터에 의해 선택된 Boundary-Scan Cell의 PO단자 값에 내부 시프트 레지스터쪽의 내용을 적용시킵니다. |
Select IR-Scan |
명령 레지스터에 제어를 할것인가 하지 않을것인지에 대한 중간 상태 값입니다. 상태 변이용 중간 상태이지 특별히 하는 기능은 없읍니다. |
Capture IR |
명령 레지스터의 Boundary-Scan Cell의 PI단자 값을 내부 시프트 레지스터쪽으로 적용되게 합니다. 즉 현재 상태를 쉬프트할수 있게 준비하는 기능입니다. |
Shift IR |
명령 레지스터의Boundary-Scan Cell의 내부 값을 SO에 출력 시키고 SI값을 내부에 적용할수 있게 합니다. 이 상태로 있을때 TCLK값을 한 클럭 줄때마다 TDI값이 명령 레지스터 Boundary-Scan Cell의 SI에 연결되고 SO의 값이 TDO에 연결됩니다. |
Exit1 IR |
상태 변이용 중간 상태이지 특별히 하는 기능은 없읍니다. |
Pause IR |
상태 변이용 중간 상태이지 특별히 하는 기능은 없읍니다. |
Exit2 IR |
상태 변이용 중간 상태이지 특별히 하는 기능은 없읍니다. |
Update IR |
명령 레지스터에 의해 선택된 Boundary-Scan Cell의 PO단자 값에 내부 시프트 레지스터쪽의 내용을 적용시킵니다. |
에궁 이번 강좌는 여기서 쫑을 보아야 겠네요.. 지가 약속시간이 다되서요.... 잉
참 항상 이야기하는 데요. 이 글의 지적 소유권 관계는 GPL을 따릅니다. 물론 상업적인 용도로는 사용할수 없죠.... 그럼..