FPGA 리소스 사용량이나 속도를 어떻게 최적화 할 수 있습니까?

업데이트 됨 Nov 16, 2023

해당 제품

소프트웨어

  • LabVIEW FPGA Module

문의사항

FPGA 코드를 컴파일 할 때 컴파일이 overmapping 으로 인해 실패하거나 타이밍 요구 사항을 충족시키지 못하거나 원하는 루프 속도로 실행할 수 없습니다. FPGA 코드를 최적화하고 이러한 문제를 해결하기 위해 어떤 단계를 밟을 수 있습니까?

해결책

게이트 사용량 줄이기 및 속도 향상 :

 
  • 큰 VI 피하기
    컴파일이 끝나면 컴파일 된 VI의 속도와 크기에 대한 정보를 제공하는 리포트가 생성됩니다. 리포트 섹션 중 Device Utilization Summary 섹션은 사용 된 슬라이스 수에 대한 정보를 제공합니다. 이 수치는 하드웨어에서 컴파일 된 프로그램의 크기를 측정하는 가장 중요한 척도입니다. 설계 프로세스는 반복적인 프로세스여야 합니다. 프로세스가 진행되는 동안 프로그램이 커질수록 사용 된 슬라이스가 증가하여 공간이 부족할 때를 식별 할 수 있습니다.
  • Single Cycle Timed While Loop (SCTL)을 사용하여 코드 최적화
    SCTL에 삽입 된 모든 LabVIEW FPGA 코드는 성능에 최적화되어 있으며 데이터 흐름 제어를 위한 추가적인 로직이 모두 제거됩니다. 따라서 코드의 일부를 SCTL에 넣고 중지 조건 (한 번만 실행)에 연결하면 FPGA 사용량을 줄이고 코드의 클럭 소스를 지정할 수있는 최적화 된 코드가 생성됩니다.
  • 적절한 중재(arbitration)를 사용
    재호출 가능한 subVI의 공유 리소스는 경합 조건 및 동시 접근을 방지하기 위해 중재를 유도합니다. 중재는 많은 양의 FPGA 리소스를 소비하며 코드의 일부가 리소스가 다시 사용 가능해질 때까지 병렬 실행을 방해 할 수 있습니다.


게이트 사용량만 줄이기 : 

 

  • 프런트패널에서 배열 제거
    프런트패널에 있는 배열은 FPGA에서 이중 버퍼링이 필요하므로 칩에서 상당한 공간을 차지합니다. 프런트패널 배열 컨트롤 및 인디케이터는 DMA FIFO, 블록 메모리(Block Memory) 인스턴스화, 룩업 테이블(Look-Up Table) 또는 블록 다이어그램에서 상수로 대체할 수 있습니다.
  • 프런트패널 요소 최소화
    FPGA Main VI의 프런트패널에 있는 모든 요소는 호스트가 FPGA와 통신하고 인터페이스 할 수 있도록 레지스터를 생성합니다. 이 프로세스는 통신을 용이하게 하기 위해 FPGA에 여분의 게이트를 사용합니다. 호스트와 통신할 필요가 없는 요소가 있으면, 해당 터미널을 상수 또는 글로벌 변수로 변환하십시오.
  • 연산 팔레트 subVI를 이진 논리 기반 계산으로 대체
    몫 & 나머지(Quotient and Remainder), 0보다 큼?(Greater than 0?) 및 범위내 확인과 강제변환(In Range and Coerce Quotient and Remainder)같은 함수 팔레트 subVI는 경우에 따라 이진 연산으로 단순화 할 수 있습니다. 이것은 FPGA에서의 게이트 사용을 상당히 감소시킬 수 있지만, 개발하는데 더 많은 시간이 필요할 수 있습니다.
  • 메모리 항목 및 FIFO를 만들 때 블록 메모리 사용
    FPGA 타겟에서 메모리 아이템과 FIFO를 생성 할 때 하드웨어에서 아이템을 인스턴스화하는 데 사용할 수 있는 몇 가지 방법이 있습니다. 플립 플롭(Flip-Flops) 또는 룩업 테이블(Look-Up Table)과 같은 일부 방법은 FPGA VI의 구성에 필요할 수 있는 FPGA 리소스를 사용합니다. 이 때 블록 메모리(Block Memory)를 사용하도록 변경하면 FPGA 리소스를 사용하지 않고 코드의 다른 부분에서 리소스를 활용할 수 있습니다. 블록 다이어그램의 사이즈가 큰 배열 또한 이러한 리소스를 사용할 수도 있으므로 큰 배열을 저장해야 할 때 메모리 사용을 고려하십시오.
  • 호스트에 아웃소싱
    때로는 FPGA에서 연산할 필요가 없는 기능을 구현했을 수도 있습니다. 즉, 호스트에서 연산한 다음 DMA 또는 I/O 노드 통신을 통해 결과를 FPGA로 다시 보낼 수 있는 부분이 있을 수 있습니다.
  • FPGA 코드를 여러 부분으로 나누기
    FPGA 코드가 단순히 동시에 실행되는 하드웨어에 있을 필요는 없는 여러 부분 일 때가 있습니다. 예를 들어, 특정 테스트에는 4 개의 개별 테스트 케이스가 있습니다. 하나의 FPGA 프로그램에 모든 케이스를 넣는 대신 4개의 개별 FPGA 프로그램을 만들어 호스트에서 필요에 따라 다운로드하여 실행할 수 있습니다.
  • 재호출이 아닌 subVI 사용
    기본적으로 모든 LabVIEW FPGA VI는 재호출 가능하므로 사용하는 subVI의 각 인스턴스에 대해 새로운 리소스 할당이 이루어집니다. 특정 subVI를 재호출이 아닌 실행으로 전환하면 이 subVI의 인스턴스는 모두 동일한 하드웨어 인스턴스를 참조합니다.


속도만 향상 : 

 
  • 병렬 실행 사용
    FPGA 프로그래밍의 주요 이점 중 하나는 여러 데이터 셋 또는 반복을 처리 할 때 병렬 실행을 쉽게 만들 수 있다는 것입니다. 코드 부분의 병렬 인스턴스를 생성하면 처리를 수행하는 데 필요한 전체 시간을 줄일 수 있습니다. FPGA VI는 기본적으로 재호출 실행이기 때문에 SubVI를 여러 번 복제하였을 때 각각 병렬로 처리되는것과 같이 간단하게 병렬 구조를 생성할 수 있습니다.
  • 파이프 라이닝 사용
    파이프 라이닝을 사용하면 순차적 프로세스를 병렬로 실행할 수 있는 개별 단계로 나누어 코드의 여러 부분을 동시에 실행할 수 있습니다. 이 방식으로 데이터의 다른 부분을 처리함으로써 코드가 실행되는 전체 속도가 증가합니다. 시프트 레지스터 또는 피드백 노드를 사용하여 로직을 병렬로 실행하고 동시에 여러 반복을 처리 할 수 ​​있습니다.


자세한 내용은 NI LabVIEW for CompactRIO Developer's Guide 를 참조하십시오.

고급 사용자는 NI LabVIEW High-Performance FPGA Developer's Guide 를 참조 할 수 있습니다.