오늘은 HDMI 인터페이스를 공부해봐야겠다는 생각이 들어 한 번 정리하면서 작성해 보려고 한다.
코드는 이번에는 없고, 2편에 코드를 작성해서 올릴 것 같다.
먼저 가장 처음 배우게 되는, 간단한 RGB 에 대해 생각을 해 보면(본인은 RGB는 구현이 된 상태임, 간단하다),
대중적인 640x480@60Hz의 경우,
Video Timings: VGA, SVGA, 720p, 1080p - Project F
Video Timings: VGA, SVGA, 720p, 1080p
To work with standard monitors and TVs, you need to use the correct video timings. This how to includes the timings for five standard display modes using analogue VGA, DVI, HDMI, or DisplayPort: 640x480 (VGA), 800x600 (SVGA), 1280x720, and 1920x1080 (30 Hz
projectf.io
이 곳에서 볼 수 있듯이 25Mhz 의 클럭 입력을 필요로 한다.
그럼 이 RGB 가 어떻게 동작할까?
사진을 보면 알겠지만, 보통 이렇게 4개로 구성된다.
O 가 화면이 나오는 부분이고, X가 화면이 나오지 않는 부분이다.
active pixels | front porch | sync pulse | back porch | |
active pixels | O | X | X | X |
front porch | X | X | X | X |
sync pulse | X | X | X | X |
back porch | X | X | X | X |
이렇게 보면 active pixel 이 굉장히 작아 보이는데, 사실은 반대이다.
active pixel 이 대부분의 크기를 차지하고 나머지 제어 (porch, sync) 들이 작은 픽셀 크기들을 차지한다.
그럼 VGA@60Hz의 input clock 25Mhz 는 왜 나온 걸까?
일단 VGA 는 다음과 같은 픽셀을 필요로 한다.
640*480 이미지를 출력하는데 결과적으로 800*525 개의 픽셀이 필요하게 되는 것이다.
640*480 = 307,200
800*525 = 420,000
그래서 한 프레임에 걸리는 시간이 총 420,000 클럭이 필요하게 된다.
근데 우리가 1초에 60개의 프레임을 VGA out 으로 보내줘야 하기 때문에 60을 곱해준다.
420,000 * 60 = 25,200,000
클럭 자체는 25.2M 번 필요하게 된다.
그래서 입력 클럭으로 25Mhz 를 받는다.
그럼 이제 이 입력을 받을 VGA 단자에 대해 알아보자.
VGA 단자 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. VGA 케이블 VGA 단자(VGA connector)라고 일반적으로 알려진 것(RGB 커넥터, D-sub 15, mini sub D15와 미니 D15를 포함)은 3열 15핀의 DE-15이다. 총 4개의 버전이 있다: 초기버전
ko.wikipedia.org
핀을 다음과 같이 받는다고 한다.
이것만 봐서는 솔직히 잘 구분하기 힘들다.
Altera 사의 DE1-SoC 보드의 입력이 어떻게 들어가는지 한 번 보도록 하자.
이건 DE1-SoC 보드의 메뉴얼이다.
https://people.ece.cornell.edu/land/courses/ece5760/DE1_SOC/DE1-SoC_User_manualv.1.2.2_revE.pdf
p.34를 보자.
들어가는 입력으로 R[7:0], G[7:0], B[7:0], 클럭, 싱크, blank, VS, HS 이 들어가는 것을 볼 수 있다.
이전에 개인적으로 sync 의 경우 없어도 동작하는데는 문제가 없는 것을 확인했다.
그런데 VGA 단자 입력으로는 R, G, B 는 모두 하나밖에 들어가지 않는다.
이는 DAC(digital-analog converter) 에 의해 표현된 신호 값이 아날로그 전압 값으로 변환되어 들어가기 때문이다.
정확한지는 모르겠는데 GPT 가 말하기로는, 이 신호 값이 전압 값으로 변환되어 들어가는데, 0V에서 0.7V 사이 값으로 들어간다고 한다.
그래서 0V일 때는 꺼진 상태, 0.7V에는 최대 밝기 상태가 된다. (라고 한다)
blank 의 경우에는 원래 없는 핀이다.
DAC 에 들어가는 하나의 신호가 이 보드(DE1-SoC)에서 추가로 지원을 해 주는 느낌이라 생각하면 되겠다.
blank = 1이면 아마 빈 신호로 입력을 받지 않을까 라고 추측해 본다.(반대일 수도 있다)
VS, HS 의 경우에는 수평 라인 동기화 신호다. RGB는 left-top to right-bottom 으로 입력 픽셀이 진행되기 때문에,
한 라인의 끝에 도달하면 HSync 가 먼저 high 로 변하고, 다음 클럭에 다시 low 로 바뀐다.
( 정확하게는 sync pulse 일 때 0이고, 나머지는 모두 1 상태이다.)
그리고 한 프레임의 끝에 도달하면 VSync 가 high 로 변하고, 다음 클럭에 다시 low로 바뀐다.
(Vsync 도 동일하다. sync pulse 일 때 0이고, 나머지 모두 1 상태이다.)
hsync, vsync 모두 동일하다.
그럼 이제 HDMI 에 대해서 알아보자.
HDMI - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. HDMI, 고선명 멀티미디어 인터페이스 HDMI 표준 단자, 공식 로고종류 디지털 오디오/비디오 단자설계자 7개 회사설계일 2002년 12월제조사 HDMI 사용자 (1100개 이상)
ko.wikipedia.org
HDMI 의 경우, 핀이 굉장히 많다.
우리는 소리 출력 보다는 영상 출력이 좀 더 중요하기 때문에, 1080p@60Hz 출력을 목표로 해 본다.
HDMI 는 또 버전이 많다.
여기서는 가장 기본이 되는 HDMI 1.0 을 기준으로 한 번 배워 본다.
GPT 가 알려 주기를,
TMDS DATA 0 : R 채널, 1 : G 채널, 2 : B 채널 이라고 한다.
또한 shield 핀의 경우 각 채널별 접지를 제공해 주어 신호 간섭을 줄이는 역할이며, 입력 데이터가 들어가지 않는다고 한다.
그리고 TMDS 가 데이터를 어떻게 인코딩하는지도 알아본다.
이는 8비트 데이터를 10비트로 변환하여 전송하는 방식을 채택하고 있다. (8b/10b encoding)
8b/10b 인코딩은 위키를 참고하자.
8b/10b encoding - Wikipedia
From Wikipedia, the free encyclopedia Line code mapping 8-bit words to 10-bit symbols In telecommunications, 8b/10b is a line code that maps 8-bit words to 10-bit symbols to achieve DC balance and bounded disparity, and at the same time provide enough stat
en.wikipedia.org
이 인코딩은, 아래 5비트를 6비트로 만들고, 상위 3비트를 4비트로 만들고 두 개를 합치는 인코딩 방법이다.
데이터 심볼은 다음과 같이 표기될 수도 있다고 한다.
D.x.y (x : 0~31, y:0~7)
왜냐하면, 2^5 = 32, 2^3 = 8 이기 때문에 초기 8비트를 표현하는 방식이라고 봐야되겠다.
또한 데이터 심볼에 넣을 수 있는 12개의 특별한 심볼이 있다고 한다. 이는 아마 컨트롤 용도로 사용이 되겠다.
얘네는 K.x.y 라고 표현된다.
또한 8b를 10b로 인코딩하기 때문에, 1024개의 가능 조합 중 일부를 제외할 수 있다고 한다.
1. 연속적으로 동일한 비트가 최대 5개까지만 나타나도록 제한한다.
2. 0과 1의 개수 차이가 최대 2를 넘지 않도록 보장해 신호의 DC 균형을 맞춘다.
3. 256개의 가능한 8비트 워드 중 일부는 두 가지 다른 방식으로 인코딩 될 수 있다.
[인코딩 선택]
각각의 6비트 혹은 4비트 코드워드는 다음을 만족한다.
- 0과 1의 개수가 동일한 경우
- 두 가지 형태가 존재하는 경우, 하나는 0이 2개 더 많은 형태 / 다른 하나는 1이 2개 더 많은 형태
불균형이 0이 아닌 6비트 또는 4비트 코드를 사용할 때는 양수, 또는 음수 불균형 중 현재 실행 불균형을 반전시키는 인코딩을 사용해야 한다. - 즉, 불균형이 있는 코드들은 교대로 사용해서 실행 불균형을 조정한다. (??)
[실행 불균형] -- 이후에 계속 적을 예정 --
8b/10b 인코딩은 DC 균형을 유지하여, 장기적으로 전송되는 1과 0의 비율이 정확히 50%가 되도록 합니다. 이를 위해 전송되는 1과 0의 개수 차이는 항상 ±2로 제한되며, 각 심볼이 끝날 때마다 이 차이는 +1 또는 -1 상태가 됩니다. 이 차이를 **실행 불균형(Running Disparity, RD)**이라고 합니다.
이 방식에서는 실행 불균형을 위해 +1과 -1 두 가지 상태만 필요하며, 초기 상태는 -1에서 시작합니다.
각 5b/6b 및 3b/4b 코드에서 1과 0의 개수가 같지 않은 경우, 이를 전송하는 데 사용할 수 있는 두 가지 비트 패턴이 있습니다: 하나는 "1" 비트가 2개 더 많고, 다른 하나는 모든 비트를 반전시켜 "0"이 2개 더 많습니다. 현재 신호의 실행 불균형에 따라 인코딩 엔진은 주어진 데이터에 대해 두 가지 6비트 또는 4비트 패턴 중 하나를 선택하여 전송합니다.
6비트 또는 4비트 코드에서 1과 0의 개수가 같으면 불균형이 유지되지 않기 때문에 선택의 여지가 없으나, 예외적으로 D.07(00111) 및 D.x.3(011) 서브블록에서는 두 가지 선택이 가능합니다.
이 두 서브블록에서는 실행 불균형이 변하지 않지만, 다음 규칙을 따릅니다:
- RD가 양수(+)일 때 D.07을 만나면 000111을 사용하고, 음수(-)일 때는 111000을 사용합니다.
- RD가 양수(+)일 때 D.x.3을 만나면 0011을 사용하고, 음수(-)일 때는 1100을 사용합니다
잘 설명해 놓은 github 가 있어서 들고 와 봤다.
GitHub - mithro/tmds_encoding: TMDS encoding tools
GitHub - mithro/tmds_encoding: TMDS encoding tools
TMDS encoding tools. Contribute to mithro/tmds_encoding development by creating an account on GitHub.
github.com
'Verilog' 카테고리의 다른 글
[Verilog] AMBA, APB Protocol (0) | 2024.12.23 |
---|---|
[Verilog & Project] Yolov3-tiny (0) | 2024.12.02 |
[Verilog] CNN top module (w. dense) (0) | 2024.11.05 |
[Verilog] maxpool2d w. line buffer (0) | 2024.10.31 |
[Verilog] Conv2d w. line buffer (0) | 2024.10.30 |