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
Prima di iniziare questo esercizio, è necessario copiare alcuni file sorgente in una nuova directory di lavoro.
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.
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 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
Fare clic con il pulsante destro del mouse sul sottosistema LMS e selezionare HDL Code > HDL Workflow
Advisor.
Nel riquadro di sinistra, espandere Set Target e selezionare Set Target Device and Synthesis Tool.
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.
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.
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.
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:
Ciò completa la generazione di un componente LMS da Mathworks HDL Coder. Ora dovresti avere
familiarità con:
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.
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
% 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;
open(testbench_name);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MATLAB test bench for the FIR filter
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
df = 1/dt;
sample_freq = linspace(-1/2,1/2,N).*df;
% 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
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)')
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';
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:
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.
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.