Sei sulla pagina 1di 10

CREAZIONE DI IP IN MATHWORKS HDL CODER

In questo esercizio creeremo un IP core che svolgerà la funzione di un filtro per la cancellazione del rumore
LMS.

 Gli algoritmi dei minimi quadrati medi (LMS) sono una classe di filtri adattivi utilizzati per imitare un
filtro desiderato trovando i coefficienti di filtro che si riferiscono alla produzione del minimo
quadrato medio del segnale di errore (differenza tra il segnale desiderato e il segnale effettivo).

Mathworks HDL Coder verrà utilizzato per trasformare un modello Simulink basato su blocchi esistenti in
una descrizione RTL che verrà confezionata(packaged) per essere utilizzata nel Catalogo IP di Vivado.

FASE SIMULINK/MATLAB

Inizieremo aprendo il modello Simulink in MatLab.

Prima di iniziare questo esercizio, è necessario copiare alcuni file sorgente in una nuova directory di lavoro.

 In Windows Explorer, vai a C: \ Zynq_Book \ sources \ hdl_coder_lms e copia il contenuto della


directory in una nuova directory chiamata C: \ Zynq_Book \ hdl_coder_lms.
 Avvia MatLab

 Inserite C: \ Zynq_Book \ hdl_coder_lms come directory di lavoro, come evidenziato nella Figura
4.19.
Nel riquadro Current Folder, dovresti anche vedere quattro file:
original_speech.wav — Una breve clip audio di discorso.
setup.m — Esegue i comandi di configurazione per importare i campioni audio nello spazio di
lavoro MatLab e impostare di conseguenza la frequenza di campionamento del sistema.
lms.slx — Un modello simulink che implementa il processo di cancellazione del rumore LMS.
playback.m — Può essere utilizzato per verificare il processo di filtraggio LMS tramite la
riproduzione audio delle varie fasi.

I comandi di configurazione in setup.m vengono richiamati automaticamente quando la simulazione


Simulink viene inizializzata.

 Apri il modello LMS Simulink facendo doppio clic su lms.slx nel riquadro Current Folder.
Il modello dovrebbe aprirsi e dovresti vedere il sistema LMS, come mostrato nella Figura 4.20.

Il modello presenta due sorgenti:


1. un blocco Sine Wave che genera rumore tonale.
2. Un blocco From Workspace che importa i campioni audio dal MatLabe Workspace.

Il rumore tonale viene quindi aggiunto ai campioni audio per creare un segnale audio danneggiato.

Per generare codice HDL per il modello Simulink LMS utilizzando HDL Coder, gli input al sistema
devono essere in formato numerico a virgola fissa (fixed-point numerical).
Due blocchi di conversione del tipo di dati vengono utilizzati per convertire il segnale audio corrotto
e il segnale di rumore tonale in un formato a virgola fissa (fixed-point numerical).
I segnali a virgola fissa vengono quindi immessi in un sottosistema LMS, che esploreremo nel
passaggio successivo.

All'uscita del sottosistema LMS, il segnale di errore, e (k), viene immesso in un oscilloscopio insieme
agli ingressi audio corrotti e di rumore tonale, per l'ispezione visiva dei segnali.
Sono presenti anche due blocchi To Workspace per consentire l'uscita dell'LMS e i segnali audio
corrotti all'area di lavoro MatLab per la riproduzione audio.
 Esegui il drill-down nel blocco del sottosistema LMS facendo doppio clic su di esso.
Vedrai il sistema nella Figura 4.21.

È dotato di un unico blocco filtro LMS. Poiché non siamo interessati al segnale di uscita, è
scollegato.
 Aprire i parametri del blocco filtro LMS facendo doppio clic sul blocco filtro LMS.
Prenditi un momento per esplorare i parametri. Dovresti essere in grado di determinare che ci sono
16 coefficienti di filtro adattivo e una dimensione del passo di 0,1.
 Chiudi la finestra Parametri e torna al modello Simulink principale facendo clic sul pulsante Up To

Parent

FASE GENERAZIONE CODICE HDL

Genereremo codice HDL solo per il sottosistema LMS.

Fare clic con il pulsante destro del mouse sul sottosistema LMS e selezionare HDL Code > HDL Workflow
Advisor.

Si aprirà la finestra HDL Workflow Advisor, come nella Figura 4.22.


HDL Workflow Advisor guida l'utente attraverso i passaggi necessari per generare il codice RTL per il
progetto.

Nel riquadro di sinistra, espandere Set Target e selezionare Set Target Device and Synthesis Tool.

Qui specifichiamo il formato di output dell'RTL e della piattaforma di destinazione.

 Nel riquadro Input Parameters, selezionare IP Core Generation come flusso di lavoro di
