어플리케이션 노트

MathWorks HDL Coder를 사용한 Moku 클라우드 컴파일

Moku:Pro에서 배포 가능한 VHDL 코드 생성, 2부 - Simulink

이것은 "Moku Cloud Compile with MathWorks HDL Coder" 튜토리얼의 2부입니다. 파트 1을 찾을 수 있습니다 여기에서 지금 확인해 보세요.. 2부에서는 MathWorks의 Simulink를 사용하여 Moku:Pro에서 XNUMX채널 Schmitt 트리거를 구축하고 배포합니다. MATLAB 스크립트 접근 방식과 Simulink 모델 접근 방식 간의 일반적인 작업 흐름은 유사하지만 Simulink는 즉시 사용할 수 있는 추가 자사 DSP 및 테스트 블록을 제공합니다. 블록 다이어그램 기반 설계 방법은 특히 복잡한 시스템의 경우 DSP 작업 흐름을 구성하는 보다 직관적인 방법을 제공합니다. 이 튜토리얼에서는 하이브리드 MATLAB-Simulink 설계를 통해 첫 번째 채널을 구성하고 Simulink 라이브러리를 사용하여 두 번째 채널을 구성합니다.

인쇄 가능한 버전 다운로드


살펴보기

Liquid Instruments의 MCC(Moku Cloud Compile) 도구를 사용하면 사용자는 Moku 플랫폼에서 구현할 맞춤형 기기를 설계할 수 있습니다. CPU 및 ASIC(주문형 집적 회로) 기반 DSP 접근 방식과 비교할 때 FPGA는 CPU처럼 소프트웨어로 정의되고 재프로그래밍 가능하면서 ASIC 수준의 입력-출력 대기 시간을 제공합니다. FPGA 프로그래밍은 일반적으로 HDL(하드웨어 설명 언어)을 사용하여 수행됩니다. HDL 코딩의 학습 곡선은 소프트웨어 프로그래밍 언어에 비해 가파르지만 다른 프로그래밍 언어의 스크립트를 HDL로 변환하는 데 사용할 수 있는 몇 가지 도구가 있습니다. 튜토리얼의 1부에서는 MathWorks HDL 코더를 사용하여 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 코드를 생성하려면 Simulink, HDL Coder 및 고정 소수점 변환기가 포함된 MATLAB이 필요합니다. 참고: Mac 사용자는 VHDL 코드를 생성하기 위해 MATLAB용 XCode도 설치해야 합니다. VHDL 코드를 컴파일하려면 Moku Cloud Compile에 액세스할 수 있어야 합니다. 컴파일된 기기 비트스트림을 구현하려면 펌웨어 버전 551 이상을 실행하는 Moku:Pro, Moku: iPad 앱, Moku:Pro의 다중 기기 모드에 대한 액세스 권한이 필요합니다.

DSP 설계 및 구성

템플릿 조정

모델 생성의 첫 번째 단계는 DSP 설계에 맞게 Simulink 템플릿을 조정하는 것입니다. 우리의 디자인은 2채널 시스템이기 때문에 입력A, 입력B, 출력A 및 출력B 포트만 필요합니다.


그림 2: 중복 채널 제거

부동 소수점 DSP 설계

이 섹션에서는 MATLAB 기능 블록을 사용하는 첫 번째 채널과 Simulink 트리거 블록을 사용하는 두 번째 채널로 두 개의 슈미트 트리거를 구성합니다.

Simulink 빌딩 블록은 시뮬레이션 탭 아래의 "라이브러리 브라우저"에서 찾을 수 있습니다. 검색 기능은 원하는 요소를 찾는 가장 좋은 방법입니다. 모든 Simulink 블록이 HDL 코드 생성을 지원하는 것은 아닙니다. DSP 하위 시스템 내의 모든 것에 대해 "HDL Coder" 또는 "HDL 지원" 카탈로그 아래의 블록만 사용하는 것이 좋습니다.


그림 3: Simulink 빌딩 블록은 라이브러리 브라우저를 통해 찾을 수 있습니다.

