어플리케이션 노트

Moku 클라우드 컴파일

시작 가이드

3 월 19, 2024 업데이트

Moku Cloud Compile은 Moku:Pro, Moku:Lab 및 Moku:Go에서 사용할 수 있는 혁신적인 기능입니다. Moku 테스트 및 측정 도구 제품군에는 FPGA 기반 계측기가 포함되어 있으며 Moku Cloud Compile을 사용하면 사용자 정의 VHDL 코드를 Moku에 배포할 수 있습니다. 이 코드는 사용자 정의 기능을 제공하고 기존 계측기와 상호 작용하여 Moku Instrument-on-Chip 아키텍처로 인해 가능한 새롭고 고유한 계측을 잠금 해제할 수 있습니다.

이 튜토리얼에서는 일부 VHDL 예제의 코딩 및 배포를 통해 Moku Cloud Compile 계정을 만드는 방법을 보여줍니다. 이 가이드가 끝나면 사용자 정의 코드를 컴파일하고 Moku에 배포하기 위한 기본 지식을 갖게 됩니다. 이 노트에서는 Moku:Pro를 사용하지만 이러한 모든 예제는 Moku:Lab 및 Moku:Go에서도 사용할 수 있습니다.

인쇄 가능한 버전 다운로드

사전 조건

Moku:Pro, Moku:Lab 또는 Moku:Go를 사용하세요.

다중 장비 모드(MiM)

 Moku 클라우드 컴파일(MCC)

살펴보기

Moku Cloud Compile 도구를 사용하면 Moku 플랫폼에서 구현하기 위한 사용자 정의 처리 및 기능을 설계할 수 있습니다. CPU 및 ASIC(주문형 집적 회로) 기반 DSP 접근 방식과 비교할 때 FPGA 플랫폼은 ASIC 수준에 가까운 대기 시간과 성능을 제공하는 동시에 기존 CPU와 마찬가지로 소프트웨어 프로그래밍이 가능합니다.

CPU 기반 설계용 소프트웨어를 작성하는 데 사용할 수 있는 널리 사용되는 소프트웨어 언어가 많이 있지만 FPGA 프로그래밍은 일반적으로 VHDL 또는 Verilog로 제한됩니다. 일반적으로 이를 위해서는 크고 복잡한 로컬 도구 체인 설치가 필요합니다. VHDL 코드 배포에 사용할 수 있는 플랫폼은 일반적으로 FPGA 공급업체의 평가 보드 또는 다양한 기능이 제한된 오픈 소스 하드웨어 보드로 제한됩니다. Moku Cloud Compile은 통합된 클라우드 기반 VHDL 컴파일러를 제공하고 Moku 하드웨어의 안정성과 결합됩니다.

Moku Cloud Compile이 포함된 Moku:Pro는 기존 FPGA 설계 소프트웨어의 오버헤드 없이 연구 등급 하드웨어와 맞춤형 처리 기능을 갖춘 고성능 실험실 장비에 대한 요구 사항을 해결합니다. MCC는 클라우드에서 사용자 정의 VHDL을 컴파일하고 MCC 지원 Moku에 배포할 준비가 된 패키지를 제공합니다.

그림 1: Moku Cloud Compile 배포 프로세스

다중 계측기 모드 및 Moku Cloud 컴파일

다중 장비 모드(MiM)를 사용하면 여러 장비를 동시에 배포하고 작동할 수 있습니다. 최고 수준에서 MiM은 Moku:Pro에서 FPGA의 1개 파티션을 나타내는 1개의 슬롯을 제공하고 Moku:Go 및 Moku:Lab에서는 2개를 제공합니다. 이러한 슬롯에 장비를 유연하게 배치할 수 있습니다. 그림 3은 슬롯 4에 배포된 오실로스코프와 슬롯 XNUMX에 배포된 스펙트럼 분석기를 포함하는 MiM 인터페이스를 보여줍니다. 슬롯 XNUMX과 XNUMX는 채워져야 합니다. 사용 가능한 장비에는 위상계, 레이저 잠금 상자, 데이터 로거, 디지털 필터 상자, PID 컨트롤러, 오실로스코프, 스펙트럼 분석기, 잠금 증폭기, 파형 발생기, 주파수 응답 분석기, FIR 필터 빌더, 임의 파형 발생기, 논리 분석기 및 클라우드 컴파일.

