파이프라인 개념#
공식적인 데이터 흐름 모델은 사용자 매뉴얼의 데이터 흐름을 참조하십시오. 디자인을 처음부터 끝까지 빌드하고 검증하는 방법에 대해서는 빈 디자인에서 실행 중인 앱릿까지 튜토리얼 항목을 참조하십시오.
모듈, 링크 및 파이프라인 구조#
VisualApplets 디자인은 연산자 라이브러리의 연산자(operators)를 사용하여 빌드합니다. 배치된 각 연산자 인스턴스는 모듈(module)입니다. 모듈에는 입력 및 출력 포트가 노출됩니다. 링크(links)를 사용하여 포트를 연결합니다. 다이어그램에는 각 링크가 화살표로 표시됩니다.
VisualApplets 디자인의 모듈과 링크는 함께 이미지 처리 파이프라인(pipeline)을 형성합니다. 빌드를 통해 해당 그래프가 프레임 그래버 FPGA의 하드웨어 단계로 구현됩니다. 처리 순서는 연결 순서를 따릅니다. 분기(Branch)와 병합(Merge)은 그래프에서 병렬 경로와 통합 지점을 정의합니다.

각 모듈은 입력 데이터를 사용할 수 있게 되는 즉시 처리를 시작합니다. 계산이 완료되고 출력이 차단되지 않은 경우 결과는 출력 링크로 전달됩니다. 런타임 시 이 동작은 VisualApplets의 그래픽 기호가 아니라 모듈에서 생성된 FPGA 로직에 의해 구현됩니다. 따라서 파이프라인 구조는 데이터가 분할되는 위치, 통합되는 위치, 그리고 어떤 연산자가 직렬 또는 병렬로 실행되는지를 정의합니다.
픽셀은 한 번에 완성된 이미지 형태로 프레임 그래버에 유입되지 않습니다. 카메라는 획득 경로로 픽셀을 차례대로 전송하거나, 앱릿 내부의 이미지 소스가 픽셀을 차례대로 생성합니다. 그런 다음 해당 픽셀은 동일한 순차적 순서로 파이프라인 단계를 거쳐 지나갑니다.

