2025.1학기에 수강했던 SoC프로그래밍 결과를 정리한 내용
대부분의 임베디드 시스템은 MCU만으로도 충분히 구현할 수 있다.
예를 들어, 단순한 C 코드를 실행하거나 외부 센서 데이터를 주기적으로 수집해 IoT 시스템을 구성하는 경우에는 굳이 FPGA와 같은 추가적인 하드웨어가 필요하지 않다.
하지만 고속 데이터 처리가 필요한 입출력(IO) 상황에서는 이야기가 달라진다.
예를 들어, 디스플레이에 실시간으로 화면을 출력하거나 카메라로부터 영상 데이터를 받아 처리하는 작업은 MCU로 구현하기 매우 어렵다.
그 이유는 크게 세 가지다.
- 카메라 데이터는 수십 MHz 이상의 픽셀 클럭으로 들어온다
- 한 프레임에 수십만~수백만 개의 픽셀이 연속적으로 들어온다
- 이 데이터를 한 클럭도 놓치지 않고 처리해야 한다
즉, MCU처럼 순차적으로 명령어를 실행하는 구조로는 이 데이터 흐름을 감당하기 어렵다.
(MCU의 동작 클락은 수십MHz에 불과하며, GPIO로 만드는 클락은 최대 주파수가 MHz에 불과함)
인터럽트나 DMA를 활용하더라도, 지속적인 고속 스트리밍 데이터 처리에는 한계가 존재한다.
그렇기 때문에, SoC를 사용해서 고속 클락이 필요한 하드웨어 로직은 PL에, 제어 및 HIGH LEVEL프로그램은 PS에 분리를 할 수 있다.
- PS: 제어, UI, high-level 로직 처리
- PL: 카메라 입력, 영상 처리 등 고속 데이터 스트리밍 처리
특히 AXI Bus를 통해 PS와 PL이 연결되면서,
낮은 레이턴시로 대용량 데이터를 주고받을 수 있는 구조를 만들 수 있다.
이러한 이유로,
단순한 임베디드 시스템이 아닌 SoC 기반 시스템 설계의 필요성을 느끼게 되었고,
프로젝트의 주제를 카메라 처리 시스템으로 설정하게 되었다.

https://github.com/hun7176/ZYNQ_smart_camera
GitHub - hun7176/ZYNQ_smart_camera: ZYNQ 기반 실시간 카메라구현, 다양한 필터를 적용
ZYNQ 기반 실시간 카메라구현, 다양한 필터를 적용. Contribute to hun7176/ZYNQ_smart_camera development by creating an account on GitHub.
github.com
기본적으로 통신 프로토콜이 가장 간단한 ov7670카메라를 사용했다.
OV7670은 SCCB 프로토콜을 사용하며, 이는 I2C프로토콜과 유사하다.

