VisualApplets 기본 사항#
본 문서의 소개 및 목적#
핵심 용어
이 튜토리얼 전체에서 핵심 용어(Key Terms)로 표시된 상자는 아직 용어에 익숙하지 않은 독자를 위해 일반적인 용어를 설명합니다.
VisualApplets은 PC에서 사용하는 디자인 도구입니다. FPGA는 프레임 그래버의 칩입니다. VisualApplets에서 파이프라인을 그리며, 빌드를 통해 해당 파이프라인을 FPGA 상의 하드웨어로 구성합니다. 카메라 데이터는 VisualApplets 편집기가 아니라 프레임 그래버에서 처리됩니다.
기본 디자인 개념#
VisualApplets을 사용하면 VHDL이나 Verilog 같은 하드웨어 기술 언어로 코드를 작성하지 않고도 FPGA 기반의 프로그래머블 하드웨어에서 이미지 처리 기능을 생성할 수 있습니다. 라이브러리 연산자를 사용하여 그래픽 방식으로 디자인을 구축하고, 이미지 데이터가 정의된 경로를 따라 흐르도록 이들을 연결합니다.

또한 Python 및 Tcl 스크립팅 언어를 사용하여 디자인을 생성하고 편집할 수 있습니다.
프로그래머블 프레임 그래버에서는 카메라 또는 기타 이미지 소스가 획득 경로로 연속적인 픽셀 스트림을 전달하고, 해당 보드의 FPGA가 그 스트림을 처리합니다. 구축한 결과물은 CPU처럼 FPGA가 가져와서 실행하는 프로그램이 아닙니다. 대신 빌드가 파이프라인 구조와 일치하는 전용 디지털 회로를 FPGA 상에 구성합니다.
PC에서 VisualApplets 디자인(연산자, 모듈, *.vad 파일 내의 링크)을 생성하고 편집합니다. 그런 다음 빌드 단계를 거쳐 해당 파이프라인을 하드웨어 로직으로 변환합니다.

