다중 DMA 채널 디자인

대부분의 VisualApplets 애플리케이션은 카메라 이미지 획득, 이미지 처리 알고리즘을 통한 이미지 처리, 그리고 호스트 PC로의 결과 출력 과정을 거칩니다. 그 외에도 사용자는 원본 모니터링 이미지를 모니터링하고자 합니다. 따라서 두 개의 이미지 출력이 필요합니다. 즉, 원본 모니터링 이미지와 알고리즘 구현의 처리 결과입니다. 다음에서는 다음 사양을 충족하는 VisualApplets 디자인을 구현합니다.

  • 베이스 구성 모드의 Camera Link 카메라를 사용한 그레이스케일 이미지
  • 최대 해상도 = 1024 x 1024 픽셀 (8비트/픽셀)
  • 이미지 버퍼링 및 획득된 이미지 중 10개마다 하나씩 호스트 PC로 전달 (모니터링)
  • 임계값 처리를 사용하여 획득된 각 이미지를 이진화하고 결과 이미지를 호스트 PC로 출력
  • 이진화된 출력 이미지의 형식은 다음과 같아야 합니다: 0 = 검은색, 흰색 = 255 (8비트/픽셀)

이 사양을 바탕으로 블록 다이어그램을 생성할 수 있습니다.

모니터링 기능이 포함된 임계값 이진화 디자인의 블록 다이어그램

그림 206. 모니터링 기능이 포함된 임계값 이진화 디자인의 블록 다이어그램


보시다시피 이미지가 획득되고 버퍼링됩니다. 버퍼링 후 처리 파이프라인은 두 개의 경로로 분기됩니다. 첫 번째 경로는 모니터링을 위해 10번째 이미지마다 출력하는 역할을 담당합니다. 두 번째 경로는 이진화 및 이진 이미지 출력을 포함합니다.

대부분의 VisualApplets 구현은 동일한 원칙을 따릅니다. 이미지 획득 및 버퍼링이 먼저 수행됩니다. 버퍼링 후 이미지 처리 로직이 위치합니다. '데이터 흐름'에서 VisualApplets 처리 파이프라인 및 디자인의 기본 설정에 대한 자세한 정보를 확인할 수 있습니다. 다음에서는 단계별로 사양을 충족하는 VisualApplets 디자인의 구현 과정을 살펴보겠습니다. VisualApplets 구현 외에도 내장된 시뮬레이션을 사용하여 디자인을 검증하고 실제 하드웨어에서 디자인을 사용할 것입니다.

