Operator Library: Memory
| 하드웨어 플랫폼별 지원 여부 |
|---|
| imaFlex CXP-12 Penta |
| imaFlex CXP-12 Quad |
이 연산자를 사용하면 호스트 PC에서 프레임 그래버 RAM(DRAM)으로 이미지 데이터를 업로드할 수 있습니다. 이 연산자는 임의의 개수의 관심 영역(ROI)에 대해 지속적인 데이터 출력을 제공합니다. 여기서는 이미지 파일을 범용 데이터 컨테이너로 사용합니다. 따라서 업로드된 이미지에는 계수 등 어떤 데이터라도 포함될 수 있습니다. 각 이미지는 출력 커널에 할당됩니다. 또한, 이 연산자는 RamLUT 연산자와 동일한 초기화 인터페이스를 제공하며, 각 메모리 주소는 수동으로, 텍스트 파일을 통해 또는 바이너리 파일을 통해 초기화할 수 있습니다. 모든 계수 이미지는 프레임 그래버 RAM(DRAM)에 저장됩니다. RAM 유형의 VisualApplets 리소스가 하나 필요합니다. 자세한 내용은 '장치 리소스 할당'을 참조하십시오. 이 연산자의 지연 시간에 대한 정보는 표 46, '라이브러리 메모리 내 연산자의 개별 지연 시간'을 참조하십시오 . RAM 유형의 여러 리소스는 공유 메모리 개념을 통해 동일한 물리적 RAM을 사용합니다. 공유 메모리 사용 방법에 대한 문서는 애플리케이션 노트: 공유 메모리에서 확인할 수 있습니다.
이 연산자 CoeffientBufferMultiRoi는 출력에서 커널을 지원합니다. 이 연산자가 이미지 파일로 초기화되는 경우, 각 이미지 파일은 해당 출력 커널에 할당됩니다. 버퍼가 수동으로, 텍스트 파일 또는 바이너리 파일로 초기화되는 경우, 데이터가 순서대로 정렬되어 있는지 확인해야 합니다. 정확한 데이터 포맷에 대해서는 아래에서 설명합니다.

이 연산자는 여러 가지 방법으로 버퍼 내용의 프로그래밍을 간소화합니다. 각 방법의 경우, 버퍼는 합성 과정이 끝난 후, 런타임 중에 애플릿이 사용될 때 프로그래밍되어야 합니다.
버퍼를 프로그래밍하는 한 가지 방법은 InitAddress 및 InitData 매개변수를 제공하는 레지스터 인터페이스를 이용하는 것입니다. 먼저,InitAddress 매개변수를 사용하여 주소를 설정합니다. 그런 다음, InitData 매개변수에 데이터를 쓰기합니다.
데이터를 쓰면 연산자가 버퍼에 실제로 데이터를 기록하고 이전 값을 덮어씁니다. 마지막 병렬 커널의 마지막 커널 요소에 데이터를 쓰면 연산자가 실제로 RAM에 데이터를 기록하고 이전 값을 대체하게 됩니다. RAM 주소의 데이터는 다음과 같이 구성되어야 합니다(위의 애니메이션도 참조하십시오):
-
각 RAM 주소에는 O.Parallelism * O.KernelColumns * O.KernelRows 개의 값이 포함됩니다.
-
결과적으로, InitData는 O.Parallelism * O.KernelColumns * O.KernelRows 값으로 구성된 배열입니다.
-
먼저, 커널 행의 모든 값을 나열해야 합니다. 즉, 각 커널 열에 대해 반복해야 합니다.
-
그런 다음, 데이터는 모든 커널에 대해 반복 처리됩니다 행를 순회합니다.
-
마지막으로, 모든 병렬 데이터 커널에 대해 동일한 과정이 반복됩니다.

