'기본 원칙'에서는 연산자와 링크를 사용하여 FPGA 애플리케이션을 구축하는 VisualApplets의 개념에 대해 설명했습니다. 이 장에서는 FPGA 기반 데이터 처리에서 사용되는 데이터 흐름 모델을 설명합니다.
FPGA 구현은 마이크로프로세서(CPU)에서 실행되는 소프트웨어 프로그램과 다릅니다. CPU는 이미지가 완전히 전송된 후에야 처리를 시작할 수 있는 반면, FPGA는 이미지의 전송과 처리를 동시에 수행할 수 있습니다.
마이크로프로세서는 프로그램 명령어를 순차적으로 실행하는 반면, FPGA 구현의 모든 기능은 동시에(즉, 병렬로) 작동할 수 있습니다. 이는 매우 중요한 차이점이며 FPGA 구현의 엄청난 장점 중 하나입니다. 모든 작업이 병렬로 수행되므로 데이터는 파이프라인 구조로 처리됩니다. 모듈(즉, 인스턴스화된 연산자)은 링크로 연결됩니다. 각 모듈은 이미지 또는 신호 데이터를 사용할 수 있게 되는 즉시 처리를 시작합니다. 결과는 링크를 통해 다음 모듈로 전달됩니다. 대부분의 모듈은 입력 이미지 데이터를 버퍼링하지 않습니다. 정보가 준비되는 즉시 계산된 결과를 출력합니다. 디자인에서 데이터 전송은 다음과 같습니다.
디자인 내의 데이터 전송은 다음과 같이 설명됩니다.
이 프로젝트는 카메라, 버퍼, DMA 연산자의 세 가지 모듈로 구성됩니다. 카메라 연산자는 이미지 소스 모듈입니다. 카메라인지에서 전송된 이미지를 수신합니다. 전체 프레임을 수집하여 획득이 완료된 후에 이미지를 출력하는 대신, 이 모듈은 픽셀이 도착하는 즉시 다음 모듈로 전달합니다. 버퍼 모듈인 ImageBuffer는 이미지 데이터를 저장할 수 있지만 출력단이 차단되어 있지 않은 경우 사용 가능한 데이터를 즉시 출력하는 버퍼입니다. DMA 모듈은 이미지를 호스트 PC로 전송합니다.
이러한 파이프라인 구조의 결과로, 동일한 이미지의 다른 픽셀이 여전히 카메라에서 전송되는 동안에도 이미지 픽셀이 호스트 PC로 전송됩니다. 따라서 모듈 내부에 저장되는 이미지가 없습니다. 이 비버퍼링 파이프라인의 장점은 모든 모듈이 병렬로 실행되며 효율적으로 사용된다는 것입니다. 또한 지연 시간(픽셀이 완전히 처리될 때까지 걸리는 시간)이 최소화됩니다.
파이프라인 모델에 대한 실용적인 지침은 파이프라인 개념 튜토리얼 항목을 참조하세요. 파이프라인의 지연 시간 작업 방법은 지연 시간 튜토리얼 항목을 참조하세요.
![]() |
참고 |
|---|---|
|
모든 모듈은 병렬로 실행될 수 있으며 결과가 준비되고 출력이 차단되지 않는 즉시 결과를 출력한다는 점을 항상 명심하십시오. 파이프라인을 밸브, 분기, 좁고 넓은 관이 있는 수도관으로 상상해 보세요. |
마이크로프로세서 프로그램과 달리 연산의 수, 즉 연산자의 수는 모든 것이 병렬로 실행되므로 처리 속도에 영향을 미치지 않습니다. 그러나 앱들에 더 많은 연산자가 사용될수록 더 많은 하드웨어 리소스가 필요합니다.
앱들 프로세스는 해당 프로세스의 모든 DMA가 시작된 후에만 하드웨어에서 사용할 수 있습니다. 그러나 프로세스에 DMA 채널이 포함되어 있지 않은 경우 앱들 초기화 직후에 즉시 시작됩니다. 이는 이미지 획득이 시작되기 전에 사용되는 트리거 및 신호 처리 응용 프로그램에 유용합니다.
하드웨어에서 VisualApplets 앱들의 초기화 및 사용에 대해 자세히 알아보려면 '하드웨어에서 앱들 실행하기' 섹션 및/또는 Framegrabber SDK 문서를 참조하세요.
프로세스 간 이미지 데이터는 상호 교환할 수 없습니다. 그러나 TxSignalLinks 및 RxSignalLinks 연산자를 사용하면 신호에 대한 프로세스 간 통신을 설정할 수 있습니다.
앱들 내 파이프라인의 대역폭은 연산자의 처리 속도와 연결된 링크에 따라 달라집니다. 링크에는 여러 개의 “링크 속성”('링크 속성' 참조)이 있습니다. 그중 하나가 대역폭을 정의하는 Parallelism입니다. Parallelism은 하나의 디자인 클록 주기 동안 두 연산자 사이에서 병렬로 전송되는 픽셀 수를 정의합니다. Parallelism이 높을수록 대역폭이 높아집니다. 연산자는 링크의 필수 대역폭을 충족하도록 자동으로 조정되며, 이것이 불가능한 경우 대역폭을 재정의합니다. Parallelism에 대한 실용적인 지침은 Parallelism 튜토리얼 항목을 참조하세요.
간단한 예를 가정해 보겠습니다. Parallelism이 4이면 4개의 픽셀이 병렬로 전송됩니다. 즉, 이미지의 처음 4개의 연속된 픽셀이 카메라 모듈에서 후속 모듈(이 경우 버퍼)로 병렬 전송됩니다. 다음으로, 다음 4개의 픽셀이 카메라 모듈에서 버퍼 모듈로 전송됩니다. 그 동안 처음 4개의 픽셀은 버퍼 모듈에서 처리되어 이미지 처리 체인의 다음 모듈로 전달됩니다.
앞서 언급했듯이 Parallelism은 디자인 클록 주파수의 한 클록 주기에서 병렬로 전송되는 픽셀 수를 정의합니다. 주파수는 사용되는 하드웨어 장치에 따라 다릅니다. 예를 들어, microEnable IV 시리즈의 프레임 그래버는 62.5MHz의 디자인 클록 주파수를 사용합니다.
![]() |
대역폭 계산 |
|---|---|
|
링크의 대역폭 b는 Parallelism p와 주파수 f의 곱으로 결정됩니다. ![]() |
따라서 4의 Parallelism은 다음과 같은 대역폭을 초래합니다.
. 픽셀당 8 bit의 Bit Width를 가정하면 이는 250MB/s의 대역폭을 생성합니다. 모든 하드웨어 플랫폼의 기본 디자인 클럭 주파수 목록은 다음에서 확인할 수 있습니다. 장치 리소스.
오퍼레이터는 입력 링크와 출력 링크 간의 Parallelism을 변경할 수 있습니다. 따라서 대역폭은 디자인 전반에 걸쳐 일정하지 않습니다. 이는 필요한 대역폭이 변경될 수 있기 때문입니다. 오퍼레이터가 이미지 크기를 줄인다고 가정해 보겠습니다. 이 경우 필요한 출력 대역폭도 감소합니다.
위 공식으로 계산된 대역폭은 이론적인 값입니다. 실제 대역폭은 이론적 값보다 약간 낮습니다.
![]() |
중요 |
|---|---|
|
일부 오퍼레이터는 입력 링크에서 제공되는 전체 대역폭을 처리할 수 없습니다. 관련 오퍼레이터에 대한 자세한 내용은 Operator Reference에서 확인할 수 있습니다. |
대역폭과 지연 시간(latency)의 차이에 유의하십시오. 지연 시간은 각 오퍼레이터에 의해 개별적으로 정의되며 주로 알고리즘 구현에 따라 달라집니다.
![]() |
GUI에서의 시각화 |
|---|---|
|
해당 링크 속성을 시각화하기 위해 VisualApplets은 프로그램 창의 툴바에 두 개의 GUI 버튼을 제공합니다.
링크 정보 표시
![]()
링크 처리량 표시
![]()
|
앞서 설명한 바와 같이 VisualApplets에서는 픽셀이 파이프라인을 통해 차례대로 전송됩니다. 링크 Parallelism이 1보다 크면 여러 픽셀이 병렬로 전송됩니다. 이미지나 라인에서 픽셀 전송 순서는 다음과 같습니다. 일반적으로 프레임(2차원 이미지)의 픽셀은 카메라에서 왼쪽 상단 모서리의 첫 번째 픽셀부터 시작하여 오른쪽 하단 모서리의 마지막 픽셀로 끝나는 순서로 전송됩니다. VisualApplets 오퍼레이터가 처리를 위해 픽셀 위치를 필요로 하는 경우 왼쪽 -> 오른쪽, 위쪽 -> 아래쪽과 같은 동일한 순서가 예상됩니다. 다음 그림은 이 순서를 보여줍니다.
그러나 카메라와 같은 일부 소스는 이 순서를 따르지 않습니다. 이러한 경우 VisualApplets 오퍼레이터와 디자인을 사용하여 픽셀 순서를 수정할 수 있습니다. 이렇게 하려면 픽셀 전송 프로토콜에 대한 약간의 지식이 있어야 합니다. 관련 정보는 'Image Protocols, Image Dimensions and Data Structure' 섹션에서 확인할 수 있습니다.
Image Protocol은 전송된 픽셀 및 데이터의 이미지 차원과 데이터 구조를 정의합니다. Image Protocol은 앞서 언급한 링크 속성인 Parallelism 외에 또 다른 링크 속성입니다.
이미지 프로토콜에는 세 가지 유형이 있습니다.
-
“2D” VALT_IMAGE2D
2D 이미지 프로토콜은 이미지 전송에 사용되며, 주로 영역 스캔 카메라와 함께 사용됩니다. 링크는 정보를 전송합니다.
-
픽셀이 전송될 때(pixel valid signal)
-
라인이 완료될 때(end-of-line signal)
-
프레임이 완료될 때(end-of-frame signal)
따라서 2D 이미지는 다음을 가질 수 있습니다.
-
라인 내의 임의 개수의 픽셀
-
임의의 이미지 높이
라인 또는 행 내의 픽셀 위치 자체는 전송되지 않습니다. 위치는 이전 라인의 수와 현재 라인 내의 이전 픽셀 수로부터 도출됩니다. 라인 내의 픽셀 사이에 간격이 있는 것은 불가능합니다. 임의의 라인 길이는 가질 수 있습니다. 라인에 픽셀이 없을 수 있으며, 즉 빈 라인이 허용됩니다. 최소한 프레임은 하나의 빈 라인으로 구성되어야 합니다.
-
-
“1D” VALT_LINE1D
1D 이미지 프로토콜은 라인 전송에 사용되며, 주로 라인 스캔 카메라와 함께 사용됩니다. 링크는 정보를 전송합니다.
-
픽셀이 전송될 때(pixel valid signal)
-
라인이 완료될 때(end-of-line signal)
따라서 1D 이미지에는 다음이 포함될 수 있습니다.
-
라인 내의 임의 개수의 픽셀
-
무제한 이미지 높이
마찬가지로 라인 내의 픽셀 위치 자체는 전송되지 않습니다. 위치는 이전 라인 수와 현재 라인 내의 이전 픽셀 수로부터 도출됩니다. 라인 내 픽셀 사이에 간격이 있는 것은 불가능합니다. 임의의 라인 길이는 허용됩니다. 라인에 픽셀이 없을 수 있으며, 즉 빈 라인도 허용됩니다.
-
-
“0D” VALT_PIXEL0D
0D 이미지 프로토콜에서는 이미지 크기에 대한 정보가 유지되지 않습니다. 이는 단순히 픽셀의 스트림일 뿐입니다. 그럼에도 불구하고 픽셀 간에 시간 간격이 존재할 수 있으며, 즉 픽셀에 유효 신호가 함께 제공됩니다. 0D 프로토콜은 주로 측정 결과와 같은 데이터 전송에 사용됩니다.
-
“Signal” VALT_SIGNAL
신호 프로토콜에서 전송은 항상 유효한(모든 클록 사이클에서 유효한) 단일 비트 데이터 전송으로 축소됩니다. 따라서 이 프로토콜에는 pixel valid 또는 line/frame completed와 같은 제어 신호가 포함되지 않습니다. 신호 프로토콜은 트리거 및 신호 처리 시스템에 사용되는 신호 오퍼레이터에 사용됩니다.
이미지 프로토콜은 링크 Property입니다. 각 오퍼레이터는 입력에서 허용되고 출력에서 사용 가능한 링크 Property를 개별적으로 결정합니다. 링크 매개변수화에 대한 자세한 내용은 'Link Properties'를 참조하십시오.
이 이전 섹션에서는 VisualApplets 디자인의 파이프라인 구조에 대해 설명했습니다. 앞서 언급했듯이 데이터는 링크를 통해 프로젝트의 모듈 간에 전송됩니다. 모듈이 입력 픽셀을 처리하고 출력 값 계산을 마치면 결과가 출력 링크로 출력됩니다. 그러나 다음 모듈이 여전히 다른 픽셀을 처리 중이어서 데이터를 처리할 수 없는 경우가 있습니다. 이 경우 VisualApplets의 흐름 제어가 적용되고 파이프라인이 차단됩니다. 따라서 모듈은 입력을 차단할 수 있습니다. 이 경우 이전 모듈은 결과를 출력하지 않고 파이프라인에서 차단 상태를 역방향으로 전파합니다.
그림 33, '간단한 VisualApplets 디자인'에 표시된 간단한 예제를 살펴보겠습니다. 카메라에서 생성된 대역폭을 처리할 수 없는 느린 PC가 사용된다고 가정해 보겠습니다. 이 경우 DmaToPC 모듈은 호스트 PC로 데이터를 전송할 수 없습니다. 따라서 수시로 입력을 차단합니다. 차단 신호는 디자인 내에서 이미지 버퍼 모듈까지 전파됩니다. 이제 이미지 버퍼는 차단이 활성화되어 있는 동안 데이터를 출력하지 않습니다. ImageBuffer 모듈은 버퍼이므로 들어오는 모든 추가 데이터가 버퍼링되고 버퍼의 Fill 수준이 증가합니다. 카메라가 데이터 전송을 중지하면 새 입력 데이터가 버퍼로 전송되지 않고 버퍼가 빌 때까지 데이터가 출력됩니다.
![]() |
팁 |
|---|---|
|
다시 말하지만, 흐름 제어는 물 파이프라인에 비유할 수 있습니다. 밸브가 닫히면 더 이상 물을 운반할 수 없습니다. 버퍼 오퍼레이터는 배출구가 입력 스트림을 소모할 수 없는 경우 물이 채워지는 저수지와 같습니다. |
중단 가능한 데이터 스트림 및 중단 불가능한 데이터 스트림 튜토리얼 항목도 참조하십시오.



![[참고]](../common/images/admon/note.png)

![[팁]](../common/images/admon/tip.png)

![[중요]](../common/images/admon/important.png)







이전

