콘텐츠로 바로 가기

Memory 요소#

이 항목에서는 ‘ VisualApplets ’ 설계 내의 메모리 연산자가 대상 하드웨어의 물리적 메모리에 어떻게 매핑되는지, 그리고 어떤 유형을 언제 사용해야 하는지에 대해 설명합니다. 이 항목을 읽은 후에는 FPGA 내부 메모리 (예: 블록 RAM)와 프레임 그래버 DRAM의 차이점, FIFO 방식 버퍼와 랜덤 액세스 프레임 버퍼의 차이점, 공유 DRAM 대역폭이 여러 RAM 연산자가 포함된 설계에 어떤 제한을 주는지, 그리고 시뮬레이션 및 하드웨어 환경에서 메모리 관련 문제를 어떻게 파악할 수 있는지를 이해하게 됩니다.

주요 용어

VisualApplets 설계의 메모리 연산자는 대상 하드웨어상의 두 가지 물리적 메모리 위치 중 하나를 사용합니다. 하나는 프레임 그래버 내부의 FPGA (용량이 작고 속도가 빠르며 로컬) 이고, 다른 하나는 FPGA 외부의 프레임 그래버 (DRAM — 라인 및 프레임 버퍼를 위한 더 큰 용량) 입니다.

FillLevel은 하드웨어에서 런타임 시 버퍼의 채워진 정도(백분율)를 알려줍니다(예: microDisplay X). 버퍼가 100% 근처를 유지하는 경우, 이는 종종 병목 현상이나 교착 상태를 의미합니다. 우선 카메라 뒤쪽에 버퍼를 배치해 보십시오.

플랫폼 RAM 용량, 데이터 폭 및 대역폭 값에 대해서는 ‘장치 리소스’를 참조하십시오.

FPGA 메모리 대 프레임 그래버 DRAM#

VisualApplets 메모리 연산자는 프레임 그래버 내 데이터 저장 위치에 따라 두 가지 그룹으로 나뉩니다. 두 번째 구분 기준은 해당 데이터에 접근하는 방식입니다. 즉, FIFO 방식 버퍼와 임의 접근 방식 또는 다중 ROI 프레임 버퍼로 구분됩니다. ‘연산자 참조 (Operator Reference ) ’의 ‘메모리 연산자 개요( Memory Library )’ 섹션에서는 각 메모리 연산자가 데이터를 저장하는 위치를 확인할 수 있습니다. ‘메모리 연산자 개요 ( VisualApplets )’에 언급된 RAM 리소스는 보드 DRAM에 매핑되는 장치 리소스 토큰입니다. 이는 ‘프레임 그래버( VisualApplets )’ 애플리케이션 내부의 메모리가 아닙니다.

Property FPGA 내장 메모리 프레임 그래버 DRAM
대표적인 연산자 ImageFifo; 작은 랜덤 액세스 사례의 경우에도 FrameMemoryRandomRd / LineMemoryRandomRd ImageBuffer, LineBuffer, FrameBufferRandomRead, FrameBufferMultiRoi, FrameBufferMultiRoiDyn
위치 FPGA 내부 ( imaFlex CXP-12 Quad/Penta 의 BRAM, LUT RAM 또는 URAM) 보드 상, FPGA 외부
용량 제한적임; 전체 해상도 프레임은 사용 가능한 FPGA 메모리 용량을 초과하는 경우가 많음 더 높음; 여러 라인 또는 풀 프레임에 적합
Latency 낮음; 외부 DRAM 버스에 접근할 수 없음 행 기반 FIFO는 최소 한 행을 추가합니다
VisualApplets RAM 리소스 아니요 — RAM 장치 리소스를 예약하지 않습니다. 네 — 인스턴스당 하나의 RAM 리소스가 있으며, 보드 DRAM에 매핑됩니다.
대역폭 로컬; 운영 체제들은 프레임 그래버의 RAM 인터페이스를 놓고 경쟁하지 않습니다. 동일한 물리적 인터페이스를 사용하는 RAM 운영자 간에 공유됨 — ‘DRAM 대역폭 공유’ 참조

“메모리 연산자 선택” 표를 참고하여 연산자를 선택한 다음, 해당 연산자 섹션에서 매개변수 및 플랫폼 관련 세부 정보를 확인하십시오.

메모리 연산자 선택하기#

