Chapter 19

센서 인터페이스와 타이밍

컬럼 ADC를 빠져나온 숫자는 아직 센서 칩 안에 있다. 12 MP 영상을 초당 30장 보내려면 수 Gbps가 몇 cm의 FPC를 지나 프로세서(AP)에 닿아야 하고, 프로세서는 그 비트열에서 프레임과 라인의 경계, 픽셀 형식, 오류 여부를 읽어 내야 한다. 거꾸로 프로세서는 느린 제어 버스로 노출과 게인을 바꾸고, 그 변경이 정확히 어느 프레임부터 적용되는지 알아야 한다. 이 장은 센서와 프로세서 사이의 링크를 아래층부터 쌓아 올린다. 전기 신호(D-PHY, C-PHY)와 신호 무결성, 바이트에 의미를 붙이는 CSI-2 패킷, 라인·프레임 타이밍과 클록, 레지스터 제어와 다중 카메라 동기를 차례로 다루고, 차량과 산업용 장거리 링크로 넓힌다.

데이터 경로와 대역폭 산수

센서와 프로세서 사이에는 성격이 전혀 다른 두 갈래 길이 있다. 하나는 영상이 흐르는 고속 단방향 링크다. 스마트폰과 대부분의 임베디드 카메라에서는 MIPI CSI-2 프로토콜을 D-PHY 또는 C-PHY라는 물리층 위에 얹어 쓴다. 다른 하나는 프로세서가 센서 레지스터를 읽고 쓰는 저속 양방향 제어 버스로, I²C와 호환되는 CCI(Camera Control Interface)나 그 후속인 I3C를 쓴다. 여기에 기준 클록 입력(EXTCLK), 리셋·셧다운 핀, 프레임 동기 핀, 전원 몇 가닥이 더해지면 카메라 모듈 커넥터의 신호가 거의 다 나온다.

이미지 센서 픽셀어레이 컬럼ADC 디지털DPC·압축 CSI-2 TX패킷·PHY 타이밍·PLLHTS · VTS · 노출 레지스터 뱅크CCI 슬레이브 · 그룹 홀드 애플리케이션 프로세서 CSI-2 RXD/C 콤보 ISP10장 카메라 드라이버AE 제어 · I²C 마스터 영상: 수 Gbps 1클록 + 1–4 데이터 레인 I²C/I3C 제어 (≤ 1 MHz / 12.5 MHz) EXTCLK 19.2/24 MHz · XSHUTDOWN · FSYNC RAW 픽셀 → 바이트 → 패킷 → 레인 → 차동 신호
그림 19-1. 센서에서 프로세서까지의 경로. 영상은 CSI-2 송신기에서 패킷으로 묶여 고속 차동 레인으로 나가고, 제어는 느린 I²C/I3C 버스로 반대 방향으로 들어온다. 기준 클록과 셧다운·프레임 동기 핀은 보통 프로세서 쪽에서 공급한다.

링크가 실어야 하는 평균 데이터율은 단순한 곱이다. 그러나 링크 설계에서 실제로 문제가 되는 것은 평균이 아니라 한 라인을 라인 시간 안에 보낼 수 있느냐다. 센서는 행 하나를 읽자마자 내보내고 다음 행을 읽기 때문에, 라인 버퍼가 작으면 한 라인 분량을 라인 시간 tlinet_{line} 안에 비워야 한다. 그 시간에는 패킷 헤더와 CRC, 그리고 물리층이 저전력 상태와 고속 상태를 오가는 시간이 함께 들어간다.

Ravg=W H b ffps nVC,tburst=8 ⌈(Wb/8+6) nVC/N⌉rlane+tLP↔HS  ≤  (1−m) tline,tline=1ffps VTS R_{avg} = W\,H\,b\,f_{fps}\,n_{VC}, \qquad t_{burst} = \frac{8\,\lceil (W b/8 + 6)\,n_{VC} / N\rceil}{r_{lane}} + t_{LP\leftrightarrow HS} \;\le\; (1-m)\,t_{line}, \qquad t_{line} = \frac{1}{f_{fps}\,VTS}
W,HW, H: 가로·세로 픽셀, bb: 픽셀당 비트, nVCn_{VC}: 한 라인 시간에 보내는 가상 채널(예: HDR 노출) 수, 6바이트: 긴 패킷의 헤더 4 + CRC 2, NN: 레인 수, rlaner_{lane}: 레인당 비트율, tLP↔HSt_{LP\leftrightarrow HS}: 상태 천이 오버헤드(다음 절), mm: 설계 여유, VTSVTS: 블랭킹을 포함한 프레임당 총 행 수.

계산 예. 50 MP(8160×6144), 10비트, 30 fps면 평균 Ravg=15.0R_{avg} = 15.0 Gbps다. 블랭킹 40행을 더하면 tline=1/(30×6184)=5.39 μst_{line} = 1/(30 \times 6184) = 5.39\ \mu s이고, 한 라인은 10,200 + 6 = 10,206바이트다. 2.5 Gbps D-PHY 4레인이면 레인당 2,552바이트를 8.2 µs에 보내야 하므로 라인 시간을 넘는다(점유율 약 160 %). D-PHY를 4.5 Gbps로 올리면 점유율이 약 91 %로 10 % 여유선을 살짝 넘고, C-PHY 3트리오를 6 Gsps로 쓰면 약 44 %로 넉넉하다. 대형 센서가 C-PHY를 쓰는 이유가 여기에 있다(17장의 설계 예와 같은 결론이다). 이 장의 레인 계획 시뮬레이터(5절)가 이 계산을 그대로 한다.

차동 신호와 MIPI D-PHY

수 Gbps를 몇 cm에서 수십 cm 보내는 표준 해법은 차동 신호(Differential signaling)다. 두 선에 반대 위상의 신호를 실어 두 선의 차이만 읽으면, 두 선에 똑같이 들어오는 잡음(공통 모드 잡음)과 접지 흔들림이 빠지고, 두 선의 전류가 서로 반대라 방사 잡음도 줄어든다. 차이만 읽으므로 스윙을 수백 mV로 낮춰도 되고, 그만큼 빨리 바꿀 수 있고 전력도 적다. 수신단은 100 Ω 차동 종단으로 반사를 막는다.

D-PHY는 한 쌍의 선(레인)에 두 가지 전혀 다른 모드를 겹쳐 놓은 물리층이다. HS 모드(High-Speed)는 공통 모드 약 200 mV, 차동 진폭 약 200 mV의 저전압 차동 신호(SLVS 계열)로 데이터를 보낸다. LP 모드(Low-Power)는 두 선을 각각 1.2 V CMOS 단일 종단 신호로 쓴다. LP에서는 두 선의 조합(LP-11, LP-01, LP-10, LP-00)이 곧 "상태"이고, 블랭킹 동안 쉬거나 HS 버스트의 시작과 끝을 알리는 데 쓴다. LP 모드는 종단을 끄므로 정지 전류가 거의 없다.

01.2 V0.30.1 LP-11 정지 LP-01 LP-00 HS-ZERO HS 데이터 TRAIL LP-11 DpDn HS: 공통 모드 ≈ 0.2 V, 차동 ±0.2 V LP: 각 선 0 / 1.2 V CMOS 시간 →
그림 19-2. D-PHY 한 레인의 두 선 Dp, Dn의 전압. LP 상태는 1.2 V 단일 종단 신호의 조합이고, HS 버스트는 약 0.1–0.3 V 사이를 오가는 작은 차동 신호다. LP-11 → LP-01 → LP-00이 "지금부터 HS"라는 약속이며, 수신기는 이때 종단을 켠다.

D-PHY는 클록을 데이터와 함께 보내는 소스 동기 방식이다. 레인 하나는 클록 전용이고 데이터 레인은 1–4개다. 클록은 DDR로 동작해 클록의 상승과 하강 에지마다 한 비트씩 샘플링하므로, 2.5 Gbps 레인의 클록은 1.25 GHz다. 레인당 속도는 규격 판마다 올라 왔다. v1.2가 2.5 Gbps, v2.x가 4.5 Gbps, v3.0이 표준 채널에서 약 9 Gbps를 정의한다. 높은 속도에서는 클록과 데이터 사이의 스큐를 맞추는 디스큐 보정 시퀀스와 수신기 등화가 필요해진다.

HS 버스트의 시작과 끝

데이터 레인은 블랭킹 동안 LP-11(정지)에 머물다가, 라인 하나를 보낼 때만 HS로 들어간다. 진입 순서는 LP-01(HS 요청) → LP-00(준비, 수신 종단 켜짐) → HS-ZERO(차동 0 유지) → 동기 바이트 B8h(LSB부터 00011101)이다. 수신기는 이 동기 패턴으로 바이트 경계를 찾는다. 끝에서는 마지막 비트를 반전해 일정 시간 유지하는 HS-TRAIL 뒤에 LP-11로 돌아간다. 각 단계의 최소 시간은 규격이 정한다.