destinazione (Target workflow) e Generic Xilinx Platform come piattaforma di destinazione, come
mostrato nella Figura 4.23.

 Fare clic su Run This Task per applicare le impostazioni.


 Seleziona Set Target Interface dal riquadro di sinistra.
Qui specifichiamo l'interfaccia di destinazione per la generazione del codice HDL.
Nel riquadro Input Parameters, selezionare Coprocessing - blocking come sincronizzazione
Processore / FPGA.
Ciò inferirà automaticamente un'interfaccia AXI4-Lite per tutte le porte del progetto e specificherà
un indirizzo di memoria per ciascuna.
 Fare clic su Run This Task per applicare le impostazioni.
 Espandi Prepare Model for HDL Code Generation nel riquadro di sinistra,e seleziona Check Global
Settings.

Qui, le impostazioni a livello di modello verranno controllate per verificare se il modello è pronto per la
generazione di codice HDL.

 Fare clic su Run This Task per controllare le impostazioni a livello di modello.
Se questo passaggio non riesce, fare clic su Modify All per consentire ad HDL Workflow Advisor
di modificare le impostazioni.
Questo passaggio dovrebbe ora passare e ti verrà presentata una tabella dei risultati.

I passaggi successivi sono tutti controlli e possono essere eseguiti in batch.

 Fare clic con il pulsante destro del mouse su Check Sample Times nel riquadro di sinistra e
selezionare "Run to Selected Task".
Questo eseguirà i controlli uno dopo l'altro per impedirti di eseguirli singolarmente.
Tutti i controlli dovrebbero passare.

I passaggi finali prevedono la specifica delle impostazioni di base sul codice RTL, come la lingua da utilizzare
(VHDL / Verilog) e i rapporti di generazione del codice da generare.
Infine verrà generato il codice HDL.

 Espandere HDL Codice Generation nel riquadro di sinistra ed espandere ulteriormente Set Code
Generation Options.
Fare clic su Set Basic Options.
 Seleziona VHDL o Verilog come Lingua nel Target pane.
Puoi anche selezionare uno dei rapporti di generazione del codice (Code generation reports)
che desideri.
 Seleziona Set Advanced Options nel riquadro di sinistra.
Qui puoi specificare opzioni più avanzate per il codice HDL.
Lasceremo i valori come predefiniti, ma potresti voler esplorare le impostazioni per un uso
futuro.
 Fare clic con il pulsante destro del mouse su Set Advanced Options, e seleziona Run to Selected
Task per applicare le impostazioni.
 Infine, seleziona Generate RTL Code and IP Core dal pannello di sinistra.
Questo è il passaggio che finalmente genererà il codice HDL per il nostro LMS IP Core.
Impostare il nome del core IP come lms_pcore e fare clic su Run This Task.

Una volta che HDL Coder ha terminato di generare il codice HDL, si aprirà la finestra Code Generation
Report.

Questo fornisce un riepilogo dei risultati di HDL Coder e fornisce ulteriori informazioni sull'interfaccia di
destinazione e sul clock.

FASE VIVADO

La fase finale della creazione del nostro core IP LMS consiste nel confezionarlo con IP Packager in modo da
poterlo utilizzare nei progetti di IP Integrator.

Per fare questo avremo bisogno di creare un nuovo progetto Vivado.

 Avvia Vivado e crea un nuovo progetto chiamato lms_packaging nella seguente posizione:
C: \ Zynq_Book \ hdl_coder_lms, assicurandosi che sia selezionata l'opzione per creare una
sottodirectory del progetto.
Seleziona VHDL o Verilog come lingua di destinazione e ZedBoard come parte predefinita.
 Quando il progetto è stato creato e aperto, selezionare Tools > Create and Package IP dalla barra
dei menu e fare clic su Next.
 Selezionare l'opzione per creare un pacchetto di una directory specificata (Package a specified
directory) e fare clic su Avanti.
 Immettere C: / Zynq_Book / hdl_coder_lms / hdl_prj / ipcore / lms_pcore_v1_00_a come IP
location.
 Fare clic su Avanti per passare alla finestra di dialogo Modifica in nome progetto IP Packager (Edit in
IP Packager Project Name) e fare clic su Avanti per accettare il nome progetto e la posizione
progetto predefiniti (default Project Name and Project Location).
 Nella finestra Riepilogo e fare clic su Fine per avviare IP Packager.
 Nel pannello di sinistra della finestra IP Packager, selezionare IP Ports and Interfaces.

