(본 글의 모든 저작권은 하제소프트가 가지고 있습니다)

1. USB 2.0 PHY

그림 1. USB 2.0 PHY(UTMI)

그림1

[그림 1]을 보면, USB 2.0에서 사용되던 UTMI(USB Transceiver Macrocell Interface)가 적용된 PHY를 보여주고 있다. 근래에는 PHY의 의미를 따질 때, 오히려 물리적(?)이라는 용어를 사용하기 보다는, Transceiver 와 Receiver의 역할을 수행하는 것을 의미하는 경우가 많다.

USB 2.0은 별도로 Link 계층을 따로 구분하고 있지 않기 때문에, [그림 2]와 같은 상황에서 PHY의 역할을 찾는다면, USB Bus Interface 내에서 SIE의 역할이라고 볼 수 있다.

그림 2. USB 2.0 전체 개요(모듈)

그림2

[그림 2]에서 SIE(Serial Interface Engine)의 역할을 정리하면 다음과 같다.

* 병렬데이타바이트스트림 ó시리얼데이타비트스트림

* 시리얼데이타비트스트림 ó D+, D-

* USB BUS Reset, Suspend, Resume 등과 같은 의미있는 신호판별

* SOP(Start Of Packet), EOP(End Of Packet)신호를 발생하거나 판별

UTMI 등과 같은 특별한 하위 인터페이스를 사용하여 보다 더 세부적으로 SIE 모듈을 세부화 시킬 수 있다.

[그림 1]을 보면 UTMI는 USB Transceiver Macrocell과 SIE(Serial Interface Engine)를 연결하는 인터페이스를 의미한다.

광의의 기능으로서 SIE의 기능을 보다 세부적으로 나누어 Transceiver와 Receiver가 수행하는 작업을 별도의 전용컨트롤러(여기서는 USB Transceiver Macrocell)를 사용하고, SIE 스스로는 이런 컨트롤로와 인터페이스를 유지하는 UTMI 를 사용해서 병렬데이타수준으로 데이터를 송, 수신하게 된다.

그림 3. UTMI를 지원하는 USB Transceiver Macrocell 의 기능다이아그램

그림3

[그림 3]은 USB Transceiver Macrocell 이 어떤 일을 하는지를 알 수 있도록 돕는다.

수신되는 데이터신호의 경우를 예를 들어 설명하면, D+, D- 회선을 통해서 수신되는 데이터신호는 그 속도에 따라서 HS XCVR(High Speed), FS XCVR(Full Speed) 중 적당한 유닛을 사용한다. 이후 이 신호는 2진수의 디지털비트로 변환된다. 이때, HS의 경우가 FS의 경우보다 빠르기 때문에 서로 다른 속도차이도 인해서 발생할 수 있는 오버헤드를 줄이기 위해서, HS의 경우 수신데이타 2진수를 탄력버퍼(Elasticity Buffer)를 사용해서 모은다음 처리한다.

이렇게 수신된 2진수의 디지털비트는 NRZI(Non Return to Zero Inverted)알고리즘회로를 통해서 비트Stuffing 되어있는 비트를 검출하여 이를 제거한뒤, 온전한 시리얼 데이터비트를 병렬데이타바이트로 모은다. 이렇게 모여진 데이터가 UMTI 인터페이스를 통해서 SIE로 전달된다.

수신되는 데이터신호의 경우를 다시 정리하면 다음과 같은 순서대로 처리된다.

D+, D- 데이터신호 => 2진수의 디지털비트값스트림 => NRZI 알고리즘회로를 통해 비트 Stuffing 제거 => 병렬데이타바이트로 모임 => UTMI인터페이스를 사용해서 SIE로 전달

그림 4. USB 2.0 High Speed에서 사용되는 패킷이 SIE를 통해서 외부로 송신되는 모습

그림4