핵심 용어
픽셀을 도로 위의 자동차라고 생각해보세요. 자동차들은 경로를 따라 서로 뒤따라 이동합니다. 어느 순간이든 서로 다른 자동차(픽셀)가 도로(파이프라인 단계)의 서로 다른 위치에 있게 됩니다. 도로 자체는 VisualApplets 디자인에서 배선한 파이프라인 구조입니다. 빌드 후 그 도로는 VisualApplets 편집기 내부의 경로가 아니라 프레임 그래버 FPGA상의 하드웨어가 됩니다.
이 비유에서 Parallelism은 도로의 차선 수와 같습니다. 차선이 많을수록 더 많은 자동차(픽셀)가 동시에 앞으로 이동할 수 있습니다.
파이프라인 입력 및 출력#
모든 파이프라인에는 디자인으로 데이터를 공급하는 소스(source)가 하나 이상 있으며, FPGA 처리 경로를 벗어나는 하나 이상의 싱크(sink)가 있습니다. 소스와 싱크는 대개 M 타입 연산자입니다. 사용 가능한 연산자는 대상 하드웨어 플랫폼에 따라 다릅니다.
Inputs#
데이터는 다음과 같은 방식으로 파이프라인에 유입될 수 있습니다.
- 카메라 또는 기타 이미지 소스에서: 플랫폼별 카메라 연산자가 연결된 카메라의 연속 픽셀 스트림을 획득 경로로 전달합니다.
- 앱릿 내부에서 생성됨: 다음과 같은 연산자
CreateBlankImage또는CoefficientBuffer실제 카메라 없이 이미지 데이터를 생성하거나 재생합니다. 이러한 소스는 Test Patterns, 호스트에서 업로드된 참조 데이터, 또는 카메라에서 획득하지 않는 디자인에 사용합니다.
신호 경로는 디지털 입력(예: GPI) 또는 앱릿 내부 신호 생성기에서 시작될 수도 있습니다. 흐름 제어 시 카메라 소스가 중지 가능한 앱릿 내부 소스와 어떻게 다른지에 대해서는 다음을 참조하십시오. 중지 가능 및 중지 불가능 데이터 스트림 튜토리얼 항목.
Outputs#
처리된 결과는 다음 방식으로 파이프라인을 벗어날 수 있습니다.
- 호스트로의 DMA:
DmaToPC오퍼레이터는 직접 메모리 액세스를 통해 이미지 데이터를 호스트 PC 메모리로 전송합니다. 이는 호스트 소프트웨어에서 처리된 이미지를 획득하는 일반적인 경로입니다. - GPO를 통한 신호:
GPO오퍼레이터는 프레임 그래버의 디지털 출력 핀을 제어합니다. 호스트 PC 외부에 트리거, 상태 또는 기타 하드웨어 제어 신호가 필요한 경우 이 경로를 사용하십시오. - 호스트로의 이벤트:
EventToHost및EventDataToHost오퍼레이터는 소프트웨어 이벤트를 호스트로 전송합니다. 호스트 응용 프로그램은 Framegrabber API를 통해 이를 수신하고 앱릿의 조건에 대응할 수 있습니다.EventToHost신호 입력의 상승 에지에서 페이로드 없이 이벤트를 발생시킵니다.EventDataToHost구성 가능한 데이터 페이로드와 함께 이벤트를 발생시킵니다. - 레지스터 정보 전용: 일부 결과는 읽을 수 있는 값으로 프레임 그래버에 유지됩니다. 다음과 같은 오퍼레이터는
GetStatus호스트 소프트웨어가 동적 파라미터로 읽어오는 값을 저장합니다. 응용 프로그램에 상태 또는 측정 수치만 필요한 경우 이미지 스트림이나 DMA 전송이 필요하지 않습니다.
디자인에서 이러한 출력을 여러 개 결합할 수 있습니다. 예를 들어 한 분기는 DmaToPC 을(를) 통해 이미지를 전송하고, GPO 다른 분기는 조건이 발생할 때 핀을 어설트하거나 호스트 이벤트를 발생시킵니다.
오퍼레이터에 대한 자세한 내용은 오퍼레이터 레퍼런스의 DmaToPC, 오퍼레이터 레퍼런스의 GPO, 오퍼레이터 레퍼런스의 EventToHost, 오퍼레이터 레퍼런스의 EventDataToHost 및 오퍼레이터 레퍼런스의 GetStatus를 참조하십시오.
버퍼링되지 않는 파이프라인 흐름#
대부분의 모듈은 내부적으로 전체 이미지를 저장하지 않습니다. 정보가 준비되는 즉시 출력 값을 계산하고 전달합니다.
모든 오퍼레이터가 입력에 데이터가 도착하는 즉시 결과를 출력하는 것은 아닙니다. M-type 특히 오퍼레이터는 출력을 지연시킬 수 있습니다. 이는 다음과 같은 버퍼 오퍼레이터뿐만 아니라 LineBuffer 또는 ImageFifo — 많은 필터 및 동기화 오퍼레이터도 M형에 해당합니다. 지연 시간의 크기는 오퍼레이터에 따라 다릅니다. 자세한 내용은 Operator 유형 및 Synchronization 튜토리얼 항목과 Latency 튜토리얼 항목.
버퍼 오퍼레이터는 다운스트림 모듈이 데이터를 받을 수 있을 때까지 데이터를 저장합니다.
이러한 비버퍼링 동작은 지연 시간을 낮게 유지합니다. 픽셀은 동일한 프레임의 다른 픽셀이 아직 카메라 입력 단계에 있는 동안에도 출력에 도달할 수 있습니다. 획득, 처리 및 DMA는 시간에 따라 중첩될 수 있습니다.
핵심 용어
생성된 FPGA 파이프라인을 가지와 밸브가 있는 파이프 시스템으로 생각해보세요. 공간이 확보되는 즉시 물이 파이프를 통해 흐릅니다. 버퍼 오퍼레이터는 배출 속도가 따라가지 못할 때 채워지는 작은 저수지와 같습니다.
경로를 따라 레이턴시가 누적되는 방식과 대역폭 및 레이턴시의 차이에 대해서는 Latency 튜토리얼 항목을 참조하십시오.
하드웨어에서의 동시 처리#
프레임 그래버 FPGA에서는 모든 파이프라인 단계가 동시에(at the same time) 실행됩니다. 이는 명령어를 주로 순차적으로 실행하는 일반적인 CPU 프로그램과 다릅니다.
하나의 FPGA 모듈이 픽셀을 처리하는 동안 다른 모듈들은 경로 상의 다른 픽셀들을 처리합니다. 파이프라인이 채워진 후에는 여러 모듈이 동일한 이미지에 대해 동시에 작업합니다. FPGA는 파이프라인 그래프와 일치하는 구조를 가진 전용 하드웨어로 VisualApplets 디자인을 구현합니다.
핵심 용어
VisualApplets 디자인에서 생성된 FPGA 하드웨어에서 처리 경로는 프레임 그래버의 전용 하드웨어 로직으로 구현됩니다. 데이터는 컨베이어 벨트 위의 물품처럼 이러한 하드웨어 단계를 통과합니다. CPU는 대개 데이터의 전체 청크를 로드하고 순서대로 단계를 거쳐 작업합니다.
빌드된 앱렛과 편집 가능한 *.vad 디자인의 관계에 대한 자세한 내용은 VisualApplets Fundamentals 튜토리얼 항목을 참조하십시오.
처리량 및 병목 현상#
Throughput은 파이프라인을 통과하는 지속적인 데이터 속도입니다. VisualApplets 디자인에서는 생성된 FPGA 하드웨어의 링크에 있는 bandwidth와 밀접하게 관련되어 있습니다.
디자인의 오퍼레이터 수가 Throughput을 감소시키지 않습니다. 생성된 모든 FPGA 단계는 병렬로 실행될 수 있습니다. 병렬 분기 수 역시 Throughput을 감소시키지 않습니다. 분기는 하드웨어 리소스를 추가하지만, 그 자체로 개별 경로의 데이터 속도를 느리게 만들지는 않습니다. 다음 두 가지 디자인에서 볼 수 있듯이, 두 개의 취득 경로는 다른 수의 오퍼레이터를 사용하고도 동일한 Throughput을 제공할 수 있습니다.