버퍼를 프로그래밍하는 두 번째 방법은 해당 내용을 포함하는 하나 이상의 파일을 사용하는 것입니다. 파일 액세스는 레지스터 액세스보다 빠르지만, 주의가 필요합니다. 파일은 다양한 형식으로 존재할 수 있습니다. InitFileMode 매개변수를 사용하여 형식을 정의해야 합니다.
이 모드에서는 초기화 파일이 텍스트 파일이어야 하며, 해당 파일 내의 값 문자열은 공백, 탭, 줄바꿈(LF) 또는 캐리지 리턴 줄바꿈(CRLF) 중 하나로 구분되어야 합니다. 운영자는 이러한 파일의 오류를 확인하고, 파일을 사용할 수 없는 경우 오류를 보고합니다.
각 값은 커널 요소를 나타내며, 올바른 범위 내의 십진수여야 합니다. 파일에는 값의 개수가 커널 요소의 개수와 정확히 일치해야 합니다. 병렬도를 1보다 크게 설정하는 경우, 값의 개수는 병렬도 * 커널 요소의 개수여야 합니다.
다음 그림은 4x3 커널에 대한 파일을 보여줍니다:

이 모드는 text_with_checks 모드와 유사하지만, 오류 검사가 덜 이루어집니다. 이 모드에서는 각 값을 별도의 줄에 기재해야 합니다. 이 모드로 파일을 불러오는 속도는 text_with_checks 모드에 비해 더 빠릅니다. 각 값이 별도의 줄에 기록되므로, 이 파일 형식에서는 병렬 처리가 데이터 순서에 영향을 미치지 않습니다. 위의 예제는 text_raw 모드에서 다음과 같이 표시됩니다:

이진 모드는 각 커널 항목에 8바이트가 사용되는 이진 파일을 가정합니다. 커널 항목의 값이 64비트 미만으로 표현될 수 있는 경우, 사용되지 않는 비트는 무시됩니다. 이는 RAM에 값을 기록하는 가장 빠른 방법입니다. 모든 값이 연속적으로 기록되므로, 이 파일 형식의 경우 병렬 처리가 데이터 값의 순서에 영향을 미치지 않습니다. 위의 예제는 바이너리 모드에서 다음과 같이나타납니다:

image_file 모드는 쉼표나 세미콜론으로 구분된 InitFileName 매개변수에 쉼표나 세미콜론으로 구분된 이미지 파일 목록을 입력받습니다. 각 파일은 하나의 커널 값을 초기화하는 데 사용되며, 첫 번째 초기화 파일은 첫 번째 커널 값에, 두 번째 파일은 두 번째 커널 값에 할당되는 식으로 이어집니다...
이 모드는 일반 이미지를 사용하기 때문에, 파일의
데이터 형식과 관련하여 병렬 처리는 중요하지 않습니다. 초기화 파일은 이미지 형식일 수 있습니다.
*.tif 또는 *.bmp. 개별
이미지 파일은 동일한 형식일 필요도 없고,
픽셀 수 또한 같을 필요가 없습니다.
이미지 한 줄당 최대 바이트 수가 32비트 정수 값의 범위를 벗어나게 되면, 연산자가 이미지를 불러오지 못할 수 있습니다. 이러한 현상은 O.Max.Img.Width가 최대 너비(2^RamAddressWidth)에 근접하고, O.Parallelism 도 1보다 클 때에만 발생할 수 있습니다.
초기화 파일에2^RamAddressWidth * KernelSize * Parallelism 개의 값이 포함되어 있으면, 메모리가 주소 0부터 시작하여 완전히 덮어쓰게 됩니다. 이 경우, InitAddress 매개변수는 변경되지 않습니다.
초기화 파일에 RAM에 기록할 수 있는 양보다 많은 데이터가 포함되어 있는 경우, 초기화 파일의 일부만 사용됩니다. 파일의 맨 앞부분에 있는 데이터는 사용 가능한 메모리 공간이 더 이상 없을 때까지 사용됩니다.
초기화 파일에 포함된 항목 수가 더 적을 경우, 부분 초기화가 수행됩니다. 이 경우, 초기화는 InitAddress 매개변수가 지정한 주소부터 시작됩니다. InitAddress 매개변수는 마지막으로 기록된 메모리 항목 바로 다음 위치로 자동으로 증가됩니다. 이를 통해 얼마나 많은 메모리 항목이 기록되었는지 모니터링할 수 있습니다. 파일에 (2^RamAddressWidth - InitAddress) * KernelSize * Parallelism 값을 포함하면, 메모리의 마지막 항목을 기록한 후 초기화가 중지되고 InitAddress는 0으로 설정됩니다.
위에서 지정한 초기화 모드의 경우, InitFilename 매개변수는 초기값이 포함된 파일을 지정합니다. 마지막으로, LoadInitFile 매개변수에 값 1을 쓰면 파일 읽기가 시작되고, 파일이 정상적으로 인식되면 해당 값들이 하드웨어에 기록됩니다. LoadInitFile 매개변수에 0을 설정해도 값이 로드되지는 않습니다. 이는 애플릿 초기화 과정에서 초기 파일이 하드웨어에 로드되는 것을 원하지 않을 때 유용할 수 있습니다.
시뮬레이션 중 초기화 파일(init file)을 불러오는 방식은 실행 시와 동일합니다. 부분적인 구성이 필요한 경우나 오류가 발생한 경우, 시뮬레이션 로그의 출력 내용을 확인하는 것이 도움이 될 수 있습니다: 다음을 활성화하세요 를 활성화하십시오. 대화 상자에서Show Details를 활성화하십시오.
운영자의 프레임 그래버 RAM(DRAM) 가 이미지 데이터로 초기화되면, 여러 관심 영역(ROI)을 읽어옵니다. 다음 매개변수를 사용하여 ROI를 정의할 수 있습니다:
-
읽은 ROI 수: MaxNumRoI 및 NumRoI
-
ROI의 크기와 위치: XOffset, XLength, YOffset 및 YLength
MaxNumRoI 매개변수는 읽을 수 있는 ROI의 최대 개수를 지정합니다. 각 ROI 좌표 매개변수 필드인 XLength, YLength, XOffset 및 YOffset에는 MaxNumRoI 개의 항목이 있습니다.
매개변수 NumRoI는 연산자가 출력에서 제공하는 실제 ROI 수를 지정합니다. NumRoI가 dynamic으로 설정된 경우, 그 값은 MaxNumRoI의 값을 초과할 수 없습니다. dynamic으로 설정된 경우, NumRoI는 이미지 획득 중에 업데이트될 수 있습니다. 획득이 진행되는 동안, 연산자는 지정된 수의 ROI를 주기적으로 읽습니다. 연산자는 ROI 주기가 끝나고 NumRoI로 변경될 때까지 대기합니다.
모든 ROI는 순차적으로 읽혀지며, 운영자 출력에 개별 이미지로 제공됩니다: ROI 0, ROI 1, ROI 2, …부터 ROI N-1까지. 여기서 N은 현재 읽혀진 ROI의 개수이며, NumRoI 매개변수로 지정됩니다. 매개변수 필드인 XOffset, XLength, YOffset 및 YLength는 일련의 ROI를 지정합니다. 이러한 매개변수를 동적(dynamic) 또는 정적(static)으로 설정할 수 있으며, 이는 런타임 중에 매개변수를 조정할 수 있는지 여부를 결정합니다. 하나의 ROI 매개변수 유형이 설정되면 모든 ROI 매개변수의 유형이 자동으로 조정됩니다. 필드 매개변수 구성 방법은 '매개변수 편집'에서 확인하십시오 .
최대 출력 프레임 크기를 초과하지 않는 한, 모든 가능한 직사각형 영역이 ROI 정의에 지원됩니다. 즉, 단일 픽셀, 단일 행, 단일 열, 직사각형 영역, 또는 전체 프레임을 ROI로 정의할 수 있습니다.
서로 다른 ROI는 반드시 같은 크기를 가질 필요는 없습니다.
각 ROI는 개별적으로 정의할 수 있습니다.
ROI는 서로 겹칠 수도 있고, 중복될 수도 있습니다.
X 좌표 매개변수인 XOffset 및 XLength 는 출력 병렬 처리의 단계 크기와 일치해야 합니다.
XLength 또는 YLength를 0으로 설정하여 빈 ROI를 정의할 수 있습니다. 그러면 연산자는 출력으로 빈 이미지(또는 링크 유형이 VALT_LINE1D인 선)를 제공합니다. 빈 이미지에는 픽셀이 포함되어 있지 않습니다. 링크 유형이 VALT_PIXEL0D인 빈 ROI의 경우, 출력이 전혀 생성되지 않습니다.
이 연산자가 이미지 프로토콜 VALT_LINE1D 또는 VALT_PIXEL0D와 함께 사용될 경우, ROI는 항상 2차원 이미지로 간주되는 초기화 파일을 기준으로 정의됩니다. 2차원 ROI가 읽히지만, 링크 유형에 따라 출력은 ROI 프레임, 라인 또는 픽셀의 시퀀스로 생성됩니다.
링크 유형 VALT_LINE1D의 경우, 출력 결과는 개별적으로 정의된 ROI 간에 구분이 없는 무한한 선 시퀀스입니다. 마찬가지로, 링크 유형 VALT_PIXEL0D의 경우, 연산자는 개별 ROI 간은 물론 ROI 라인 간에도 구분이 없는 무한한 픽셀 시퀀스를 제공합니다.
이 연산자는 데이터 수집이 시작되는 즉시 출력에서 ROI 데이터를 제공하며, 연산자의 출력이 후속 연산자에 의해 차단되지 않는 경우에 한합니다. 이 연산자의 지연 시간에 대한 자세한 내용은 표 46, ‘라이브러리 메모리 내 연산자의 개별 지연 시간’을 참조하십시오 .
ROI 매개변수 유형이 ‘동적’으로 설정되어 있다면, 모든 ROI를 동적으로 업데이트할 수 있습니다. 하지만 업데이트된 ROI는 현재 “ROI 주기”가 완료되고 모든 NumRoI 개의 ROI가 읽힌 후에야 적용됩니다.
![]() |
많은 수의 관심 영역(ROI)과 타이밍 |
|---|---|
|
매개변수 MaxNumRoI로 정의된 최대 ROI 정의 개수가 증가함에 따라, 오퍼레이터의 BRAM 소비량도 증가합니다. 이로 인해 높은 클럭 속도에서 타이밍 문제가 발생할 수 있습니다. 예를 들어, MaxNumRoI가 65536인 경우 전체 설계에서 타이밍 요건을 충족하지 못할 수 있습니다. |
다음 제한 사항이 CoefficientBufferMultiRoi 연산자에 적용됩니다:
-
DRAM이 완전히 초기화되지 않은 경우, ROI 좌표에 실제로 이미지 데이터가 포함되어 있는지 여부에 대한 검사가 이루어지지 않습니다. 이 경우, 조작자는 메모리에서 임의의 더미 값을 읽어옵니다.
-
최대 링크 속성은 연산자 사용 방식에 따라 다릅니다. 자세한 내용은 아래의 Supported Link Format 섹션을 참조하십시오.
-
MaxNumRoI 값이 높을 경우(최대값인 65536에 가까울 경우) 타이밍 문제가 발생할 수 있습니다.
-
InitFileLoadMode가 image_file 모드로 설정된 경우, 이미지가 지나치게 넓으면 로드되지 않을 수 있습니다.
최적의 성능을 얻으려면, 사용되는 데이터 비트 수는 모듈의 RamDataWidth 매개변수에 지정된 값과 가능한 한 가깝게 일치해야 합니다. 연산자를 통과하는 최대 대역폭은 비트 폭, 커널 크기 및 병렬 처리 횟수의 곱이 내부 RAM 포트 폭인 RamDataWidth와 같을 때 달성됩니다. 내부 비트 폭은 커널을 사용하여 늘릴 수 있지만, 전체 커널은 여전히 단일 픽셀로 처리된다는 점에 유의하십시오.
|
입력 Bit Width의 범위는 다음과 같습니다:
입력 Bit Width는 네이티브 RAM 데이터 폭인 RamDataWidth를 초과해서는 안 됩니다. |
|
|
비트 폭, 병렬 처리 수준 및 커널 크기의 곱은 네이티브 RAM 데이터 폭을 초과해서는 안 됩니다:
|
|
|
이미지의 최대 크기는 사용 가능한 RAM 용량을 초과해서는 안 됩니다:
그 결과, O.MaxImageWidth 및 O.MaxImageHeight에 대해 다음과 같은 조건이 성립합니다:
|
| RamDataWidth | |
|---|---|
| Type | 정적 쓰기 파라미터 |
| Default | N/A |
| Range | 정수 |
|
이 매개변수는 RAM에서 사용할 수 있는 최대 데이터 폭을 지정합니다. 이 매개변수는 사용되는 하드웨어 플랫폼에 따라 달라집니다. |
|
| RamAddressWidth | |
|---|---|
| Type | 정적 쓰기 파라미터 |
| Default | N/A |
| Range | 정수 |
|
이 매개변수는 사용할 수 있는 주소 비트 수를 지정합니다. 사용 가능한 RAM 슬롯 수는 2^RamAddressWidth로 정의됩니다. 현재 RamAddressWidth 값은 하드웨어 플랫폼과 설계 내의 현재 메모리 연산자 수(즉, RAM 리소스를 사용하는 연산자)에 따라 달라집니다. |
|
| 초기 주소 | |
|---|---|
| Type | dynamic write 파라미터 |
| Default | 0 |
| Range | [0, 2^RamAddressWidth-1] |
|
이 매개변수는 InitData 매개변수로 정의된 데이터의 주소를 지정합니다. 또한 이 매개변수는 초기화 파일을 사용하여 RAM을 초기화할 때 오프셋 주소로 사용할 수도 있습니다. 위의 설명을 참조하십시오. |
|
| InitData | |
|---|---|
| Type | dynamic write 파라미터 |
| Default | 0 |
| Range | [0, 2^O.BitWidth-1] |
|
이 필드 매개변수는 매개변수 InitAddress로 정의된 주소로 쓰여지는 데이터를 정의합니다. InitData에는 O.Parallelism * O.KernelColumns * O.KernelRows 값이 포함됩니다. InitData 배열의 마지막 필드를 작성하면 하드웨어에 대한 실제 쓰기 작업이 수행됩니다. 자세한 설명은 위 내용을 참조하십시오. |
|
| InitFileLoadMode | |
|---|---|
| Type | dynamic write 파라미터 |
| Default | image_file |
| Range | {text_with_checks, text_raw, binary, image_file} |
|
이 매개변수는 조회 테이블에 로드되는 파일의 파일 형식과 모드를 정의합니다.
상단의 자세한 설명을 참조하십시오. |
|
| InitFileName | |
|---|---|
| Type | dynamic write 파라미터 |
| Default | InitCoefficientBuffer.tif |
| Range | |
|
이 매개변수는 초기화 파일의 이름을 지정합니다. InitFileLoadMode가 image_file로 설정된 경우, 이 매개변수에는 단일 파일 이름 대신 파일 목록이 포함됩니다. 파일 목록에서 각 항목은 쉼표 또는 세미콜론으로 구분되어야 합니다.image_file 모드에서 지정된 파일의 수는 LoadInitFile을 사용하여 파일을 로드할 때 사용 가능한 커널 값의 수(O.KernelColumns * O.KernelRows)와 일치해야 합니다. 이 매개변수는 앞뒤에 공백이 있거나 앞뒤에 “"” 또는 “'” 문자가 포함된 파일 이름을 허용합니다. |
|
| LoadInitFile | |
|---|---|
| Type | dynamic write 파라미터 |
| Default | 0 |
| Range | [0, 1] |
|
InitFileName 매개변수로 지정된 파일(들)을 RAM에 불러오려면, 이 매개변수에 값 1을 기록하십시오. 자세한 내용은 위를 참조하십시오. |
|
| MaxNumRoI | |
|---|---|
| Type | 정적 쓰기 파라미터 |
| Default | 1 |
| Range | [1, 65536] |
|
이 매개변수는 작업자가 저장할 수 있는 ROI의 최대 개수를 정의합니다. NumRoI가 static으로 설정된 경우, 이 매개변수는 편집할 수 없습니다. 대신 NumRoI와 동일한 값이 자동으로 적용됩니다. 최대 ROI 개수가 매우 많은 경우 MaxNumRoI는 애플릿을 빌드할 때 타이밍 문제를 일으킬 수 있습니다. |
|
| NumRoI | |
|---|---|
| Type | 동적/정적 쓰기 파라미터 |
| Default | 1 |
| Range | [1, MaxNumRoI] |
|
이 매개변수는 실제로 사용되는 ROI의 수를 정의합니다. 연산자는 NumRoI개의 ROI를 읽은 후, 첫 번째 ROI 읽기를 다시 시작합니다. 획득이 진행되는 동안, 연산자는 다음 연산자에 의해 출력이 차단될 때까지 NumRoI개의 ROI를 주기적으로 출력합니다. 이 매개변수가 static으로 설정된 경우, 범위는 [1, 65536]이며 MaxNumRoI는 비활성화됩니다. |
|
| XOffset | |
|---|---|
| Type | dynamic/static 읽기/쓰기 파라미터 |
| Default | 0 |
| Range | [0, O.MaxImgWidth - XLength] |
|
이 필드 매개변수는 ROI의 가장 왼쪽 열의 x 좌표 배열을 정의합니다. 스텝 크기는 parallelism입니다. |
|
| XLength | |
|---|---|
| Type | dynamic/static 읽기/쓰기 파라미터 |
| Default | 1024 |
| Range | [0, O.MaxImgWidth - XOffset] |
|
이 필드 매개변수는 ROI 너비 배열을 정의합니다. 스텝 크기는 parallelism입니다. |
|
| YOffset | |
|---|---|
| Type | dynamic/static 읽기/쓰기 파라미터 |
| Default | 0 |
| Range | [0, O.MaxImgHeight - YLength] |
|
이 필드 매개변수는 ROI의 첫 번째 행에 해당하는 y좌표 배열을 정의합니다. |
|
| YLength | |
|---|---|
| Type | dynamic/static 읽기/쓰기 파라미터 |
| Default | 1024 |
| Range | [0, O.MaxImgHeight - YOffset] |
|
이 필드 매개변수는 ROI 높이의 배열을 정의합니다. |
|
| LinesToSimulate | |
|---|---|
| Type | 정적 쓰기 파라미터 |
| Default | 1 |
| Range | {1, 2^31-1} |
|
이 매개변수는 시뮬레이션의 설계 단계에서 사용되며, 오직 O.LinkType이 VALT_LINE1D로 설정된 경우에만 사용됩니다. 이 매개변수는 연산자가 시뮬레이션해야 할 ROI 라인의 수를 정의합니다. ROI는 초기화 이미지(들)에서 2차원 영역으로 정의되지만, 시뮬레이션 출력은 지정된 모든 ROI를 순환적으로 반복하는 일련의 라인을 제공합니다( NumRoI개의 ROI 라인을 읽은 후 ROI 0부터 다시 시작합니다). |
|
| PixelsToSimulate | |
|---|---|
| Type | 정적 쓰기 파라미터 |
| Default | 1 |
| Range | {1, 2^31-1} |
|
이 매개변수는 시뮬레이션을 위한 설계 단계에서 사용되며, 오직 O.LinkType이 VALT_PIXEL0D로 설정된 경우에만 사용됩니다. 이 매개변수는 연산자가 시뮬레이션해야 할 ROI 픽셀의 수를 정의합니다. ROI는 초기화 이미지 내에서 2차원 영역으로 정의되지만, 시뮬레이션 출력은 지정된 모든 ROI를 순환적으로 반복하는 픽셀 시퀀스를 제공하며, NumRoI개의 ROI 픽셀을 읽은 후 ROI 0부터 다시 시작합니다. |
|

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



이전

