회사 개요
Liquid Instruments의 Moku Cloud Compile(MCC) 도구를 사용하면 Moku 플랫폼에서 구현할 맞춤형 계측기를 설계할 수 있습니다. CPU 및 ASIC(애플리케이션별 집적 회로) 기반 DSP 방식과 비교했을 때, FPGA는 CPU처럼 소프트웨어로 정의되고 재프로그래밍 가능하면서도 ASIC 수준의 입출력 지연 시간을 제공합니다. FPGA 프로그래밍은 일반적으로 HDL(하드웨어 설명 언어)을 사용하여 수행됩니다. HDL 코딩의 학습 곡선은 소프트웨어 프로그래밍 언어에 비해 가파르지만, 다른 프로그래밍 언어로 작성된 스크립트를 HDL로 변환하는 데 사용할 수 있는 몇 가지 도구가 있습니다. 이 튜토리얼 1부에서는 MathWorks HDL Coder를 사용하여 MATLAB 스크립트를 Moku:Pro에서 구현할 HDL 코드로 변환하는 방법을 다루었고, 이번 2부에서는 Simulink 모델에서 HDL 코드를 생성하는 방법을 보여드리겠습니다. Simulink는 MathWorks에서 개발한 그래픽 기반 모델링 도구입니다. 블록 다이어그램 기반 설계 방식을 통해 손으로 그린 디지털 신호 처리(DSP) 시스템을 컴퓨터 기반 모델로 변환하는 과정을 간소화합니다. 파형 발생기 및 오실로스코프와 같은 가상 테스트 및 측정 장비는 테스트벤치를 구성하고 DSP 모델을 검증하는 보다 직관적인 방법을 제공합니다. 또한 사용자는 Simulink를 사용하여 고정 소수점 시스템을 처음부터 구축할 수 있습니다. 일부 논리 연산은 MATLAB 함수를 사용하여 구현하기가 더 쉽기 때문에 사용자는 설계에 MATLAB 함수 블록을 추가할 수 있습니다. 더 복잡한 시스템의 경우 두 도구를 모두 활용하면 설계 프로세스를 크게 간소화할 수 있습니다. 이 튜토리얼에서는 2채널 슈미트 트리거를 구성합니다. 슈미트 트리거의 기본 사항 및 개념 설계는 튜토리얼 1부에서 확인할 수 있습니다. 첫 번째 채널의 경우 튜토리얼 1부에서 사용한 것과 동일한 MATLAB 함수를 사용하여 DSP를 구성합니다. 두 번째 채널의 경우 Simulink 내장 DSP 블록을 사용하여 동일한 기능을 구현합니다.
그림 1: Moku Cloud Compile + HDL Coder DSP Design에 권장되는 워크플로.
요구조건 니즈
슈미트 트리거 빌드 및 구현을 시작하기 전에 시스템이 다음 요구 사항을 충족하는지 확인하십시오. Simulink 모델에서 VHDL 코드를 생성하려면 MATLAB with Simulink, HDL Coder, Fixed-Point Converter가 필요합니다. 참고: Mac 사용자는 VHDL 코드를 생성하기 위해 MATLAB용 XCode도 설치해야 합니다. VHDL 코드를 컴파일하려면 Moku Cloud Compile에 액세스할 수 있어야 합니다. 컴파일된 악기 비트스트림을 구현하려면 펌웨어 버전 601 이상을 실행하는 Moku:Pro, Moku: 앱, 그리고 다중 장비 모드 Moku:Pro에서.DSP 설계 및 구성
템플릿 조정
모델 생성의 첫 번째 단계는 DSP 설계에 맞게 Simulink 템플릿을 조정하는 것입니다. 우리의 디자인은 2채널 시스템이기 때문에 입력A, 입력B, 출력A 및 출력B 포트만 필요합니다.
그림 2: 중복 채널을 제거합니다.
부동 소수점 DSP 설계
이 섹션에서는 MATLAB 함수 블록을 사용하여 첫 번째 채널의 슈미트 트리거를, Simulink 트리거 블록을 사용하여 두 개의 슈미트 트리거를 구성합니다. Simulink 빌딩 블록은 시뮬레이션 탭의 "라이브러리 브라우저"에서 찾을 수 있습니다. 검색 기능을 사용하면 원하는 요소를 가장 쉽게 찾을 수 있습니다. 모든 Simulink 블록이 HDL 코드 생성을 지원하는 것은 아니므로, DSP 서브시스템 내의 모든 기능에는 "HDL 코더" 또는 "HDL 지원" 카탈로그에 있는 블록만 사용하는 것이 좋습니다.
그림 3: Simulink 빌딩 블록은 라이브러리 브라우저를 통해 찾을 수 있습니다.
그림 4: MATLAB 함수 기반 슈미트 트리거의 블록 다이어그램 디자인.
기능 출력A = 슈미트_트리거(입력A)
%#codegen
지속 아웃0; %함수 호출 사이의 변수 값을 유지합니다.
if 비어있음(out0) %첫 번째 호출에 대한 값을 초기화합니다.
출력0 = 0;
end
upperThreshold = 바닥(2^15/10); %상한 임계값을 전체 양성 범위의 1/10로 설정합니다.
lowerThreshold = -floor(2^15/10); %하한 임계값을 전체 음수 범위의 1/10로 설정합니다.
if 입력A >상한임계값 슈미트 트리거 기능을 수행하는 %논리.
출력0 = 2^15-1; %가장 높은 양수로 매핑됩니다.
그렇지 않으면 입력A
출력0 = 0;
end
출력A = 출력0; %변수 out0을 OutputA에 할당합니다.
두 번째 채널에서는 Simulink의 "Relay" 블록을 사용하여 Schmitt 트리거 로직을 수행하겠습니다. 입력B와 출력B 사이에 릴레이 블록을 배치한 다음 "릴레이" 블록을 두 번 클릭하여 스위치 켜기 및 끄기 임계값을 각각 바닥(2^15/10) 및 – 바닥(2^15/10)으로 변경했습니다. "신호 속성" 탭에서 신호 출력을 다음으로 설정합니다. 수정(1, 16,0) 출력을 일치시킵니다.
그림 5: "릴레이" 블록은 첫 번째 채널과 동일한 슈미트 트리거 논리를 수행하도록 설정되었습니다.
테스트벤치 구축
Simulink에는 신호 발생기, 오실로스코프 및 기타 일반적인 테스트 및 측정 장비 블록이 내장되어 있습니다. 이를 통해 보다 직관적인 방식으로 테스트벤치를 설계할 수 있습니다. DSP 시스템 외부의 빌딩 블록은 시뮬레이션에만 사용되므로 HDL Coder에서 지원할 필요가 없습니다. 테스트벤치를 구성하기 위해 "신호 발생기" 블록을 사용하여 1부에서 사용한 것과 동일한 신호를 생성했습니다. 발생기에서 생성된 신호를 시스템의 16비트 부호 있는 입력에 맞게 스케일링하고 변환했습니다. 신호를 입력에 넣기 전에 "변환" 블록을 추가하여 부동 소수점 숫자를 고정 소수점으로 변환했습니다. 그런 다음 발생기 신호, 출력A 및 출력B를 오실로스코프에 입력하여 시스템 응답을 관찰했습니다.
그림 6: Simulink 기반 테스트벤치의 블록 다이어그램.
그림 7: 오실로스코프의 DSP 서브시스템 출력.
고정 소수점 변환
DSP 하위 시스템을 위한 VHDL 코드를 생성하기 전에 부동 소수점 MATLAB 함수 블록을 고정 소수점 함수 블록으로 변환해야 합니다. 우리는 "앱" 탭에 있는 MathWorks의 고정 소수점 도구와 "반복 고정 소수점 변환" 방법을 사용하여 이를 달성합니다. 처음부터 고정 소수점 DSP를 사용하여 Simulink 모델을 구축하는 경우 고정 소수점 변환을 실행할 필요가 없습니다.
그림 8: Simulink Apps 탭을 통해 반복 고정 소수점 변환을 시작할 수 있습니다.
그림 9: MATLAB 함수가 "설계 중인 시스템"으로 선택되었습니다.
그림 10: (1) 테스트벤치 데이터를 기반으로 신호 정밀도를 제안합니다. (2) 히스토그램으로 신호 범위를 관찰합니다. (3) 모델을 고정점 설계로 변환을 진행합니다. (4) 첫 번째 "convert" 블록을 삭제합니다.
고정점 모델 검증
모델이 변환된 후에는 또 다른 시뮬레이션을 실행하여 동작과 정밀도 손실이 예상한 대로인지 확인하는 것이 중요합니다.VHDL 코드 생성
HDL 코드는 HDL 코드 탭 아래의 “HDL 코드 생성” 버튼을 클릭하여 생성할 수 있습니다. HDL Coder 생성 설정은 Simulink 템플릿에 이미 사전 구성되어 있으므로 여기서 설정을 조정할 필요가 없습니다.
그림 11: "HDL 코드 생성" 버튼은 HDL 코드 앱 아래에 있습니다.
타사 도구를 사용한 VHDL 시뮬레이션(선택 사항)
VHDL 테스트벤치 파일은 HDL 코드 앱 아래의 "테스트벤치 생성" 버튼을 클릭하여 생성할 수 있습니다. 확인 단계는 MATLAB 예제와 동일합니다.
그림 12: "테스트벤치 생성" 버튼은 HDL 코드 앱 아래에 있습니다.
DSP 컴파일 및 배포
Moku Cloud Compile에는 사용자 정의 계측기가 Moku:Pro의 다른 부분과 상호 작용할 수 있도록 표준 래퍼가 내장되어 있습니다. 이 표준 래퍼는 계측기의 네 개의 입력 채널과 출력 채널을 모두 사용하는데, 이는 두 개의 입력과 두 개의 출력을 사용하는 슈미트 트리거 예제와는 다릅니다. 따라서 제공된 템플릿을 사용하여 계측기에 대한 사용자 정의 래퍼를 생성해야 합니다. "클록 활성화 최소화" 옵션을 선택하더라도 HDL Coder가 때때로 VHDL 코드를 생성할 수 있다는 점에 유의하십시오. clock_enable ce_out 포트(이 튜토리얼과 유사). 우리는 clock_enable 지속적으로 높은 신호를 보내고 VHDL 변환 프로세스 중에 이러한 포트가 생성된 경우 ce_out 포트를 열어 둡니다.
건축 HDLCoder래퍼 OF 커스텀 래퍼 IS
-- 신호 선언
신호 상수높음:std_logic. :='1';
--구성요소 선언
구성 요소 DSP
포트(클릭: IN 표준_논리;
초기화 : IN 표준_논리;
clk_enable : IN 표준_논리;
입력 A : IN 서명됨(15 DOWNTO 0); -- sfix16_En16
입력B : IN 서명됨(15 DOWNTO 0); -- sfix16_En16
ce_out_0 : OUT 표준_논리;
ce_out_1 : OUT 표준_논리;
출력A : OUT 서명됨(15 DOWNTO 0); -- sfix16_En14
출력B : OUT 서명됨(15 DOWNTO 0); -- sfix16_En14
);
최종 구성 요소;
BEGIN
u_DSP:DSP
항구 지도(클릭 => 클릭,
재설정 => 재설정,
clk_enable => 상수높음,
입력A => 입력A,
입력B => 입력B,
ce_out_0 => 열 수,
ce_out_1 => 열 수,
출력A => 출력A,
출력B => 출력B
);
END HDLCoderWrapper;
계측기 컴파일 및 배포
Moku Cloud Compile을 사용하여 계측기 비트스트림을 구축하고 계측기를 배포하는 방법에 대한 자세한 지침은 당사에서 찾을 수 있습니다. Moku 클라우드 컴파일 시작 가이드슈미트 트리거를 컴파일하려면 Liquid Instruments의 Moku 클라우드 컴파일에서 새 프로젝트를 생성합니다. 이 프로젝트에 슈미트 트리거의 VHDL 코드인 DSP_fixpt.vhd 파일을 생성하고, 이전 섹션에서 설명한 사용자 지정 래퍼에 대한 래퍼 파일도 생성합니다. 대상 장치로 슬롯이 4개 있는 Moku:Pro를 선택하고 프로젝트를 빌드합니다. 비트스트림 빌드가 완료되면 웹 인터페이스와 Moku: 앱을 사용하여 Moku:Pro에 슈미트 트리거를 배포할 수 있습니다. 슈미트 트리거가 개념 설계대로 작동하는지 확인하기 위해 Moku: 앱과 멀티 인스트루먼트 모드를 사용하여 Moku:Pro에 계측기를 구현했습니다. 슬롯 1에는 테스트벤치에서 슈미트 트리거의 입력 신호로 사용한 것과 동일한 신호를 생성하는 임의 파형 생성기를 배치했습니다. 슬롯 2에는 슈미트 트리거를 배치했습니다. 슬롯 3에는 슈미트 트리거와 임의 파형 발생기의 출력 신호를 비교하기 위해 오실로스코프를 설치했습니다. 먼저 MATLAB 함수 블록으로 설계된 채널 A의 슈미트 트리거를 검증합니다. 입력 신호가 110mV 이상일 때 슈미트 트리거의 출력이 하이(high)로 전환되고, 신호가 -110mV 이하로 떨어질 때까지 기다린 후 0(zero)으로 전환되는 것을 확인할 수 있습니다.
그림 13: (a) MATLAB 함수 블록 슈미트 트리거를 테스트하기 위한 다중 계측기 시스템 구성. (b) 슈미트 트리거가 설계대로 작동하는지 확인하기 위한 오실로스코프 측정.
그림 14: (a) Simulink 트리거 블록 슈미트 트리거를 테스트하기 위한 다중 계측기 시스템 구성. (b) 슈미트 트리거가 설계대로 작동하는지 확인하기 위한 오실로스코프 측정.
그림 15: MATLAB 함수 블록을 사용하여 설계된 슈미트 트리거와 트리거 블록은 동일한 동작을 갖습니다.



