Operator Library: Memory
이 연산자를 사용하면 호스트 PC에서 프레임 그래버로 이미지 파일을 업로드할 수 있으며, 이 파일은 지속적으로 출력되어 이미지 소스로 사용됩니다. 여기서는 이미지 파일이 범용 데이터 컨테이너로 사용됩니다. 따라서 업로드된 이미지에는 계수(coefficients)와 같은 모든 데이터가 포함될 수 있습니다. 모든 계수 이미지는 픽셀 너비와 높이가 동일해야 하지만 형식은 완전히 다를 수 있습니다. 예를 들어 링크 0 계수 이미지는 GRAY 8비트 형식일 수 있습니다. 링크 1은 RGB16 형식의 이미지를 제공할 수 있습니다. 그리고 링크 2는 바이너리 이미지일 수 있습니다. 모든 계수 이미지는 Frame Grabber RAM(DRAM)에 저장됩니다. RAM 유형의 VisualApplets 리소스가 하나 필요합니다. 자세한 내용은 'Allocation of Device Resources'를 확인하십시오. 연산자의 지연 시간(latency)에 대한 정보는 Table 46, 'Individual Latencies of the Operators in Library Memory'를 참조하십시오.
![]() |
CoefficientBuffer는 imaFlex CXP-12 Quad 및 imaFlex CXP-12 Penta 플랫폼에서 사용할 수 없습니다. |
|---|---|
|
CoefficientBuffer는 imaFlex CXP-12 Quad 및 imaFlex CXP-12 Penta 플랫폼에서 지원되지 않습니다. '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에 저장된 계수 이미지의 수와 일치합니다. 계수 이미지는 이미지 취득(acquisition)이 실행되지 않는 동안 소프트웨어를 통해서만 FPGA 버퍼에 업로드할 수 있습니다. 이는 LoadCoefficients 파라미터에 값을 써서 수행합니다.
연산자의 출력 포트는 동기식으로 작동합니다. 첫 번째 이미지 픽셀의 전송은 모든 출력 포트에서 정확히 같은 순간에 시작됩니다. 모든 이미지가 수신 연산자로 전송되면 CoefficientBuffer는 이미지를 다시 동기적으로 출력하기 시작합니다.
![]() |
시뮬레이션 중 동작 |
|---|---|
|
연산자 링크의 이미지는 동시에 출력됩니다. 하나의 시뮬레이션 단계에서 연산자는 각 링크에 최대 하나의 이미지를 출력합니다. 시뮬레이션 단계 동안 저장된 모든 이미지(링크당 하나)가 수신 연산자로 전달된 경우, 즉 블로킹이 발생하지 않은 경우 다음 시뮬레이션 단계에서 동일한 출력(링크당 하나)이 전달됩니다. |
CoefficientBuffer는 관심 영역(RoI) 관리도 지원합니다. 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비트 링크에는 8비트 이미지 파일의 픽셀 3개가 필요합니다. 따라서 이미지 파일의 이미지 너비는 파라미터 BufferWidth보다 3배 더 커야 합니다.
링크의 Bit Width가 이미지 파일의 Bit Width보다 작은 경우, 연산자는 입력 이미지 파일의 하위 비트만 사용합니다. 예를 들어 8비트 이미지 파일과 3비트 링크의 경우 파일의 0, 1, 2번 비트가 사용됩니다.
16비트 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 셀은 하나의 슈퍼 픽셀에 의해서만 점유되거나 슈퍼 1픽셀의 일부가 됩니다.
오퍼레이터는 내부적으로 출력 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이므로 나중에 모든 링크를 결합할 수 있습니다.
예: Parallelism 4로 RGB24 이미지를 전송하려고 합니다. 누적된 픽셀은 4*24 = 96Bit가 되며, 이는 너무 큽니다. 이를 해결하기 위한 아이디어는 이미지를 4개의 서브 이미지로 분할하는 것이며, 각 서브 이미지는 픽셀의 ¼을 갖습니다.
내부적으로 오퍼레이터는 각 입력의 픽셀을 96bit의 슈퍼 픽셀 하나로 누적합니다.
이러한 방식으로 RAM 효율성도 향상됩니다. Ironman mE5VQ8-CXPD 플랫폼(128 Bit 넓이의 RAM 데이터 인터페이스)에서 1024x1024 이미지를 사용하는 경우, 단일 1 링크 CoefficientBuffer에 저장된 이미지는 다음과 같습니다.
1024 * 1024 * 128 / 8 Byte = 16MB.
4링크 설정을 적용한 경우 크기는 다음과 같습니다.
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 효율로 인해 항상 이론적 대역폭보다 작습니다.
오퍼레이터를 통과하는 최대 대역폭은 Bit Width와 Parallelism의 곱이 내부 RAM 포트 너비 x 2와 같을 때 도달됩니다(읽기 전용 매개변수에 해당).
![]() |
플랫폼별 값 |
|---|---|
|
RAM Port Width과 System Clock은 플랫폼 종속적입니다. 개별 플랫폼에 대한 자세한 내용은 Device Resources를 참조하십시오. |
|
부호 없는(unsigned) 입력의 경우 출력 bit width 범위는 [1, 64]입니다. 부호 있는(signed) 입력의 경우 범위는 [2, 64]입니다. 부호 없는 컬러 입력의 경우 범위는 [3, 63]이며, 부호 있는 컬러 입력의 경우 범위는 [6, 63]입니다. |
|
|
bit width와 parallelism의 곱은 네이티브 RAM 데이터 너비를 초과해서는 안 됩니다. 자세한 내용은 Device Resources를 확인하십시오. |
| RamDataWidth | |
|---|---|
| Type | 정적 쓰기 파라미터 |
| Default | N/A |
| Range | 정수 |
|
이 매개변수는 RAM 인터페이스에서 사용할 수 있는 데이터 비트 수를 제공합니다. |
|
| RamAddressWidth | |
|---|---|
| Type | 정적 쓰기 파라미터 |
| Default | N/A |
| Range | 정수 |
|
이 매개변수는 사용할 수 있는 RAM 주소 비트 수를 제공합니다. |
|
| BufferWidth | |
|---|---|
| Type | static parameter |
| Default | 1024 |
| Range | [1, 65535] |
|
이 매개변수는 픽셀 단위의 계수 이미지 너비를 정의합니다. 또한 이 매개변수는 모든 출력 링크의 최대 이미지 너비를 정의합니다. 이 매개변수의 범위는 사용되는 frame grabber와 그 RAM에 따라 다릅니다. |
|
| BufferHeight | |
|---|---|
| Type | static parameter |
| Default | 1024 |
| Range | [1, 65535] |
|
이 매개변수는 픽셀 단위의 계수 이미지 높이를 정의합니다. 또한 이 매개변수는 모든 출력 링크의 최대 이미지 높이를 정의합니다. 이 매개변수의 범위는 사용되는 frame grabber와 그 RAM에 따라 다릅니다. |
|
| LoadCoefficients | |
|---|---|
| Type | dynamic write 파라미터 |
| Default | 0 |
| Range | {0, 1} |
|
이 매개변수는 이미지 수집이 시작되기 전에 버퍼로 계수 이미지 로딩을 시작하는 데 사용됩니다. 로딩은 이 매개변수에 값 1을 쓰는 쓰기 주기에 의해 트리거됩니다. 값 0을 쓰는 경우 계수 파일 로딩이 발생하지 않습니다. |
|
| UpdateROI | |
|---|---|
| Type | dynamic write 파라미터 |
| Default | 1 |
| Range | {1} |
|
이 매개변수는 하드웨어에서 ROI 설정을 업데이트하는 데 사용됩니다. 4개의 ROI 좌표 매개변수로 정의된 값이 사용됩니다. 업데이트는 이미지 수집이 진행 중인 동안을 포함하여 언제든지 수행할 수 있습니다. |
|
| XOffset | |
|---|---|
| Type | dynamic/static 읽기/쓰기 파라미터 |
| Default | 0 |
| Range | [0, Max.Img Width - XLength] |
|
이 매개변수는 ROI의 왼쪽 상단 모서리 x 좌표를 정의합니다. 값을 변경해도 ROI 설정이 바로 변경되지는 않습니다. 새 설정을 적용하려면 UpdateROI 매개변수에 값을 써야 합니다. 스텝 크기는 parallelism입니다. |
|
| XLength | |
|---|---|
| Type | dynamic/static 읽기/쓰기 파라미터 |
| Default | 1024 |
| Range | [parallelism, Max.Img Width - XOffset] |
|
이 매개변수는 ROI의 너비를 정의합니다. 값을 변경해도 ROI 설정이 바로 변경되지는 않습니다. 새 설정을 적용하려면 UpdateROI 매개변수에 값을 써야 합니다. 스텝 크기는 parallelism입니다. |
|
| YOffset | |
|---|---|
| Type | dynamic/static 읽기/쓰기 파라미터 |
| Default | 0 |
| Range | [0, BufferHeight - YLength] |
|
이 매개변수는 ROI의 왼쪽 상단 모서리 y 좌표를 정의합니다. 값을 변경해도 ROI 설정이 바로 변경되지는 않습니다. 새 설정을 적용하려면 UpdateROI 매개변수에 값을 써야 합니다. |
|
| YLength | |
|---|---|
| Type | dynamic/static 읽기/쓰기 파라미터 |
| Default | 1024 |
| Range | [1, BufferHeight - YOffset] |
|
이 파라미터는 ROI의 높이를 정의합니다. 값을 변경해도 ROI 설정이 직접 변경되지는 않습니다. 새 설정을 적용하려면 UpdateROI 파라미터에 값을 써넣어야 합니다. |
|
| FillLevel | |
|---|---|
| Type | dynamic read parameter |
| Default | 0 |
| Range | [0%, 100%] |
|
이 파라미터는 DRAM의 Fill 상태를 25% 단위로 제공합니다. |
|
| Overflow | |
|---|---|
| Type | dynamic read parameter |
| Default | 0 |
| Range | [0, 1] |
|
이 파라미터는 버퍼 오버플로를 나타냅니다. |
|
| Coefficient File N | |
|---|---|
| Type | 동적 읽기/쓰기 매개변수 |
| Default | coefficients_N.tif |
| Range | 경로가 포함될 수 있는 TIF 파일의 임의 파일 이름 |
|
이 파라미터는 링크 N에 대한 계수 이미지의 파일 이름을 정의합니다. |
|
CoefficientBuffer 오퍼레이터의 사용법은 다음 예시와 같습니다.
-
예시 - 디버깅 목적으로 이미지를 수동으로 삽입할 수 있습니다.
-
예시 - 디버깅 목적으로 링크상의 이미지 전송 상태를 조사할 수 있습니다.
-
예제 - 이 예제는 2D Shading Correction의 구현을 보여줍니다. 보정 값은 프레임 그래버 RAM에 저장됩니다. 이 앱릿은 고정밀 오프셋 및 게인 보정을 수행합니다.
-
'프레임 그래버 RAM을 사용한 1D Shading Correction'
예제 - 이 예제는 1D Shading Correction을 보여줍니다. 보정 값은 Frame Grabber RAM에 저장됩니다.

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



이전