Throughput은 다음 요소들에 따라 달라집니다.
- Link capacity: 모듈 간 연결이 전송할 수 있는 데이터 양입니다. 용량은 Base Design Clock과 함께 모듈 및 링크의 매개변수화(parameterization), 특히 Parallelism, Bit Width, maximum image dimensions에 의해 설정됩니다. 링크 및 모듈 속성에 대한 자세한 내용은 Parameterization 튜토리얼 항목을 참조하십시오.
- Downstream readiness: 모듈이 데이터를 연속적으로 수용할 수 있는지 여부입니다. 예를 들어 버퍼가 가득 찼거나 후속 모듈이 차단되어 모듈이 데이터를 영구적으로 받을 수 없는 경우, 흐름 제어가 스트림을 중지시켜 blocking 및/또는 backpressure를 유발합니다.
- Operator limits: 일부 오퍼레이터는 입력 링크가 제공하는 전체 대역폭을 처리할 수 없습니다. Operator Reference에는 영향을 받는 각 오퍼레이터에 대한 이러한 제한 사항이 문서화되어 있습니다.
픽셀 레이트(초당 픽셀 수)로서 링크의 bandwidth는 다음 공식을 따릅니다.
Bandwidth = parallelism × Base Design Clock
이 픽셀 레이트 공식에는 Bit Width나 커널 크기가 포함되지 않습니다. Bit Width가 넓거나 커널이 클수록 클록당 데이터 양(비트 또는 값)이 증가하며, 이는 DRAM 액세스 및 FPGA 리소스에 중요하지만 이 픽셀 레이트 수치는 변경하지 않습니다. DRAM 데이터 너비에 대해서는 Memory Elements 튜토리얼 항목을 참조하십시오. 커널 대 픽셀 레이트 대역폭에 대한 내용은 Working with Kernels 튜토리얼 항목을 참조하십시오.
Base Design Clock은 프레임 그래버 플랫폼에 따라 다릅니다. Device Resources에서 값을 확인하십시오.
최대 이미지 치수 역시 이 픽셀 레이트 공식에 나타나지 않지만 여전히 디자인을 형성합니다. 즉, 파이프라인이 처리할 수 있는 이미지 크기를 제한합니다. Parallelism 및 Bit Width와 함께 이러한 링크 속성은 카메라 또는 라인 스캔 소스와 일치해야 합니다.
경로의 bottleneck은 해당 경로에서 가장 낮은 대역폭입니다. 디자인의 전체 Throughput은 항상 이 가장 좁은 지점에 의해 제한됩니다. 하나의 좁은 링크 또는 대역폭이 제한된 하나의 오퍼레이터는 동일한 경로상에서 그보다 상위에 있는 모든 항목의 Throughput을 제한합니다. 따라서 Throughput은 경로상의 가장 좁은 대역폭과 다운스트림 모듈이 데이터를 연속적으로 수용하는지 여부에 의해 결정됩니다.
설계 지침
Parallelism 및 링크 속성은 카메라 또는 라인 스캔 소스에 필요한 속도를 지원하는 데 필요한 만큼만 높게 구성하십시오. 이러한 값을 더 높이면 추가 FPGA 리소스가 소비되며, 다른 구성 요소가 이미 병목 현상을 일으키고 있는 경우 Throughput이 향상되지 않습니다.
일부 오퍼레이터는 입력과 출력 간의 Parallelism을 변경합니다. 다른 오퍼레이터는 예를 들어 이미지를 자르는(cropping) 방식으로 픽셀 수를 줄입니다. 결과적으로 필요한 출력 대역폭이 입력 대역폭과 다를 수 있습니다. 가능한 경우 오퍼레이터는 Parallelism을 자동으로 조정합니다. 조정이 불가능한 경우 VisualApplets은 Design Rules Check 오류를 보고합니다.
디자인에 필요한 대역폭을 계산하는 방법과 오퍼레이터가 스트림을 병합할 때 대역폭 병목 현상을 해결하는 방법을 포함하여 Parallelism 계산 및 조정에 대한 정보는 Parallelism 튜토리얼 항목과 Troubleshooting Bottlenecks 튜토리얼 항목을 참조하십시오.
디자인에서 처리량 시각화하기#
Link Info 및 Throughput 플래그를 사용하여 설계에서 Parallelism과 데이터 처리량을 시각적으로 확인할 수 있습니다. 툴바에서 다음 버튼을 사용하여 이러한 플래그를 활성화하십시오.