[그림 4]를 보면, 벌크 Data Stream을 D+, D-의 데이터신호로 변경해서 외부로 송신하는 모습을 볼 수 있다. USB 2.0까지는 어디까지가 xHCI(호스트컨트롤러 인터페이스)라고 딱 잘라서 말하기는 어렵다. 단지, 벌크 Data Stream 은 여러 개의 벌크 Data Packet들로 쪼개지고, 이렇게 쪼개진 데이타가 PHY계층내에서 SYNC, Token, CRC, EOP등의 신호들이 부과되고, 이렇게 합쳐진 2진수의 데이터비트열은 K신호와 J신호로 적당하게 변환되어, D+, D- 전기적인 신호로 송신된다.

 

2. USB 3 PHY

그림 5. USB 3 개요

그림5

[그림 5]에서 가장 아래쪽에 배치된 영역이 PHY영역(Physical)이다.

그림을 보면, USB 3에서는 PHY영역외에 PROTOCOL 영역과 LINK 영역을 별도로 구분하고 있다. 더 이상 USB 2.0때 사용하던 영역구분이 모호했던 문제는 어느정도 해소된듯 하다.

그림에 따라 데이터송신측면에서 말하자면, PHY층이 하는 일은 LINK층에서 전달되는 데이터를 받아서 적당하게 변조하여 외부로 송신하는 역할이라고 볼 수 있다. 이런 역할은 USB 2.0때의 PHY의 역할과 크게 달라보이지 않는다. 하지만 기억해야 하는 내용은 LINK층이 존재함으로 인해, USB 2.0에서 PHY가 수행하던 작업중 일부분의 작업이 덜어졌다는 점이다.

[그림 5]에 나타난 PHY의 역할을 정리해보도록 하자.

* Data Encoding & Decoding

순수한 데이터바이트외에 특별한 의미를 부가한 명령어바이트를 정의하기 위해서 원본데이타에 몇 개의 비트를 더 추가하거나 제거하는 작업을 수행한다.

USB 3.0 SS와 USB 3.1 SS+ 각각에서 서로 다른 방식의 데이터 변, 복조 알고리즘이 사용된다.

SS(Enhanced Super Speed)에서는 8비트의 원본데이타를 10비트로 변조하거나 그 반대이다.

SS+에서는 128비트의 원본데이타를 132비트로 변조하거나 그 반대이다.

변, 복조하는 이유는 이어지는 절에서 설명하도록 한다.

 

* Scramble/Descramble

변, 복조와 유사한 의미로 해석될 수 있지만, 이 기능은 옵션(선택)기능이다. 데이터의 무결성을 보증하기 위해서 적당한 CRC다항식알고리즘을 적용해서 원본데이타를 변조한다.

 

* LFPS

USB 3 에서 사용되는 일반적인 데이터전송용이 아니라 특별한 상황에서 저전력으로 송수신할 수 있는 저주파수 시그널링을 의미한다. 링크계층이 이 기능을 주로 사용하여 U1, U2, U3에서 U0상태로 포트상태를 회복하는 과정중에 주로 사용되며, Warm Reset 의 용도로도 사용된다.

 

* CDR(Clock and Data Recovery)

데이터 수신의 경우, 별도의 Clock신호를 가지지 않는 USB전송의 특성으로 인해, 수신기내부의 자체 Clock을 사용해서 수신된 데이터를 해석해야 한다. 이와 관련된 기능을 제공한다.

 

* Elasticity Buffer/Skips

데이터 수신의 경우, 현저한 속도차이로 인해서 발생될 수 있는 동기문제를 해결하는 방식

 

2.1 Scramble/Descramble

데이터 송신의 측면에서 본다면, Link 계층에서 데이터가 전달되면 가장 먼저 Scramble 작업을 하게 된다. 이런 Scramble 작업은 옵션기능이기 때문에, Link계층에서 LTSSM(Link Training and Status State Machine)의 Training과정중에 Downstream Port와 Upstream Port 양쪽간의 협의에 의해서 사용유무를 결정하게 된다.

