대부분의 VisualApplets 애플리케이션은 카메라 이미지를 획득하고, 이미지 처리 알고리즘을 통해 이미지를 처리한 후 그 결과를 호스트 PC로 출력해야 합니다. 또한 사용자는 원본 감시 이미지를 모니터링하기를 원합니다. 따라서 두 가지 이미지 출력이 필요합니다. 원본 감시 이미지와 알고리즘 구현을 통해 처리된 결과입니다. 다음에서는 다음 사양을 충족하는 ‘ VisualApplets ’ 설계를 구현할 것입니다:
- Camera Link 카메라를 기본 구성 모드에서 사용하여 그레이스케일 이미지 촬영
- maximum resolution = 1024 x 1024 pixel @ 8Bit/pixel
- 이미지를 버퍼에 저장하고, 캡처된 이미지 중 10장마다 한 장씩 호스트 PC로 전송(모니터링)
- 임계값 처리를 사용하여 획득한 각 이미지를 이진화하고, 그 결과 이미지를 호스트 PC로 출력한다
- 이진화된 출력 이미지는 다음 형식을 따라야 합니다: 0 = 검정, 흰색 = 255 (8비트/픽셀)
사양서를 바탕으로 블록 다이어그램을 작성할 수 있습니다.
보시다시피 이미지가 캡처되어 버퍼에 저장됩니다. 버퍼링 단계 이후, 처리 파이프라인은 두 개의 경로로 나뉩니다. 첫 번째 경로는 모니터링을 위해 10장마다 한 장씩 이미지를 출력하는 역할을 합니다. 두 번째 경로는 이진화 처리와 이진 이미지 출력을 담당합니다.
대부분의 ‘ VisualApplets ’ 구현은 동일한 원리를 따릅니다: 먼저 이미지 획득 및 버퍼링이 이루어집니다. 버퍼링이 완료된 후, 이미지 처리 로직이 적용됩니다. ‘데이터 흐름 (Data Flow) ’ 섹션에서 ‘ VisualApplets ’ 처리 파이프라인 및 설계의 기본 설정에 대한 자세한 정보를 확인할 수 있습니다. 다음에서는 사양을 단계별로 충족하는 VisualApplets 설계의 구현 과정을 단계별로 살펴보겠습니다. VisualApplets 구현 외에도, 내장 시뮬레이션을 사용하여 설계를 검증하고 실제 하드웨어에서 해당 설계를 적용해 보겠습니다.
-
먼저, 이전 예제에서 사용했던 기본 연산자부터 살펴보겠습니다. 이것들은 카메라 연산자 CameraGrayAreaBase, 버퍼 ImageBuffer 그리고 결과를 호스트 PC로 전송하는 연산자인 DmaToPC입니다. 반면, 이번 설계에서는 이진화된 결과뿐만 아니라 원본 이미지도 전송하기 위해 두 번째 DmaToPC 모듈이 필요합니다. 다음 설계에 표시된 대로 모든 연산자를 찾아 이름을 변경하십시오.