이러한 VisualApplets 디자인에서는 연산자 라이브러리에서 연산자를 인스턴스화하며, 디자인 내 연산자의 각 인스턴스를 모듈이라고 합니다. 모듈은 링크로 연결되며, 처리 순서는 이러한 모듈을 배열하고 연결하는 방법에 따라 결정됩니다. 모듈과 링크가 함께 모여 픽셀 데이터가 획득, 처리 및 출력 단계를 거치는 방식을 정의하는 이미지 처리 파이프라인을 형성합니다.
이 튜토리얼에서 런타임에 모듈이 데이터를 처리, 버퍼링, 차단 또는 전송한다고 언급할 때는 해당 모듈에서 생성된 FPGA 로직을 가리키는 것입니다. VisualApplets의 그래픽 모듈은 해당 하드웨어 동작을 설명할 뿐이며, 모듈 자체가 런타임 카메라 데이터를 직접 처리하는 것은 아닙니다.
편집 가능한 디자인을 *.vad 파일로 저장합니다. 특정 대상 프레임 그래버용 디자인을 빌드하면 VisualApplets은 확장자가 *.hap인 바이너리 하드웨어 어플릿 파일을 생성합니다. 이 파일을 프레임 그래버에 로드합니다. *.hap 파일을 편집 가능한 디자인 소스로 취급하지 마십시오. 디자인 변경은 항상 *.vad에서 수행하고 다시 빌드해야 합니다. 런타임 중에도 애플리케이션이나 런타임 도구가 장치에 쓰는 동적 쓰기 매개변수는 변경할 수 있습니다.
실제 목적은 하드웨어에서의 실시간 이미지 처리입니다. 파이프라인을 PC에서 *.vad 프로젝트로 편집하고 검증하는 동안, 빌드된 *.hap만이 해당 처리 로직과 데이터 흐름 구조를 실행 가능한 하드웨어로서 FPGA에 전달합니다.
핵심 용어
빌드란 VisualApplets의 그래픽 디자인을 프레임 그래버 FPGA가 실행할 수 있는 구성으로 변환하는 것을 의미합니다.
파일 확장자가 *.hap인 하드웨어 어플릿이 바로 이 실행 가능한 결과물입니다.
프레임 그래버는 카메라 데이터를 수신하고, FPGA를 탑재하며, 빌드한 어플릿을 실행하는 컴퓨터 내의 확장 보드입니다. VisualApplets 자체에는 FPGA가 포함되어 있지 않습니다.
FPGA 기술#
필드 프로그래머블 게이트 어레이(FPGA)는 수많은 프로그래머블 로직 소자를 포함하는 칩입니다. 이러한 소자와 칩 내 라우팅을 구성하여 많은 연산을 병렬로 수행하는 복잡한 디지털 회로를 하드웨어로 구현할 수 있습니다.
대상 프레임 그래버용 VisualApplets 디자인을 빌드하면 VisualApplets이 연산자와 링크를 FPGA 로직에 자동으로 매핑합니다. 사용자가 직접 이 매핑을 구현할 필요는 없습니다. VisualApplets은 배치, 라우팅 및 비트스트림 생성을 위해 공급업체별 FPGA 툴체인(일반적으로 Xilinx Vivado)을 처리합니다. PC의 *.vad 프로젝트가 FPGA를 구성하는 *.hap과 어떻게 연관되는지에 대해서는 기본 디자인 개념을 참조하십시오.
조합 회로를 구축하는 데 주로 사용되는 프로그래머블 로직 소자 외에도, FPGA는 클럭 제어 스토리지용 플립플롭, 라인 버퍼 및 기타 온칩 메모리용 블록 RAM, 그리고 빠른 곱셈-누산 및 유사 기능을 위한 DSP 또는 Arithmetic 슬라이스를 제공합니다. 동일한 자동 빌드 흐름의 일부로서 VisualApplets은 연산자와 링크를 이러한 리소스에 매핑합니다. 디자인의 각 연산자는 로직, 메모리, Arithmetic 또는 이들의 조합과 같은 구체적인 하드웨어에 해당합니다.
디자인에 필요한 FPGA 리소스는 사용하는 모듈 수, 선택한 연산자, 그리고 Parallelism, 버퍼 크기 및 기타 매개변수를 설정한 방법에 따라 달라집니다. 로직, 메모리 또는 병렬 데이터 경로를 더 많이 사용할수록 소비량이 증가합니다. 디자인이 장치가 구현할 수 있는 범위를 초과하면 빌드가 실패하거나 타이밍 클로저를 달성하지 못할 수 있습니다. VisualApplets은 디자인 규칙 검사 레벨 2(DRC Level 2)를 실행할 때 FPGA 리소스 소비량을 예상하고 보고합니다. 사용자 설명서의 FPGA 리소스 예상 및 디자인 규칙 검사를 참조하십시오. 소비량이 늘어나는 방식, 적용되는 규칙, 디자인 선택 간의 절대적 균형에 대한 자세한 설명은 Parallelism 튜토리얼 항목과 메모리 소자 튜토리얼 항목도 참조하십시오.
하드웨어에서의 파이프라인 실행#
프레임 그래버에서 빌드된 하드웨어 어플릿은 파이프라인화된 하드웨어 경로로 디자인을 구현합니다. 즉, 픽셀 데이터가 연속적인 흐름 속에서 연결된 연산자 단계를 거쳐 이동합니다.
VisualApplets에서 작성하는 파이프라인은 FPGA의 하드웨어 경로를 모델링한 것입니다. FPGA는 데이터를 단계별로 처리하고 연속적인 흐름으로 다음 단계에 전달합니다. 이 설계 방식은 파이프라인이 경로상의 모든 단계에서 전체 이미지를 저장한다고 가정하지 않습니다. 생성된 FPGA 파이프라인은 Pipeline Concept 튜토리얼 주제에서 자세히 설명하는 바와 같이, 이 파이프라인 모델에 따라 클록 주기에 맞춰 단계별로 데이터를 전송합니다.