이는 그림 4의 슬롯 2를 차지하는 Moku Cloud Compile 장비로, 컴파일된 디자인을 배포할 수 있습니다. 따라서 MiM을 사용하면 설계가 ADC 및 DAC 입력 및 출력 외에도 Moku 장비와 상호 작용할 수 있습니다.


그림 2: 다중 계측기 모드 시스템 구축

 

 


그림 3: Moku Cloud Compile 슬롯으로 구축된 MiM

Moku Cloud Compile 계정 설정

Moku에 코드를 컴파일하거나 배포하려면 온라인 계정이 필요합니다. 이는 간단한 과정입니다:

  • 다음 위치에서 MCC 사용자 계정을 설정하세요.  compile.liquidinstruments.com
  • 처음 이용하시는 경우에는 '회원가입'을 선택하셔야 합니다.
  • 기존 사용자인 경우 사용자 이름이나 이메일 주소로 로그인한 후 비밀번호를 입력하세요.
  • 가입 페이지에는 사용자가 선택한 사용자 이름, 유효한 이메일 주소 및 사용자 정의 비밀번호만 필요합니다.
  • 일단 가입하고 로그인하면 처음에는 비어 있는 프로젝트 페이지가 표시됩니다(그림 4 참조).


그림 4: 새 프로젝트 메뉴

첫 번째 VHDL 예제를 작성하기 전에 대상으로 할 장치를 구성해야 합니다. 장치 탭을 선택하고 그림 5와 같이 구성합니다. 편리한 이름을 선택한 다음 그림과 같이 하드웨어 버전, 펌웨어 버전 및 슬롯 수를 선택합니다. 데스크탑 앱(Moku 아이콘을 마우스 오른쪽 버튼으로 클릭 -> 장치 정보) 또는 iPad 앱("장치 선택" 화면에서 Moku 아이콘을 길게 터치)을 통해 Moku의 펌웨어 버전을 확인할 수 있습니다.


그림 5: 새로운 Moku 장치 구성

VHDL 예제 #1: 입력을 출력으로 라우팅

VHDL 코드를 입력하세요

이제 MCC(Moku Cloud Compile) 계정이 설정되고 인터페이스에 익숙해졌으므로 가장 기본적인 도구를 작성, 컴파일 및 배포하게 됩니다. 간단한 첫 번째 장비는 Moku Cloud Compile 슬롯의 입력 신호를 받아 출력에 직접 연결합니다.

시작하려면 '새 프로젝트'를 선택하고 적절한 이름을 입력하세요. 이 예는 "Inputs2Outputs"입니다.

 

아키텍처 CustomWrapper의 동작은 다음과 같습니다. OutputA <= InputA; 출력B <= 입력B; 최종 아키텍처;

그림 6: 예제 #1의 전체 코드; 입력2출력.vhdl

이 첫 번째 예제의 코드는 그림 6에 나와 있습니다. 이 코드는 'CustomWrapper' 엔터티의 아키텍처를 정의해야 합니다. 'CustomWrapper'는 MCC 디자인이 준수해야 하는 템플릿입니다. 이는 맞춤형 MCC 계측기의 기본 I/O 포트 정의를 제공합니다. 전체 정의는 다음에서 확인하세요. 온라인 문서.

"Inputs2Outputs" 프로젝트 내에서 편집기를 선택하고 "Inputs2Outputs.vhd"라는 새 파일을 만듭니다(그림 7 참조).


그림 7: 편집기의 새 파일

그림 6의 텍스트를 입력합니다. 그림 8과 같아야 합니다.


그림 8: 편집기의 VHDL 코드

코드 빌드

'대상 장치', '저장', '빌드'를 차례로 선택합니다. 그러면 코드가 MCC 서버에 제출되며 빌드를 선택할 수 있습니다. 탭을 클릭하여 그림 9와 같이 프로세스를 관찰합니다. 이 작업을 완료하는 데 몇 분 정도 걸립니다.


그림 9: 빌드 진행 중

코드 컴파일이 완료되면 "Synthesize", "Route", Report" 및 "Bitstream"이 모두 녹색이어야 합니다. 이 화면의 맨 아래에는 비트스트림 또는 아티팩트인 'bitstream.tar.gz'가 있습니다. 그런 다음 작은 다운로드 아이콘을 클릭하여 "bitstream.tar.gz" 파일을 로컬 PC에 다운로드할 수 있습니다. 이 파일의 압축을 풀거나 압축을 풀지 마세요.