직접 설계한 IP는 OV7670 카메라 모듈을 입력으로 받는 카메라 인터페이스이다.
초기에는 AXI4-Lite 인터페이스를 통해 카메라 데이터를 레지스터에 저장하고 PS로 전달하는 구조를 고려하였다.
하지만 이 방식에는 명확한 한계가 있었다.
AXI4-Lite는 레지스터 기반 인터페이스이기 때문에,
데이터를 저장하기 위해서는 Flip-Flop(FF) 자원을 사용하게 된다.
카메라 데이터는 한 프레임 기준으로 수십만 개 이상의 픽셀을 포함하기 때문에,
이를 모두 레지스터로 저장하는 것은
- FPGA 자원(F/F)을 과도하게 소모하며
- 사실상 구현이 불가능한 수준이다
따라서 프레임 데이터를 저장하기 위한 구조로 BRAM(Block RAM)을 사용하는 방향으로 설계를 변경하였다.
카메라 데이터를 TFT에 출력하기 위한 전체 시스템 구조는 크게 두 가지로 나눌 수 있었다.
1. 카메라 + TFT를 하나의 모듈로 직접 연결하는 구조
이 방식은 구조가 단순하고 구현 난이도가 낮다.
- 카메라 입력 → 바로 TFT 출력
- 중간 저장 없이 streaming 방식
하지만 이 구조의 단점은 명확하다: 영상 데이터를 중간에서 처리할 수 없다
- 필터링
- 색상 변환
- 후처리
와 같은 연산을 수행하기 어렵다.
만약 처리를 추가하려면,
- Dual-port BRAM을 두고
- 한쪽은 TFT 출력
- 다른 한쪽은 PS 또는 추가 로직으로 보내는 구조
를 설계해야 한다.
2. 카메라 – PS – TFT로 분리하는 구조
두 번째 방식은 카메라 모듈과 TFT 모듈을 분리하고,
중간에 PS를 두어 데이터 흐름을 제어하는 구조이다.
이 경우 데이터 흐름은 다음과 같다:
- 카메라 → PL (BRAM 저장)
- PL → PS (AXI 인터페이스)
- PS → TFT 출력
이 구조의 장점은 다음과 같다:
- PS에서 영상 데이터 접근 가능
- 소프트웨어 기반 영상 처리 가능
- 확장성 높음 (필터, 분석, 저장 등)
본 프로젝트에서는 실시간 영상 처리 시스템 구현을 목표로 하였기 때문에
두 번째 구조를 선택하였다.
특히,
- 카메라 데이터는 PL에서 BRAM에 저장하고
- PS가 이를 읽어 처리한 뒤
- 다시 출력으로 전달하는 방식으로 설계하였다.
이 과정에서 PS와 PL 간의 데이터 전송은
AXI 프로토콜 기반으로 수행하였다.
(※ 단, AXI4-Lite는 제어용으로 사용하고, 실제 데이터 전송은 BRAM 기반 구조를 사용)

PS(Processing System) 입장에서 보면, PL로부터 데이터를 읽어오기 위한 인터페이스만 존재한다.
PS는 AXI의 Read Address Channel을 통해 읽고자 하는 주소를 PL로 전달하고, PL은 해당 주소에 대응하는 데이터를 반환하는 구조이다.
PL(Programmable Logic)에서는 다음과 같은 동작이 이루어진다:
- PS로부터 전달받은 주소값을 수신
- 해당 주소를 BRAM에 입력
- BRAM에서 데이터를 읽어옴
- 읽은 데이터를 AXI Read Data Channel을 통해 PS로 전달
하지만 이 과정에서 BRAM read latency 라는 중요한 문제가 있었다.
현재 설계에서는 BRAM의 크기가 크기 때문에
데이터를 읽어오기까지 약 2클럭의 latency가 발생하였다.
따라서 AXI handshake 타이밍을 그대로 사용할 경우
데이터가 준비되기 전에 전송이 이루어지는 문제가 발생한다.
이를 해결하기 위해,
- BRAM read latency를 고려하여
- AXI read data valid 신호를 2클럭 지연시키도록 설계하였고
- master–slave 간 handshake 타이밍을 맞추어
정상적으로 데이터를 전달할 수 있도록 구현하였다.
하지만 이 구조에는 근본적인 한계가 존재한다.
한 번에 한 픽셀씩 읽는 방식은 매우 비효율적이다
- 매 픽셀마다 AXI transaction 발생
- 프로토콜 오버헤드 증가
- 실시간 처리에 불리
일반적으로는 이러한 문제를 해결하기 위해
- DMA(Direct Memory Access)를 사용하여
- 시작 주소와 데이터 크기를 설정한 뒤
- burst 기반으로 데이터를 전송한다
이 방식이 훨씬 높은 대역폭을 제공한다.
하지만 이번 프로젝트에서는
- AXI4-Lite 기반으로 설계를 진행하였고
- AXI4-Stream + DMA 구조까지 확장하지는 않았다
이렇게 PS가 한 프레임의 데이터를 모두 수신하면, 이제 해당 데이터를 기반으로 영상 처리를 수행할 수 있다.
영상 처리 방식은 크게 두 가지로 나눌 수 있다.
1. 화소 처리 (Point Processing)
출력 픽셀 값이 오직 해당 입력 픽셀 하나에만 의존하는 방식이다.
예:
- 밝기 조절
- thresholding
- grayscale 변환
특징:
- 연산이 단순함
- 병렬화 쉬움
- 메모리 접근 부담 적음
2. 공간 필터링 (Spatial Filtering)
출력 픽셀 값이 주변 픽셀 값까지 함께 고려되는 방식이다.
대표적으로는 컨볼루션(convolution)이 있다.
예:
- blur filter
- edge detection
- sharpening
특징:
- 주변 픽셀 참조 필요 (window 연산)
- 메모리 접근 증가
- line buffer 등의 구조 필요