TLPX≥50 ns,THS-PREPARE+THS-ZERO≥145 ns+10 UI,THS-TRAIL≥max⁡(8 UI, 60 ns+4 UI),THS-EXIT≥100 ns T_{LPX} \ge 50\ \text{ns}, \quad T_{HS\text{-}PREPARE} + T_{HS\text{-}ZERO} \ge 145\ \text{ns} + 10\,UI, \quad T_{HS\text{-}TRAIL} \ge \max(8\,UI,\ 60\ \text{ns} + 4\,UI), \quad T_{HS\text{-}EXIT} \ge 100\ \text{ns}
UI(Unit Interval) = 1/비트율. 2.5 Gbps에서 1 UI = 400 ps. 클록을 버스트마다 끄는 비연속 모드에서는 TCLK-PREPARE+TCLK-ZERO≥300T_{CLK\text{-}PREPARE} + T_{CLK\text{-}ZERO} \ge 300 ns, TCLK-POST≥60 ns+52 UIT_{CLK\text{-}POST} \ge 60\ \text{ns} + 52\,UI 같은 클록 레인 조건이 더해진다. 값은 D-PHY 타이밍 표의 최소값이며 실제 설정은 여유를 둔다.

이 조건들의 대부분은 ns 단위 고정값이고 UI 항은 작다. 그래서 오버헤드는 비트율과 거의 무관하게 버스트마다 수백 ns가 든다. 비트율을 올리면 페이로드 시간은 줄지만 이 고정 비용은 그대로이므로, 고속일수록, 그리고 패킷이 짧을수록 상대 오버헤드가 커진다. 클록 레인을 계속 켜 두는 연속 클록 모드는 이 비용을 줄이지만 블랭킹 동안에도 전력과 전자파를 낸다.

CLKD0 LP PREP+ZERO PRE HS 클록 (DDR, 비트율/2) POST TRAIL LP-11 LP-11 대기 01·00 ZERO B8 패킷 바이트 TRAIL HS-EXIT → LP-11 클록 선행 (비연속 모드) 진입 ≈ 220 ns 종료 ≈ 180 ns 2.5 Gbps, 여유 10 % 기준 대략값
그림 19-3. 비연속 클록 모드에서 한 라인 버스트의 구간. 클록 레인이 먼저 HS로 들어가 CLK-PRE만큼 돈 뒤 데이터 레인이 진입한다. 데이터 레인이 LP로 돌아간 뒤에도 클록은 CLK-POST만큼 더 돈다. 연속 클록 모드에서는 윗줄이 내내 HS 클록이다.
SIMULATOR

D-PHY 레인 상태 기계: LP ↔ HS 파형과 블랭킹 비용

클록 레인
보기
UI · 클록—
진입 (LP→HS→B8)—
종료 (TRAIL+EXIT)—
버스트 오버헤드—
라인 시간 점유—
라인당 최대 페이로드—
모델: 데이터 레인은 LP-01(TLPX) → LP-00(HS-PREPARE, 허용 구간의 중앙) → HS-ZERO(최소 조건 × 1.1) → 동기 B8h → 페이로드(긴 패킷 헤더 2B h·A0h·0Fh·ECC와 의사 난수 바이트) → HS-TRAIL(마지막 비트 반전) → HS-EXIT 순으로 그린다. 비연속 클록은 CLK-PREPARE 60 ns, CLK-ZERO, CLK-PRE, CLK-POST, CLK-TRAIL을 더한다. 해볼 것: 기본값(2.5 Gbps, 1252 B, 연속 클록)에서 오버헤드는 약 398 ns, 페이로드 4.0 µs, 라인 점유 44 %다. 비연속 클록으로 바꾸면 오버헤드가 약 941 ns로 두 배 넘게 늘고 점유가 49.5 %가 된다. 버스트를 100 B로 줄이고 비연속 클록이면 오버헤드가 버스트 시간의 75 %다. 짧은 패킷을 버스트마다 따로 보내면 안 되는 이유다. 비트율을 1.0 Gbps로 낮추면 같은 1252 B가 10 µs 라인에 들어가지 않는다(104 %). "진입 확대"에서 LP-00 이후 HS-ZERO와 B8h 비트 패턴을 확인하자.
LP 모드의 다른 쓰임

LP 상태 조합으로 수 Mbps의 느린 양방향 통신(이스케이프 모드, LPDT)도 할 수 있다. 디스플레이용 DSI는 이것으로 명령을 보내지만, 카메라 CSI-2는 레지스터 제어를 별도 I²C/I3C로 하므로 LP는 주로 블랭킹 중 대기와 버스트 경계 표시, 초저전력 상태(ULPS) 진입에 쓴다. 영상을 멈추지 않고 블랭킹마다 LP로 내려가는 것은 레인당 수 mA의 HS 종단 전류를 아끼기 위해서다.

C-PHY: 세 선, 세 레벨, 내장 클록

D-PHY는 데이터 레인마다 선 두 개, 그리고 클록 레인 두 개가 더 든다. 레인을 늘리면 커넥터 핀과 FPC 배선이 늘고, 레인 사이 스큐도 맞춰야 한다. C-PHY는 선 세 개(A, B, C)를 한 묶음(트리오)으로 쓰고, 클록을 따로 보내지 않는다. 매 순간 세 선 중 하나는 높은 레벨(약 3/4), 하나는 낮은 레벨(1/4), 나머지 하나는 가운데(1/2)에 있다. 어느 선이 높고 어느 선이 낮은지의 조합은 3 × 2 = 6가지이며, 이것을 와이어 상태라 부르고 +x, −x, +y, −y, +z, −z로 쓴다.

핵심 규칙은 매 심벌마다 반드시 상태를 바꾼다는 것이다. 지금 상태를 빼면 갈 수 있는 상태가 다섯 개이므로, 한 심벌은 다섯 갈래 중 하나, 즉 log⁡25≈2.32\log_2 5 \approx 2.32비트를 나른다. 상태가 매번 바뀌므로 수신기의 차동 비교기 세 개(A−B, B−C, C−A) 가운데 적어도 하나는 매 심벌 부호가 뒤집히고, 수신기는 이 전이에서 심벌 클록을 직접 복원한다. 클록 레인이 필요 없는 이유다.

+x −x +y −y +z −z 현재 상태에서나머지 5곳으로 회전(CW/CCW) × 극성(유지/반전) 4 + 극성 반전 1 와이어 레벨 (정규화) 상태ABCA−B B−C C−A +x3/41/41/2+ ½ − ¼ − ¼ −x1/43/41/2− ½ + ¼ + ¼ +y1/23/41/4− ¼ + ½ − ¼ +z1/41/23/4− ¼ − ¼ + ½ 여섯 상태의 비교기 부호 조합이 모두 달라서 상태가 바뀌면 적어도 한 출력이 반드시 뒤집힌다. 16비트 ↔ 7심벌 (5⁷ = 78,125 ≥ 2¹⁶ = 65,536)
그림 19-4. C-PHY 트리오의 여섯 와이어 상태(왼쪽)와 각 상태의 선 레벨·수신기 출력(오른쪽, −y·−z는 부호만 반대). 한 상태에서 다른 다섯 상태로 가는 전이가 심벌 값 0–4가 된다. 이 그림과 시뮬레이터의 상태 이름·전이 번호 붙임은 원리를 보이기 위한 단순화다.

실제 C-PHY는 16비트 워드를 심벌 7개로 바꾼다. 57=78,1255^7 = 78{,}125가 216=65,5362^{16} = 65{,}536보다 크므로 가능하고, 심벌당 16/7≈2.28616/7 \approx 2.286비트로 이론 상한 2.32비트의 98.5 %를 쓴다. 남는 조합은 동기 워드 같은 제어 용도로 돌린다. C-PHY v2.x는 표준 채널에서 6 Gsps(트리오당 약 13.7 Gbps), 짧은 채널에서 8 Gsps를 정의하고, 2025년의 v3.0은 상태 수를 늘린 18-와이어스테이트 부호화를 선택 기능으로 더했다. 선 9개로 비교하면 D-PHY는 4데이터 레인 + 클록(10선) 4.5 Gbps급에서 18 Gbps, C-PHY 3트리오(9선)는 6 Gsps에서 41 Gbps다. 많은 AP의 수신기는 같은 핀을 D-PHY와 C-PHY로 바꿔 쓰는 콤보 PHY다.

rtrio=fsym⋅167,167=2.286<log⁡25=2.322 r_{trio} = f_{sym}\cdot\frac{16}{7}, \qquad \frac{16}{7} = 2.286 \lt \log_2 5 = 2.322
SIMULATOR

C-PHY 부호기: 16비트 → 7심벌 → 와이어 상태 → 수신기 출력