모니터링을 통한 Binarization의 VisualApplets 구현

  1. 이전 예제에서 사용했던 기본 오퍼레이터부터 시작하겠습니다. 이들은 카메라 오퍼레이터인 CameraGrayAreaBase, 버퍼인 ImageBuffer, 그리고 결과를 호스트 PC로 전송하는 오퍼레이터인 DmaToPC입니다. 반면, 이번에는 원본 이미지와 이진화된 결과를 모두 전송하기 위해 디자인에 두 번째 DmaToPC 모듈이 필요합니다. 다음 디자인에 표시된 대로 모든 오퍼레이터를 찾아 이름을 변경하십시오.

  2. 보시다시피 DMA 모듈의 이름을 DMA0_OriginalImages 및 DMA1_BinarizedImages로 변경하여 인덱스를 부여했습니다. 각 DMA 채널이 채널 인덱스를 사용하기 때문입니다. 이 채널 인덱스는 모든 PC 소프트웨어에서 데이터에 접근하는 데 사용됩니다. 대부분의 FPGA 내부 리소스가 아닌 리소스는 위치를 지정하기 위해 인덱스를 사용합니다. FPGA 외부 하드웨어를 사용하는 오퍼레이터 중 일부는 카메라 오퍼레이터, ImageBuffer 등 DRAM을 사용하는 오퍼레이터, 트리거 신호 등 범용 입출력을 사용하는 오퍼레이터 및 DMA 오퍼레이터입니다. 실제로 지금까지 우리 디자인에 있는 모든 오퍼레이터는 외부 리소스를 사용하며 인덱스에 할당될 수 있습니다. 카메라 오퍼레이터는 Camera Link 포트 A 또는 B에 할당할 수 있습니다. 버퍼는 microEnable IV VD4-CL의 4개 DRAM 중 하나에 할당할 수 있으며, DMA는 DMA 채널 중 하나에 할당할 수 있습니다. 디바이스 리소스 사용에 대한 자세한 설명은 '디바이스 리소스 할당'에서 확인할 수 있습니다. 지원되는 모든 하드웨어 플랫폼에 사용 가능한 디바이스 리소스 목록은 디바이스 리소스에 나와 있습니다.

    대부분의 디바이스 리소스는 VisualApplets의 리소스 대화 상자 창을 사용하여 변경할 수 있습니다. 일부 리소스는 오퍼레이터의 파라미터를 사용하여 변경할 수 있습니다. 디바이스 리소스를 변경하려면 디자인 → 리소스에서 액세스할 수 있는 리소스 대화 상자 창을 열거나 편집 메뉴 모음의 아이콘을 사용해야 합니다.

    DMA 모듈 DMA0_OriginalImages가 인덱스 0에 할당되고 DMA1_BinarizedImages가 인덱스 1에 할당되었는지 확인하십시오. 카메라 모듈은 Camera Link 포트 A를 나타내는 인덱스 0에 할당되어야 합니다. 버퍼가 사용하는 DRAM 칩은 중요하지 않으므로, 메모리 오퍼레이터 간에 충돌이 있는 경우 VisualApplets가 자동으로 인덱스를 선택하도록 합니다. 일반적으로 VisualApplets는 항상 사용되지 않는 인덱스를 선택합니다. 카메라 모듈이 두 개이고 인덱스 0을 사용하는 모듈을 삭제하면 남은 카메라 모듈은 인덱스 1을 사용하게 됩니다. 따라서 앱릿 빌드를 시작하기 전에 모든 디바이스 리소스 인덱스를 반드시 확인하십시오. 리소스 인덱스는 합성 후에는 변경할 수 없습니다.

  3. 다음으로 이미지 처리 알고리즘을 포함해야 합니다. 두 가지 서로 다른 이미지 처리 알고리즘을 구현해야 하므로 파이프라인을 두 개의 경로로 분기해야 합니다. 이는 분기 오퍼레이터를 통해 간단하게 수행됩니다. 기본 오퍼레이터 라이브러리에서 오퍼레이터를 찾아 디자인으로 드래그하십시오. 마우스 버튼을 놓으면 사용자가 출력 링크의 수, 즉 분기 수를 지정할 수 있는 팝업 창이 나타납니다. 2를 선택하고 확인을 누릅니다. 이제 디자인에 두 개의 출력 링크와 하나의 입력 링크가 있는 분기 모듈이 생깁니다. 모듈을 버퍼 옆으로 이동하고 연결하십시오.

    이제 파이프라인이 분기되었으며 분기 모듈과 DMA 모듈 사이에 두 이미지 처리 알고리즘을 모두 구현할 수 있습니다.

    1. 먼저, 10번째 이미지마다 출력해야 하는 원본 이미지 출력 경로를 구현합니다. 필요한 모든 오퍼레이터를 메인 디자인 레벨에 배치하는 대신 계층적 상자를 사용합니다. 계층적 모듈을 사용하면 디자인에 계층 구조를 구현하고 임의의 수의 오퍼레이터를 결합하여 새로운 오퍼레이터를 만드는 것이 실용적입니다. 계층적 모듈을 사용하면 작업 영역을 쉽게 파악할 수 있습니다. 입력 하나와 출력 하나가 있는 계층적 상자를 디자인에 삽입합니다. 계층적 상자는 기본 오퍼레이터 라이브러리, 디자인 영역 팝업 메뉴 또는 메인 메뉴 "디자인"에서 찾을 수 있습니다.

      HierarchicalBox 모듈을 분기(branch)와 DMA 사이에 배치하고 연결합니다. 컨텍스트 메뉴를 사용하거나 모듈을 선택하고 F2 키를 눌러 모듈 이름을 변경할 수 있습니다.

      계층적 모듈 내용을 편집하려면 해당 모듈을 더블 클릭하기만 하면 됩니다. 새로운 빈 디자인 창이 열립니다. 이 창에는 입력 및 출력 커넥터만 포함되어 있습니다. 필요한 오퍼레이터를 그 사이에 배치하고 포트에 연결합니다. 계층적 모듈을 종료하려면 백스페이스(Backspace) 키를 누르거나 아이콘을 누르십시오. .

      10개의 이미지 중 9개를 제거하려면 다음과 같은 오퍼레이터가 필요합니다.

      및 파라미터 설정:

      • 모듈 CountFrames의 속성

      • 모듈 CountFrames 출력의 링크 속성

      • 모듈 Not0의 속성

      작동 방식: CountFrames 모듈은 각 이미지의 픽셀을 0에서 9 사이의 값으로 교체합니다. 따라서 각 이미지와 함께 0부터 9까지 반복해서 카운트합니다. 현재 카운트 값이 0이 아니면 Not0 모듈이 각 이미지의 모든 픽셀을 값 1로 교체합니다. RemoveImage 모듈은 두 번째 입력 "Rem"의 픽셀 값이 1인 경우 각 이미지를 삭제합니다. 따라서 0번, 10번, 20번, 30번, ... 이미지는 우회(바이패스)됩니다. 나머지 모든 이미지는 삭제됩니다.

    2. 이진화 구현을 위해 디자인에 또 다른 계층 모듈을 추가하겠습니다.

      이 계층 모듈의 오퍼레이터는 "Is_GreaterThan" 및 "Scale"입니다.

      Module ThresholdFrom은 실제 이진화를 나타냅니다. Number 파라미터로 지정된 값보다 큰 각 입력 픽셀 값에 대해 값 1이 출력되고, 그렇지 않으면 0이 출력됩니다. 따라서 모듈의 출력 비트 심도는 1비트가 됩니다. 링크 속성을 열어 이를 확인할 수 있습니다. 1비트 값을 출력하는 대신 결과를 8비트 값으로 변환해야 합니다. 이를 수행하는 매우 간단한 방법은 각 값에 255를 곱하여 스케일링하는 것입니다. 따라서 이진 값 1은 255가 되고 이진 값 0은 0으로 유지됩니다. ScaleBy255 모듈의 파라미터를 다음과 같은 값으로 설정하십시오.

      As you can see, we have set the parameter type of parameter ScaleFactor to Static. For this operator this is very important as it will require much less FPGA resources compared to a dynamic parameter. In general, always set parameters to a static type if you know that you will not need to change them after synthesis.

  4. 구현의 마지막 단계는 디자인 규칙 오류 확인입니다. 오류가 있는지 확인하기 위해 DRC를 수행하십시오. 오류가 없다면 이제 디자인을 빌드하고 하드웨어에서 사용할 수 있습니다. 대안으로, 다음 섹션에 표시된 시뮬레이션을 사용하여 구현을 확인할 수도 있습니다. 수시로 디자인을 저장하는 것을 잊지 마십시오.