Il pannello Interfacce IP (IP Interface) si aprirà e dovresti vedere che IP Packager ha identificato le
singole porte AXI, ma non ha dedotto un'interfaccia AXI.
Per dedurre un'interfaccia AXI:
 Fare clic con il pulsante destro del mouse su una sezione vuota del riquadro IP Ports and Interfaces
e selezionare Auto Infer Interface.
 Si aprirà la finestra Auto Infer Interface Chooser:

Selezionare aximm dall'elenco, come mostrato, e fare clic su OK.


Le singole porte AXI nel nostro progetto verranno mappate su un'interfaccia AXILite.
 Seleziona IP Addressing and Memory dal pannello di sinistra. Qui, IP Packager ha specificato in
modo errato un intervallo di indirizzi di 4294967296. Fare clic su Range e modificare il valore in 32.
 Infine, seleziona Review and Package dal menu a sinistra.
Rivedi le informazioni fornite e fai clic su Package IP.

Ciò completa la generazione di un componente LMS da Mathworks HDL Coder. Ora dovresti avere
familiarità con:

• Utilizzo dell'ambiente di progettazione basato su blocchi Simulink per la progettazione e la


simulazione dell'IP.
• Utilizzo di HDL Workflow Advisor per guidarvi attraverso le fasi di generazione del codice RTL e
dei core IP per i progetti Simulink esistenti.
• Packaging HDL Coder ha generato blocchi IP in IP Packager da utilizzare nei progetti di Vivado IP
Integrator.
ULTERIORE SPIEGAZIONE - INTRODUZIONE AL FLUSSO DI LAVORO DA MATLAB A HDL

Questo esempio mostra come creare un progetto HDL Coder ™ e generare codice dal tuo progetto
MATLAB®.
 Crea un progetto MATLAB HDL Coder.
 Aggiungi i file di progettazione e banco di prova al progetto.
 Avvia HDL Workflow Advisor per il design MATLAB.
 Esegui conversione a virgola fissa e generazione di codice HDL.

Filtro FIR MATLAB Design


Il design MATLAB mlhdlc_sfir è un semplice filtro FIR simmetrico.

design_name = 'mlhdlc_sfir';
testbench_name = 'mlhdlc_sfir_tb';

Design MATLAB
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MATLAB design: Symmetric FIR Filter
% % Introduction:
%% We can reduce the complexity of the FIR filter by leveraging its symmetry.
% Symmetry for an n-tap filter implies, coefficient h0 = coefficient hn-1,
% coefficient, h1 = coefficient hn-2, etc. In this case, the number of
% multipliers can be approximately halved. The key is to add the
% two data values that need to be multiplied with the same coefficient
% prior to performing the multiplication.
%% Key Design pattern covered in this example:
% (1) Filter states represented using the persistent variables
% (2) Filter coefficients passed in as parameters
% Copyright 2011-2019 The MathWorks, Inc.
%#codegen
function [y_out, delayed_xout] = mlhdlc_sfir(x_in,h_in1,h_in2,h_in3,h_in4)
% Symmetric FIR Filter

% declare and initialize the delay registers


persistent ud1 ud2 ud3 ud4 ud5 ud6 ud7 ud8;
if isempty(ud1)
ud1 = 0; ud2 = 0; ud3 = 0; ud4 = 0; ud5 = 0; ud6 = 0; ud7 = 0; ud8 = 0;
end

% access the previous value of states/registers


a1 = ud1 + ud8; a2 = ud2 + ud7;
a3 = ud3 + ud6; a4 = ud4 + ud5;

% multiplier chain
m1 = h_in1 * a1; m2 = h_in2 * a2;
m3 = h_in3 * a3; m4 = h_in4 * a4;
% adder chain
a5 = m1 + m2; a6 = m3 + m4;

% filtered output
y_out = a5 + a6;

% delayout input signal


delayed_xout = ud8;
% update the delay line
ud8 = ud7;
ud7 = ud6;
ud6 = ud5;
ud5 = ud4;
ud4 = ud3;
ud3 = ud2;
ud2 = ud1;
ud1 = x_in;
end
Filtro FIR MATLAB Test Bench

Un testbench MATLAB mlhdlc_sfir_tb esercita il design del filtro.

open(testbench_name);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MATLAB test bench for the FIR filter
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Copyright 2011-2019 The MathWorks, Inc.


clear mlhdlc_sfir;
T = 2;
dt = 0.001;
N = T/dt+1;
sample_time = 0:dt:T;

df = 1/dt;
sample_freq = linspace(-1/2,1/2,N).*df;

% input signal with noise


x_in = cos(2.*pi.*(sample_time).*(1+(sample_time).*75)).';

% filter coefficients
h1 = -0.1339; h2 = -0.0838; h3 = 0.2026; h4 = 0.4064;