사용 사례 선호
작은 버퍼, 낮은 지연 시간, DRAM 대역폭 비용 없음 ImageFifo (FPGA 내부)
mE5의 이미지 FIFO, 최대 흡수, ROI ImageBuffer (DRAM)
FIFO 라인 활성화 imaFlex CXP-12 Quad/Penta LineBuffer (DRAM)
버퍼 이전 SYNC 약간의 지연이 있는 ImageFifo (지연 시간이 길 경우 더 큰 DRAM 버퍼)
무작위 픽셀 읽기 기능을 갖춘 풀프레임 스토어 FrameBufferRandomRead (DRAM)
하나의 버퍼에서 여러 개 또는 동적인 ROI 생성 FrameBufferMultiRoi / FrameBufferMultiRoiDyn (DRAM)

디자인 가이드라인

Basler는 카메라에서 발생하는 데이터 버스트를 상쇄하기 위해 설계에 DRAM 연산기를 최소 한 개는 사용할 것을 권장합니다. 이 DRAM 버퍼는 카메라의 기본 디커플링 경로입니다 (LineBuffer 또는 ImageBuffer). ImageFifo 카메라의 연사 촬영을 처리해야 할 때, 이 기능은 해당 DRAM 버퍼를 대체할 수 없습니다.

ImageFifo#

The ImageFifo 연산자는 이미지 데이터를 다음과 같이 큐에 넣습니다. 선입선출 FPGA 내부 메모리에 있는 버퍼. 버퍼의 크기는 EntitiesToStore 및 EntityType 매개변수. EntityType 다음과 같은 값을 가집니다 PIXEL, LINE, 또는 FRAME. 출력이 비어 있으면 데이터가 즉시 전달됩니다. 하류 모듈이 차단되면 버퍼가 가득 차게 됩니다.

파라미터를 원하는 InfiniteSource operator의 ImageFifo 연산자 to ENABLED 입력이 카메라와 같이 중지할 수 없는 출처에서 들어올 때.

정보

The ImageFifo 이 연산자는 비교적 적은 수의 픽셀만 버퍼링합니다. 따라서 FIFO 오버플로우가 발생할 위험이 크며, 연산자 측에서 이를 내부적으로 항상 안정적으로 처리해 주는 것은 아닙니다. 중지할 수 없는 스트림의 경우, Basler는 다음을 결합할 것을 권장합니다. ImageFifo 앞에 ~가 있는 Overflow 연산자, 또는 다음을 사용하여 ImageFlowControl ~ 대신 연산자 ImageFifo operator를 통해 수행됩니다. ImageFlowControl 이 연산자는 FIFO 버퍼링과 통합된 오버플로 처리를 결합합니다.

다음 매개변수를 사용하여 ImplementationType 다음 중에서 선택할 수 있습니다 AUTO (기본값), BRAM, LUTRAM, 또는 — imaFlex CXP-12 Quad/Penta — URAM. 바슬러는 항상 다음을 사용할 것을 권장합니다. AUTO 특정 FPGA 리소스 유형이 부족해지지 않는 한.

이 연산자에 대한 자세한 내용은 ‘연산자 참조’의 ImageFifo 항목을 참조하십시오.

ImageBuffer와 LineBuffer#

The ImageBuffer (microEnable 5) 및 LineBuffer (imaFlex) 연산자는 다음과 같이 작동합니다. 행 기반 FIFO: 선택한 ROI 내의 완료된 라인은 하류 모듈이 이를 수용할 수 있게 되는 즉시 전달됩니다. 지연 시간은 최소 한 줄. 버퍼가 가득 차면 출력이 차단되기 때문에 지연 시간이 늘어납니다. 다음 항목도 참조하십시오. Latency 튜토리얼 주제.

버퍼를 활용한 간단한 획득 경로

플랫폼 참고 사항: ImageBuffer 대 LineBuffer#

Operator 플랫폼
ImageBuffer microEnable 5 (mE5)
LineBuffer imaFlex CXP-12 쿼드 / 펜타

imaFlex CXP-12 쿼드 및 펜타 지지하지 마세요 그 ImageBuffer 연산자. mE5에서 imaFlex로 설계를 변환할 때, VisualApplets 대체합니다 각각 ImageBuffer ~를 가진 연산자 LineBuffer operator를 통해 수행됩니다. LineBuffer 이 운영자는 imaFlex 플랫폼에 대해 동일한 핵심 버퍼링 및 ROI 기능을 제공합니다.

