다층 구조 속 채널의 의미와 역할
채널은 단순한 데이터 경로가 아니라, 하드웨어 계층 간 병렬성과 격리를 실현하는 핵심 요소다. 이는 물리적 연결, 논리적 전송 엔진, 그리고 응용 로직 사이에 존재하는 다층적 개념이다.
1. PCIe 물리 레이어: 신호 채널 (Lane)
- 위치: PCIe 인터페이스의 하드웨어 계층
- 구성: 차분 신호 쌍(각각의 레인)으로 구성되며, x1, x4, x8, x16 등으로 표현됨
- 기능: 각 레인은 독립적인 전송 경로를 제공하며, 전체 대역폭을 확보함 (예: PCIe 4.0 x8 ≒ 16 GB/s)
- 사용자 관점: 사용자가 직접 제어하거나 분할할 수 없으며, 하드웨어 레벨에서 자동 관리됨
2. XDMA 논리 레이어: 전송 엔진 채널
- 위치: FPGA 내부의 XDMA IP 코어
- 구성: 별도의 DMA 엔진으로 구성된 논리적 채널 (예: 4개의 H2C + 4개의 C2H)
- 기능:
- 병렬 전송 가능 (예: 영상 데이터와 제어 신호 동시 처리)
- 우선 순위 격리 (고속 데이터 흐름이 저속 제어 신호를 방해하지 않도록)
- 응용 프로그램에서 개별 채널을 파일 디바이스로 접근 가능 (예: /dev/xdma0_h2c1)
- 설정 방법: Vivado에서 IP 커스터마이징 시 채널 수 지정
3. FPGA 응용 레이어: 스트림 인터페이스
- 위치: 사용자 설계 모듈 내부
- 구성: AXI4-Stream 또는 사용자 정의 프로토콜 기반의 데이터 흐름 인터페이스
- 기능:
- XDMA 채널과 실제 처리 모듈 연결 (예: H2C0 → 비디오 인코더)
- 프로토콜 변환 (AXI4-Stream ↔ 사용자 정의 버스)
- 코드 예시:
[XDMA IP] --AXI4-Stream--> [Video Processing Module] --AXI4-Stream--> [XDMA IP] Channel H2C0 │ Channel C2H0 └─> [Control via AXI4-Lite]
계층 간 연계 구조
graph LR
A[PCIe Physical Lanes
x1/x4/x8/x16] -->|물리 대역폭 제공| B(XDMA IP in FPGA) B -->|논리적 채널 생성| C[Logical DMA Channels
H2C0, H2C1, C2H0, C2H1] C -->|인터페이스 바인딩| D[FPGA User Stream Interfaces
AXI4-Stream/Custom] D -->|모듈 연결| E[User Logic Modules
AI Accelerator, Video Pipeline]
x1/x4/x8/x16] -->|물리 대역폭 제공| B(XDMA IP in FPGA) B -->|논리적 채널 생성| C[Logical DMA Channels
H2C0, H2C1, C2H0, C2H1] C -->|인터페이스 바인딩| D[FPGA User Stream Interfaces
AXI4-Stream/Custom] D -->|모듈 연결| E[User Logic Modules
AI Accelerator, Video Pipeline]
핵심 사항 정리
- 물리 채널: PCIe 레인은 기초 대역폭을 제공하나, 사용자는 직접 조작 불가
- 논리 채널: XDMA IP 내부의 병렬 전송 엔진. 가장 직접적으로 조작되는 채널 유형
- 스트림 채널: FPGA 사용자 로직에서 정의된 데이터 경로. 실제 기능 수행에 연결됨
실제 적용 사례: 4K 영상 처리 가속
- PCIe 링크: x8, 16 GB/s 대역폭 확보
- XDMA 설정:
- H2C0: 원본 영상 입력 (약 12 Gbps)
- C2H0: 처리 결과 출력
- H2C1/C2H1: 제어 및 상태 정보 전달 (저대역폭)
- FPGA 로직:
- H2C0 → 영상 입력 스트림
- C2H0 → 출력 스트림
- H2C1/C2H1 → 레지스터 제어
설정 및 사용 방법
- FPGA 측 (Vivado):
- XDMA IP에서 채널 수 설정 (예: 4 H2C, 4 C2H)
- 각 채널의 AXI4-Stream 포트를 사용자 모듈에 연결
- 호스트 측 (Linux):
- 드라이버 자동 생성:
/dev/xdma0_h2c2,/dev/xdma0_c2h1 - 독립적인 입출력 수행:
// H2C 채널 2에 데이터 전송 write(fd_h2c2, data_buffer, size); // C2H 채널 1에서 데이터 수신 read(fd_c2h1, result_buffer, size);
- 드라이버 자동 생성:
결론
채널은 XDMA IP라는 중앙 집중적 논리 코어를 통해 구현되며, 물리적 대역폭을 활용하고, 사용자 로직에 병렬 데이터 흐름을 제공한다. 성능 최적화를 위해서는 모든 계층의 상호작용을 이해하고, 적절한 채널 배분과 리소스 할당이 필요하다.
추천 전략:
- 고속 데이터 흐름 → 별도 채널 할당 (예: 영상, 센서 데이터)
- 제어/상태 정보 → 공유 채널 또는 경량 채널 사용
- 채널 수는 PCIe 대역폭과 균형 잡기 → 과다 설정 시 리소스 경쟁 발생 가능성