보기
첫 워드의 심벌—
와이어 상태 (처음 8개)—
복호 결과—
심벌당 출력 반전 (평균/최소)—
부호 효율—
트리오당 데이터율—
단순화: 16비트 워드를 5진수 7자리(심벌 값 0–4)로 바꾸고, 0–3은 위상 회전 방향(CCW/CW)과 극성 유지/반전, 4는 같은 위상의 극성 반전으로 정의했다. 실제 C-PHY 매퍼는 규격의 표를 쓰고 버스트 앞뒤에 프리앰블·동기 워드가 붙지만, "매 심벌 상태가 바뀐다", "16비트 = 7심벌"이라는 구조는 같다. 해볼 것: 0x1234(4660)는 심벌 0 1 2 2 1 2 0이다. 워드 값을 0으로 두면 모든 심벌이 0(같은 방향 회전)이지만 선 전압은 여전히 매 심벌 바뀐다. 어떤 워드를 골라도 "최소" 반전 수는 1이고 평균은 약 1.8이다(전이 종류에 따라 1–3개). 수신기 출력 보기에서 매 심벌 경계에 적어도 한 선이 0을 가로지르는 것을 확인하자. 클록 복원은 바로 이 전이를 쓴다.

신호 무결성: 손실, 지터, 아이

센서 패드에서 AP 패드까지 신호는 패키지 리드, 모듈 기판, FPC, 커넥터, 메인보드 배선을 지난다. 이 경로는 주파수가 높을수록 신호를 더 깎는다. 도체 표면으로 전류가 몰리는 표피 효과 손실은 대략 f\sqrt{f}에, 유전체 손실은 ff에 비례한다. 고주파가 더 깎이면 펄스가 퍼지고, 앞 비트의 꼬리가 다음 비트에 겹쳐 심벌 간 간섭(ISI)이 된다. 여기에 비트 타이밍의 흔들림인 지터(Jitter)와 열잡음·누화 같은 전압 잡음이 더해진다.

이 모든 효과를 한 그림에 모은 것이 아이 다이어그램(Eye diagram)이다. 긴 의사 난수(PRBS) 비트열을 보내고 받은 파형을 2 UI 길이로 잘라 겹쳐 그리면, 가운데에 눈 모양의 빈 공간이 생긴다. 눈이 세로로 열린 정도(아이 높이)는 전압 여유, 가로로 열린 정도(아이 폭)는 타이밍 여유다. 수신기는 눈 한가운데에서 샘플링해야 오류가 가장 적다.

아이 높이 아이 폭 지터 아이 (2 UI 겹침) 1e-12 폭 @ BER 0.5샘플링 위상 배스텁 log BER
그림 19-5. 아이 다이어그램(왼쪽)과 배스텁 곡선(오른쪽). 아이의 위아래 두께는 ISI와 전압 잡음, 교차점의 가로 폭은 지터다. 배스텁은 샘플링 위상을 옮기며 잰 BER로, 목표 BER(예: 10⁻¹²)과 만나는 두 점 사이가 그 BER에서의 아이 폭이다.

비트 오류율은 판정점에서 신호가 잡음에 밀려 문턱을 넘을 확률이다. 잡음이 가우시안이면 Q 인자 하나로 쓴다. 지터는 한정된 크기의 결정성 지터(DJ: ISI, 듀티 왜곡, 주기성 잡음)와 가우시안 랜덤 지터(RJ)로 나누고, 목표 BER에서의 총 지터를 이중 디랙 모델로 어림한다.

BER=Q(q)=12 erfc ⁣(q2),q=μ1−μ0σ1+σ0,TJ(BER)=DJδδ+2 Q−1(BER) σRJ,Q−1(10−12)=7.03 \text{BER} = Q(q) = \tfrac12\,\text{erfc}\!\left(\frac{q}{\sqrt2}\right), \quad q = \frac{\mu_1-\mu_0}{\sigma_1+\sigma_0}, \qquad TJ(\text{BER}) = DJ_{\delta\delta} + 2\,Q^{-1}(\text{BER})\,\sigma_{RJ}, \quad Q^{-1}(10^{-12}) = 7.03
μ1,0,σ1,0\mu_{1,0}, \sigma_{1,0}: 판정점에서 '1'과 '0' 샘플의 평균과 표준편차(ISI + 잡음). 10⁻¹²에서 랜덤 지터는 RMS의 약 14배만큼 아이 폭을 먹는다. ISI 분포는 가우시안이 아니므로 Q 인자로 어림한 BER은 실제와 크게 다를 수 있다.

손실을 되돌리는 것이 등화(Equalization)다. 수신단의 CTLE(Continuous-Time Linear Equalizer)는 영점 하나와 극점 둘로 저주파를 깎고 나이퀴스트 근처를 상대적으로 올려 채널의 기울기를 상쇄한다. 송신단의 디엠퍼시스는 같은 값이 이어지는 비트의 진폭을 줄이고 전이 비트만 크게 보내는 FIR 필터다. 둘 다 ISI를 줄이는 대신 잡음(CTLE)이나 신호 진폭(디엠퍼시스)을 희생한다. 지나치게 걸면 오히려 과보상 ISI가 생긴다.

SIMULATOR

아이 다이어그램: PRBS → 손실 채널 → 지터·잡음 → CTLE, 통계적 BER과 배스텁

나이퀴스트 손실—
아이 높이 @1e-12—
아이 폭 @1e-12—
Q 인자 → 가우시안 BER—
통계적 BER (최적 위상)—
CTLE 잡음 이득—
모델: 차동 ±200 mV NRZ PRBS7(256비트, 비트당 32샘플)을 주파수 영역에서 인과적 표피 효과 손실 e−cjfe^{-c\sqrt{jf}}(1.25 GHz에서 0.3 dB/cm, f\sqrt f 비례)과 패키지 극점에 통과시킨 뒤 CTLE(영점 1개, 극점 2개, 고주파 이득 정규화)를 곱한다. 통계적 BER은 모든 비트의 샘플에 대해 이중 디랙 DJ와 가우스–에르미트 7점 RJ를 적분하고 잡음 Q 함수를 평균한 값이다. 해볼 것: 기본값(2.5 Gbps, 20 cm, 손실 6 dB)에서 아이 폭이 약 0.6 UI다. 길이를 40 cm(12 dB)로 늘리면 아이가 닫히고 통계적 BER이 약 5×10⁻⁷이 된다. 여기서 CTLE를 12 dB 걸면 폭이 약 0.6 UI로 다시 열리고, CTLE 대신 디엠퍼시스 0.3(약 5.4 dB)을 걸어도 폭이 약 0.44 UI로 열린다. 길이를 1 cm로 줄이고 CTLE를 12 dB로 과하게 걸면 통계적 BER은 10⁻³⁰ 아래인데 Q 인자는 약 3.5(가우시안 BER 약 2×10⁻⁴)로 떨어진다. 과보상 ISI가 만든 두 갈래 분포를 가우시안으로 어림하면 BER을 틀리게 읽는다는 뜻이다. RJ를 0.04 UI로 올리면 기본값의 아이 폭이 0.59에서 약 0.34 UI로 줄어든다. 10⁻¹²에서는 RMS 지터가 아주 작아도 비싸다.

CSI-2 패킷: 바이트에 의미 붙이기

물리층은 바이트를 나를 뿐이다. 그 바이트가 프레임의 시작인지, 몇 번째 라인인지, RAW10인지 YUV인지, 어느 카메라(가상 채널)의 것인지는 CSI-2의 패킷이 정한다. 송신기는 픽셀을 바이트로 패킹하고(픽셀–바이트 변환), 패킷 헤더와 오류 검출 코드를 붙이고(저수준 프로토콜), 바이트를 레인에 나눠 담는다(레인 관리). 수신기는 이 순서를 거꾸로 밟는다.

패킷은 두 종류다. 짧은 패킷은 4바이트로, 데이터 식별자 DI, 16비트 값, ECC로 이루어진다. 프레임 시작(FS)과 끝(FE)에는 프레임 번호를, 선택 사항인 라인 시작(LS)과 끝(LE)에는 라인 번호를 싣는다. 긴 패킷은 4바이트 헤더(DI, 워드 수 WC 2바이트, ECC), WC바이트의 페이로드, 2바이트 CRC로 이루어진다. 한 라인의 픽셀이 긴 패킷 하나에 들어가는 것이 보통이다.

