VisualApplets 에서 생성된 모든 다이어그램은 연산자 인스턴스(모듈)로 구성된 네트워크입니다. 이 다이어그램은 여러 하위 네트워크를 결합할 수 있습니다.
다른 프로그래밍 언어와 마찬가지로, ‘ VisualApplets ’에서 생성하는 다이어그램은 허용되는, 허용되지 않는, 그리고 제한적으로 사용 가능한 구문으로 구성된 일련의 규칙을 따릅니다. 다음 섹션에서는 모듈을 연결하는 기본 규칙을 설명합니다.
먼저, 여러분이 다루고 있는 다양한 연산자 유형을 살펴보겠습니다.
연산자유형 및 동기화에 대한 실용적인 지침은 “연산자 유형 및 동기화 자습서” 항목을 참조하십시오.
VisualApplets 에서는 세 가지 종류의 연산자가 있습니다:
| 범용형 “O” (원형): |
|
|
|
| 더 복잡한 유형인 “M”형 (사각형): |
|
의 이전 버전 VisualApplets 과 문서의 일부 예시 에서는 타원형 모양이 다음과 같이 표시됩니다: |
|
| 특수 유형 “P” (사각형): |
|
의 이전 버전 VisualApplets 과 문서의 일부 예시 에서는 타원형 모양이 다음과 같이 표시됩니다: |
|
표 4. 연산자 유형
연산자의 모양을 보면, 해당 연산자가 보편적인 “O” 유형에 속하는지, 아니면 더 복잡한 “M” 또는 “P” 유형 중 하나에 속하는지 알 수 있습니다. (특정 연산자의 유형에 대한 정보는 ‘연산자 참조’에서 해당 연산자에 대한 설명서를 확인하십시오.)
O형 연산자의 작동 원리는 꽤 간단합니다. 따라서,
-
O형 연산자는 입력과 출력 간의 픽셀/데이터 수를 변경하지 않습니다. 모든 입력 링크의 입력 픽셀/데이터 수는 출력 픽셀/데이터 수와 같으며, 즉, 각 입력 값에 대해 연산자는 하나의 값을 출력합니다.
-
O형 연산자는 입력과 출력 사이에 지연 시간을 발생시킬 수 있습니다. 하지만 이 지연 시간은 지연 시간 균형 조정 과정에서 자동으로 보정됩니다.
-
O형 오퍼레이터는 원하는 대로 직렬 또는 병렬로 연결할 수 있습니다.
M형 연산자의 작동 방식은 더 복잡합니다:
-
입력과 출력 간의 픽셀 수나 데이터 양을 변경할 수 있습니다.
-
출력이 지연될 수도 있습니다.
-
M형 연산자들을 연결할 때는 연결 규칙과 연결된 연산자들의 함수성에 주의를 기울여야 한다.
-
M형 연산자는 입력을 차단할 수 있습니다.
-
다이어그램에 있는 모든 소스 연산자(예: CameraGrayAreaBase 등)는 M형 연산자입니다.
-
도식 내의 모든 최종 목적지 연산자(예: DmaToPC 등)는 M형 연산자입니다.
P형 연산자는 M형 연산자와 유사하지만,
-
P형 연산자는 대역폭을 줄이지 않습니다. (이 문제에 대한 자세한 내용은 ‘무한 소스 / 카메라 연결’을 참조하십시오 .)
-
P형 연산자는 입력으로 주어진 데이터보다 더 많은 데이터를 생성하지 않습니다.
-
P형 연산자는 절대로 입력을 능동적으로 차단하지 않습니다. ( P형 연산자의 차단 동작에 대한 자세한 내용은 ‘P형 연산자’를 참조하십시오.)
이하에서, M형 연산자에 대해 정의된 모든 규칙은 P형 연산자에 대한 예외가 명시되지 않은 한 P형 연산자에도 적용됩니다.
O형 네트워크는 O형 모듈들이 결합된 것입니다. O형 네트워크에서는 모듈들을 직렬로 결합할 수도 있고 병렬로 결합할 수도 있습니다. O형 회로는 항상 M형 또는 P형 모듈로 시작하고 끝납니다. 이 정의를 바탕으로 다음과 같은 중요한 규칙을 정의할 수 있습니다:
![]() |
O형 네트워크 규칙 |
|---|---|
|
O형 네트워크에서는 아무리 복잡하더라도, 각 O형 모듈은 반드시 동일한 M형 또는 P형 모듈로부터 전원을 공급받아야 합니다. 이 전원 공급원과는 다른 O형 모듈이나 심지어 O형 (하위)네트워크를 통해 연결될 수도 있습니다. (단, 이 규칙은 신호 링크에는 적용되지 않는다는 점에 유의하십시오.) |
다음 그림은 모듈의 병렬 및 직렬 연결을 포함하는 O형 네트워크를 보여줍니다. 보시다시피, 모든 O형 모듈은 동일한 M형 모듈(M_source)에서 전원을 공급받습니다.
반면, 다음 그림은 ADD 모듈이 서로 다른 M형 모듈(M_source_0 및 M_source_1)로부터 전원을 공급받기 때문에 O형 네트워크 규칙을 위반하는 O형 네트워크를 보여줍니다.
VisualApplets (버전 2.2 이상)에서는 동기화 규칙이 위반될 때마다 설계 다이어그램에 직접 확실하게 표시합니다. 해당 링크는 보라색으로 강조 표시됩니다. 링크는 올바르게 동기화되지 않은 데이터를 수신하는 연산자에서 해당 M 연산자 소스까지 역방향으로 강조 표시됩니다.
DRC 1 및 DRC 2에는 해당 경고가 표시됩니다.
예를 들어, 위의 설계의 경우 DRC 1은 다음과 같은 경고를 생성합니다:

![]() |
예외: 신호 링크 |
|---|---|
|
신호 링크를 전송하는 O형 연산자에는 O형 네트워크 규칙이 적용되지 않습니다( ‘신호 링크에 대한 상이한 규칙’ 참조). |
M형 모듈을 소스 및 목적지뿐만 아니라 이미지 처리 목적으로 중간 단계에도 포함하는 모듈 네트워크를 M형 네트워크라고 합니다. M형 네트워크에서는 M형 모듈을 직렬로 연결할 뿐만 아니라 병렬로도 연결할 수 있습니다. M형 모듈은 제한 없이 분기될 수도 있습니다. M형 모듈을 병렬로 연결할 경우 이미지 크기와 타이밍을 동기화해야 할 수 있으므로, M형 네트워크는 상당히 복잡해질 수 있습니다. (참고: M형 모듈은 입력과 출력 간의 픽셀/데이터 수를 변경할 수 있으며, 출력을 지연시킬 수도 있습니다.)
다음 그림은 M형 회로의 매우 간단한 예를 보여줍니다. 이 회로도에서 M형 모듈들은 직렬로만 연결되어 있거나, 분기되어 있습니다. 회로도에서 유일한 O형 회로는 동일한 M형 모듈(ImageBuffer)에서 전원을 공급받기 때문에, 이 회로도는 지금까지 배운 모든 회로도 규칙을 따릅니다:
대부분의 경우, M형 네트워크는 훨씬 더 복잡합니다. 위 예시와 달리, M형 모듈들이 병렬로 연결되어 있는 경우 (즉, 병합 경로의 소스가 서로 다른 M형 소스에서 비롯되는 경우), 타이밍과 이미지 크기를 동기화해야 합니다. 이는 여러 입력을 사용하는 M형 연산자를 통해 이루어집니다.
서로 다른 M형 소스에서 출력되는 네트워크를 병합하려면, 다중 입력을 갖는 M형 연산자를 사용해야 합니다. (다중 입력을 갖는 O형 연산자는 사용할 수 없습니다. 이는 앞서 설명한 O형 네트워크의 규칙을 위반하기 때문입니다.) 하지만 동기화에 대해 자세히 알아보기 전에, 먼저 다중 입력을 갖는 M형 연산자에 대해 전반적으로 살펴보겠습니다.
여러 개의 입력을 갖는 M형 연산자는 두 가지 종류의 입력을 가질 수 있습니다:
-
동기 입력
-
비동기 입력
동기 입력 및 동기 입력 그룹
모듈의 일부 입력이 동기식인 경우, 이러한 동기식 입력들은 함께 하나의 동기 입력 그룹을 형성합니다. 따라서, 동기 입력 그룹은 동기식 입력들의 집합입니다. 동기 입력 그룹의 입력은 항상 임의의 O형 연산자 네트워크를 통해 동일한 M형 소스에서 공급되어야 합니다. M형 연산자는 임의의 개수의 동기 입력 그룹을 가질 수 있습니다.
아래 그림은 동기식 입력 그룹을 사용하는 M형 연산자의 사용 예시입니다. RemoveImage 연산자의 두 입력은 모두 동일한 M형 연산자(ImageBuffer)에서 공급됩니다. 이 두 입력이 함께 동기 입력 그룹을 형성합니다. RemoveImage 연산자는 입력 포트에 서로 다른 M형 소스를 사용할 수 없도록 되어 있습니다.
비동기식 입력
비동기 입력은 동기 입력과 다릅니다. 비동기 입력은 O형 연산자로 구성된 임의의 네트워크를 통해 서로 다른 M형 연산자로부터 공급될 수 있습니다. 또한, 다중 입력을 갖는 일부 M형 연산자는 실제로 서로 다른 M형 연산자로부터 공급받아야 합니다. 다중 입력을 갖는 M형 연산자가 서로 다른 M형 연산자로부터 신호를 공급받아야 하는지 여부는 해당 연산자 자체의 특성에 따라 달라집니다. 모든 연산자에 대한 자세한 정보는 ‘연산자 참조’에서 확인할 수 있습니다. M형 연산자는 임의의 개수의 비동기 입력을 가질 수 있습니다.
다음 스크린샷은 두 개의 비동기 입력을 가진 M형 연산자의 전형적인 예를 보여줍니다. 의 두 입력 모두 SYNC 모듈의 두 입력은 서로 다른 M형 소스, 즉 DRAM0과 DRAM1에서 신호를 공급받습니다.
SYNC 모듈 다음에는 MergePixel 연산자가 이어집니다. 이 연산자는 중간에 SYNC 연산자가 없으면 두 개의 M형 소스를 병합하는 데 사용할 수 없습니다.
![]() |
M-타입 연산자 입력 |
|---|---|
|
M형 모듈의 입력은 서로 다른 M형 소스에서 공급될 수 있습니다. 그러나 동기 입력 그룹의 입력은 임의의 O형 연산자 네트워크를 통해 동일한 M형 소스에서 공급되어야 한다. . |
여러 개의 입력을 갖는 각 M형 연산자에 대한 설명서에는 해당 연산자에 대해 허용되거나 필수적인 입력에 대해 매우 상세하게 설명되어 있습니다. 모든 연산자에 대한 포괄적인 설명은 ‘연산자 참조’를 참조하십시오.
O형 네트워크의 경우, ` VisualApplets `가 타이밍 동기화를 자동으로 수행합니다.
M형 네트워크의 경우, 동기화는 M형 사업자가 수행해야 합니다.
타이밍 동기화가 올바르게 설계되지 않은 경우,
-
소위 말하는 교착 상태가 발생하게 되며,
-
대역폭이 충분하지 않거나, 또는
-
데이터가 손실될 것입니다.
![]() |
올바른 타이밍 동기화가 이루어지도록 하십시오 |
|---|---|
|
타이밍 동기화는 VisualApplets 에 구현한 알고리즘의 동작에 따라 달라지므로, 다이어그램의 타이밍 동기화가 올바른지 반드시 확인해야 합니다. |
다음 예제들을 통해 타이밍 동기화에 대해 자세히 살펴보겠습니다.
-
독립된 소스의 동기화
그림 59, ‘독립 소스의 동기화’에 나와 있는 간단한 2대 카메라 스티칭 예제를 살펴보겠습니다 . 이 예제에서는 두 대의 카메라가 소스로 사용됩니다. ImageBuffer 연산자가 데이터를 버퍼링합니다. 마지막으로, M-타입 연산자인 InsertLine이 두 카메라의 라인을 하나의 출력 링크로 다중화합니다. 이 연산자는 두 개의 병렬 링크를 병합합니다.
두 대의 카메라가 동기화되지 않으면 어떤 일이 일어날지 상상해 보십시오. 한 대의 카메라 프레임 속도가 다른 카메라의 프레임 속도보다 높다고 가정해 봅시다. InsertLine 연산자는 라인을 엄격하게 다중화합니다. 즉, 입력 신호를 차례대로 사용합니다. 프레임 속도가 다르기 때문에, DRAM 버퍼 중 하나는 실제로 데이터를 버퍼링해야 합니다. 이 버퍼의 채움 수준은 지속적으로 증가할 것입니다. 오버플로우 상태가 발생하면 더 이상 데이터를 버퍼링할 수 없게 되어 데이터가 손실됩니다.
![[중요]](../common/images/admon/important.png)
동일한 데이터 전송 속도 보장 따라서 비동기 스트림을 병합할 경우, 라인 속도/프레임 속도/픽셀 속도가 동일하고 동기화될 수 있도록 해야 합니다.
-
동일한 출처의 데이터 동기화
일부 M형 연산자는 결과를 출력할 수 있을 때까지 지연 시간을 발생시킵니다. 대표적인 예로 다음 연산자가 있습니다. FIRkernelNxM 로, 다음 그림에서 살펴볼 다이어그램에 사용됩니다. 이 연산자는 픽셀 하나와 그 주변의 인접 픽셀들을 함께 출력하여 커널을 형성합니다. 인접 픽셀들을 출력하기 위해, 이 연산자는 (필요한 인접 픽셀들이) 입력에서 사용 가능해질 때까지 기다려야 합니다. 이 연산자는 중간 결과를 저장해 둡니다. 이 예시에서, FIRkernelNxM 연산자는 4개의 전체 라인이 연산자에 입력된 후에야 첫 번째 결과를 출력할 수 있습니다. 따라서, 이 연산자는 현재 구성에서 4개의 이미지 라인에 해당하는 지연을 발생시킵니다.
이 예시를 좀 더 자세히 살펴보겠습니다.
전제 조건
카메라에서 전송된 첫 번째 픽셀들은 버퍼를 거쳐 브랜치로 전송됩니다. 여기서 데이터는 복제되어 SYNC 및 FIRkernelNxM 모듈로 전달됩니다. 앞서 설명한 바와 같이, FIRkernelNxM은 4라인의 지연 시간이 있으므로 첫 번째 픽셀을 즉시 출력할 수 없습니다:
Deadlock
SYNC 연산자는 두 입력 간의 동기화를 시도합니다. 두 번째 입력에서 데이터가 들어오지 않으므로, 첫 번째 입력에서 STOP 신호를 생성합니다. 이 STOP 신호는 파이프라인을 따라 역방향으로 버퍼까지 전파됩니다. 이제 교착 상태가 발생합니다: 커널 연산자는 데이터를 출력할 수 있을 때까지 더 많은 데이터를 필요로 하지만, SYNC가 그 이후의 모든 입력을 차단하고 있기 때문에 새로운 데이터를 얻을 수 없습니다.
교착 상태 해결하기
교착 상태를 해결하려면, 커널 연산자의 지연 시간을 보상할 수 있도록 상부 경로에 버퍼를 추가해야 합니다. 다음과 같이:
교착 상태 방지
가장 좋은 해결책은 동기화를 아예 피하는 것입니다. 이는 대개 가능합니다. 아래의 해결책 예시에서, 다이어그램에는 M형 연산자로 구성된 직렬 파이프라인만 존재하므로, 병합 지점에서 동기화가 필요하지 않습니다.
M형 네트워크에서 또 다른 중요한 현상은 특정 연산자의 대역폭이 감소함과 동시에 이러한 제한이 모듈 네트워크를 따라 역방향으로 전파될 가능성이 있다는 점입니다. 다음 그림은 대역폭 제한을 유발하는 회로도를 보여줍니다.
이 다이어그램에서 ModuloCount 연산자와 RemoveLine 연산자를 조합하면 두 줄 중 한 줄씩 삭제됩니다. ‘애플릿의 대역폭’에서 알 수 있듯이, 최대 대역폭은 사용된 병렬 처리 수준에 따라 달라집니다. RemoveLine 연산자 이후, 필요한 대역폭은 2분의 1로 줄어들었습니다. 따라서, PARALLELdn ("Parallel down") 연산자를 사용하여 병렬도를 2분의 1로 줄일 수 있습니다. 그러나 이로 인해 상위 경로의 대역폭도 매 두 번째 줄마다 2분의 1로 줄어들게 됩니다.
RemoveLine 연산자에서 한 줄이 삭제되는 동안, PARALLELdn 모듈에는 픽셀이 공급되지 않습니다. 다이어그램 입력부에 명시된 완전한 병렬 처리는 두 경로 모두에서 활용될 수 있습니다. 반면, RemoveLine 연산자에 의해 라인이 제거되지 않을 경우, 현재 라인의 픽셀은 PARALLELdn의 입력으로 전달됩니다. 이제PARALLELdn은 병렬 처리 능력을 2로 줄이게 되며, 즉 입력에 비해 값을 출력하는 데 두 배의 사이클이 필요합니다. 따라서 PARALLELdn 연산자는 매 두 번째 클럭 사이클마다 입력을 차단합니다. 첫 번째 Branch 연산자와 PARALLELdn 연산자 사이에 버퍼가 사용되지 않기 때문에, 이 차단 신호는 파이프라인을 따라 역방향으로 전파됩니다. 따라서 상단 경로도 매 두 번째 클럭 사이클마다 차단됩니다.
이 문제에 대한 해결책은 PARALLELdn 연산자 앞에 최소 한 줄을 버퍼링할 수 있는 추가 FIFO를 배치하여 피크 기간과 유휴 기간의 차이를 상쇄하는 것입니다. 다음 그림은 이 해결책을 보여줍니다:
P형 연산자는 M형 연산자와 유사하지만, 한 가지 예외가 있습니다. 바로 입력을 능동적으로 차단할 수 없다는 점입니다.
그럼에도 불구하고, 처리 파이프라인의 상류에 위치한 모듈이 입력을 차단하면, 해당 입력 차단이 파이프라인을 따라 역방향으로 전파됩니다. 만약 P형 연산자가 파이프라인의 하류에 위치해 있다면, P형 연산자의 입력 포트도 (수동적으로) 차단됩니다. P형 연산자는 차단 정보를 처리 라인의 다음 모듈로 역방향으로 전파합니다.
예시: M형 연산자 PARALLELdn은 데이터가 연산자로 입력되는 시간에 비해 결과를 출력하는 데 더 많은 시간이 소요됩니다. 따라서 때때로 입력을 차단하게 됩니다. 반면, P형 연산자 PARALLELup은 입력 대역폭에 비해 출력 대역폭이 항상 더 큽니다. 이러한 특성은 P형 및 M형 연산자에 무한 소스를 연결할 때 매우 중요합니다. 무한 소스에 대한 자세한 설명은 다음 섹션인 ‘무한 소스 / 카메라 연결’에서 다룹니다 .
무한 소스는 ‘ VisualApplets ’ 흐름 제어에 의해 중지될 수 없는 연산자입니다. 한 가지 예로 카메라 연산자를 들 수 있습니다. 이 연산자들은 입력 링크를 통해 카메라로부터 데이터를 수신합니다. 출력 링크를 통해 이 데이터를 다이어그램상의 다음 모듈로 전달합니다. 카메라 연산자 내부에는 버퍼가 없으며, 카메라에 데이터 전송을 중지하도록 지시할 수 없기 때문에, 이 연산자들은 무한 소스가 됩니다.
중지 가능한 스트림과중지 불가능한 스트림에 대한 실질적인 지침은 “중지 가능한 데이터 스트림 및 중지 불가능한 데이터 스트림 자습서” 항목을 참조하십시오.
무한 소스는 무한 소스를 허용하는 M형 연산자에만 연결할 수 있습니다. 개별 M형 연산자가 무한 소스와 연결 가능한지 여부는 해당 연산자의 설명서 에 명시되어 있습니다( ‘연산자 참조’ 참조). 무한 소스를 허용하지 않는 M형 연산자에 무한 소스가 연결된 경우, DRC 레벨 2에서 다음과 같은 오류가 발생합니다:
모든 P형 및 O형 연산자는 무한 소스에 연결될 수 있습니다. 무한 소스의 정보는 파이프라인 내의 연산자가 무한 소스 데이터 스트림을 제어 가능한 데이터 스트림으로 변환할 때까지 연산자를 통해 전파됩니다. 일반적으로 이러한 변환 연산자는 버퍼입니다. 버퍼 연산자는 출력에서 흐름 제어를 사용할 수 있으며, 입력을 차단할 필요 없이 입력 데이터 스트림을 버퍼링합니다.
따라서, 앞선 예제의 연산자 순서를 바꿔도 DRC 레벨 2에서는 오류가 발생하지 않습니다:
일부 변환 연산자의 동작은 무한 소스를 허용할지 여부를 변경할 수 있습니다. 이러한 연산자에는 InfiniteSource라는 매개변수가 포함되어 있으며, 이 매개변수는 Enabled 또는 Disabled로 설정할 수 있습니다.
무한한 소스와 연결되지 않은 변환 연산자 는'비활성화'로 설정되어야 합니다.
![]() |
경고 |
|---|---|
|
해당 모듈의 InfiniteSource 매개변수가 Enabled로 설정된 경우, 해당 모듈은 무한 소스에 연결되어 있어야 합니다. 무한 소스에 연결되지 않은 변환 연산자는 ‘비활성화’로 설정해야 합니다. |
![]() |
팁 |
|---|---|
|
확실하지 않은 경우에는 항상 해당 매개변수를 ‘비활성화’로 설정하고, DRC 레벨 2 검사가 끝난 후에 오류가 발생한 모듈을 수정하십시오. |
신호 링크는 매 클럭 사이클마다 유효한 1비트 신호 데이터를 전송합니다. 신호 전송 입력 링크를 갖는 모듈에 대한 링크 규칙은 지금까지 설명한 링크 규칙과 두 가지 측면에서 다릅니다:
-
신호 링크 입력을 갖춘 모든 O형 및 M형 모듈은 서로 다른 M형 전원으로 전원을 공급받을 수 있습니다.
-
신호 링크 입력을 갖는 모듈은 항상 무한 전원에 연결될 수 있다.
신호 링크에 대한 자세한 내용은 ‘이미지 프로토콜, 이미지 크기 및 데이터 구조’에서 확인하십시오 .
이 장에서는 링크에 관한 규칙을 살펴보았습니다. 링크에 관한 규칙은 VisualApplets 애플리케이션을 구현할 때 가장 중요합니다.
O형 네트워크는 항상 M형 모듈로 시작하고 끝납니다. 각 O형 모듈은 다른 O형 모듈들로 구성된 임의의 네트워크를 통해 동일한 M형 또는 P형 모듈로부터 전원을 공급받아야 합니다. . 서로 다른 M형 전원의 병합은 M형 모듈에 의해서만 수행될 수 있습니다.
M형 네트워크는 직렬 순서로 임의로 연결될 수 있을 뿐만 아니라, 임의로 분기될 수도 있습니다. 모듈 내에서 서로 다른 M형 소스를 병합하려면 타이밍 동기화와 이미지 크기 동기화가 필요합니다. 다중 입력을 갖는 M형 모듈은 동기 입력 그룹을 가질 수 있습니다. 동기 입력 그룹은 임의의 O형 네트워크를 통해 동일한 M형 소스로부터 신호를 공급받아야 합니다.
타이밍 동기화는 시간적으로 지연된 서로 다른 소스들을 동기화합니다. 타이밍 동기화를 수행하려면 사용자 구현에 대한 지식이 필요합니다. 타이밍 동기화가 제대로 이루어지지 않으면 교착 상태나 버퍼 오버플로가 발생합니다.
무한 소스는 통합 유량 제어 장치로 제어할 수 없습니다. 무한 소스에 연결이 허용된 M형 오퍼레이터만 무한 소스에 연결할 수 있습니다.
신호 링크 입력을 갖는 모듈의 경우, 일반적인 동기화 규칙이 적용되나 두 가지 수정 사항이 있습니다: 신호 링크 입력(M형 및 O형 모듈)의 신호 링크 입력은 서로 다른 M형 소스로부터 전원을 공급받을 수 있습니다. 신호 링크 입력을 가진 모듈은 항상 무한 소스에 연결될 수 있습니다.
![]() |
경고 |
|---|---|
|
VisualApplets 논리 동기화 오류는 사용자 프로젝트 구현에 따라 달라지기 때문에 감지할 수 없습니다. 각 M형 연산자의 타이밍 및 지연에 대한 동작을 파악하려면 해당 연산자의 설명서를 주의 깊게 읽어보십시오. |







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






![[경고]](../common/images/admon/warning.png)











이전