메모리를 통해 대용량 데이터 블록을 이동시키고 주로 순차적으로 명령어를 실행하는 일반적인 CPU 워크플로와 달리, FPGA는 파이프라인을 따라 데이터를 픽셀 단위로 병렬 처리하고 전송할 수 있습니다. 프로그램 제어 하에 데이터를 대상으로 수많은 스레드를 실행하는 GPU와 비교할 때, FPGA 파이프라인은 고정된 컨베이어 벨트에 가깝습니다. 데이터는 사용자가 설계에서 배선한 처리 단계를 통과하며 이동합니다. 문서에서 파이프라인이라는 비유를 자주 사용하는 이유가 바로 여기에 있습니다.
핵심 용어
- FPGA는 프레임 그래버 상의 칩으로 생각할 수 있으며, 여기서 VisualApplets에서 설계한 경로를 따라 수많은 소형 연산이 동시에 실행됩니다. 빌드는 해당 설계를 FPGA의 전용 하드웨어 로직으로 변환합니다. 그런 다음 픽셀 데이터는 컨베이어 벨트 위의 물품처럼 이러한 하드웨어 단계를 통과하여 흐르게 되는데, 이것이 바로 파이프라인 개념입니다.
- CPU는 일반적으로 단계를 하나씩 차례대로 처리하며 전체 데이터 청크를 빈번하게 로드하고 저장합니다.
- GPU는 프로그램 제어 하에 많은 픽셀 또는 스레드에서 동일한 종류의 연산을 병렬로 실행합니다.
클럭 사이클 및 타이밍#
FPGA 설계는 각 파이프라인 단계에 데이터를 캡처, 전송 및 처리할 시기를 알려주는 클록 신호에 의존합니다. VisualApplets과 이 튜토리얼에서는 이 클록을 Base Design Clock이라고 부릅니다. 이는 생성된 FPGA 파이프라인의 클록이며, 카메라 픽셀 클록과는 다릅니다. 클록 주기란 Base Design Clock의 한 틱(tick)을 의미합니다. 클록의 상승 에지마다 파이프라인의 플립플롭이 입력 데이터를 저장하고 다음 단계로 전달합니다.
따라서 클록 주기는 다음과 같은 역할을 합니다.
- 파이프라인 내의 레지스터와 같은 모든 요소의 타이밍을 정의합니다.
- 값은 예측 가능한 클록 에지에서만 다음 단계로 이동하므로 안정적인 데이터 흐름을 보장합니다.
- 다음 주기 전에 레지스터 사이의 모든 조합 논리(combinational logic)가 올바르게 안정화될 수 있도록 Base Design Clock 주파수가 충분히 낮아야 하므로 최대 처리 속도를 결정합니다.
즉, 클록 리듬을 통해 전체 하드웨어 파이프라인이 정렬된 상태를 유지합니다. 개별 오퍼레이터 역시 파이프라인화되어 있습니다. 빌드는 각 오퍼레이터에 내부 레지스터 단계를 구현하므로, 단일 입력에 대해 결과가 출력에 나타나기까지 여러 주기가 소요되는 경우에도 FPGA 단계는 매 클록 주기마다 새로운 입력을 받을 수 있습니다. 파이프라인이 채워진 후에는 특정 입력에서 결과가 나오기까지의 지연(latency)이 1주기를 초과할 수 있더라도, 출력에서의 처리량(throughput)은 여전히 주기당 1개의 결과를 유지할 수 있습니다. 이것이 바로 빌드 중에 수행되는 파이프라인화 및 리소스 매핑이 달성 가능한 Base Design Clock 주파수와 처리량에 직접적인 영향을 미치는 이유입니다.
정보
프레임 그래버의 Base Design Clock 주파수 및 기타 하드웨어 리소스 정보는 Device Resources에서 확인할 수 있습니다.
관련 항목#
- From Empty Design to Running Applet 튜토리얼 주제 — 설계, DRC, 시뮬레이션 및 빌드
- Pipeline Concept 튜토리얼 주제 — 파이프라인을 통한 데이터 이동 방식
- Parallelism 튜토리얼 주제 — 대역폭, 클록 및 FPGA 리소스
- Memory Elements 튜토리얼 주제 — FPGA 메모리 및 프레임 그래버 DRAM
- Device Resources — Base Design Clock 및 플랫폼 리소스
- 사용 설명서의 Design Rules Check — DRC Level 1 및 Level 2