-
보시다시피, DMA 모듈의 이름을 DMA0_OriginalImages와 DMA1_BinarizedImages로 변경했습니다. 즉, 인덱스를 부여한 것입니다. 이는 각 DMA 채널이 채널 인덱스를 사용하기 때문입니다. 이 채널 인덱스는 PC 소프트웨어에서 데이터에 접근할 때 사용됩니다. 대부분의 FPGA 내부 자원이 아닌 리소스는 인덱스를 사용하여 위치를 지정합니다. FPGA 외부 하드웨어를 사용하는 연산자 중에는 카메라 연산자, DRAM을 사용하는 연산자(예: ImageBuffer), 범용 입출력을 사용하는 연산자(예: 트리거 신호) 및 DMA 연산자가 있습니다. 사실, 현재까지 설계에 포함된 모든 연산자는 외부 리소스를 사용하며 인덱스에 할당될 수 있습니다. 카메라 연산자는 Camera Link 의 포트 A 또는 B에 할당될 수 있습니다. 버퍼는 microEnable IV VD4-CL 에 있는 네 개의 DRAM 중 하나에 할당될 수 있으며, DMA는 DMA 채널 중 하나에 할당될 수 있습니다. 장치 리소스 사용에 대한 자세한 설명은 ‘장치 리소스 할당’에서 확인할 수 있습니다 . 지원되는 모든 하드웨어 플랫폼에서 사용 가능한 장치 리소스 목록은 장치 리소스에서 확인할 수 있습니다.
대부분의 장치 리소스는 VisualApplets 에 있는 리소스 대화 상자를 사용하여 변경할 수 있습니다. 일부 장치는 운영자 매개변수를 사용하여 리소스를 변경할 수 있습니다. 장치 리소스를 변경하려면 리소스 대화 상자를 열어야 하며, 이 대화 상자는 다음 경로에서 접근할 수 있습니다. → 를 선택하거나 편집 메뉴 바의 아이콘을 사용하여 열 수 있습니다.

DMA 모듈인 DMA0_OriginalImages가 인덱스 0에, DMA1_BinarizedImages가 인덱스 1에 할당되었는지 확인하십시오. 카메라 모듈은 Camera Link 의 포트 A를 나타내는 인덱스 0에 할당되어야 합니다. 버퍼가 어떤 DRAM 칩을 사용하는지는 크게 중요하지 않으므로, 일부 메모리 연산자 간에 충돌이 발생할 경우 VisualApplets 가 인덱스를 자동으로 선택하도록 합니다. 일반적으로 VisualApplets 는 항상 사용되지 않은 인덱스를 선택합니다. 카메라 모듈이 두 개 있고 인덱스 0을 사용하는 모듈을 삭제하면, 남은 카메라 모듈은 인덱스 1을 사용하게 됩니다. 따라서 애플릿 빌드를 시작하기 전에 모든 장치 리소스 인덱스를 반드시 확인해야 합니다. 합성 후에는 리소스 인덱스를 변경할 수 없습니다.
-
다음으로, 이미지 처리 알고리즘을 포함시켜야 합니다. 두 가지 서로 다른 이미지 처리 알고리즘을 구현해야 하므로, 파이프라인을 두 개의 경로로 분기시켜야 합니다. 이는 분기 연산자를 사용하면 간단히 수행할 수 있습니다. 기본 연산자 라이브러리에서 해당 연산자를 찾아 디자인으로 드래그하세요. 마우스 버튼을 놓으면 창이 뜨며, 여기서 사용자가 출력 링크의 수, 즉 분기 수를 지정할 수 있습니다. 2개를 선택하고 ‘확인’을 누르세요. 이제 설계에 출력 링크 2개와 입력 링크 1개를 가진 분기 모듈이 생성됩니다. 이 모듈을 버퍼 옆으로 이동시킨 후 서로 연결하세요.

이제 파이프라인을 분기시켰으므로, 분기 모듈과 DMA 모듈 사이에서 두 가지 이미지 처리 알고리즘을 모두 구현할 수 있게 되었습니다.
-
먼저, 10장 중 1장씩만 출력되도록 하는 원래의 이미지 출력 경로를 구현해 보겠습니다. 필요한 모든 연산자를 메인 설계 레벨에 배치하는 대신, 계층적 박스를 사용할 것입니다. 계층적 모듈을 활용하면 설계에 계층적 구조를 구현하고 임의의 수의 연산자를 결합하여 새로운 연산자를 만들 수 있습니다. 계층적 모듈을 사용하면 구성 영역을 한눈에 파악하기가 쉬워집니다. 입력 단자 1개와 출력 단자 1개를 가진 계층적 박스를 설계에 삽입하십시오. 계층적 박스는 기본 연산자 라이브러리, 설계 영역 팝업 메뉴 또는 메인 메뉴의 "설계"에서 찾을 수 있습니다.
HierarchicalBox 모듈을 분기(branch)와 DMA 사이에 배치하고 서로 연결하십시오. 모듈의 컨텍스트 메뉴를 사용하거나 모듈을 선택한 후 F2 키를 눌러 모듈 이름을 변경할 수 있습니다.