Verification of the Binarization Design using Simulation

대부분의 디자인에서는 실제 FPGA 하드웨어에서 사용하기 전에 시뮬레이션을 사용하여 구현의 기능을 확인하는 것이 매우 유용합니다. 다음에서는 시뮬레이션을 사용하여 디자인을 확인하겠습니다.

  1. 준비

    먼저 시뮬레이션에 사용할 이미지가 필요합니다. TIFF 또는 BMP 형식의 이미지 파일을 사용해야 합니다. 예제에서와 같이 흑백 이미지를 사용하는 이미지 처리 파이프라인에 이미지 데이터를 주입하려면 단일 색상 성분이 있는 이미지를 사용해야 합니다. 시뮬레이션에 허용되는 이미지 파일에 대한 자세한 내용은 'Simulation'에서 확인할 수 있습니다. VisualApplets 설치 폴더에는 몇 가지 샘플 이미지가 있습니다.

  2. 소스 및 프로브

    이미지 파일은 "simulation_source" 모듈을 사용하여 이미지를 전송하는 모든 링크에 주입할 수 있으며, "simulation_probe" 모듈을 사용하여 다른 링크에서 모니터링할 수 있습니다. 예제에서는 카메라와 버퍼 사이의 링크에 시뮬레이션 소스를 추가하고, 다음 스크린샷에 따라 시뮬레이션 프로브를 추가합니다. 시뮬레이션 소스 및 프로브는 "Analysis" 메뉴, 디자인 창의 컨텍스트 메뉴 또는 그림에 표시된 아이콘에서 직접 추가할 수 있습니다.

  3. 이미지 파일 추가

    시뮬레이션 소스에 이미지 파일을 추가하려면 디자인의 소스를 더블클릭하여 Simulation Source Viewer를 엽니다. 이제 이미지 파일을 Simulation Source Viewer 창으로 드래그앤드롭하거나 File → Open 메뉴를 사용하십시오.

    이제 이미지 파일이 시뮬레이션 소스에 추가되었습니다. 모듈이나 창으로 드래그하여 소스에 파일을 더 추가할 수 있습니다. Simulation Source Viewer 창 하단에서 시퀀스의 모든 이미지를 볼 수 있습니다.

  4. 시뮬레이션 시작

    이제 시뮬레이션을 시작할 준비가 되었습니다. Analysis → Start Simulation ( F9 ) 을 선택하여 메인 Simulation 창을 엽니다. 이 창을 열 때마다 디자인 규칙 검사가 자동으로 수행됩니다. 디자인 규칙 검사에 실패한 디자인은 시뮬레이션할 수 없습니다.

    VisualApplets에서 시뮬레이션은 사이클 단위로 처리됩니다. 각 사이클은 디자인의 모든 시뮬레이션 소스에서 이미지를 주입하는 것을 나타냅니다. Start를 클릭하여 시뮬레이션을 시작하기만 하면 됩니다. 이제 VisualApplets가 시뮬레이션을 수행합니다. 디자인의 복잡성에 따라 몇 초 정도 걸릴 수 있습니다.

  5. 결과 확인

    이제 시뮬레이션 결과를 확인할 수 있습니다. Simulation 창을 닫습니다. 이제 시뮬레이션 프로브에 결과가 채워져 있어야 합니다.

    이진화 뒤에 있는 프로브의 Simulation Probe Viewer를 열면 시뮬레이션이 작동했는지 즉시 확인할 수 있습니다. 이미지에는 값이 0과 255인 픽셀이 포함되어 있어야 합니다.

    필요한 경우 결과를 디스크에 저장할 수 있습니다.

  6. 시퀀스 시뮬레이션

    이전 단계에서 이진화를 확인할 수 있었습니다. 그러나 10개의 이미지 중 1개만 호스트 PC로 전송되도록 되어 있으므로 단일 시뮬레이션 이미지만으로는 모니터링 출력을 확인하기에 충분하지 않습니다. 따라서 이미지 시퀀스를 시뮬레이션해야 합니다.

    1. Simulation 창을 다시 엽니다.

    2. Reset을 클릭하여 이전 시뮬레이션의 시퀀스를 재설정합니다. 일반적으로 새로운 시뮬레이션을 시작하려면 사용자 오류를 방지하기 위해 항상 시뮬레이션을 재설정하는 것이 유용합니다.

    3. Start를 클릭하여 이미지 하나를 시뮬레이션합니다. 각 시뮬레이션 프로브에서 결과를 얻을 수 있습니다. 지금 Simulation 창을 닫을 필요는 없습니다. 디자인 창의 모듈 번호를 보면 시뮬레이션 프로브의 현재 이미지 수를 확인할 수 있습니다.

    4. Start를 클릭하여 다른 사이클을 실행합니다. 이번에는 DMA0 모듈을 제외한 모든 시뮬레이션 프로브의 이미지 번호가 2로 증가해야 합니다.

      총 11개 사이클이 시뮬레이션될 때까지 이 단계를 반복합니다. 이제 DMA 0의 프로브에는 2개의 이미지가 포함되어야 합니다. 이는 구현이 올바르게 작동함을 보여줍니다.

    5. Start를 11번 클릭하는 대신 Simulation 창의 스핀 박스를 사용하여 처리 사이클 수를 설정할 수 있습니다. 시뮬레이션 결과는 동일합니다. 또한 10개의 시뮬레이션 사이클을 설정하여 시작한 다음, 그 후에 다음 10개 사이클을 시작할 수도 있습니다. 편하신 대로 하세요...