많은 컴파일러 또는 신디사이저 경고가 표시될 가능성이 높습니다. 이는 우리의 목적을 위해 대부분 무시될 수 있습니다. 그러나 오류가 발생하면 빌드 프로세스가 중단되므로 주의가 필요합니다.


그림 10: 성공적인 빌드

코드 배포

이제 Moku 앱을 사용하여 MiM을 선택한 다음 그림 10과 같이 슬롯과 I/O를 구성합니다. 이렇게 하면 Moku Cloud Compile 비트스트림을 위한 Moku:Pro가 준비됩니다.


그림 10: 예제 1의 MiM 슬롯 구성

비트스트림을 배포하려면 그림 10과 같이 Moku Cloud Compile 기기를 탭하고 "비트스트림 업로드"를 선택합니다. 이전에 로컬 PC에 다운로드한 "bitstream.tar.gz" 파일을 찾아 선택합니다.

새로운 맞춤형 계측기를 테스트하려면 그림 1과 같이 출력 A에 10MHz 사인파, 출력 B에 1MHz 램프파로 슬롯 13 파형 발생기를 구성합니다. 그런 다음 이는 간단한 계측기를 통과합니다. 오실로스코프를 슬롯 3에 배치하면 슬롯 2에서 둘 사이에 배치된 MCC 장비의 올바른 "통과" 작동을 관찰할 수 있습니다.


그림 13: 슬롯 2 파형 발생기 설정


그림 14: 맞춤형 계측기 작동의 슬롯 4 오실로스코프 확인

VHDL 예제 #2: 입력 빼기/더하기

예제 1에서는 매우 간단한 VHDL 예제를 컴파일하고 배포하는 데 필요한 단계를 자세히 설명합니다.

아키텍처 CustomWrapper의 동작은 다음과 같습니다. OutputA <= InputA + InputB; 출력B <= 입력B - 입력B; 최종 아키텍처;

예제 2는 입력을 더하고 빼는 VHDL을 보여줍니다. 이는 기본적인 예이기도 하지만 테스트 및 측정 세계에는 많은 실제 시나리오가 있습니다. 디지털에서 아날로그로의 변환과 외부 아날로그 합산 증폭기 없이 디지털 도메인에서 신호를 합산하거나 빼면 많은 애플리케이션이 단순화됩니다.

사용자는 이 예제를 사용하여 예제 #1에 설명된 컴파일 및 배포 단계를 반복하는 것이 좋습니다. 첫 번째 예와 마찬가지로 검증은 슬롯 1의 파형 생성기, 슬롯 2의 Moku Cloud Compile, 슬롯 3의 오실로스코프와 함께 MiM을 사용하여 구성될 수 있습니다. 올바른 작동에 대한 시각적 확인은 교대로 사인파를 추가하고 빼는 것으로 구성될 수 있습니다. 동위상 및 180도 역위상.

VHDL 예 #3: 스케일링 및 오프셋 입력/DSP 슬라이스

예제 3에서는 제어 레지스터의 사용을 소개합니다. MCC 계측기를 클릭하고 계측기 열기를 선택하여 배포된 MCC 계측기용 앱 인터페이스인 Moku의 레지스터에 액세스합니다. 사용자는 앱에서 이러한 32비트 제어 레지스터를 변경하고 이를 VHDL 코드에서 사용할 수 있습니다. 예제 3에서는 Control1의 LSB(최하위 비트)가 활성화로 사용됩니다. '1'로 설정하면 InputA와 InputB가 각각 OutputA와 OutputB로 전달됩니다. Control1 LSB가 '0'으로 설정되면 출력이 0으로 설정됩니다.

WORK.MercurySupport.ScaleOffset을 사용하세요. 도서관 IEEE; IEEE.Std_Logic_1164.all을 사용하십시오. IEEE.Numeric_Std.all을 사용합니다. 아키텍처 CustomWrapper의 동작은 Control1(0)으로 시작됩니다. '1'인 경우 OutputA <= InputA를 선택하고, 기타인 경우 (OTHERS => '0'); Control1(1)을 사용하여 '1'인 경우 OutputB <= InputB를 선택하고 기타인 경우 (OTHERS => '0')을 선택합니다. 최종 아키텍처;

그림 14: 제어 레지스터

VHDL 예 #4: 스케일링 및 오프셋 입력/DSP 슬라이스

이 예는 처음 세 가지 예보다 약간 더 복잡합니다.