구현한 영상 필터는 다음과 같다.
- Edge Detection (엣지 검출)
- Blur Filter (블러)
Edge Detection
엣지 검출은 크게 1차 미분 기반 필터와 2차 미분 기반 필터로 나눌 수 있다.
1차 필터: Sobel Filter
Sobel 필터는 x축, y축 방향의 커널이 따로 존재하며, 각 방향에 대해 1차 미분 값을 계산하여 이미지의 경계를 검출한다.
- x 방향 변화량 (∂I/∂x)
- y 방향 변화량 (∂I/∂y)
특징:
- 방향성이 존재함
- 특정 방향의 edge에 강함 (수평 / 수직)
2차 필터: Laplacian Filter
Laplacian 필터는 2차 미분 기반 필터로, 방향성이 없이 모든 방향의 edge를 검출할 수 있다.
특징:
- isotropic (방향성 없음)
- 모든 방향의 경계에 대해 균일한 반응
본 프로젝트에서는 실시간 처리를 고려하여 Sobel 대신 Laplacian 필터를 선택하였다.
이유:
- x, y 방향 계산을 따로 할 필요 없음
- 연산 구조가 단순함
- 전체적으로 계산량이 더 적음
Blur Filter
블러 필터는 필터 계수의 합이 1이 되는 커널을 사용하여 컨볼루션을 수행한다.
이 연산을 통해:
- 고주파 성분(급격한 변화) 감소
- 저주파 성분(완만한 변화) 강조
- 결과:
- 이미지가 부드럽게 변함
- 노이즈 제거 효과
성능 문제와 해결
영상 필터링은 기본적으로
- 픽셀 단위 반복 연산
- 주변 픽셀 참조 (특히 convolution)
이기 때문에 연산량이 매우 크고 실시간 처리가 어려운 구조이다.
SIMD를 활용한 최적화
이를 해결하기 위해 SIMD(Single Instruction Multiple Data)를 적용하였다.
사용한 플랫폼인 Zynq의 ARM Cortex-A 계열 프로세서는
- Superscalar 구조
- Out-of-Order 실행
을 통해 ILP(Instruction Level Parallelism)를 활용할 수 있다.
하지만 영상 처리와 같은 데이터 병렬성(Data Parallelism)이 높은 작업에서는 SIMD가 훨씬 효과적이다
따라서 필터링 과정에서 반복되는 연산에 대해 <arm_neon.h> 라이브러리를 사용하여 NEON SIMD 연산으로 벡터화하였다.
예:
- 여러 픽셀을 한 번에 로드
- 동일 연산을 동시에 수행
결과
SIMD 적용을 통해 약 2 FPS 성능 향상을 달성할 수 있었다.
영상 처리에서는 ILP보다 데이터 병렬성을 활용하는 SIMD가 훨씬 효과적이었다.
https://youtu.be/xyjQMS_ZIwY?si=QyLX9EE0nNkCJS7o