짧은 패킷 (4 B) DI 데이터 16b (LSB 먼저) ECC FS·FE: 프레임 번호 · LS·LE: 라인 번호 긴 패킷 (WC + 6 B) DI WC 16b ECC 페이로드 WC 바이트 (패킹된 픽셀) CRC-16 DI 바이트 VC [7:6] DT [5:0] FS 00h · FE 01h · LS 02h · LE 03h · 임베디드 12h RAW8 2Ah · RAW10 2Bh · RAW12 2Ch · RAW14 2Dh ECC: 24비트(DI+WC)에 대한 6비트 해밍 SEC-DED · CRC: x¹⁶+x¹²+x⁵+1, 초기값 FFFFh, LSB 먼저
그림 19-6. CSI-2 패킷 구조. DI의 위 2비트가 가상 채널(VC), 아래 6비트가 데이터 형식(DT)이다. 헤더는 ECC로 1비트 오류를 고치고 2비트 오류를 검출하며, 페이로드는 CRC-16으로 오류를 검출만 한다. CSI-2 v2.0부터는 ECC 바이트의 남는 비트를 VC 확장에 써서 D-PHY에서 16개, C-PHY에서 32개 VC를 쓸 수 있다.

헤더 ECC는 DI와 WC 24비트에서 해밍 부호 방식으로 만든 6비트다. 각 패리티 비트는 정해진 데이터 비트들의 XOR이고, 수신기가 다시 계산한 ECC와 받은 ECC를 XOR한 신드롬이 0이면 정상, 데이터 비트 하나에 대응하는 값이면 그 비트를 뒤집어 고치고, 어느 쪽도 아니면 2비트 이상 오류로 버린다. 헤더를 고칠 수 있게 한 이유는, WC가 틀리면 수신기가 패킷 끝을 잘못 잡아 뒤따르는 모든 데이터가 엉키기 때문이다. 반면 페이로드 오류는 그 라인 하나만 망가지므로 CRC로 검출해 알리기만 한다.

p=G d(mod2),s=prx⊕G drx,CRC:g(x)=x16+x12+x5+1 \mathbf{p} = \mathbf{G}\,\mathbf{d} \pmod 2, \qquad \mathbf{s} = \mathbf{p}_{rx} \oplus \mathbf{G}\,\mathbf{d}_{rx}, \qquad \text{CRC}: g(x) = x^{16} + x^{12} + x^5 + 1
d\mathbf d: 헤더 24비트, G\mathbf G: 6 × 24 패리티 행렬, s\mathbf s: 신드롬. 단일 비트 오류 24가지는 서로 다른, 무게 2 이상의 신드롬을 만들고, ECC 비트 자체의 오류는 무게 1 신드롬이 된다.

픽셀 패킹과 레인 분배

10비트 픽셀을 바이트 경계에 맞추려면 묶어야 한다. RAW10은 4픽셀을 5바이트로, 각 픽셀의 상위 8비트를 차례로 4바이트에 넣고 하위 2비트 네 개를 다섯째 바이트에 모은다. RAW12는 2픽셀을 3바이트로 묶는다. 상위 비트를 앞에 모아 두면 하위 비트를 버리고 8비트로만 읽는 빠른 미리보기가 쉽다. 한 라인의 픽셀 수는 묶음 단위(RAW10은 4)의 배수여야 한다. 패킷 바이트는 레인에 돌아가며 배분되어 바이트 nn은 레인 n mod Nn \bmod N으로 간다. 각 레인은 따로 SoT/EoT를 갖고, 패킷 길이가 NN의 배수가 아니면 레인마다 끝나는 시점이 한 바이트씩 다를 수 있다.

RAW10: 4픽셀 → 5바이트 P0[9:2] P1[9:2] P2[9:2] P3[9:2] P3[1:0] P2[1:0] P1[1:0] P0[1:0] RAW12: 2픽셀 → 3바이트 P0[11:4] P1[11:4] P1[3:0] P0[3:0] 4레인 분배 (바이트 0, 1, 2, …) L0: B0 B4 B8 … L1: B1 B5 B9 … L2: B2 B6 B10 … L3: B3 B7 B11 … 헤더 4바이트는 4레인에서 정확히 한 바이트씩 동시에 나간다.
그림 19-7. RAW10과 RAW12 패킹, 그리고 레인 분배. RAW10에서 다섯째 바이트의 비트 1:0이 P0의 하위 비트다.
SIMULATOR

CSI-2 패킷 빌더: 패킹 → 헤더·ECC·CRC → 레인 분배 → 오류 주입과 복구

데이터 형식
픽셀 패턴
레인 수
오류 주입
DI—
WC · ECC—
CRC-16 (수신 검사)—
헤더 복호—
패킷 오버헤드—
자체 시험—
엔진은 CSI-2 규격의 ECC 패리티 식과 CRC-16(다항식 1021h를 LSB 먼저 처리하는 반사형 8408h, 초기값 FFFFh)을 그대로 계산하고, 규격 문서의 예제 벡터(헤더 37h F0h 01h → ECC 3Fh, 24바이트 페이로드 두 개 → CRC 00F0h, E569h)로 자체 시험한다. 해볼 것: 기본값(RAW10, VC0, 16픽셀)에서 DI = 2Bh, WC = 20바이트, ECC = 12h다. "헤더 1b"로 비트 10(WC의 둘째 비트)을 뒤집으면 신드롬 23h가 나오고 D10으로 정정된다. 비트를 26(ECC 바이트 안)으로 옮기면 "ECC 비트 오류 정정"이 된다. "헤더 2b"는 어떤 위치에서도 정정 불가로 판정되어 패킷을 버린다(24비트 안의 2비트 오류 435가지를 전부 검출함을 엔진에서 확인했다). "페이로드 1b"는 CRC 불일치로 검출만 된다. 16픽셀 RAW10 패킷의 오버헤드는 23 %지만 4000픽셀 라인이면 0.12 %로 줄어든다.

레인 계획: 평균이 아니라 버스트로

이제 1절의 식을 실제 숫자로 돌려 보자. 한 라인 시간 안에 픽셀 페이로드, 헤더·CRC, LP↔HS 전환이 모두 들어가야 한다. HDR 센서가 노출 두세 개를 가상 채널로 섞어 보내면(DOL·스태거드 HDR, 7장) 라인 시간마다 패킷이 그만큼 늘어난다. 블랭킹 시간은 평균 데이터율을 낮춰 주지만 라인 버스트 자체를 줄여 주지는 않는다는 점이 핵심이다.

SIMULATOR

대역폭·레인 계획기: D-PHY vs C-PHY, HDR 가상 채널, 라인 버스트 여유

해상도 (MP)
비트 수
노출(VC) 수
물리층
레인/트리오 수
평균 데이터율—
라인 시간—
버스트 점유율—
필요 최소 개수—
이 구성의 최대 fps—
속도 규격—
모델: VTS = 세로 행 + 블랭킹 40행, 라인 시간마다 노출 수만큼의 긴 패킷(픽셀 + 6 B)을 레인에 나눠 한 버스트로 보낸다. D-PHY 전환 비용은 위 상태 기계(연속 클록)에서, C-PHY는 LP 요청·준비·프리앰블·종료를 합친 개략값(약 360 ns + 35심벌)을 쓴다. C-PHY의 레인 속도는 심벌율(Gsps)이고 16비트를 7심벌로 바꾼다. 해볼 것: 기본값(12 MP, 10비트, 30 fps, D-PHY 2.5 Gbps 2레인)의 점유율은 77 %이고 이 구성의 최대 fps는 35다. 12비트 60 fps로 올리면 4레인에서도 95 %로 여유선을 넘으므로, 레인 속도를 3.0 Gbps로 올려야 80 %가 된다. 50 MP 30 fps는 D-PHY 2.5 Gbps 4레인에서 159 %, 4.5 Gbps에서도 91 %인데, C-PHY 6 Gsps 3트리오면 44 %다. 12 MP 3노출 HDR을 4레인 2.5 Gbps에 실으면 113 %로 넘친다. HDR 모드에서 해상도나 fps를 낮추는 센서가 많은 이유다.
프레임 안의 패킷 순서

한 프레임은 FS 짧은 패킷 → (임베디드 데이터 라인, DT 12h) → 라인마다 긴 패킷(선택적으로 LS/LE로 감쌈) → FE 순서로 나간다. 패킷 사이와 프레임 사이에는 레인이 LP-11로 내려간다. 수신기는 FS의 프레임 번호와 LS의 라인 번호로 누락을 검출하고, VC와 DT를 보고 패킷을 서로 다른 버퍼(예: 긴 노출, 짧은 노출, 위상차 AF 데이터)로 보낸다.

라인·프레임 타이밍

센서 안의 타이밍 발생기는 두 개의 카운터로 돈다. 가로 카운터는 픽셀 클록을 세어 한 라인의 길이 HTS(line_length_pck)에서 0으로 돌아가고, 세로 카운터는 라인을 세어 한 프레임의 길이 VTS(frame_length_lines)에서 돌아간다. HTS는 실제 픽셀 수보다 크고 그 차이가 수평 블랭킹이며, VTS는 실제 행 수보다 크고 그 차이가 수직 블랭킹이다. 이 두 숫자와 픽셀 클록이 프레임 레이트를 정한다.