SS의 경우와 SS+의 경우가 다르며, 이와 같은 작업을 통해서 데이터 무결성을 보증하게 된다.

그림 6. SS의 경우 Scramble 알고리즘 회로

그림6

[그림 6]알고리즘에서 윗부분의 회로는 다음과 같은 다항식으로 설명될 수 있다.

G(X) = X^16 + X^5 + X^4 + X^3 + 1

이때 사용되는 윗부분의 회로를 LFSR(Linear Feedback Shift Register)라고 부른다. 이 레지스터는 매번 데이터비트를 연산할 때 마다 쉬프트된다. 이 레지스터의 초기상태값은 0xFFFF값을 가진다. 이 값은 Scramble회로를 사용할 때 마다 점점 쉬프트된다. LINK측에서 사용하는 특별한 명령어바이트 Comma(K28.5) 를 처리할 때 마다 이 레지스터의 값이 초기화되어 0xFFFF값으로 회복된다.

그림 7. SS+의 경우 Scramble 알고리즘 회로

그림7

[그림 7]알고리즘에서 윗부분의 회로는 다음과 같은 다항식으로 설명될 수 있다.

G(X) = X^23 + X^21 + X^16 + X^8 + X^5 + X^2 + 1

사용되는 LFSR의 값은 16바이트의 정의된 SYNC데이터스트림을 만나면 리셋된다.

이때 사용되는 SYNC데이터스트림은 0x00FF00FF00FF00FF00FF00FF00FF00FF 이렇게 16바이트이다.

그림 8. LINK계층과 Scramble, Descramble

그림8

[그림 8]을 보면, USB 3 PROTOCOL 계층과 LINK 계층을 모두 거친 데이터스트림이 PHY 계층으로 들어가면 가장 먼저 만나는 회로가 Scramble/Descramble 회로인것을 알 수 있다.

LINK계층이 전달하는 데이터스트림은 K문자와 D문자로 구성된다.

K문자는 Scramble/Descramble에서 제외된다.

D문자는 대부분 Scramble/Descramble에서 변환되어지지만, 특별한 조건에서는 그대로 통과하기도 한다. K문자는 명령어문자, D문자는 데이터문자로 이해하면 된다.

 

2.2 Data Encoding/Decoding

SS 에서는 8b/10b 알고리즘을, SS+에서는 128b/132b 알고리즘을 사용해서 Encoding/Decoding된다. 이런 특징으로 인해서, SS에서는 20%의 데이터오버헤드가 예상되며, SS+에서는 약 3%의 데이터오버헤드가 예상된다. 이것만 보더라도 두가지 속도간에 데이터낭비정도가 다르다는 것을 알 수 있다.

Data Encoding/Decoding 알고리즘을 사용하는 근본적인 이유는 물리적인 라인을 통해서 전송하려는 데이터신호(D+, D-)의 편차를 최대한 줄이도록 설계하는데 그 목적이 있다.

그림 9. LINK계층과 Encoding, Decoding

그림9

이진수 11110000 값과 이진수 10101010 값을 비교해보면, 둘다 1의 값이 4개가 들어있지만, 오른쪽의 데이터가 보다 잘 균형있게 배치된 것을 알 수 있다. 이와 같은 균형성있는 배치는 결국 D+, D-의 Differential 값을 정규적으로 생성하는 큰 역할을 수행하기 때문에, 이와 같은 균형성있는 배치를 위해서 적당하게 원래 코드값이 변조된다.

하나의 데이터바이트는 조건에 따라서 두가지중에 한가지 방식으로 변조되는 것이 필요하다. 왜냐하면 한바이트입장에서는 균형성있는 1의 값이 배치되었다고 보더라도, 이어지는 다음 바이트와 연결되는 관점에서 바라보면 이런 규칙이 흔들릴 수 있기 때문이다.

