Zybo Z7-10 보드에서 HDMI 입력 영상을 실시간으로 Sobel edge detection 처리한 뒤 HDMI 출력으로 전달하는 시스템을 구현하였습니다.
기존에는 AXI-DMA 및 AXI4-Stream 기반으로 이미지 데이터를 Sobel 연산하는 구조를 구현하였는데, 이번에는 HDMI 기반 실시간 영상 스트림에 직접 Sobel 연산을 적용해보는 것을 목표로 하였습니다.
Digilent HDMI demo를 기반으로 AXI4-Stream video pipeline 중간에 Sobel IP를 삽입하는 방식으로 구성하였습니다.
| 항목 | 내용 |
|---|---|
| Board | Zybo Z7-10 |
| HDL | Verilog |
| Tool | Vivado / Vitis |
| Terminal | TeraTerm |
| Input | PC RX(HDMI) |
| Output | Monitor TX(HDMI) |
| Resolution | 1280 × 720 |
Digilent에서 제공하는 Zybo Z7 HDMI demo 프로젝트를 실행하여 기본 HDMI 입출력이 정상적으로 동작하는지 확인하였습니다.
Vivado에서 bitstream 생성 후 Vitis에서 application을 실행하였고, TeraTerm의 UART menu를 통해 HDMI resolution 및 frame index를 제어하며 HDMI demo 동작을 확인하였습니다.
HDMI demo는 아래와 같은 흐름으로 동작하였습니다.
HDMI RX (PC)
→ dvi2rgb
→ v_vid_in_axi4s
→ AXI4-Stream Video Pipeline
→ rgb2dvi
→ HDMI TX (Monitor)
Block diagram

동작 사진

영상
최종 구조는 다음과 같이 구성하였습니다.
HDMI RX (PC)
→ dvi2rgb
→ v_vid_in_axi4s
→ RGB-to-Gray
→ Sobel
→ Gray-to-RGB
→ AXI4-Stream
→ rgb2dvi
→ HDMI TX (Monitor)
HDMI 입력 영상은 AXI4-Stream video 형태로 변환된 뒤 Sobel edge detection 연산을 수행하도록 구성하였습니다.
Block diagram

기존 Sobel IP는 grayscale 8-bit 데이터를 입력받아 처리하도록 설계하였지만, HDMI demo의 AXI4-Stream video 데이터는 RGB888 기반의 24-bit 데이터 형식으로 구성되어 있어 입력 데이터 폭이 서로 맞지 않았습니다.
따라서, RGB888 형식의 입력 데이터를 grayscale로 변환하기 위해 RGB-to-Gray 블록을 추가하였습니다.
AXI4-Stream video의 tdata[23:16]은 R, tdata[15:8]은 G, tdata[7:0]은 B 데이터를 의미하며, 이를 ITU-R BT.601 기반 grayscale 변환 방식으로 처리하였습니다.
| 항목 | Sobel IP | HDMI Video |
|---|---|---|
| Data Format | Gray 8-bit | RGB888 24-bit |
gray = (77 * R + 150 * G + 29 * B) >> 8; // ITU-R BT.601 표준 권장 가중치
또한 Sobel 출력 결과를 다시 HDMI 출력 형식에 맞추기 위해 Gray-to-RGB 블록을 추가하였습니다.
rgb = {gray, gray, gray};
초기 구현에서는 아래 사진의 vid_in_axi4s와 converter_in Block 사이에 Block 및 IP를 추가하였습니다.

추가한 이후,

※추가한 Block 및 IP
RGB-to-Gray → Sobel → Gray-to-RGB
이후 synthesis 및 implementation 결과 WNS = -3.5ns 로 Timing Violation이 발생하였습니다.

Timing report를 확인해보니 RGB-to-Gray 출력부터 Sobel line buffer 입력까지의 경로와,
Sobel 내부 연산 이후 output register까지의 경로가 critical path로 확인하였습니다.
1) RGB-to-Gray 연산 경로 → Sobel 입력/line buffer 경로
2) Sobel 내부 line buffer/window 값 → Gx/Gy, abs, magnitude, output register 경로
Combinational Logic depth 및 routing delay가 증가하면서 Negative Slack이 발생하여 이를 해결하기 위해 각 Block 내부를 pipeline 구조로 수정하였습니다.
1) RGB-to-Gray : 2-stage Pipeline
2) Sobel : 3-stage Pipeline
이후 Synthesis 및 Implementation 결과로 WNS = 0.454ns의 Positive Slack을 확인하였고 bitstream generate 수행하였음.

Timing 문제를 해결한 뒤 bitstream을 FPGA에 programming하여 실행해보니 Sobel 결과는 출력되었지만 화면이 겹쳐 보이는 문제가 발생하였습니다.

Sobel 내부 IMAGE_WIDTH parameter와 실제 HDMI resolution이 서로 다르게 설정되어 있는 것을 확인하였고, 동일한 크기인 1280으로 수정하였습니다.
parameter IMAGE_WIDTH = 1280;
수정 후 정상적으로 Sobel edge detection 영상이 출력되는 것을 확인하였습니다.

노트북 HDMI 출력 영상을 Zybo Z7-10 보드에서 입력받아 실시간 Sobel edge detection 결과가 Monitor에 정상 출력되는 것을 확인하였습니다.
HDMI 기반 실시간 Sobel edge detection 시스템을 구현하였습니다.
기존 HDMI demo를 기반으로 AXI4-Stream video pipeline 중간에 Sobel block을 삽입하였으며, RGB888 입력 데이터를 grayscale로 변환하는 block을 추가하였습니다.
초기 구현에서는 Combinational Logic 및 routing delay로 인해 timing violation이 발생하였고, pipeline 구조를 적용하여 timing closure를 만족시켰습니다.
또한 HDMI 입력 해상도와 Sobel 내부 line buffer width가 서로 맞지 않아 화면 겹침 현상이 발생하였고, IMAGE_WIDTH를 수정하여 문제를 해결하였습니다.
이를 통해 HDMI 기반 AXI4-Stream video pipeline 구조와 timing optimization, streaming image processing 구조를 직접 구현하고 확인할 수 있었습니다.
HDMI video pipeline 구조 및 timing issue를 분석하면서 정리한 메모입니다.