tline=HTSfpix,Tframe=VTS⋅tline,ffps=fpixHTS⋅VTS,Texp=Ncoarse tline+Nfinefpix t_{line} = \frac{HTS}{f_{pix}}, \qquad T_{frame} = VTS\cdot t_{line}, \qquad f_{fps} = \frac{f_{pix}}{HTS\cdot VTS}, \qquad T_{exp} = N_{coarse}\,t_{line} + \frac{N_{fine}}{f_{pix}}
fpixf_{pix}: 타이밍 기준 픽셀 클록(내부 병렬 처리 때문에 실제 픽셀률과 상수배 다를 수 있다), NcoarseN_{coarse}: 적분 시간 레지스터(행 단위), NfineN_{fine}: 미세 적분 시간(픽셀 클록 단위). 롤링 셔터의 노출은 각 행의 리셋 포인터와 읽기 포인터 사이의 행 수로 정해진다(7장).

롤링 셔터에서 행 rr의 읽기는 프레임 시작에서 r tliner\,t_{line} 뒤에 일어나고, 리셋은 그보다 TexpT_{exp} 앞서 일어난다. 그러므로 노출은 VTSVTS에서 작은 여유(보통 수 행)를 뺀 값보다 길 수 없다. 더 긴 노출을 요청하면 센서는 둘 중 하나를 한다. 노출을 최대값으로 자르거나, VTS를 자동으로 늘려 프레임을 늘린다. 야간에 스마트폰 미리보기의 프레임 레이트가 30에서 15 fps로 떨어지는 것이 후자다. 프레임 레이트를 바꾸고 싶을 때 픽셀 클록을 건드리지 않고 VTS만 바꾸는 것도 같은 원리다.

임베디드 데이터 라인 (DT 12h) 유효 픽셀 (W × H)라인마다 긴 패킷 하나 H-블랭크LP-11 V-블랭크 (VTS − H − 임베디드 행) HTS (픽셀 클록) → t_line VTS (행) 한 프레임의 패킷 순서 FS EMB … FE → V-블랭크 → 다음 FS 노출 레지스터의 적용 시점 프레임 N에 쓰기 → N+1 경계 래치 노출: 보통 N+2 프레임에 반영 게인: 보통 N+1 프레임에 반영 → 지연 차이를 맞추지 않으면 밝기가 한 프레임 튄다
그림 19-8. HTS × VTS 격자로 본 한 프레임. 유효 영역 밖은 블랭킹이며, 이 동안 링크는 LP 상태로 쉰다. 오른쪽은 링크에 나가는 패킷의 순서와, 노출·게인 레지스터가 실제 영상에 반영되는 전형적인 지연이다(센서마다 다르므로 데이터시트로 확인해야 한다).

계산 예. 12 MP 센서의 타이밍 픽셀 클록이 600 MHz이고 HTS = 4400이면 tline=7.33 μst_{line} = 7.33\ \mu s다. 30 fps를 원하면 VTS=600×106/(4400×30)=4545VTS = 600\times10^6/(4400\times30) = 4545행이다. 유효 행 3000을 읽는 데 22.0 ms가 걸리고 나머지 11.3 ms가 수직 블랭킹이다. 50 Hz 전원 지역의 조명은 100 Hz로 깜빡이므로, 노출을 10 ms(1364행)의 정수배로 맞추면 깜빡임 줄무늬가 사라진다. 같은 10 ms가 60 Hz 지역(120 Hz 깜빡임)에서는 진폭 16 % 정도의 줄무늬를 남긴다.

SIMULATOR

프레임 타이밍 다이어그램: 롤링 노출을 끌어서 바꾸기

VTS를 넘는 노출
조명 깜빡임
라인 시간—
프레임 레이트—
노출 시간—
실제 VTS—
롤링 판독—
깜빡임 줄무늬 진폭—
모델: 유효 영역 4000 × 3000, 노출 여유 8행. 각 프레임의 읽기 포인터(굵은 선)는 프레임 시작에서 행당 tlinet_{line}씩 내려가고, 리셋 포인터(점선)는 노출만큼 앞선다. 깜빡임 진폭은 I(t)=1+mcos⁡2πftI(t) = 1 + m\cos 2\pi f t를 노출 시간으로 적분한 ∣sinc(f Texp)∣|\mathrm{sinc}(f\,T_{exp})|를 깜빡임 깊이 대비 %로 나타낸 것이다. 해볼 것: 기본값은 정확히 30.00 fps, 노출 10.00 ms이고 100 Hz 줄무늬가 0.03 %로 사라진다. 120 Hz로 바꾸면 15.6 %가 된다. 노란 손잡이를 오른쪽으로 끌어 노출을 4538행 이상으로 늘리면 VTS가 따라 늘어 프레임 레이트가 떨어진다(6000행이면 VTS 6008, 22.7 fps). "노출 제한"으로 바꾸면 fps는 30에 머물고 노출이 4537행(33.27 ms)에서 잘린다. HTS를 늘리면 같은 VTS에서 라인 시간과 판독 시간이 길어져 롤링 왜곡이 커진다.

클록과 PLL

센서에 들어오는 클록은 보통 19.2, 24, 27 MHz 같은 낮은 기준 클록 하나다. 센서 안의 PLL(Phase-Locked Loop)이 이것을 수 GHz로 올리고, 분주기로 나눠 타이밍용 픽셀 클록, 컬럼 ADC 카운터 클록, MIPI 비트 클록을 만든다. 기준 클록을 먼저 나눠 위상 비교기(PFD)에 넣고, VCO 출력을 MM으로 나눈 것과 비교해 위상이 맞도록 VCO를 조정하므로, 락이 걸리면 VCO 주파수는 기준의 M/NM/N배가 된다.

fPFD=fextNpre,fVCO=M fPFD,fpix=fVCOdsys dpix,rlane=fVCOdop,fADC=fVCOdadc f_{PFD} = \frac{f_{ext}}{N_{pre}}, \qquad f_{VCO} = M\,f_{PFD}, \qquad f_{pix} = \frac{f_{VCO}}{d_{sys}\,d_{pix}}, \qquad r_{lane} = \frac{f_{VCO}}{d_{op}}, \qquad f_{ADC} = \frac{f_{VCO}}{d_{adc}}
각 분주비와 MM은 레지스터로 정한다. PFD 주파수와 VCO 주파수에는 허용 범위가 있다(이 장의 예시: PFD 6–12 MHz, VCO 1.5–3.2 GHz). SMIA/CCS 계열 레지스터 맵은 영상 타이밍(vt_) 쪽과 출력(op_) 쪽 분주기를 나눠 정의하고, 두 쪽에 PLL을 따로 두는 센서도 많다.

분주비를 고르는 것은 제약 충족 문제다. 기준 클록은 보드가 정하고, 픽셀 클록은 원하는 프레임 레이트와 HTS·VTS가 정하고, 레인 비트율은 AP 수신기가 지원하는 값과 전자파 간섭이 정한다. 휴대폰에서는 MIPI 비트율의 고조파가 셀룰러·GNSS 수신 대역에 떨어지지 않도록 몇 가지 비트율 중에서 고르기도 한다. 한 VCO에서 두 클록을 나누려면 두 목표의 비가 정수 분주비로 맞아야 하고, 맞지 않으면 PLL을 둘로 나눠야 한다.

PLL은 되먹임 제어 루프이기도 하다. 전하 펌프와 루프 필터를 쓰는 2형 PLL의 닫힌 루프 전달 함수는 고유 주파수 ωn\omega_n과 감쇠비 ζ\zeta를 갖는 2차 시스템이다. 루프 대역이 넓으면 빨리 락하고 VCO 자체 위상 잡음을 잘 누르지만, 기준 클록의 지터와 PFD 스퍼를 더 통과시킨다. 이산 시간 비교의 영향을 무시하려면 루프 대역을 PFD 주파수의 약 1/10 아래로 둔다. PLL 지터는 그대로 MIPI 아이의 RJ가 된다.

H(s)=2ζωns+ωn2s2+2ζωns+ωn2 H(s) = \frac{2\zeta\omega_n s + \omega_n^2}{s^2 + 2\zeta\omega_n s + \omega_n^2}
EXTCLK24 MHz ÷N PFD 전하펌프+ 루프 필터 VCO ÷M ÷d_sys÷d_pix → 픽셀 클록 ÷d_op → MIPI 비트 클록 ÷d_adc → ADC 카운터 f_PFD = f_ext / N f_VCO = M · f_PFD HTS·VTS → fps · 레인 수 → 대역 2^b 카운트 → ADC 변환 시간
그림 19-9. 센서 PLL과 클록 분배. 기준 클록을 나눠 PFD에 넣고, VCO를 MM으로 나눈 되먹임과 위상을 맞춘다. VCO 출력은 다시 나뉘어 타이밍, 출력 링크, ADC로 간다.
SIMULATOR