코드는 Liquid Instruments 라이브러리인 VHDL 라이브러리 Moku.Support를 참조합니다. 해당 내용에 대한 자세한 내용은 MCC 웹사이트의 도움말 섹션에서 확인할 수 있습니다. 특히 ScaleOffset 엔터티의 이름이 지정됩니다. 이 엔터티는 곱셈과 덧셈 기능을 수행하는 전용 하드웨어 블록을 래핑합니다. 이 엔터티는 'DSP'라는 블록으로 인스턴스화되며 다음과 같은 수학 기능을 제공하는 데 사용됩니다.

 

도서관 모쿠; Moku.Support.ScaleOffset을 사용하세요. 아키텍처 CustomWrapper의 동작이 시작됩니다 -- Z = X * Scale + Offset -- Z를 최소/최대로 클립합니다(오버/언더플로우 방지) -- 반올림 포함 -- 1개의 클럭 주기 지연 DSP: ScaleOffset 포트 맵( Clk => Clk, 재설정 => 재설정, X => 입력A, 스케일 => 서명됨(Control15(0 아래로 2)), 오프셋 => 서명됨(Control15(0 아래로 1)), Z => 출력A, 유효 => 'XNUMX', OutValid = > 열기); 최종 아키텍처;

이 예에서 스케일과 오프셋은 모두 16비트 부호 있는 2의 보수입니다. 배율은 -1에서 +1까지 매핑됩니다. 또한 출력 Z는 수학 연산의 흐름이 과도하거나 부족해지는 것을 방지하기 위해 잘립니다. 온라인 설명서에는 -1에서 +1까지 확장하는 방법을 포함하여 ScaleOffset에 대한 추가 정보가 있습니다. https://compile.liquidinstruments.com/docs/support.html#scaleoffset

VHDL 예 #5a: 출력 제한 설정

예제 #5a에서는 출력 신호를 상한(또는 하한)으로 클리핑하는 방법을 제공합니다.

예제 #3과 마찬가지로 이 예제에서는 Moku.Support 라이브러리를 사용하며 이번에는 'clip' 기능을 사용합니다.

이제 OutputA는 잘린, InputA의 하위 9비트에 할당됩니다. 이는 2^전력 클리핑 기능을 제공합니다. 즉, 신호가 0 – 2 범위로 클리핑됩니다.9.

예제 #4에서는 출력 신호를 상한(또는 하한)으로 클리핑하는 방법을 제공합니다.

도서관 IEEE; IEEE.Numeric_Std.all을 사용합니다. WORK.MercurySupport.clip을 사용하세요. 아키텍처 Customwrapper의 동작은 다음과 같습니다. start OutputA <= resize(clip(InputA, 8, 0), 16); 최종 아키텍처;

VHDL 예 #5b: 일반 출력 제한 설정

예제 #5b에서는 출력 신호를 상한 및 하한으로 클리핑하는 방법을 제공합니다.

예제 #5a는 투박하지만 2의 거듭제곱으로 빠른 클리핑을 제공하는 반면, 이 예제는 보다 일반화된 클리핑 기능을 제공합니다. OutputA는 InputA에 할당되지만 +2387 및 -7462 범위로 잘립니다.

도서관 IEEE; IEEE.Numeric_Std.all을 사용합니다. 도서관 모쿠; Moku.Support.clip_val을 사용하십시오. 아키텍처 CustomWrapper의 동작은 다음과 같습니다. start OutputA <=clip_val(InputA, -7462, 2387); 최종 아키텍처;

VHDL 예 #5: 아날로그 입력의 PWM

예제 6은 더 복잡합니다. 이는 아날로그 입력 A에서 펄스 폭 변조(PWM) 신호를 생성합니다. 이는 Counter.vhdl과 pwm.vhdl이라는 두 개의 파일로 구성됩니다. 사용자는 함께 빌드하기 전에 MCC 파일 편집기에 이를 별도의 파일로 입력합니다. 이 예는 Moku:Pro 및 해당 312.5MHz 클럭에 적용되지만 각각 125MHz 및 31.25MHz 클럭을 사용하는 Moku:Lab 및 Moku:Go에 적용할 수 있습니다. Moku:Go, Moku:Lab 및 Moku:Pro의 Moku Cloud Compile 간의 차이점에 대한 자세한 내용은 데이터시트를 읽어보세요. 여기에서 지금 확인해 보세요..


