Operator Library: Memory
이 연산자는 호스트 PC에서 프레임 그래버로 이미지 파일 업로드를 허용하며, 업로드된 파일은 지속적으로 출력되어 이미지 소스로 사용됩니다. 여기서는 이미지 파일이 범용 데이터 컨테이너로 사용됩니다. 따라서 업로드된 이미지에는 계수 등 모든 데이터가 포함될 수 있습니다. 모든 계수 이미지는 동일한 픽셀 너비와 높이를 가져야 하지만 완전히 다른 형식일 수 있습니다. 예를 들어 링크 0 계수 이미지는 GRAY 8 bit 형식일 수 있습니다. 링크 1은 RGB16 형식의 이미지를 제공할 수 있습니다. 그리고 링크 2는 바이너리 이미지일 수 있습니다. 모든 계수 이미지는 Frame Grabber RAM(DRAM)에 저장됩니다. 유형이 RAM인 VisualApplets 리소스가 하나 필요합니다. 자세한 내용은 'Allocation of Device Resources'를 확인하세요. 연산자의 지연 시간에 대한 정보는 Table 46, 'Individual Latencies of the Operators in Library Memory'를 참조하세요.
![]() |
imaFlex CXP-12 Quad 및 imaFlex CXP-12 Penta 플랫폼에서는 CoefficientBuffer를 사용할 수 없습니다. |
|---|---|
|
imaFlex CXP-12 Quad 및 imaFlex CXP-12 Penta 플랫폼에서는 CoefficientBuffer가 지원되지 않습니다. 'Functional Example for Loading Test Images Using ImageInjector' 예제에서는 ImageInjector 연산자를 사용하여 imaFlex CXP-12 Quad 또는 imaFlex CXP-12 Penta에서 CoefficientBuffer 연산자의 기능을 테스트 이미지 소스로 대체하는 방법을 보여줍니다. '2D Shading Correction / Flat Field Correction Using Operator RamLUT' 예제는 2D 쉐딩 보정을 위해 CoefficientBuffer 대신 RamLUT를 사용하는 방법을 보여줍니다. |
링크 수는 CoefficientBuffer에 저장된 계수 이미지의 수와 일치합니다. 계수 이미지는 이미지 억퀴지션이 실행되지 않는 동안 소프트웨어를 통해서만 FPGA 버퍼에 업로드할 수 있습니다. 이는 LoadCoefficients 파라미터에 값을 써서 수행됩니다.
연산자의 출력 포트는 동기화되어 작동합니다. 첫 번째 이미지 픽셀의 전송은 모든 출력 포트에서 정확히 동시에 시작됩니다. 모든 이미지가 수신 연산자로 전송되면 CoefficientBuffer가 다시 동기화하여 이미지 출력을 시작합니다.
![]() |
시뮬레이션 중 동작 |
|---|---|
|
연산자의 링크에 있는 이미지는 동시에 출력됩니다. 하나의 시뮬레이션 단계에서 연산자는 각 링크에 최대 하나의 이미지를 출력합니다. 시뮬레이션 단계 중에 저장된 모든 이미지(링크당 하나)가 수신 연산자로 전달된 경우, 즉 블로킹이 발생하지 않은 경우 다음 시뮬레이션 단계에서 동일한 출력(링크당 하나의 이미지)이 전달됩니다. |
CoefficientBuffer는 ROI(Region of Interest) 관리도 지원합니다. RoI는 XOffset, XLength, YOffset 및 YLength의 4가지 파라미터로 정의됩니다. XOffset과 YOffset은 RoI의 좌상단 모서리, 즉 픽셀 단위의 시작 좌표를 정의합니다. RoI의 치수는 BufferWidth 및 BufferHeight 파라미터로 정의된 저장된 계수 이미지의 치수를 초과할 수 없습니다. RoI는 억퀴지션 중에 동적으로 업데이트할 수 있으며, 억퀴지션이 실행 중이 아닐 때는 4개의 RoI 좌표 파라미터를 모두 새 값으로 설정하고 UpdateROI 파라미터에 값을 써서 업데이트할 수 있습니다. XLength는 링크 Parallelism의 단위(즉, XLength modulo LinkParallelism = 0)를 충족해야 합니다.
각 출력 링크에 대해 하나의 계수 이미지 파일이 버퍼에 저장됩니다. 즉, 링크 0에서는 계수 이미지 0이 제공됩니다. 계수 이미지는 억퀴지션이 시작되기 전에 CoefficientBuffer에 로드되어야 합니다. 계수 이미지는 CoefficientFile N 파라미터에 지정된 파일에 저장되어야 합니다. N은 각각 링크 번호 또는 계수 이미지 번호를 나타냅니다. 계수 파일은 TIF 형식으로 인코딩되어야 합니다.
BufferWidth는 CoefficientBuffer에 저장된 모든 계수 이미지의 너비를 픽셀 단위로 지정합니다.
BufferHeight는 CoefficientBuffer에서 관리하는 모든 계수 이미지의 높이를 픽셀 단위로 지정합니다. BufferWidth 및 BufferHeight는 모든 출력 링크의 최대 출력 이미지 치수를 결정합니다.
그레이스케일 링크의 경우 그레이스케일 이미지 파일을 사용해야 합니다. 컬러 링크의 경우 RGB 이미지 파일을 사용해야 합니다.
링크의 Bit Width가 이미지 파일의 Bit Width보다 큰 경우 연산자는 여러 이미지 파일 픽셀을 사용하여 출력 픽셀을 생성합니다. 예를 들어 22 bit 링크에는 8 bit 이미지 파일의 픽셀 3개가 필요합니다. 따라서 이미지 파일의 이미지 너비는 BufferWidth 파라미터보다 3배 더 커야 합니다.
링크의 Bit Width가 이미지 파일의 Bit Width보다 작은 경우 연산자는 입력 이미지 파일의 하위 비트만 사용합니다. 예를 들어 8 bit 이미지 파일과 3 bit 링크의 경우 파일의 0, 1, 2번 비트가 사용됩니다.
16 bit TIF 파일은 주의해서 사용해야 합니다.
LoadCoefficients 파라미터는 이미지 억퀴지션이 시작되기 전에 계수 이미지를 버퍼에 로딩하는 것을 시작하는 데 사용됩니다. 로딩은 쓰기 주기 또는 이 파라미터에 값 1을 전달하여 트리거됩니다. 값 0을 쓰는 것은 아무런 효과가 없습니다.
UpdateROI 파라미터는 이미지 억퀴지션이 실행 중이거나 이미지를 획득하지 않을 때 현재 RoI를 동적으로 업데이트하는 데 사용됩니다. 이 파라미터에 값을 쓰기 전에 4개의 RoI 좌표 파라미터를 사용하여 새 RoI를 지정해야 합니다. 작성된 값은 업데이트 프로세스에 영향을 주지 않으며 쓰기 주기만 트리거합니다. 즉, 작성된 값은 0 또는 1일 수 있습니다.
XOffset 파라미터는 왼쪽 이미지 경계에서 RoI의 첫 번째 열까지의 수평 방향 오프셋을 지정합니다. 지정된 값은 픽셀 단위로 측정되며 BufferWidth-1 값을 초과할 수 없습니다.
Parameter XLength specifies the length of the RoI in horizontal direction in pixels. The specified value must not exceed BufferWidth and must be divisible by the output link parallelism. Also the following constraint must be met: XOffset + XLength <= BufferWidth.
YOffset 파라미터는 상단 이미지 경계에서 RoI의 첫 번째 라인까지의 수직 방향 오프셋을 지정합니다. YOffset은 픽셀 단위로 지정해야 하며 BufferHeight-1을 초과할 수 없습니다.
Parameter YLength specifies the length of the RoI in vertical direction in pixels. The length must not exceed BufferHeight. Furthermore, the following constraint must be met: YOffset + YLength <= BufferHeight.
CoefficientFile N 파라미터는 TIF 형식으로 저장된 링크 N용 계수 이미지의 파일 이름을 지정합니다.
![]() |
참고 |
|---|---|
|
이 오퍼레이터를 사용할 때 권장되는 설정 순서
-
CoefficientBuffer의 모든 링크를 연결합니다.
-
모든 링크의 링크 형식을 지정합니다.
-
BufferWidth 및 BufferHeight 파라미터를 설정합니다.
-
RoI 좌표를 설정합니다.
-
계수 파일 이름을 지정합니다.
내부적으로 CoefficientBuffer 오퍼레이터는 모든 계수 이미지 픽셀로부터 하나의 누적 픽셀을 생성합니다. 이를 슈퍼 픽셀(super-pixel)이라고 합니다.
- RAM 데이터 너비가 슈퍼 픽셀의 Bit Width보다 작으면 슈퍼 픽셀이 여러 RAM 셀에 분산되어 저장됩니다.
- 슈퍼 픽셀이 RAM 데이터 너비보다 작은 경우, 여러 슈퍼 픽셀이 하나의 RAM 셀에 들어갈 수 있더라도 각 RAM 셀에는 하나의 슈퍼 픽셀만 저장됩니다.
따라서 RAM 셀은 하나의 슈퍼 픽셀에 의해서만 점유되거나 슈퍼 픽셀의 일부를 구성하게 됩니다.
오퍼레이터는 내부적으로 출력 Bit Width의 픽셀을 RAM 데이터 너비만큼의 넓은 블록에 저장합니다. 예를 들어 marathon VCL 플랫폼(RAM 데이터 너비: 256bit)에서 출력 Bit Width를 8bit로 설정한 경우 각 RAM 셀에서 8bit만 사용되고 나머지는 낭비됩니다.
단순히 Parallelism을 높여 대역폭을 늘리는 것은 이 경우에 전혀 도움이 되지 않습니다.
사용 중인 프레임 그래버의 RAM 데이터 너비는 본 문서의 Platform Resources 섹션에서 확인할 수 있습니다.
대역폭 및 RAM 효율성을 높이기 위한 몇 가지 팁은 다음과 같습니다.
팁 1:
대역폭을 높이려면 픽셀의 Bit Width를 더 크게 정의한 다음 나중에 CastParallel 오퍼레이터를 사용하여 이를 보정할 수 있습니다.
예: Gray 8bit 이미지가 필요하지만 Parallelism 8의 대역폭이 필요한 경우, 출력 Bit Width를 64(Parallelism 1)로 정의한 후 나중에 CastParallel 오퍼레이터를 사용하여 링크를 다시 8bit 및 Parallelism 8로 전환할 수 있습니다.
이렇게 하면 1개의 RAM 셀에 2개 이상의 픽셀이 저장되므로 이미지 소비 RAM도 줄어듭니다. CastParallel 오퍼레이터 없이 직접 사용하는 경우 이미지 저장에 필요한 메모리가 8배 더 커집니다.
팁 2:
결합된 링크의 Bit Width가 64bit를 초과하는 경우, 이미지를 여러 개의 이미지로 분할하고 CoefficientBuffer 오퍼레이터의 링크를 둘 이상 사용할 수 있습니다. 모든 출력이 O-synchronous이므로 나중에 모든 링크를 결합할 수 있습니다.
예: RGB24 이미지를 Parallelism 4로 전송하려고 합니다. 누적된 픽셀은 4 * 24 = 96Bit가 되며, 이는 너무 큽니다. 따라서 이를 해결하는 방법은 이미지를 4개의 서브 이미지로 분할하고 각각이 픽셀의 ¼을 갖도록 하는 것입니다.
내부적으로 오퍼레이터는 각 입력의 픽셀을 96bit의 하나의 슈퍼 픽셀로 누적합니다.
이러한 방식으로 RAM 효율성도 향상됩니다. Ironman mE5VQ8-CXPD 플랫폼(128 Bit 너비의 RAM 데이터 인터페이스)에서 1024x1024 이미지를 사용하는 경우, 단순한 1 링크 CoefficientBuffer에 저장된 이미지는 다음과 같습니다.
1024 * 1024 * 128 / 8 Byte = 16MB.
4-link 설정이 적용된 경우 크기는 다음과 같습니다.
1024 * 1024 * (128 / 4) / 8 = 4MB
Coefficientbuffer가 단 하나의 계수 이미지 파일만 사용하고, 픽셀 Bit Width가 8 bit이며 Parallelism이 1이라고 가정해 보겠습니다. 이 경우 버퍼의 성능이 극도로 저하됩니다. 대역폭의 1/8만 사용되기 때문입니다. 게다가 버퍼가 두 배의 디자인 클록 주파수로 값을 읽어오기 때문에, 결과적으로 전체 대역폭의 1/16밖에 사용되지 않습니다.
버퍼를 최대 성능으로 사용하려면 픽셀 데이터를 재해석해야 합니다. 예시에서는 버퍼 출력 링크의 매개변수를 픽셀당 64 bit로 설정하고 Parallelism 2를 사용해야 합니다. 이렇게 하면 버퍼가 디자인 클록당 128 bit를 읽게 됩니다. CastParallel 오퍼레이터를 사용하여 64 bit 데이터 값을 8의 Bit Width와 16의 Parallelism으로 재해석하십시오. 또한 BufferWidth 매개변수를 계수 이미지 너비의 1/8로 설정해야 합니다.
결론적으로 최대 대역폭은 출력 Bit Width가 64 bit 등과 같이 높을 때만 얻을 수 있습니다. 높은 출력 Parallelism을 사용한다고 해서 대역폭이 증가하지는 않습니다.
이 오퍼레이터는 시뮬레이션 소스로 사용할 수 있습니다. 이 경우 오퍼레이터는 Coefficient File N 매개변수에 지정된 이미지 파일을 로드하여 사용하려고 시도합니다. 단, 이는 이미지 파일이 링크 형식과 정확히 일치하는 경우에만 제대로 작동합니다. 예를 들어 링크 형식이 64 Bit인 경우 이미지 파일에는 픽셀당 8 bit가 포함되므로 이미지 파일의 너비는 링크의 최대 이미지 너비의 8배여야 합니다. 높이 역시 링크에 지정된 최대 이미지 높이와 정확히 일치해야 합니다.
Frame Grabber RAM (DRAM)을 사용하는 연산자를 통과하는 이론적 대역폭[bits/second]은 다음 공식에 따라 계산됩니다.