PLL 구성기: 분주비 제약 검사, 자동 해 찾기, 락 과도 응답

EXTCLK (MHz)
d_sys
목표 (픽셀 MHz / 레인 Gbps)
PFD / VCO—
픽셀 클록—
프레임 레이트—
MIPI 레인 (4레인)—
ADC 변환 (10b, 2램프)—
락 시간—
대역 비—
해 찾기버튼을 눌러 보자
모델: HTS 4400, VTS 3100, 유효 폭 4000, 10비트, 4레인. "필요" 레인 속도는 한 라인을 라인 시간의 85 % 안에 보내는 값, ADC 변환 시간은 리셋·신호 두 램프 × 2¹⁰ 카운트이며 라인 시간의 80 % 안에 들어가야 한다. 해 찾기는 N, M, d_sys, d_pix, d_op를 전수 탐색해 두 목표를 2 % 안에서 맞추는 조합을 고른다. 락 응답은 위 2차 전달 함수의 계단 응답을 RK4로 적분하고 ±0.1 % 안에 머무는 시점을 락으로 본다. 해볼 것: 기본값은 PFD 8 MHz, VCO 2.4 GHz, 픽셀 600 MHz, 44 fps, 레인 2.4 Gbps(필요 1.60)다. d_op를 2로 하면 1.2 Gbps로 링크가 모자라고, d_adc를 8로 하면 변환이 6.83 µs로 한계 5.87 µs를 넘는다. M을 420으로 올리면 VCO가 3.36 GHz로 범위를 벗어난다. 목표 "480 / 1.44"로 풀면 VCO 2.88 GHz에서 d_pix 6, d_op 2가 나온다. ζ를 0.25로 낮추면 오버슈트 50 %, 락 8.4 µs이고, 0.71이면 21 %, 2.9 µs다. 고유 주파수를 2 MHz로 올리면 PFD/대역 비가 4로 떨어져 경고가 뜬다.

레지스터 제어: CCI, 그룹 홀드, 스트리밍

센서의 동작은 수백에서 수천 개의 레지스터로 정해진다. 프로세서는 이것을 CCI로 읽고 쓴다. CCI는 I²C와 호환되는 2선 버스로, 7비트 슬레이브 주소 뒤에 16비트 레지스터 주소와 8비트 데이터를 보내고, 연속 주소는 자동 증가로 이어 쓴다. 표준 모드 100 kHz, 고속 모드 400 kHz, 고속 모드 플러스 1 MHz가 흔하다. 최근 센서는 같은 레지스터 맵을 MIPI I3C(SDR 12.5 MHz, 대역 내 인터럽트)로도 접근하게 한다. MIPI의 CCS(Camera Command Set)는 SMIA에서 이어진 표준 레지스터 맵으로, 예를 들어 0x0100(mode_select), 0x0104(grouped_parameter_hold), 0x0202(coarse_integration_time), 0x0340(frame_length_lines), 0x0342(line_length_pck)를 정의한다. 그러나 많은 상용 센서는 제조사 고유의 맵을 쓴다.

twr≈1+9 (1+2+n)+1fSCL,n=1: twr≈38400 kHz=95 μs t_{wr} \approx \frac{1 + 9\,(1 + 2 + n) + 1}{f_{SCL}}, \qquad n = 1:\ t_{wr} \approx \frac{38}{400\ \text{kHz}} = 95\ \mu s
시작 비트, 바이트당 9비트(8비트 + ACK) × (주소 1 + 레지스터 주소 2 + 데이터 nn), 정지 비트. 실제로는 드라이버와 OS의 간격이 더해진다. 초기화 표 2000개를 낱개로 쓰면 400 kHz에서 약 0.2 s다. 연속 쓰기로 묶으면 크게 준다.

문제는 언제 적용되느냐다. 센서는 레지스터를 바로 쓰지 않고 그림자 레지스터에 받아 두었다가 프레임 경계에서 한꺼번에 래치한다. 노출은 다음 프레임의 리셋 포인터가 이미 지나가고 있기 때문에 대개 두 프레임 뒤에, 게인은 읽을 때 적용되므로 한 프레임 뒤에 반영된다. 노출을 반으로 줄이고 게인을 두 배로 올려 밝기를 유지하려 했는데 두 값이 서로 다른 프레임에 반영되면, 그 사이 한 프레임이 절반 밝기로 튄다. 또 16비트 노출 값을 바이트 두 개로 나눠 쓰는 도중에 프레임 경계가 지나가면, 상위 바이트만 새 값인 엉뚱한 노출이 한 프레임 동안 적용된다.

그룹 홀드(Grouped parameter hold)는 이 둘째 문제를 막는다. 홀드를 켜고 여러 레지스터를 쓴 뒤 홀드를 풀면, 그 묶음 전체가 같은 프레임 경계에서 래치된다. 첫째 문제(노출과 게인의 지연 차이)는 그룹 홀드로 해결되지 않는다. 센서의 게인 지연 보정 기능을 켜거나, 드라이버가 게인을 한 프레임 늦게 쓰는 식으로 맞춰야 한다. ISP가 어느 프레임에 어떤 설정이 적용됐는지 알도록, 많은 센서는 프레임마다 노출·게인·프레임 번호를 담은 임베디드 데이터 라인(DT 12h)을 FS 직후에 보낸다.

프레임 NN+1N+2N+3 I²C쓰기 → 래치 노출E₀E₁ (N+2부터) 게인G₀G₁ (N+1부터) 밝기E₀·G₁ 튐E₁·G₁ 그룹 홀드는 "같이 래치"를 보장할 뿐, 노출과 게인의 지연 차이는 따로 맞춰야 한다
그림 19-10. 레지스터 쓰기와 적용 시점. 프레임 N에 노출과 게인을 함께 썼더라도, 게인은 N+1부터, 노출은 N+2부터 반영되어 N+1 한 프레임의 밝기가 어긋난다.
단계하는 일주의
1. 전원데이터시트 순서대로 아날로그·I/O·코어 전원 인가순서·상승 시간 위반은 래치업이나 OTP 손상 위험
2. 클록·리셋EXTCLK 공급 후 XSHUTDOWN(XCLR) 해제, 수 ms 대기클록 없이 리셋 해제하면 내부 상태 불확정
3. 초기화소프트 리셋, 칩 ID 확인, 초기화 표(PLL·아날로그 바이어스) 쓰기쓰기 수천 개 → 부팅 지연의 주원인
4. 모드 설정해상도·HTS/VTS·노출·게인·레인 수·비트율그룹 홀드로 묶어 쓰기
5. 스트리밍 시작mode_select = 1, 레인 LP-11에서 첫 FS처음 1–2 프레임은 AE 미수렴·불안정 → 버림
6. 정지mode_select = 0, 프레임 경계에서 멈춤프레임 중간 정지 시 수신기 FIFO 잔여 정리
SIMULATOR

레지스터 갱신 위험: 래치 경계, 바이트 찢김, 그룹 홀드와 지연 보정

시나리오
그룹 홀드
게인 지연 보정
I²C 속도 (kHz)
쓰기 1회 · 묶음—
튀는 프레임—
최대 밝기 오차—
글리치 확률 (위치 전수)—
쓰기 묶음 길이—
모델: 노출(16비트, 상위 바이트 먼저)과 게인(16비트, 1/256 단위)을 레지스터 4개로 쓰고, 그룹 홀드를 켜면 앞뒤에 홀드 쓰기 2개를 더한다. 쓰기 1회는 38비트 ÷ SCL + 소프트웨어 간격 15 µs. 각 프레임 경계에서 그때까지 끝난 쓰기(홀드 중이면 홀드 해제까지 보류)를 래치하고, 노출은 다음 프레임, 게인은 같은 프레임에 반영한다(보정을 켜면 게인도 다음 프레임). 오차는 "그룹 홀드 + 보정"인 이상적 센서와의 밝기 비(EV)이고, 확률은 쓰기 위치를 프레임 안 400곳에 놓아 본 비율이다. 해볼 것: 기본값(교환, 둘 다 끔)은 위치와 무관하게 프레임 5가 정확히 2배(+1 EV) 튄다(확률 99.8 %). 그룹 홀드만 켜도 그대로다. 보정을 켜면 튐이 사라지고, 쓰기 묶음이 경계에 걸치는 0.7 %만 남는다. "16비트 자리올림"(1023 → 1024행), 100 kHz, 보정 켬, 위치 98 %로 두면 상위 바이트만 바뀐 1279행이 한 프레임 적용되어 +0.32 EV 튄다. 여기서 그룹 홀드를 켜면 오차가 0이 된다. AE 램프에서 보정을 끄면 게인을 올리는 구간의 세 프레임이 최대 0.2 EV 어긋난다.

다중 카메라 동기