계층형 모듈의 내용을 편집하려면 해당 모듈을 더블클릭하기만 하면 됩니다. 새로운 빈 디자인 창이 열립니다. 이 창에는 입력 및 출력 커넥터만 표시됩니다. 필요한 연산자를 그 사이에 배치하고 포트에 연결합니다. 계층형 모듈을 종료하려면 Backspace 키를 누르거나 아이콘을 클릭하세요.
.
10개의 이미지 중 9개를 제거하려면, 다음과 같이 연산자를 사용해야 합니다.

그리고 매개변수화:
-
CountFrames 모듈의 속성

-
CountFrames 모듈 출력의 링크 속성

-
Not0 모듈의 속성

작동 원리: CountFrames 모듈은 각 이미지의 픽셀을 0에서 9 사이의 값으로 대체합니다. 따라서 각 이미지마다 0부터 9까지 반복적으로 카운트합니다. Not0 모듈은 현재 카운트 값이 0이 아닐 경우, 각 이미지의 모든 픽셀을 값 1로 대체합니다. RemoveImage 모듈은 두 번째 입력인 "Rem"의 픽셀 값이 1일 경우, 해당 이미지를 삭제합니다. 따라서 이미지 번호 0, 10, 20, 30, ...은 처리되지 않고 건너뜁니다. 그 외의 모든 이미지는 삭제됩니다.
-
-
이진화 처리를 구현하기 위해 설계에 또 다른 계층적 모듈을 추가할 것입니다.

이 계층적 모듈의 연산자는 “Is_GreaterThan”과 “Scale”입니다.

ThresholdFrom 모듈은 실제 이진화 처리를 담당합니다. 매개변수 Number로 지정된 값보다 큰 각 입력 픽셀 값에 대해서는 1이 출력되고, 그렇지 않은 경우 0이 출력됩니다. 따라서 이 모듈의 출력 비트 심도는 1비트가 됩니다. 링크 속성을 열어 이 점을 확인할 수 있습니다. 1비트 값을 출력하고 싶지 않으므로, 결과를 8비트 값으로 변환해야 합니다. 이를 위한 매우 간단한 해결책은 각 값을 255로 스케일링하는 것입니다. 따라서 이진값 1은 255가 되고, 이진값 0은 0으로 유지됩니다. ScaleBy255 모듈의 매개변수를 다음 값으로 설정하십시오.