len = length(x_in);
y_out = zeros(1,len);
x_out = zeros(1,len);

for ii=1:len
data = x_in(ii);
% call to the design 'mlhdlc_sfir' that is targeted for hardware
[y_out(ii), x_out(ii)] = mlhdlc_sfir(data, h1, h2, h3, h4);
end

figure('Name', [mfilename, '_plot']);


subplot(3,1,1);
plot(1:len,x_in,'-b');
xlabel('Time (ms)')

ylabel('Amplitude')
title('Input Signal (with noise)')
subplot(3,1,2); plot(1:len,y_out,'-b');
xlabel('Time (ms)')
ylabel('Amplitude')
title('Output Signal (filtered)')

freq_fft = @(x) abs(fftshift(fft(x)));

subplot(3,1,3); semilogy(sample_freq,freq_fft(x_in),'-b');
hold on
semilogy(sample_freq,freq_fft(y_out),'-r')
hold off
xlabel('Frequency (Hz)')
ylabel('Amplitude (dB)')
title('Input and Output Signals (Frequency domain)')
legend({'FilterIn', 'FilterOut'}, 'Location','South')
axis([-500 500 1 100])
Crea una cartella e copia i file rilevanti
Per copiare i file di esempio in una cartella temporanea, esegui questi comandi:

design_name = 'mlhdlc_sfir';
testbench_name = 'mlhdlc_sfir_tb';

mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos',


'matlabhdlcoderdemos');
mlhdlc_temp_dir = [tempdir 'mlhdlc_sfir'];

Crea una cartella temporanea e copia i file MATLAB.


cd(tempdir);
[~, ~, ~] = rmdir(mlhdlc_temp_dir, 's');
mkdir(mlhdlc_temp_dir);
cd(mlhdlc_temp_dir);

copyfile(fullfile(mlhdlc_demo_dir, [design_name,'.m*']), mlhdlc_temp_dir);


copyfile(fullfile(mlhdlc_demo_dir, [testbench_name,'.m*']), mlhdlc_temp_dir);

Crea un progetto HDL Coder


Per creare un progetto HDL Coder:

1. In MATLAB Editor, nella scheda App, seleziona HDL Coder. Immettere “sfir_project” come * Nome
del progetto.
Per creare un progetto dal prompt dei comandi di MATLAB, esegui questo comando:

coder -hdlcoder -new sfir_project

Nella cartella corrente viene creato un file sfir_project.prj.

2. Per MATLAB Function, fare clic sul collegamento Add MATLAB function e selezionare il filtro FIR
MATLAB design mlhdlc_sfir. Nella sezione MATLAB Test Bench, fai clic su Add files e aggiungi il
MATLAB test bench mlhdlc_sfir_tb.m.

3. Fare clic su Autodefine types e utilizzare i tipi consigliati per il design MATLAB.

Il generatore di codice deduce i tipi di input dal banco di prova MATLAB.


Esegui conversione a virgola fissa e generazione di codice HDL
Fare clic sul pulsante Workflow Advisor per avviare HDL Workflow Advisor.

Fare clic con il pulsante destro del mouse sull'attività HDL Code Generation e selezionare Run to selected
task.
Il generatore di codice esegue le attività di Controllo flusso di lavoro per generare codice HDL per la
progettazione del filtro. I passi:

 Traduci il tuo progetto MATLAB a virgola mobile in un progetto a virgola fissa. Per esaminare il
codice a virgola fissa generato dal design a virgola mobile, fare clic sull'attività Conversione a virgola
fissa (Fixed-point Conversion). Il codice MATLAB a virgola fissa generato si apre nell'editor MATLAB.

 Genera codice HDL dal design MATLAB a virgola fissa. Per impostazione predefinita, HDL Coder
genera codice VHDL. Per esaminare il codice HDL generato, fare clic sull'attività Generazione codice
HDL (HDL Code Generation), quindi fare clic sul collegamento ipertestuale a mlhdlc_sfir_fixpt.vhd
nella finestra Registro generazione codice (Code Generation Log). Per generare codice Verilog,
nell'attività Generazione codice HDL (HDL Code Generation), selezionare la scheda Avanzate
(Advanced) e impostare Lingua (Language) su Verilog.

Pulisci i file generati


Per pulire la cartella del progetto temporaneo, esegui questi comandi:

mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos',


'matlabhdlcoderdemos');
mlhdlc_temp_dir = [tempdir 'mlhdlc_sfir'];
clear mex;
cd (mlhdlc_demo_dir);
rmdir(mlhdlc_temp_dir, 's');

Potrebbero piacerti anche