스마트폰 후면의 카메라 서너 개, 차량의 서라운드 뷰 카메라, 스테레오 깊이 카메라는 서로 같은 순간을 찍어야 한다. 각 센서가 자기 수정 발진기(또는 서로 다른 PLL 설정)로 돌면, 공칭 프레임 레이트가 같아도 실제 주파수는 수십 ppm씩 다르다. 100 ppm 차이면 30 fps에서 프레임마다 3.3 µs씩 어긋나 1초에 0.1 ms, 1분에 6 ms가 벌어지고, 약 5.6분 뒤에는 한 프레임 전체가 미끄러진다.

동기 방법은 세 단계다. 가장 약한 것은 소프트웨어 동기로, 프레임 타임스탬프를 비교해 한쪽의 VTS를 잠깐 늘리거나 줄여 위상을 당긴다. I²C 지연과 OS 지터 때문에 잔차가 수백 µs에서 ms 수준이고, 보정 사이에는 다시 드리프트한다. 하드웨어 동기는 주 센서가 프레임 시작마다 내는 XVS(수직 동기) 펄스를 종 센서의 입력 핀에 넣어 종 센서가 매 프레임 그 펄스에 맞춰 시작하게 하거나, 외부 트리거 하나로 모든 센서를 동시에 시작시킨다. 잔차는 라인 시간 이하로 줄어든다. 여기에 같은 기준 클록을 나눠 주면 드리프트 자체가 사라진다. 네트워크로 연결된 차량·산업용 카메라는 IEEE 1588(PTP) 같은 시간 동기 프로토콜로 타임스탬프를 맞춘다.

센서 A (주)XVS 출력 센서 B (종)XVS 입력 프레임 펄스 AP / FPGA타임스탬프 · 트리거 CSI-2 스테레오에서의 시간차 → 깊이 오차 z = f·B / d Δd = f·v·Δt / z Δz ≈ −z²·Δd / (f·B) 한쪽 센서를 180° 돌려 달면 롤링 방향이 반대 → 행마다 Δt가 ±판독 시간만큼 달라진다
그림 19-11. 하드웨어 프레임 동기(왼쪽)와 스테레오 깊이 오차의 연쇄(오른쪽). 같은 행이 다른 시각에 찍히면 움직이는 물체의 시차가 틀어지고, 시차 오차는 거리의 제곱에 비례하는 깊이 오차가 된다.
SIMULATOR

다중 카메라 드리프트와 스테레오 롤링 스큐 → 깊이 오차

동기 방식
센서 B 장착
프레임당 드리프트—
한 프레임 미끄러짐까지—
프레임 시작 차이—
깊이 오차 (중앙 행)—
깊이 오차 (최악 행)—
기준 시차—
모델: 30 fps, 1080행, 라인 15 µs(판독 16.2 ms), 초점 거리 1400 px, 기선 0.3 m. 자유 동작은 초기 위상 0에서 ppm만큼 선형으로 벌어지고(±반 프레임으로 감음), SW 보정은 5초마다 잔차 σ = 0.5 ms로 다시 맞춘 뒤 드리프트하며, HW 동기는 수 µs 잔차만 남긴다. 180° 장착에서는 행 rr의 시간차가 (V−2r) tline(V-2r)\,t_{line}만큼 더해진다. 시차가 기준의 1/4 아래로 줄면 매칭 실패로 본다. 해볼 것: 기본값(100 ppm, 자유 동작, 10 s, 50 km/h, 20 m)에서 프레임 시작 차이는 1.0 ms, 시차 21 px 중 약 1 px가 틀어져 깊이 오차 −4.4 %다. 60 s로 옮기면 6 ms, −21.7 %가 된다. SW 보정이면 잔차에 따라 2 % 안팎, HW XVS면 0이다. 그런데 HW 동기 상태로 센서 B를 180° 돌려 달면 중앙 행만 맞고 위아래 끝은 매칭이 깨진다. 속도를 5 km/h로 낮춰도 끝 행 오차가 7–8 %다. 스테레오 모듈에서 두 센서의 롤링 방향을 반드시 맞추는 이유다.

차량·산업용 확장

CSI-2와 D-PHY/C-PHY는 수십 cm 안쪽을 위한 링크다. 차에서는 범퍼나 사이드미러의 카메라에서 중앙 제어기까지 수 m에서 15 m를 가야 하고, 진동·온도·전자파 조건도 훨씬 가혹하다(15장). 그래서 카메라 모듈 안에 SerDes(Serializer/Deserializer)를 둔다. 직렬화기는 센서의 CSI-2를 받아 동축 케이블 한 가닥(또는 차폐 연선)에 수 Gbps로 싣고, 같은 케이블로 전원(PoC, Power over Coax)과 수십–수백 Mbps의 역방향 채널을 함께 보낸다. 역방향 채널은 I²C 터널링과 프레임 동기 신호, GPIO를 나른다. 역직렬화기는 이것을 다시 CSI-2로 풀어 SoC에 넘기며, 여러 카메라를 가상 채널로 합치기도 한다.

오래 쓰인 방식은 업체 고유 규격이다(예: GMSL 계열, FPD-Link 계열). 표준으로는 MIPI A-PHY가 있다. v1.0(2020)이 최대 16 Gbps, v1.1이 이중 차동 쌍(스타 쿼드) 케이블로 32 Gbps까지 정의하며, 그 위에 CSI-2를 얹는 프로토콜 어댑터를 둔다. 자동차 업계의 다른 표준으로 ASA Motion Link도 있다. 기능 안전 관점에서는 CSI-2 위에 프레임 카운터·CRC·보안 정보를 덧붙이는 MIPI CSE(Camera Service Extensions) 같은 확장이 쓰인다.

고해상도·고속 산업용과 방송용 센서는 MIPI 대신 SLVS-EC(Scalable Low Voltage Signaling with Embedded Clock) 같은 내장 클록 직렬 링크를 쓰기도 한다. 8b/10b 부호로 클록을 데이터에 넣어 레인 사이 스큐 제약이 없고, 레인을 많이 묶어 큰 대역을 얻는다. 카메라와 PC 사이에는 다시 다른 층이 있다. USB3 Vision, GigE Vision(1–10 GbE, 100 m), CoaXPress(동축 1가닥당 최대 12.5 Gbps급) 같은 머신 비전 규격과 공통 제어 표준 GenICam이다. 이때 센서의 MIPI/SLVS-EC 출력은 카메라 안의 FPGA가 받아 바꿔 준다.

카메라 모듈 센서12b 압축 SERPoC CSI-2 순방향 수 Gbps (영상) 역방향: I²C 터널 · 프레임 동기 · GPIO 동축 / 차폐 연선 최대 ~15 m · 전원 중첩 ECU DESVC 합침 SoCISP · 인식 CSI-2
그림 19-12. 차량용 카메라 링크. 모듈 안 직렬화기가 CSI-2를 장거리 직렬 신호로 바꾸고, 같은 케이블로 전원과 역방향 제어 채널을 함께 보낸다. 역직렬화기는 여러 카메라를 가상 채널로 묶어 SoC의 CSI-2 수신기에 넘긴다.
링크매체 · 거리클록레인당 속도 (대략)주 용도
MIPI D-PHY차동 쌍 · 수십 cm별도 클록 레인 (DDR)2.5 (v1.2) / 4.5 (v2.x) / ~9 Gbps (v3.0)폰·임베디드 카메라
MIPI C-PHY3선 트리오 · 수십 cm심벌 전이에 내장6 Gsps ≈ 13.7 Gbps (v2.x 표준 채널)고해상도 폰 카메라
SLVS-EC차동 쌍 · 짧은 거리8b/10b 내장수 Gbps급, 레인 다수산업·방송용 대형 센서
차량용 SerDes · A-PHY동축/STP · ~15 m내장 + 역방향 채널수–16 Gbps (A-PHY v1.1 이중 쌍 32 Gbps)ADAS·서라운드 카메라
USB3 / GigE Vision · CoaXPressUSB · 이더넷 100 m · 동축내장5–10 Gbps · 1–10 GbE · 12.5 Gbps/동축머신 비전 카메라 → PC

계산 예. 15장의 8 MP(3840×2160) 30 fps 차량 카메라가 화소당 24비트 HDR을 그대로 보내면 약 6.0 Gbps(블랭킹 포함 버스트로는 더)가 필요하다. 센서 안에서 12비트로 구간 선형 압축하면 3.0 Gbps가 되어, 이 장의 레인 계획기로 D-PHY 2.5 Gbps 2레인(점유 약 64 %)에 들어가고 직렬화기 링크 하나로 충분하다. 압축 곡선의 무릎점은 임베디드 데이터에 실어 보내 ISP가 되펴도록 한다.