보시다시피, ScaleFactor 매개변수의 유형을 ‘Static’으로 설정했습니다. 이 연산자의 경우, 동적 매개변수에 비해 훨씬 적은 FPGA 리소스만 필요로 하기 때문에 이는 매우 중요합니다. 일반적으로, 합성 후 매개변수를 변경할 필요가 없다고 판단되면 항상 매개변수를 정적 유형으로 설정해야 합니다.
-
- 구현의 마지막 단계는 설계 규칙 오류 확인입니다. DRC를 실행하여 오류가 있는지 확인하십시오. 오류가 없다면 이제 설계를 빌드하여 하드웨어에서 사용할 수 있습니다. 또는 다음 섹션에서 설명하는 시뮬레이션을 사용하여 구현을 검증할 수도 있습니다. 수시로 설계를 저장하는 것을 잊지 마십시오.
대부분의 설계에서는 실제 FPGA 하드웨어에서 사용하기 전에 시뮬레이션을 통해 구현된 기능의 정상 작동을 검증하는 것이 매우 유용합니다. 다음에서는 시뮬레이션을 사용하여 우리 설계를 검증해 보겠습니다.
-
준비
먼저 시뮬레이션에 사용할 이미지가 필요합니다. TIFF 또는 BMP 형식의 이미지 파일을 사용해야 합니다. 본 예제와 같이 그레이스케일 이미지를 사용하여 이미지 처리 파이프라인에 이미지 데이터를 주입하려면 단일 색상 구성 요소를 가진 이미지를 사용해야 합니다. 시뮬레이션에 허용되는 이미지 파일에 대한 자세한 내용은 '시뮬레이션'에서 확인할 수 있습니다 . VisualApplets 설치 폴더에는 몇 가지 예제 이미지가 포함되어 있습니다 .
-
소스와 프로브
이미지 파일은 “simulation_source” 모듈을 사용하여 어떤 이미지 전송 링크에도 삽입할 수 있으며, “simulation_probe” 모듈을 사용하여 다른 어떤 링크에서든 모니터링할 수 있습니다. 이 예제에서는 다음 스크린샷과 같이 카메라와 버퍼 사이의 링크에 시뮬레이션 소스를 추가하고 시뮬레이션 프로브를 설정합니다. 시뮬레이션 소스와 프로브는 "Analysis" 메뉴, 설계 창의 컨텍스트 메뉴, 또는 그림에서 표시된 아이콘을 통해 간편하게 추가할 수 있습니다.

-
이미지 파일 추가
시뮬레이션 소스에 이미지 파일을 추가하려면, 설계 내의 소스를 더블 클릭하여 시뮬레이션 소스 뷰어를 엽니다. 이제 이미지 파일을 시뮬레이션 소스 뷰어 창으로 드래그 앤 드롭하거나 → 메뉴를 사용하십시오.

이제 이미지 파일이 시뮬레이션 소스에 추가되었습니다. 파일을 모듈이나 창 위로 끌어다 놓기만 하면 소스에 파일을 더 추가할 수 있습니다. 시뮬레이션 소스 뷰어 Windows 하단에서 시퀀스에 포함된 모든 이미지를 확인할 수 있습니다.
-
시뮬레이션 시작
이제 시뮬레이션을 시작할 준비가 되었습니다. 다음을 선택하십시오. → ( F9 ) 를 눌러 메인 시뮬레이션 창을 엽니다. 이 창을 열 때마다 설계 규칙 검사가 자동으로 수행됩니다. 설계 규칙 검사에서 실패한 설계는 시뮬레이션할 수 없습니다.
VisualApplets 에서는 시뮬레이션이 사이클 단위로 처리됩니다. 각 사이클은 설계 내의 모든 시뮬레이션 소스에서 이미지를 불러오는 과정을 의미합니다. 다음 버튼을 클릭하기만 하면 됩니다. 을 클릭하기만 하면 시뮬레이션을 시작할 수 있습니다. 이제VisualApplets 가 시뮬레이션을 수행합니다. 디자인의 복잡성에 따라 이 과정에 몇 초가 소요될 수 있습니다.
-
결과 확인
이제 시뮬레이션 결과를 확인할 수 있습니다. 시뮬레이션 창을 닫으십시오. 이제 시뮬레이션 프로브에 결과가 표시되어 있어야 합니다.

이진화 단계 뒤에 위치한 프로브의 시뮬레이션 프로브 뷰어를 열면, 시뮬레이션이 제대로 수행되었는지 즉시 확인할 수 있습니다. 이미지에는 0과 255 값을 가진 픽셀이 포함되어 있어야 합니다.