하드웨어에서 이진화 설계 검증

구현의 기능을 확인한 후에는 하드웨어에서 테스트하고 사용할 수 있습니다. 하드웨어 앱릿 파일 HAP를 얻으려면 디자인을 빌드해야 합니다. (사용자 설명서: 'Build') 디자인이 예시의 mE4VD4-CL 같은 하드웨어 플랫폼과 일치하는지 확인하십시오. 또한 프로젝트가 Windows 64 Bit 같은 올바른 아키텍처를 사용하고 있는지 확인하십시오. 설치된 Framegrabber SDK와 동일해야 합니다. 다음 경로를 통해 빌드를 시작합니다. Build → Synthesize ( F7 ). 이제 VisualApplets은 FPGA 제조업체 툴을 사용하여 디자인을 FPGA 비트스트림으로 변환합니다.

합성 결과는 HAP 파일입니다. 이 파일에는 데이터 및 매개변수에 액세스하기 위한 FPGA 비트스트림과 소프트웨어 인터페이스가 포함되어 있습니다. HAP 파일은 Framegrabber SDK 설치 디렉토리의 하위 디렉토리인 "Hardware Applets"에 있거나, Framegrabber SDK가 설치되지 않았거나 다른 대상 런타임을 선택한 경우 시스템 설정에 지정된 폴더에 있습니다 (참조: 'System Settings').

Framegrabber SDK 툴인 microDisplay에서 디자인을 테스트합니다. microDisplay는 앱릿을 처음 테스트하기 위한 툴입니다. microDisplay를 열고 앱릿을 로드합니다. microDisplay에는 10번째 이미지만 표시되는 원본 이미지 창과 이진화된 이미지를 보여주는 두 번째 DMA 창이라는 두 개의 DMA 이미지 창이 표시됩니다. Framegrabber SDK의 앱릿 사용에 대한 자세한 설명은 Framegrabber SDK documentation에서 확인할 수 있습니다.

microDisplay에서 Binarization Applet 사용

그림 207. microDisplay에서 Binarization Applet 사용