이런 특징으로 인해서 Encoding/Decoding 알고리즘회로는 처음상태를 RD-상태로 규정하고, 다음바이트는 RD+로, 그다음 바이트는 RD-, 이런식으로 교대로 적용하는 알고리즘이 추가로 정의된다.

RD는 Running Disparity의 뜻으로서, 이어지는 연속적인 비트스트림들간의 균형있는 1값의 배치를 위해서 사용되는 조건이다.

그림 10. 8b/10b 알고리즘에서 사용되는 Data Symbol Codes(일부분)

그림10

[그림 10]를 보면서 8b/10b 알고리즘을 사용하는 경우를 예를 들어서 설명해본다.

예로 들어, Scramble 과정을 거쳐서 생성된 데이터바이트를 0x1A, 0x0F, 0×05, 0x1E 이렇게 4바이트라고 가정해보자.(그림 10에서 보여주는 범위의 값 이내를 예를 들어서 사용한다)

PHY에서는 이와 같은 데이터바이트를 다음과 같이 명명해서 사용하기도 한다.

0x1A = D26.0, 0x0F = D14.0, 0×05 = D5.0, 0x1E = D30.0

이와 같이 다른 이름으로 Dx.y와 같이 표기하는 방법은 [그림 11]과 같은 규칙을 사용한다.

그림 11. 8b/10b 알고리즘에서 사용되는 Data Symbol 생성방법

그림11

0x1A, 0x0F, 0×05, 0x1E 데이터를 그 순서대로 변환하려고 하면, 각각 [그림 10]에서 알 수 있는 RD-값과 RD+값이 있는 것을 알 수 있다. 이중에 하나씩을 선택해야 하는데, 그 방법은 다음과 같다. RD-, RD+, RD-, RD+ 이런식으로 데이터를 취해보자.

0x1A는 RD-값을 취하므로 0101101011 을 선택한다.

0x0F는 RD+값을 취하므로 1010001011 을 선택한다.

0×05는 RD-값을 취하므로 1010011011 을 선택한다.

0x1E는 RD+값을 취하므로 1000011011 을 선택한다.

결국 이들 10비트의 4개의 데이터를 모두 붙여본다.

0101101011 1010001011 1010011011 1000011011

이렇게 40비트의 데이터스트림이 만들어진다.

128b/132b 알고리즘은 조금 다르다. 지면상 자세한 내용은 스팩을 참고하도록 한다.

 

2.3 Parallel to Serial, Differential Driver

그림 12. Transmitter 관점에서 바라본 PHY(SS)

그림12

그림 13. Transmitter 관점에서 바라본 PHY(SS+)

그림13

그림 14. Receiver 관점에서 바라본 PHY(SS)

그림14

그림 15. Receiver 관점에서 바라본 PHY(SS+)

그림15

[그림 12,13,14,15]를 보면 전체적으로 PHY의 내부구조를 Transmitter와 Receiver 양쪽의 관점에서 보여주고 있다. 특별히 Receiver측면에서 볼 때, Elastic Buffer가 사용되는 모습과 CRC, DRC회로가 사용되는 내용을 알 수 있다.

 

USB 2.0에서 UTMI, ULPI가 있듯이 USB 3.0, 3.1 에서 사용되는 대표적인 PHY인터페이스가 있다. 이것을 PIPE 인터페이스라고 부른다. 지금까지 살펴본 PHY의 흐름은 PIPE인터페이스에서 좀더 자세히 알 수 있으며, PIPE 인터페이스는 USB 3.0, 3.1 그리고 PCI Express 와 같이 고속시리얼통신에서 사용되는 PHY 전용칩을 위한 인터페이스이다.

관련된 내용은 다음 인덱스를 구글링해서 살펴보도록 한다.

Compliant With PHY Interface for the USB Architectures (PIPE), Version 3.0, USB Architectures (PIPE)

Compliant with UTMI+ Low Pin Interface (ULPI) Specification, Revision 1.1