그러나 실제 대역폭은 DRAM 효율로 인해 항상 이론적 대역폭보다 낮습니다.
연산자를 통과하는 최대 대역폭 is Bit Width와 Parallelism의 곱이 내부 RAM Port Width x 2와 같을 때 도달합니다(읽기 전용 파라미터의 경우 해당됨).
![]() |
플랫폼별 값 |
|---|---|
|
RAM Port Width와 System Clock은 플랫폼별로 다릅니다. 개별 플랫폼에 대한 자세한 내용은 Device Resources를 참조하세요. |
|
부호 없는 입력의 경우 출력 Bit Width 범위는 [1, 64]입니다. 부호 있는 입력의 경우 범위는 [2, 64]입니다. 부호 없는 컬러 입력의 경우 범위는 [3, 63]이며, 부호 있는 컬러의 경우 범위는 [6, 63]입니다. |
|
|
Bit Width와 Parallelism의 곱은 네이티브 RAM 데이터 너비를 초과해서는 안 됩니다. 자세한 내용은 Device Resources를 확인하십시오. |
| RamDataWidth | |
|---|---|
| Type | static write parameter |
| Default | 해당 없음 |
| Range | 정수 |
|
이 매개변수는 RAM 인터페이스에서 사용할 수 있는 데이터 비트 수를 제공합니다. |
|
| RamAddressWidth | |
|---|---|
| Type | static write parameter |
| Default | 해당 없음 |
| Range | 정수 |
|
이 매개변수는 사용 가능한 RAM 주소 비트 수를 제공합니다. |
|
| BufferWidth | |
|---|---|
| Type | static parameter |
| Default | 1024 |
| Range | [1, 65535] |
|
이 매개변수는 픽셀 단위의 계수 이미지 너비를 정의합니다. 또한 이 매개변수는 모든 출력 링크의 최대 이미지 너비를 정의합니다. 이 매개변수의 범위는 사용되는 프레임 그래버와 해당 RAM에 따라 다릅니다. |
|
| BufferHeight | |
|---|---|
| Type | static parameter |
| Default | 1024 |
| Range | [1, 65535] |
|
이 매개변수는 픽셀 단위의 계수 이미지 높이를 정의합니다. 또한 이 매개변수는 모든 출력 링크의 최대 이미지 높이를 정의합니다. 이 매개변수의 범위는 사용되는 프레임 그래버와 해당 RAM에 따라 다릅니다. |
|
| LoadCoefficients | |
|---|---|
| Type | dynamic write parameter |
| Default | 0 |
| Range | {0, 1} |
|
이 매개변수는 이미지 취득이 시작되기 전에 버퍼로 계수 이미지 로딩을 시작하는 데 사용됩니다. 로딩은 이 매개변수에 값 1을 쓰는 쓰기 주기에 의해 트리거됩니다. 값 0을 쓰는 경우 계수 파일 로딩이 발생하지 않습니다. |
|
| UpdateROI | |
|---|---|
| Type | dynamic write parameter |
| Default | 1 |
| Range | {1} |
|
이 매개변수는 하드웨어에서 ROI 설정을 업데이트하는 데 사용됩니다. 4개의 ROI 좌표 매개변수로 정의된 값이 사용됩니다. 업데이트는 이미지 취득이 진행 중인 동안에도 언제든지 수행할 수 있습니다. |
|
| XOffset | |
|---|---|
| Type | 동적/정적 읽기/쓰기 파라미터 |
| Default | 0 |
| Range | [0, Max.Img Width - XLength] |
|
이 매개변수는 ROI의 왼쪽 상단 모서리 x좌표를 정의합니다. 값을 변경해도 ROI 설정이 직접 변경되지는 않습니다. 새 설정을 적용하려면 UpdateROI 매개변수에 값을 써야 합니다. 스텝 크기는 Parallelism입니다. |
|
| XLength | |
|---|---|
| Type | 동적/정적 읽기/쓰기 파라미터 |
| Default | 1024 |
| Range | [parallelism, Max.Img Width - XOffset] |
|
이 매개변수는 ROI의 너비를 정의합니다. 값을 변경해도 ROI 설정이 직접 변경되지는 않습니다. 새 설정을 적용하려면 UpdateROI 매개변수에 값을 써야 합니다. 스텝 크기는 Parallelism입니다. |
|
| YOffset | |
|---|---|
| Type | 동적/정적 읽기/쓰기 파라미터 |
| Default | 0 |
| Range | [0, BufferHeight - YLength] |
|
이 매개변수는 ROI의 왼쪽 상단 모서리 y좌표를 정의합니다. 값을 변경해도 ROI 설정이 직접 변경되지는 않습니다. 새 설정을 적용하려면 UpdateROI 매개변수에 값을 써야 합니다. |
|
| YLength | |
|---|---|
| Type | 동적/정적 읽기/쓰기 파라미터 |
| Default | 1024 |
| Range | [1, BufferHeight - YOffset] |
|
이 파라미터는 ROI의 높이를 정의합니다. 값을 변경해도 ROI 설정이 직접 변경되지는 않습니다. 새 설정을 적용하려면 UpdateROI 파라미터에 값을 써넣어야 합니다. |
|
| FillLevel | |
|---|---|
| Type | 동적 읽기 파라미터 |
| Default | 0 |
| Range | [0%, 100%] |
|
이 파라미터는 DRAM의 Fill 레벨을 25% 단위로 제공합니다. |
|
| Overflow | |
|---|---|
| Type | 동적 읽기 파라미터 |
| Default | 0 |
| Range | [0, 1] |
|
이 파라미터는 버퍼 오버플로우를 나타냅니다. |
|
| Coefficient File N | |
|---|---|
| Type | 동적 읽기/쓰기 파라미터 |
| Default | coefficients_N.tif |
| Range | 선택적 경로가 포함된 tif 파일의 임의 파일 이름 |
|
이 파라미터는 링크 N의 계수 이미지 파일 이름을 정의합니다. |
|
CoefficientBuffer 오퍼레이터의 사용법은 다음 예시와 같습니다:
-
Example - 디버깅 목적을 위해 이미지를 수동으로 삽입할 수 있습니다.
-
예시 - 디버깅 목적을 위해 링크상의 이미지 전송 상태를 조사할 수 있습니다.
-
Examples - 이 예제는 2D Shading Correction 구현을 보여줍니다. 보정 값은 프레임 그래버 RAM에 저장됩니다. 이 애플릿은 고정밀 오프셋 및 게인 보정을 수행합니다.
-
'1D Shading Correction Using Frame Grabber RAM'
Examples - 이 예제는 1D Shading Correction을 보여줍니다. 보정 값은 Frame Grabber RAM에 저장됩니다.

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



이전