핵심 정리

  1. 센서–프로세서 링크는 고속 단방향 영상(CSI-2 over D-PHY/C-PHY)과 저속 양방향 제어(I²C/I3C CCI), 기준 클록·리셋·동기 핀으로 이루어진다.
  2. 링크 용량은 평균 데이터율 WHb ffpsWHb\,f_{fps}가 아니라 라인 버스트로 따진다. 한 라인의 픽셀 + 헤더·CRC 6 B + LP↔HS 전환이 라인 시간(여유 포함) 안에 들어가야 하고, HDR 가상 채널은 라인당 패킷 수를 곱으로 늘린다.
  3. D-PHY는 HS(약 200 mV 차동, DDR 소스 동기 클록)와 LP(1.2 V 단일 종단 상태) 모드를 오간다. LP-11 → LP-01 → LP-00 → HS-ZERO → B8h → 데이터 → TRAIL → LP-11의 전환에 버스트당 수백 ns가 들며 대부분 ns 고정값이라 고속·짧은 패킷일수록 상대 오버헤드가 크다. 비연속 클록은 그 비용을 두 배 넘게 늘린다.
  4. C-PHY는 3선 3레벨 6상태를 매 심벌 바꿔 클록을 내장하고, 16비트를 7심벌(5⁷ ≥ 2¹⁶)로 보내 심벌당 2.286비트를 나른다. v2.x 표준 채널 6 Gsps는 트리오당 약 13.7 Gbps다.
  5. 채널 손실(표피 f\sqrt f, 유전체 ff)은 ISI를, 지터와 잡음은 아이를 좁힌다. 10⁻¹²에서 RJ는 RMS의 약 14배를 먹는다. CTLE와 디엠퍼시스는 ISI를 되돌리지만 잡음·진폭을 희생하며, ISI가 비가우시안이므로 Q 인자 BER은 틀릴 수 있다.
  6. CSI-2 짧은 패킷은 DI + 16비트 + ECC, 긴 패킷은 DI + WC + ECC + 페이로드 + CRC-16이다. DI = VC[7:6] + DT[5:0]. 헤더 ECC는 1비트 정정·2비트 검출, CRC(x¹⁶+x¹²+x⁵+1)는 검출만 한다. RAW10은 4픽셀 → 5바이트, RAW12는 2픽셀 → 3바이트이며 바이트는 레인에 돌아가며 분배된다.
  7. ffps=fpix/(HTS⋅VTS)f_{fps} = f_{pix}/(HTS\cdot VTS). 노출은 VTS − 여유를 넘을 수 없어 더 길면 프레임이 늘거나 노출이 잘린다. 깜빡임 줄무늬는 노출을 조명 주기(10 ms 또는 8.33 ms)의 정수배로 맞춰 없앤다.
  8. PLL은 기준 클록을 M/NM/N배 해 VCO를 만들고 분주해 픽셀·ADC·MIPI 클록을 낸다. PFD·VCO 범위와 정수 분주비가 해를 제한하며, 루프 대역과 감쇠비는 락 시간과 지터의 절충이다.
  9. 레지스터는 그림자에 받아 프레임 경계에서 래치되고, 노출은 보통 2프레임, 게인은 1프레임 뒤 반영된다. 그룹 홀드는 묶음의 동시 래치와 바이트 찢김을 막고, 노출·게인 지연 차이는 별도 보정이 필요하다. 임베디드 데이터가 어떤 설정이 어느 프레임에 적용됐는지 알려 준다.
  10. 독립 클록 카메라는 ppm 차이로 드리프트한다(100 ppm, 30 fps → 프레임당 3.3 µs). HW XVS 동기나 공통 클록으로 묶어야 하고, 스테레오는 롤링 방향까지 맞춰야 깊이가 틀어지지 않는다. 장거리 차량 링크는 SerDes·A-PHY가 CSI-2를 감싸 전원·역방향 제어와 함께 나른다.

확인 퀴즈

Q1. 12 MP, 10비트, 30 fps의 평균 데이터율은 3.6 Gbps다. 2.5 Gbps D-PHY 2레인(5 Gbps)이면 충분한지 판단할 때 가장 중요한 추가 고려는?

헤더·CRC는 4000픽셀 라인에서 0.1 % 정도이고, DDR은 비트율 정의에 이미 들어 있다. 문제는 라인을 버스트로 보내야 한다는 것이다. 이 예에서 블랭킹 40행을 넣으면 라인 시간 10.96 µs에 버스트가 약 8.4 µs(77 %)를 차지한다.

Q2. D-PHY 데이터 레인이 블랭킹에서 HS 버스트로 들어가는 올바른 순서는?

LP-01이 HS 요청, LP-00이 준비(수신 종단 켜짐)이며, HS-ZERO 동안 수신기가 차동 신호에 맞춘 뒤 B8h 동기 바이트로 바이트 경계를 찾는다. 끝에서는 HS-TRAIL 뒤 LP-11로 돌아간다.

Q3. C-PHY가 별도 클록 선 없이 수신기 클록을 복원할 수 있는 이유는?

여섯 와이어 상태의 비교기 부호 조합(A−B, B−C, C−A)이 모두 다르므로 상태가 바뀌면 적어도 한 출력의 부호가 뒤집힌다. 수신기는 그 전이로 심벌 경계를 잡는다. 이 규칙 때문에 한 심벌의 선택지는 5개(약 2.32비트)다.

Q4. C-PHY가 16비트 워드를 7심벌에 담을 수 있는 근거와 심벌당 비트 수가 맞게 짝지어진 것은?

현재 상태를 뺀 다섯 상태로만 갈 수 있으므로 심벌은 5진수 한 자리다. 5⁷이 2¹⁶보다 커서 7심벌이면 16비트가 들어가고, 효율은 16/7 ÷ log₂5 ≈ 98.5 %다. 3⁷(2187)은 2¹⁶보다 훨씬 작다.

Q5. 링크의 랜덤 지터가 RMS 0.02 UI, 결정성 지터가 0.10 UI(이중 디랙)이다. BER 10⁻¹²에서의 총 지터에 가장 가까운 값은?

TJ=DJ+2×7.03×RJ=0.10+14.07×0.02≈0.38TJ = DJ + 2 \times 7.03 \times RJ = 0.10 + 14.07 \times 0.02 \approx 0.38 UI. 0.12는 RJ를 그냥 더한 값이다. 낮은 BER에서는 작은 RMS 지터도 크게 곱해진다.

Q6. CSI-2 긴 패킷 헤더 24비트 중 1비트가 뒤집혔다. 수신기의 동작으로 맞는 것은?

헤더 ECC는 SEC-DED 해밍 부호여서 1비트는 고치고 2비트는 검출한다. 헤더를 고칠 수 있게 한 것은 WC가 틀리면 패킷 경계를 잃기 때문이다. CRC-16은 페이로드만 덮고 검출만 한다.

Q7. RAW10 라인 4000픽셀의 긴 패킷은 몇 바이트이고, DI의 DT 값은?

RAW10은 4픽셀을 5바이트로 묶으므로 페이로드는 5000바이트(WC = 5000)이고, 헤더 4바이트와 CRC 2바이트를 더해 5006바이트다. RAW8이 2Ah, RAW10이 2Bh, RAW12가 2Ch다.

Q8. 픽셀 클록 600 MHz, HTS 4400, VTS 4545로 30 fps인 센서에 노출 6000행을 요청했다. "프레임 연장" 모드(여유 8행)에서 일어나는 일은?

롤링 노출은 VTS − 여유를 넘을 수 없으므로, 연장 모드에서는 VTS = 6000 + 8 = 6008이 되고 ffps=600×106/(4400×6008)≈22.7f_{fps} = 600\times10^6/(4400\times6008) \approx 22.7이 된다. 노출을 자르는 것은 다른 모드의 동작이다.

Q9. 드라이버가 노출을 절반으로 줄이고 아날로그 게인을 두 배로 올려 같은 프레임에 그룹 홀드로 함께 썼는데도 밝기가 한 프레임 튄다. 가장 그럴듯한 원인은?

그룹 홀드는 묶음을 같은 경계에서 래치하게 할 뿐, 래치 후 반영되기까지의 지연은 레지스터 종류마다 다르다. 센서의 게인 지연 보정을 켜거나 게인을 한 프레임 늦게 써야 한다. 바이트 찢김은 그룹 홀드가 막는 문제다.

Q10. 같은 공칭 30 fps로 자유 동작하는 두 카메라의 클록 차이가 50 ppm이다. 한 프레임(33.3 ms) 전체가 미끄러지는 데 걸리는 시간은 대략?

드리프트율은 50 × 10⁻⁶이므로 33.3 ms가 벌어지려면 33.3 ms / 50 × 10⁻⁶ = 667 s ≈ 11분이 걸린다. 그 전에도 1초에 1.7 ms씩 벌어지므로, 스테레오나 다중 카메라 합성에는 하드웨어 동기가 필요하다.