필요한 경우 이제 결과를 디스크에 저장할 수 있습니다.
-
시퀀스 시뮬레이션
이전 단계에서 이진화 과정을 검증할 수 있었습니다. 그러나 모니터링 출력을 검증하기에는 단일 시뮬레이션 이미지만으로는 충분하지 않습니다. 왜냐하면 10장 중 1장씩만 호스트 PC로 전송되도록 되어 있기 때문입니다. 따라서 일련의 이미지 시퀀스를 시뮬레이션해야 합니다.
-
시뮬레이션 창을 다시 한 번 열어 주세요.
-
다음 버튼을 클릭하세요 을 클릭하여 이전 시뮬레이션의 순서를 초기화하십시오. 일반적으로 새로운 시뮬레이션을 시작할 때는 사용자 오류를 방지하기 위해 항상 시뮬레이션을 초기화하는 것이 좋습니다.
-
다음 중 하나를 클릭하세요 을 클릭하여 하나의 이미지를 시뮬레이션합니다. 각 시뮬레이션 프로브에서 결과를 확인할 수 있습니다. 지금은 시뮬레이션 창을 닫을 필요가 없습니다. 설계 창에서 모듈의 수를 확인하면 시뮬레이션 프로브에 포함된 현재 이미지 수를 알 수 있습니다.
-
이제 다음을 클릭하여 또 다른 주기를 실행하세요 을 클릭하여 또 다른 사이클을 실행하십시오. 이번에는 DMA0 모듈에 있는 프로브를 제외하고 모든 시뮬레이션 프로브의 이미지 번호가 2로 증가했을 것입니다.
총 11회의 사이클을 시뮬레이션할 때까지 이 단계를 반복하십시오. 이제 DMA 0에 있는 프로브에는 두 개의 이미지가 포함되어 있어야 합니다. 이는 우리 구현이 올바르게 작동하고 있음을 보여줍니다.

-
다음 링크를 11번 클릭하는 대신 대신 시뮬레이션 창의 스핀 박스를 사용하여 처리 사이클 수를 설정할 수 있습니다. 시뮬레이션 결과는 동일합니다. 또한, 시뮬레이션 사이클을 10회로 설정하여 실행한 후, 그 다음에 또 다른 10회 사이클을 시작할 수도 있습니다. 원하는 대로 하시면 됩니다...
-
구현의 기능을 확인한 후에는 하드웨어에서 테스트하고 사용할 수 있습니다. 하드웨어 애플릿 파일(HAP)을 얻으려면 설계를 빌드해야 합니다. (사용자 설명서: ‘빌드’) 설계가 하드웨어 플랫폼(예: 이 예제의 mE4VD4-CL)과 일치하는지 확인하십시오. 또한 프로젝트가 올바른 아키텍처(예: Windows 64비트)를 사용하고 있는지 확인하십시오. 이는 설치된 아키텍처 Framegrabber SDK 와 동일해야 합니다. 다음 명령을 실행하여 빌드를 시작하십시오. → ( F7 ). 이제VisualApplets 는 FPGA 제조사의 도구를 사용하여 귀하의 설계를 FPGA 비트스트림으로 변환합니다.
합성 결과물은 HAP 파일입니다. 이 파일에는 FPGA 비트스트림과 데이터 및 매개변수에 접근하기 위한 소프트웨어 인터페이스가 포함되어 있습니다. HAP 파일은 Framegrabber SDK 설치 디렉터리의 "Hardware Applets" 하위 디렉터리에 위치하며, Framegrabber SDK 가 설치되어 있지 않거나 다른 대상 런타임을 선택한 경우, 이 파일은 시스템 설정에서 지정한 폴더에 위치합니다 ( ‘시스템 설정’ 참조).
Framegrabber SDK 의 microDisplay 도구를 사용하여 설계를 테스트해 보겠습니다. microDisplay는 애플릿을 처음 테스트해 볼 수 있는 도구입니다. microDisplay를 열고 애플릿을 불러오십시오. microDisplay에는 두 개의 DMA 이미지 창이 표시되는데, 하나는 10장 중 1장씩만 표시되는 원본 이미지 창이고, 다른 하나는 이진화된 이미지를 보여주는 두 번째 DMA 창입니다. Framegrabber SDK 에서 애플릿을 사용하는 방법에 대한 자세한 설명은 Framegrabber SDK 문서에서 확인할 수 있습니다.



이전