-- counter.vhdl 라이브러리 IEEE; IEEE.Std_logic_1164.all을 사용하세요. IEEE.Numeric_Std.all을 사용합니다. --2^EXPONENT / INCREMENT마다 스트로브를 출력합니다. 입력 스트로브 --정수를 반올림하기 위해 양자화하지만 오버플로를 유지하므로 --시간이 지남에 따라 평균을 구하지만 +-1 주기 지터가 발생합니다. 엔터티 카운터는 일반적입니다( EXPONENT : positive := 8; PHASE90 : boolean := false ). port ( Clk : std_logic ; Reset : std_logic ; Enable : std_logic ; Increment : in unsigned ; Strobe : out std_logic ); 최종 엔터티; 아키텍처 카운터의 동작은 신호 Count: unsigned(EXPONENT downto 0); 증분'길이 <= 카운트'길이 심각도 FAILURE 주장 시작; process(Clk)는rising_edge(Clk)이면 시작되고 Reset = '1'이면 Count <= (others => '0'); PHASE90이면 Count(EXPONENT - 1) <= '1'; 종료하면; elsif Enable = '1' then --MSB를 다듬지만 오버플로는 허용합니다. --스트로브에 단일 Clk 사이클 출력 펄스를 제공합니다. Count <= resize(Count(Count'left-1 downto 0), Count'length) + Increment; else Count(Count'left) <= '0'; 종료하면; 종료하면; 프로세스 종료; 스트로브 <= Count(Count'left); 최종 아키텍처;

 


-- pwm.vhdl 라이브러리 IEEE; IEEE.Std_Logic_1164.all을 사용하십시오. IEEE.Numeric_Std.all을 사용합니다. 도서관 모쿠; Moku.Support.ScaleOffset을 사용하세요. Moku.Support.clip을 사용하십시오. 아키텍처 CustomWrapper의 동작은 일정합니다. HI_LVL : signed(15에서 0까지) := x"7FFF"; 상수 LO_LVL : signed(15에서 0까지) := x"0000"; 신호 값: signed(12에서 0까지); 신호 개수 : unsigned(12에서 0까지); 신호 Pulse50kHz : std_logic; 신호 펄스 : std_logic; 신호 OutA : std_logic; start INPUT_SCALE: ScaleOffset 포트 맵( Clk => Clk, Reset => Reset, X => InputA & "0", Scale => signed(Control1(15 downto 0)), -- 내부 버스 2Vpp의 경우, 0x0200 맵 설정 Well Offset => signed(Control2(15 downto 0)), -- 2Vpp의 내부 버스의 경우 오프셋 0x0400은 +/-1 v 내부 버스에 적합합니다. Z => Value, Valid => Pulse50kHz, OutValid => open ) ; OSC: 엔터티 WORK.Counter 일반 맵(22) -- 5MHz 포트 맵에서 ~312.5kHz(Clk, Reset, '1', to_unsigned(67, 8), Pulse50kHz); OSC2: 엔터티 WORK.Counter 일반 맵(11) --5kHz/2048 약 10MHz 포트 맵(Clk, Pulse50kHz, '1', to_unsigned(65, 9), Pulse); ising_edge(Clk)이면 process(Clk)가 시작되고 Pulse50kHz = '1'이면 Count <= resize(unsigned(clip(Value, 11, 0)), Count'length); elsif Pulse = '1' 및 Count /= 0, Count <= Count - 1; 종료하면; 종료하면; 프로세스 종료; OutputA <= HI_LVL 때 카운트 /= 0 else LO_LVL; 최종 아키텍처;

요약

이 애플리케이션 노트는 Moku:Pro에서 다중 계측기 모드의 일부로 작동할 때 Moku Cloud Compile의 몇 가지 장점과 이점을 제시했습니다. 예제 #1에서 가능한 가장 간단한 VHDL 코드를 입력하는 것부터 예상되는 작동을 구축, 배포 및 확인하는 것까지 전체 프로세스가 다루어졌습니다.

추가 예제 코드가 제시되고 간략하게 설명되어 MCC가 제공하는 가능성을 실험해 볼 수 있습니다.

보다 복잡한 수학 연산, 사용자 정의 트리거 모드 및 기타 애플리케이션을 포함한 추가 MCC 설계는 이러한 기본 사항을 바탕으로 개발될 수 있습니다.


질문이 있으시거나 인쇄가능 버전을 필요로 하십니까?

support@liquidinstruments.com로 문의 부탁드립니다.