ImageBuffer 및 LineBuffer를 사용하여 관심 영역(ROI) 정의하기#

을(를) 통해 ImageBuffer 및 LineBuffer 연산자를 사용하여 관심 영역(ROI)을 정의할 수도 있습니다. 이를 위해서는 다음을 설정하여 XOffset, XLength, YOffset및 YLength parameters. Edge cases are documented in the Operator Reference: For example, if the input is smaller than the requested ROI, or if your design is in Line1D 모드이거나, 추가 픽셀에 대해 정의되지 않은 콘텐츠가 있는 경우입니다.

이 연산자에 대한 자세한 내용은 ‘연산자 참조’의 LineBuffer 및 ‘연산자 참조’의 ImageBuffer를 참조하십시오.

버퍼 사용량 및 오버플로 모니터링#

The ImageBuffer 및 LineBuffer 운영자는 버퍼 사용량과 오버플로를 모니터링하기 위해 다음과 같은 상태 매개변수를 제공합니다:

매개변수 의미
FillLevel 버퍼 RAM의 사용량을 백분율로 나타냅니다 (on ImageBuffer (25% 단위로).
LineCount 현재 저장된 줄 수를 나타냅니다. 다음에서만 사용할 수 있습니다. LineBuffer 연산자.
Overflow 버퍼가 용량을 초과하지 않고는 더 이상 데이터를 수신할 수 없음을 나타냅니다. 이 상태 매개변수는 Overflow 동기화 라이브러리의 연산자이며, 산술 오버플로우와는 다릅니다. 참조: 중지 가능 및 중지 불가능 데이터 스트림 튜토리얼 주제 및 Bit Arithmetic 튜토리얼 주제.

오버플로가 발생하면 입력 데이터가 버려질 수 있으며, 실제 이미지 높이가 줄어들 수 있습니다. 불완전한 이미지는 운영자가 복구할 때까지 메모리에 남아 있을 수 있습니다. Overflow 이 조건은 소스가 중지 불가능한 경우에 적용되며, InfiniteSource 은(는) ENABLED. 설정 InfiniteSource 에서 ENABLED 버퍼가 카메라나 다른 무한 소스 바로 뒤에 위치할 때. 다음 항목도 참조하십시오. 중지 가능 및 중지 불가능 데이터 스트림 튜토리얼 주제. 디버깅 시 이러한 매개변수를 사용하는 방법에 대해서는 다음을 참조하십시오. 기억과 관련된 오류 파악하기.

InfiniteSource가 활성화된 버퍼 연산자

다음에서: LineBuffer 연산자에 대해 Basler는 다음을 활성화할 것을 권장합니다. WritePriority 매개변수 when InfiniteSource 은(는) ENABLED. 만약 WritePriority 은(는) ENABLED, 임시 쓰기 속도가 사용 가능한 DRAM 대역폭을 초과하는 동안에는 카메라의 쓰기 버스트가 읽기보다 선호됩니다. 이 평균 대역폭은 여전히 해당 사업자에게 할당된 할당량 범위 내에서 유지되어야 합니다.

The LineBuffer 이 연산자는 모듈 매개변수를 사용하여 입력과 출력 간의 병렬성을 변환할 수도 있습니다. ParallelismConverter, 따라서 항상 별도의 PARALLELup / PARALLELdn. 또한 다음을 참조하십시오. Parallelism 튜토리얼 주제.

프레임 버퍼 연산자를 활용한 전체 프레임, 랜덤 액세스, 다중 ROI#

The FrameBufferRandomRead, FrameBufferMultiRoi및 FrameBufferMultiRoiDyn 운영자 스토어 전체 이미지 또는 넓은 영역 그리고 다음 순서대로 읽어보세요. 않습니다 엄격한 FIFO 방식입니다. 단일 버퍼에서 임의의 픽셀에 접근하거나 여러 ROI가 필요한 경우에 사용하십시오.

FrameBufferRandomRead#

FrameBufferRandomRead 입력 이미지를 DRAM에 쓴 다음, 픽셀을 읽어오며 열 및 행 주소 전용 주소 포트에 사용됩니다. 기하학적 변환, 리매핑 및 기타 임의 접근 패턴에 활용하십시오.

작은 프레임이나 라인의 경우, 다음과 같은 FPGA 내부 연산자를 사용하는 것이 좋습니다. FrameMemoryRandomRd 또는 LineMemoryRandomRd DRAM 사업자 대신.

이 연산자에 대한 자세한 내용은 연산자 참조의 ‘FrameBufferRandomRead’ 항목을 참조하십시오.

FrameBufferMultiRoi 및 FrameBufferMultiRoiDyn#

The FrameBufferMultiRoi 및 FrameBufferMultiRoiDyn 연산자는 이미지 데이터를 저장하고 출력합니다. 여러 관심 영역. FrameBufferMultiRoiDyn ~할 수 있게 한다 동적 제어 링크를 통한 ROI의 크기와 위치.

DRAM 대역폭 공유#

각 DRAM 운영자(operator)는 RAM 유형의 리소스 하나( VisualApplets )가 필요합니다. 이 리소스는 ‘ VisualApplets ’ 리소스 모델 내의 슬롯입니다. 이는 프레임 그래버의 물리적 DRAM에 매핑됩니다. imaFlex 및 microEnable 5 marathon 플랫폼에서는 RAM 리소스를 할당받은 모든 운영자가 물리적 DRAM을 공유합니다. 각 운영자는 중복되지 않는 전용 메모리 영역을 할당받지만 , 용량과 대역폭은 동일한 물리적 인터페이스에 있는 활성 RAM 운영자들 간에 분배됩니다.

결과:

  • 읽기 및 쓰기 작업이 발생할 때마다 공유 인터페이스의 대역폭이 소모됩니다.
  • DRAM 인스턴스가 여러 개이거나 처리량이 높은 경우, 총 트래픽이 플랫폼 제한을 초과할 수 있습니다.
  • 수요 과잉은 정체와 가격 상승을 초래한다 FillLevel, 오버플로우, 또는 지속 가능한 프레임 속도가 낮아지는 현상.

‘장치 리소스’에서 사용 중인 플랫폼의 RAM 용량, RAM 데이터 폭 및 RAM 대역폭 합계(공유)를 확인하십시오.

필요할 때 ‘리소스’ 대화 상자에서 리소스를 할당하십시오. 자세한 내용은 ‘장치 리소스’의 ‘장치 리소스 할당’을 참조하십시오.

대역폭 계산 관련 참고 사항#

‘공유 메모리 애플리케이션 노트’에서는 RAM 용량과 RAM 데이터 폭을 효율적으로 활용하는 방법을 설명합니다.

주요 내용:

  1. 읽기 및 쓰기 작업은 동일한 인터페이스를 공유합니다. DRAM 연산기가 하나일 경우, 사용 가능한 이미지 데이터 전송 속도를 추정할 때는 플랫폼의 최대 대역폭을 2로 나눈 값(쓰기용 절반, 읽기용 절반)을 산출한 다음, 효율 계수를 적용해야 합니다. 문서화된 대역폭 값은 이론상 최대치이며, 실제 효율은 이보다 낮습니다.

  2. 실용적인 범위 내에서 RAM 데이터 폭을 최대한 활용하십시오. 링크의 유효 RAM 데이터 폭은 다음과 같습니다:

비트 폭 × 병렬도 × 커널 요소 수

이 곱은 각 DRAM 액세스의 유효 폭을 나타냅니다. 이를 병렬 처리 × 기본 설계 클럭으로 계산된 픽셀 레이트 대역폭과 혼동해서는 안 됩니다. 이 곱이 플랫폼 RAM 데이터 폭 (예: 보드에 따라 256비트, 384비트 또는 640비트)과 일치하되 이를 초과하지 않을 때 최대 DRAM 처리량이 달성됩니다. 이 곱의 값을 최대 RAM 데이터 폭과 일치시키면 DRAM의 전체 쓰기 및 읽기 대역폭을 활용할 수 있습니다. 이 값이 훨씬 낮으면 DRAM 액세스가 병목 현상이 될 수 있습니다. 8비트 × 병렬도 4인 설계는 256비트 인터페이스 중 32비트만 사용하므로 대역폭 여유분을 낭비하게 됩니다.

  1. 여러 DRAM 운영자가 대역폭을 공유합니다. 공유 메모리 플랫폼에서, 한 운영자가 사용할 수 있는 대역폭은 해당 인터페이스에서 대략 1 / (RAM 운영자 수) 에 비례하여 확장됩니다. 자세한 내용은 ‘장치 리소스’ 및 ‘애플리케이션 노트: 공유 메모리’( ‘관련 주제’ 참조)에 설명된 바와 같이 플랫폼마다 다릅니다.

  2. imaFlex 2 Dual 100 와 같이 플랫폼이 하나 이상의 물리적 인터페이스를 제공하는 경우, 독립적인 RAM 뱅크 간에 연산자를 분산시켜야 합니다. 대역폭은 동일한 물리적 뱅크에 속한 연산자들끼리만 공유됩니다.

디자인 가이드라인

RAM 사용량을 미리 계획하십시오. DRAM 연산자가 하나 추가될 때마다 동일한 물리적 메모리 인터페이스에서 다른 연산자가 사용할 수 있는 대역폭이 줄어듭니다. DRAM 버퍼를 하나 더 추가하기 전에, 총 읽기/쓰기 트래픽을 계산하여 플랫폼에서 사용할 수 있는 공유 대역폭과 비교하십시오(‘장치 리소스’ 참조). 다음을 우선적으로 고려하십시오. ImageFifo (FPGA 메모리)를 소규모 디커플링 작업에 활용하면 DRAM 대역폭을 불필요하게 소모하지 않을 수 있습니다.

VisualApplets 모든 런타임 시나리오에서 설계에 적합한 유형과 크기의 메모리가 충분히 확보되어 있는지항상 확인할 수는 없습니다. 이미지의 크기, 처리 속도 및 동기화 요구 사항에 맞는 연산자와 버퍼 크기를 선택해야 합니다.

버퍼 크기가 하드웨어에 비해 부족하더라도 시뮬레이션은 정상적으로 실행될 수 있습니다. 오류는 대개 프레임 그래버에서만 나타납니다. 예를 들어, 시뮬레이션은 정상적으로 보였음에도 SDK에서는 이미지가 출력되지 않는 경우가 있습니다.

흔한 원인은 다음과 같습니다. SYNC 교착 상태 및 메모리 부족 또는 오류.

이러한 문제를 방지하려면 다음 사항을 확인해 보세요:

  • 버퍼와 DMA 경로를 배선한 후, 레벨 1 및 레벨 2 설계 규칙 검사를 실행하십시오.
  • 하드웨어 관련 내용은 다음을 참고하세요 FillLevel (그리고 Overflow (가능한 경우), 예를 들어 microDisplay X 에서 확인할 수 있습니다. 100% 사용률이 지속적으로 유지되는 것은 대개 교착 상태나 대역폭 병목 현상을 나타냅니다.
  • 여러 DRAM 운영자가 있는 경우, ‘Design → Device Resources’를 열고 RAM 할당량과 예상 대역폭 점유율을 확인하십시오.
  • 무한한 소스의 경우, 다음을 확인하십시오. InfiniteSource 은(는) ENABLED 중단할 수 없는 스트림을 수신하는 모든 버퍼에서.

대표적인 파이프라인 예시#

DRAM 라인 버퍼를 통한 카메라-DMA 간 통신#

가장 간소화된 설계에는 카메라 조작자 1명과, DRAM 버퍼 1개가 포함되어 있으며 InfiniteSource 다음을 다음으로 설정: ENABLED, 그리고 하나 DmaToPC 연산자:

InfiniteSource가 활성화된 최소 설계

이 버퍼를 사용하여 피크를 흡수하고 라인 기반 처리에 데이터를 공급하십시오. 확인 FillLevel 하드웨어의 경우, 100%에 가까운 값은 대개 병목 현상이나 교착 상태를 나타냅니다. 참조: 기억과 관련된 오류 파악하기.

라인 버퍼를 거쳐 3×3 커널로 전달되는 카메라#

다음 설계에서 DRAM 버퍼는 커널(예: 3×3)을 구성하는 근접 연산자에 신호를 공급합니다. 이 버퍼는 최소 한 줄의 지연 시간을 발생시키며, 필터 경로가 차단되어 버퍼가 가득 차게 되면 지연 시간이 더 늘어납니다. 다음의 공유 DRAM 대역폭을 고려해야 합니다. LineBuffer 연산자도 마찬가지입니다. 스크린샷에 표시된 설계 규칙 검사 기능은 빌드 전에 링크 형식과 버퍼 설정이 일관되게 설정되어 있는지 확인해 줍니다.

무한 소스가 활성화된 라인 버퍼