첫 번째 채널의 경우 모델에 MATLAB 함수 블록을 배치합니다. MATLAB 함수는 부동 소수점 모델이고 Simulink 템플릿에는 모든 포트에 대한 데이터 유형이 사전 정의되어 있으므로 데이터 유형이 일치하지 않습니다. MATLAB 함수 블록 앞뒤에 두 개의 "변환" 블록을 배치하여 이 문제를 해결합니다. 사용자는 고정 소수점 알고리즘을 사용하여 모델을 설계할 수 있지만, 모델에서 MATLAB 함수 블록을 구현할 때 부동 소수점으로 시작하는 것이 더 쉽다는 것을 알았습니다. HDL 변환 단계 전에 첫 번째 변환 블록을 제거해야 할 수도 있습니다.

Schmitt 트리거 함수를 MATLAB 함수 블록에 추가하려면 블록을 두 번 클릭하십시오. 함수 이름을 제외하고 튜토리얼의 1부와 동일한 MATLAB 함수를 사용합니다(따라서 MATLAB 함수와 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에서 지원할 필요가 없습니다.

테스트벤치를 구성하기 위해 "신호 생성기" 블록을 사용하여 파트 I의 테스트벤치에 사용한 것과 동일한 신호를 생성했습니다. 우리는 시스템의 16비트 부호 있는 입력과 일치하도록 생성기의 신호 크기를 조정하고 변환했습니다. 신호를 입력에 공급하기 전에 부동 소수점 숫자를 고정 소수점 숫자로 변환하기 위해 추가 "Convert" 블록이 추가되었습니다. 그런 다음 발생기 신호 OuputA 및 OutputB를 오실로스코프에 공급하여 시스템 응답을 관찰했습니다.


그림 6: Simulink 기반 테스트벤치의 블록 다이어그램

시스템이 구축되면 시뮬레이션을 실행하고 출력을 확인합니다. 우리는 출력 신호가 예상한 대로 나타나는 것을 관찰했습니다.


그림 7: 오실로스코프의 DSP 하위 시스템 출력.

고정 소수점 변환

DSP 하위 시스템을 위한 VHDL 코드를 생성하기 전에 부동 소수점 MATLAB 함수 블록을 고정 소수점 함수 블록으로 변환해야 합니다. 우리는 "앱" 탭에 있는 MathWorks의 고정 소수점 도구와 "반복 고정 소수점 변환" 방법을 사용하여 이를 달성합니다. 처음부터 고정 소수점 DSP를 사용하여 Simulink 모델을 구축하는 경우 고정 소수점 변환을 실행할 필요가 없습니다.


그림 8: Simulink Apps 탭을 통해 반복 고정 소수점 변환을 시작할 수 있습니다.

다음으로 MATLAB 함수를 대상으로 선택하고 "범위 수집" 버튼을 클릭하여 변환 프로세스를 시작했습니다. Simulink는 testbech 데이터 포인트를 참조로 사용하여 모델을 변환합니다.


그림 9: MATLAB 기능이 "설계 중인 시스템"으로 선택되었습니다.

그런 다음 "데이터 유형 제안" 버튼을 사용하여 Simulink가 최고의 고정 소수점 정밀도를 결정하도록 할 수 있습니다. 하단의 히스토그램은 각 신호의 범위를 표시합니다. 필요한 경우 신호 정밀도를 수동으로 무시할 수 있습니다. 정밀도가 결정되면 "데이터 유형 적용" 버튼을 사용하여 변환을 진행할 수 있습니다.


그림 10: (1) 테스트벤치 데이터를 기반으로 신호 정밀도를 제안합니다. (2) 히스토그램으로 신호 범위를 관찰합니다. (3) 모델을 고정점 설계로 변환을 진행합니다. (4) 첫 번째 "convert" 블록을 삭제합니다.

고정 소수점 변환 후 첫 번째 "변환" 블록을 제거해야 합니다. 새로운 "MATLAB Function" 블록은 부동 소수점 숫자 대신 부동 소수점 숫자를 사용합니다.

고정점 모델 검증

모델이 변환된 후에는 또 다른 시뮬레이션을 실행하여 동작과 정밀도 손실이 예상한 대로인지 확인하는 것이 중요합니다.

VHDL 코드 생성

HDL 코드는 HDL 코드 탭 아래의 “HDL 코드 생성” 버튼을 클릭하여 생성할 수 있습니다. HDL Coder 생성 설정은 Simulink 템플릿에 이미 사전 구성되어 있으므로 여기서 설정을 조정할 필요가 없습니다.


그림 11: "HDL 코드 생성" 버튼은 HDL 코드 앱 아래에 있습니다.

타사 도구를 사용한 VHDL 시뮬레이션(선택 사항)

VHDL 테스트벤치 파일은 HDL 코드 앱 아래의 "테스트벤치 생성" 버튼을 클릭하여 생성할 수 있습니다. 확인 단계는 MATLAB 예제와 동일합니다.


그림 12: "테스트벤치 생성" 버튼은 HDL 코드 앱 아래에 있습니다.

DSP 컴파일 및 배포

Moku Cloud Compile에는 맞춤형 도구가 Moku:Pro의 다른 부분과 상호 작용할 수 있도록 표준 래퍼가 내장되어 있습니다. 표준 래퍼는 계측기의 입력 채널 4개와 출력 채널을 모두 사용합니다. 이는 두 개의 입력과 두 개의 출력이 있는 슈미트 트리거 예제와 일치하지 않습니다. 따라서 제공된 템플릿에서 계측기에 대한 사용자 정의 래퍼를 생성해야 합니다.

"클럭 활성화 최소화" 옵션을 선택한 경우에도 HDL Coder가 여전히 VHDL 코드를 생성하는 경우가 있습니다. clock_enablece_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 클라우드 컴파일 시작 가이드.

Schmitt 트리거를 컴파일하려면 Liquid Instruments의 Moku Cloud Compile에서 새 프로젝트를 만듭니다. 이 프로젝트에서는 슈미트 트리거용 VHDL 코드인 DSP_fixpt.vhd용 파일을 생성합니다. 또한 이전 섹션에서 사용자 정의 래퍼에 대한 래퍼 파일을 만듭니다. 4개의 슬롯이 있는 Moku:Pro로 대상 장치를 선택하고 프로젝트를 빌드합니다. 비트스트림이 구축되면 웹 인터페이스와 iPad 앱을 사용하여 Moku:Pro에 Schmitt 트리거를 배포할 수 있습니다.

Schmitt 트리거가 개념 설계에 따라 작동하고 있음을 보여주기 위해 Moku: 앱 및 다중 계측기 모드를 사용하여 Moku:Pro에 계측기를 구현했습니다. 슬롯 1에서는 슈미트 트리거에 대한 입력 신호로 테스트 벤치에서 사용한 것과 동일한 신호를 생성하기 위해 임의 파형 발생기에 배치했습니다. 슬롯 2에서는 슈미트 트리거를 배치했습니다. 슬롯 3에서는 슈미트 트리거와 임의 파형 발생기의 출력 신호를 비교하기 위해 오실로스코프를 배치했습니다.

먼저 MATLAB 함수 블록으로 설계된 채널 A의 슈미트 트리거를 검증합니다. 입력 신호가 110mV를 초과하면 슈미트 트리거의 출력이 하이로 전환되고 신호가 -110mV 아래로 떨어질 때까지 기다렸다가 XNUMX으로 전환되는 것을 확인할 수 있습니다.


그림 13: (a) MATLAB 함수 블록 슈미트 트리거를 테스트하기 위한 다중 계측기 시스템 구성. (b) 슈미트 트리거가 설계된 대로 작동하는지 확인하는 오실로스코프 측정.

또한 Simulink 트리거 블록을 사용하여 설계된 채널 B의 슈미트 트리거를 검증하고 동일한 동작을 관찰했습니다.


그림 14: (a) Simulink 트리거 블록 Schmitt 트리거를 테스트하기 위한 다중 계측기 시스템 구성. (b) 슈미트 트리거가 설계된 대로 작동하는지 확인하는 오실로스코프 측정.

마지막으로 두 출력 채널을 함께 비교하여 동일한 지점에서 높음과 낮음으로 전환되는 것을 확인할 수 있습니다.


그림 15: MATLAB 함수 블록을 사용하여 설계된 슈미트 트리거와 트리거 블록은 동일한 동작을 갖습니다.

결론

튜토리얼의 두 번째 부분에서는 MathWorks의 Simulink 및 HDL Coder를 활용하여 Moku:Pro에서 DSP 모델을 구축, 검증 및 배포하는 방법을 다루었습니다. MATLAB 단독 접근 방식과 비교하여 Simulink는 DSP 라이브러리를 통해 DSP를 설계하고 처음부터 고정 소수점 모델을 사용하여 모델을 구축할 수 있는 옵션을 제공합니다. 복잡한 DSP 시스템을 구축하는 데 권장됩니다.

코드 가용성

이 프로젝트의 소스 코드는 다음에서 다운로드할 수 있습니다. 이 링크.


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

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