결과적으로 설계에 Link Info 및 Throughput 플래그가 표시됩니다.

가장 좁은 링크를 찾으려면 경로를 따라 값들을 비교하십시오. 후속 오퍼레이터가 속도를 따라가지 못하는 경우가 아니라면, 해당 링크가 해당 경로의 병목 현상입니다.
정보
Throughput 플래그가 모든 성능 제한을 보여주는 것은 아닙니다. 예를 들어 여러 DRAM 오퍼레이터가 동일한 메모리 인터페이스를 공유하는 경우, Shared Memory로 인한 결과 DRAM 대역폭 제한은 Throughput 표시에 반영되지 않습니다. 기타 DRAM inefficiencies뿐만 아니라 blocking 및 잠재적인 deadlocks도 표시되지 않습니다. Shared Memory 사용 및 DRAM 대역폭 계획에 대한 지침은 Memory Elements 튜토리얼 항목을 참조하십시오. 데드락에 대한 자세한 내용은 Operator Types and Synchronization 튜토리얼 항목을 참조하십시오.
링크 속성 및 이미지 형식#
Throughput과 데이터 형식은 link properties 및 module properties에 따라 다릅니다. 앞에서 다룬 용량 관련 속성(Parallelism, Bit Width, maximum image dimensions) 외에도, 기타 일반적인 속성에는 이미지 프로토콜 및 Color Format이 포함됩니다.
Link properties는 파이프라인을 통해 전파(propagate)됩니다. 많은 속성을 카메라 출력 링크나 초기 처리 단계에서 설정합니다. 이 속성은 오퍼레이터가 변경할 때까지 모든 다운스트림 링크에 적용됩니다. 모듈 매개변수는 연결된 링크의 링크 속성과 일치해야 합니다. 따라서 업스트림 링크의 변경 사항은 다른 오퍼레이터가 속성을 재설정할 때까지 그 뒤의 모든 오퍼레이터에 영향을 줍니다.
전체 링크 속성 및 전파 규칙 목록은 사용자 매뉴얼의 Parameterization 튜토리얼 항목 및 Rules of Links를 참조하십시오.
이미지 프로토콜(image protocol)은 링크의 데이터 스트림 구조를 정의합니다. VisualApplets는 다음과 같은 다양한 데이터 형식 / 스트림 포맷을 지원합니다.
| 프로토콜 | 일반적인 용도 |
|---|---|
VALT_IMAGE2D | 예를 들어 영역 스캔 카메라의 경우와 같이, 라인 끝 및 프레임 끝 마커가 있는 2차원 이미지입니다. 프레임 내의 라인은 길이가 다를 수 있습니다. |
VALT_LINE1D | 예를 들어 라인 스캔 카메라의 경우와 같이 끝이 없거나 연속적인 라인 데이터입니다. |
VALT_PIXEL0D | 이미지 차원 정보가 없는 비정형 연속 픽셀 스트림입니다. |
VALT_SIGNAL | 예를 들어 트리거 로직에서와 같이 모든 클럭 사이클에서 유효한 단일 비트 신호입니다. |
픽셀은 스캔 순서에 따라 파이프라인을 통과합니다. 즉, 라인 내에서는 왼쪽에서 오른쪽으로, 프레임 내에서는 위에서 아래로 이동합니다. 일부 카메라 소스는 다른 순서를 사용합니다. 소스가 이 규칙과 일치하지 않는 경우 적절한 연산자를 사용하여 순서를 수정하십시오.
이미지 프로토콜 및 픽셀 순서에 대한 자세한 내용은 사용자 매뉴얼의 Image Protocols, Image Dimensions and Data Structure를 참조하십시오.
소스가 흐름 제어(flow control) 하에서 일시 중지할 수 있는지 여부는 파이프라인 배선 방식에 영향을 미칩니다. 카메라 연산자는 중지 불가능한(non-stoppable) 소스입니다. 종종 이들 바로 뒤에 버퍼 연산자를 배치합니다. 자세한 내용은 아래의 Flow Control, Blocking, and Backpressure 및 Stoppable and Non-Stoppable Data Streams 튜토리얼 항목을 참조하십시오.
흐름 제어, 차단 및 역압(Backpressure)#
생성된 FPGA 파이프라인은 단계(stage) 간에 흐름 제어(flow control)를 적용합니다. 단계가 더 이상 데이터를 수용할 준비가 되지 않은 경우, 입력을 차단(block its input)할 수 있습니다. 즉, 업스트림 단계에 데이터 요청을 중지하고 업스트림 단계는 출력을 중지합니다. 이 차단은 배압(backpressure)으로 파이프라인을 거쳐 역방향으로 전파됩니다. M-타입 연산자만 입력을 차단할 수 있다는 점에 유의하십시오. VisualApplets의 그래픽 모듈은 이 하드웨어 동작을 설명할 뿐, 그 자체로 흐름 제어를 적용하지는 않습니다.
가령 DmaToPC 호스트 컴퓨터로 데이터를 충분히 빠르게 전송할 수 없습니다. 이 모듈은 수시로 입력을 차단합니다. 차단 신호는 업스트림의 버퍼 연산자로 전파됩니다. 버퍼는 차단이 활성화되어 있는 동안 데이터 전달을 중지합니다. 들어오는 픽셀을 저장하며 Fill 레벨이 상승합니다. 카메라가 데이터 전송을 중지하면 버퍼가 다시 비워집니다.

버퍼 연산자는 서로 다른 속도로 처리하는 단계를 분리합니다. 중지 불가능한 카메라 소스 뒤에 버퍼가 없으면, 다운스트림 모듈에 의한 차단으로 인해 카메라 스트림 속도를 느리게 할 수 없습니다. 결과적으로 디자인이 디자인 규칙 검사(Design Rules Check)에 실패하거나 하드웨어에서 교착 상태(deadlock)가 발생할 수 있습니다.
연산자 유형 및 O-타입, M-타입, P-타입 모듈에서 차단이 작동하는 방식에 대한 자세한 내용은 Operator Types and Synchronization 튜토리얼 항목을 참조하십시오.
핵심 용어
차단(Blocking)이란 후속 단계가 데이터를 수용하지 않거나 단계 내부 처리 시간이 더 오래 걸리기 때문에 생성된 FPGA 단계가 추가 입력 데이터를 수용할 수 없는 상태를 의미합니다. VisualApplets의 모듈 아이콘은 해당 단계를 나타내며, 아이콘 자체가 대기하거나 차단하는 것은 아닙니다.
배압(Backpressure)은 그 이면에 있는 메커니즘으로, "압력"이 역방향으로 작용합니다. 한 단계가 데이터를 충분히 빠르게 처리하지 못하면 업스트림 단계가 대기해야 하고 흐름이 차단됩니다. 실제로: 다운스트림 단계가 데이터를 수용할 수 없으므로(예: 버퍼가 가득 찬 경우) 업스트림 단계가 대기하게 됩니다.
이 항목에서 대역폭(Bandwidth)은 연결의 픽셀 레이트, 즉 링크를 통해 초당 전송되는 픽셀 수를 의미합니다. Bit width와 커널 크기는 각 픽셀이 전달하는 데이터 양을 변경하며, 이는 별개의 개념입니다. Parallelism 튜토리얼 항목을 참조하십시오.
관련 항목#
- 사용자 매뉴얼의 Data Flow — 공식 파이프라인 데이터 흐름 모델
- VisualApplets Fundamentals 튜토리얼 항목 — 디자인 대 하드웨어 어플릿
- From Empty Design to Running Applet 튜토리얼 주제 — 설계, DRC, 시뮬레이션 및 빌드
- Parallelism 튜토리얼 항목 — 대역폭 및 Parallelism
- Latency 튜토리얼 항목 — 파이프라인을 따라 발생하는 지연
- Parameterization 튜토리얼 항목 — 링크 속성 및 이미지 형식
- Stoppable and Non-Stoppable Data Streams 튜토리얼 항목 — 흐름 제어 및 카메라 소스
- Operator Types and Synchronization 튜토리얼 항목 — 연산자 유형 및 차단
- Operator 레퍼런스