author | date | title | |
---|---|---|---|
|
A.A. 2021-2022 |
Progetto Reti Logiche |
Voto : 30L
Attenzione: conversione da .tex
a .md
utilizzando pandoc
. Si trova il contenuto originale (meglio formattato) nella cartella report/
.
Una codifica convoluzionale è un tipo di codifica utilizzata per la
Forward Error Correction (FEC) in sistemi di telecomunicazioni basati
su canali monodirezionali.
Attraverso una codifica convouzionale si genera un codice
convoluzionale, il quale trasforma ogni parola
Lo scopo del progetto è quello di implementare un componente hardware,
tramite l'utilizzo del linguaggio di specifica dello hardware VHDL, in
grado di interfacciarsi con una memoria ram e di applicare una codifica
convoluzionale con
Vengono fornite l'interfaccia del progetto, la specifica della memoria
sulla quale interfacciarsi ed, infine, una limitazione temporale che
impone che il modulo hardware computi correttamente con periodi di clock
di almeno
Di seguito viene riportata l'interfaccia del modulo e l'interfaccia
della memoria.
entity project_reti_logiche is
port (
i_clk : in std_logic;
i_rst : in std_logic;
i_start : in std_logic;
i_data : in std_logic_vector(7 downto 0);
o_address : out std_logic_vector(15 downto 0);
o_done : out std_logic;
o_en : out std_logic;
o_we : out std_logic;
o_data : out std_logic_vector (7 downto 0)
);
end project_reti_logiche;
entity rams_sp_wf is
port(
clk : in std_logic;
we : in std_logic;
en : in std_logic;
addr : in std_logic_vector(15 downto 0);
di : in std_logic_vector(7 downto 0);
do : out std_logic_vector(7 downto 0)
);
end rams_sp_wf;
Per maggiori dettagli viene fornito il link alla User Guide di Vivado dalla quale la memoria è stata derivata : https://www.xilinx.com/support/documentation/sw_manuals/xilinx2017_3/ug901-vivado-synthesis.pdf
In questa sezione verrà descritta la FSM1 del progetto seguita da un rapido overview sul codice presentato. Prima però vengono riportate alcune doverose considerazioni riguardanti il linguaggio di programmazione VHDL.
In questo progetto, durante la fase di progettazione e successivamente
di sviluppo, non verrà preso mai in considerazione l'utilizzo del
costrutto process e di conseguenza di architetture di tipo
behavioral . Questa scelta implementativa, che si riflette sia in fase
di sintesi che di implementazione, [non è dovuta]{.underline} al fatto
che l'autore del progetto creda che l'utilizzo di process sia
scorretto in qual si voglia forma o maniera. Si devono riconoscere le
potenzialità e le funzionalità implementative/strutturali che ne
derivano dall'utilizzo di quest'ultimi ma si deve anche considerare il
maggior strato di astrazione portato da questo costrutto rispetto ad
architetture dataflow o structural.
È per il motivo sopra citato e per la non diretta corrispondenza tra
codice scritto e struttura interna del sintetizzato hardware che in
questo progetto sono state scartate implementazioni di tipo
behavioral.
Tenendo conto delle considerazioni sopra fatte viene ora presentato un
primo design della macchina a stati in grado già di soddisfare
ampiamente requisiti di timing sia post sintesi sia post
implementazione; viene discussa quest'ultima in quanto alla base del
design finale e da considerarsi design ottimale per periodi di clock
con
::: description
stato della macchina iniziale dove questa attende che il segnale
i_start
venga portato alto; una volta che ciò accade in questo stato
vengono anche settati o_en = ’1’
e o_address = 0
in modo tale da
rendere il modulo pronto a ricevere il numero di parole dalla ram.
Questo coincide anche con lo stato di reset della FSM.
stato della macchina dove viene settato il numero di parole da codificare.
stato della macchina adibito alla lettura della prossima parola da
codificare. In particolare in questo stato vengono settati i valori
valori di o_en = ’1’
e o_address = 1
in modo tale da leggere la
parola da codificare in questo ciclo della FSM
serie di 8 stati della macchina utilizzati per l'effettiva codifica della parola. Questi servono in particolare a ciclare sul singolo bit della parola considerata, oltre a contribuire alla sincronizzazione di alcuni segnali necessari al funzionamento del componente(descritto in maniera dettagliata più avanti). Espandiamo specificatamente:
-
$p_0$ : in questo stato viene anche letta la parola richiesta precedentemente nello stato$r$ . -
$p_3$ ,$p_4$ : in questi stati vengono settatio_en = ’1’
eo_we = ’1’
in modo tale da poter parallelizzare la scrittura della parola in memoria con la sua effettiva computazione.
stato della macchina che si dedica al controllo del numero di parole
rimaste da codificare. Se il numero di parole è i_start = ’1’
e parallelamente o_done
verrà alzato.
:::
Come precedentemente scritto, la macchina sopra specificata superava i
test bench per periodi di clock
Una possibile soluzione sarebbe quella di aggiungere altri 2 stati così
da poter mitigare i ritardi dovuti alla lettura della memoria. Vengono
quindi qui sotto riportate delle semplici, seppur doverose, analisi in
termini di tempo e di spazio per poter giustificare il cambiamento delle
stuttura della macchina a stati.
Considerando il numero di stati
Essendo uno di questi 2 stati aggiuntivi eseguito solo una volta in fase
di lettura del numero di parole contenuto in ram, esso verrà trascurato
perchè asintoticamente irrilevante. Tenendo in considerazione gli stati
che vengono eseguiti in loop, facendo riferimento alla figura
2{reference-type="ref" reference="prima_fsm"} gli stati da
Quindi perchè questa modifica alla FSM sia motivata si deve avere che
$$
numStati_{m1} * clockPeriod_{\textit{\text{m1 min}}} > numStati_{m2} * clockPeriod_{m2}
$$ con
Si ottiene che
Vengono così aggiunti altri 2 stati :
Wait word count -
:
Wait -
:
entrambi adibiti alla mitigazione del ritardo dovuto alla lettura della memoria e alla propagazione di tale segnale in fase di implementazione.
Design finale compatto della FSM finale
Nota : In figuara 3{reference-type="ref"
reference="seconda_fsm"} gli stati
L'obbitettivo di questa sezione è quello di mettere in relazione le
scelte implementative precedentemente introdotte con l'effettivo codice
VHDL del progetto.
Il progetto è composto da 3 principali componenti :
-
controller
-
convolutional_encoder
-
string_manager
Successivamente vengono riportate le interfacce delle entità e una breve spiegazione sulle funzionalità implementate.
È il responsabile per il "comportamento" del componente. Controlla il
corretto cycling degli stati ed in modo diretto i segnali di o_en
,
o_we
, o_address
e o_done
.
entity controller is
port(
clock : in std_logic; --> i_clock
reset : in std_logic; --> i_reset
start : in std_logic; --> i_start
data : in std_logic_vector (7 downto 0); --> i_data
done : out std_logic := '-'; --> o_done
mem_address : out std_logic_vector(15 downto 0); --> o_address
mem_enable : out std_logic; --> o_en
mem_write : out std_logic; --> o_we
u : out std_logic; --> bit to be encoded
component_enable : out std_logic := '0'; --> enable signal for other components
component_reset : out std_logic := '0' --> reset signal for other components
);
end controller;
Parte del componente adibita alla codifica di un singolo bit di una parola; implementa il codificatore convoluzionale mostrato in figura 1{reference-type="ref" reference="codificatore_convoluzionale_image"}.
entity convolutional_encoder is
port(
u : in std_logic; --> u
clock : in std_logic; --> i_clock
reset : in std_logic; --> component_reset
enable : in std_logic; --> component_enable
pk : out std_logic_vector(1 downto 0) --> encoder's output
);
end convolutional_encoder;
Questo modulo del componente ha il compito di concatenare i 2 bit di
output del convolutional_encoder
per formare una parola in uscita, da
scrivere successivamente in memoria.
entity string_manager is
port(
clock : in std_logic; --> i_clock
reset : in std_logic; --> component_reset
enable : in std_logic; --> component_enable
bits : in std_logic_vector(1 downto 0); --> pk
half_z : out std_logic_vector(7 downto 0) --> o_data
);
end string_manager;
Viene qui riportata un'immagine che mostra i collegamenti fra le varie
entità del codice VHDL. La descrizione di tali collegamenti si può
ritrovare nell'architettura, di tipo structural, dell'entità
project_reti_logiche
.
In questa sezione verranno discussi tutti i risultati ottenuti attraverso le varie tipologie e i tipi di test utilizzati per assicurare il corretto funzionamento del componente; successivamente vengono riportati alcuni dati sperimentali direttamente ottenuti dal tool di sintesi ed implementazione Vivado. Vengono però prima riportate le dimensioni, in termini di LUT e FF, del componente hardware implementato.
LUT :
: 87
FF :
: 47
Nota : tutti i test eseguiti sono stati eseguiti su FPGA Artix-7 xc7a200tfbg484-1.
Come precedentemente accennato le simulazioni behavioral e di
Post-Synthesis (sia Functional che Timing) ottenevano esiti
positivi già utilizzando la FSM in figura
2{reference-type="ref" reference="prima_fsm"} con un range
di clock
Grazie alle simulazioni è stato possibile verificare che il modulo
hardware computa correttamente per periodi di clock poco inferiori a
Viene ora commentata una simulazione per mostrare il funzionamento del modulo hardware :
Tipo di simulazione :
: behavioral
TestBench :
: tre_bis.vhdl
, fornita dal docente
Periodo di clock :
:
La figuara 5{reference-type="ref"
reference="behavioral_totale"} mostra l'inizio della testbench e la
codifica completa della parola; sulla sinistra sono presenti i segnali
facenti parte dell'interfaccia del progetto insieme ad un segnale
current_state
che rappresenta lo stato corrente della macchina. È
stata scelta una simulazione behavioral perchè assente da ritardi
dovuti a computazione e/o propagazione, facilitandone così la lettura.
Viene ora spezzata la figura appena sopra riportata per consentirne
migliore lettura.
Facendo riferimento alla figura 6{reference-type="ref" reference="behavioral_primi_4"}
::: description
La macchina si trova in stato di idle e appena start = ’1’
viene
portato o_en = ’1’
per richiedere alla memoria il numero di parole da
codificare.
Nella fase di read (r) il componente porta nuovamente o_en = ’1’
preparandosi così per la lettura di una parola.
Il modulo si trova ora nella prima fase di computazione della parola
$p_0$. Viene codificato il primo bit della parola precedentemente
letta e in parallelo viene aggiornato il valore di o_data
.
La macchina si trova nello stato $p_3$; sta quindi codificando il
quarto bit e la prima parola è già pronta per essere scritta. Si
realizza così un parallelismo tra codifica e scrittura in memoria
portando alto i segnali di o_en
e o_we
.
:::
::: description vedi Marker 4 in riferimento a figuara 6{reference-type="ref" reference="behavioral_primi_4"}
Nello stato $p_7$ il componente ha terminato la codifica dell'intera parola. Similmente a come accade nello stato $p_3$ (Marker 4 in riferimento a figuara 6{reference-type="ref" reference="behavioral_primi_4"}) vi è il parallelismo tra computazione e scrittura in memoria.
Essendo le parole da codificare 2 la FSM ritorna nello stato di read (Marker 2). :::
Vengono ora qui discusse le testbench eseguite e la loro potenza di test.
Questa sezione di testbench comprende in particolare :
-
tb_esempio_1.vhdl
-
tb_esempio_2.vhdl
-
tb_esempio_3.vhdl
-
tb_seq_max.vhdl
-
tb_seq_min.vhdl
-
tb_re_encode.vhdl
-
tb_reset.vhdl
-
tb_tre_reset.vhdl
-
tb_tre_bis.vhdl
Questo set di test è molto vario così come la loro potenza.
::: description sono testbench iniziali per verificare il "basilare" funzionamento del componente hardware2.
testbench utilizzate per verificare il corretto comportamento della macchina in caso di sequenze limite .
testbench che verifica il re-encoding del modulo hardware (senza resettare la macchina) .
testbench che verificano le funzionalità del reset della macchina .
testbench con
In questa sezioni vengono ulteriormente distinte :
-
testbench generate attraverso tool automatici di un collega (reperibile al seguente link : https://github.com/thegoldgoat/RL-generator-2021-2022)
-
testbench con ram generate attraverso tool automatico (reperibile al link :
https://github.com/d-graz/Progetto-reti-logiche-2022 dopo la chiusura della data di consegna)3.
Entrambe le precedenti testbench hanno come scopo quello di verificare
la correttezza del componente sintetizzato mettendo il componente stesso
sotto forte stress computazionale.
Inoltre, considerando il secondo tool citato, è stato possibile
riutilizzare le testbench della sezione
3.2.1{reference-type="ref"
reference="cap:test_bench_docente"} con ram differenti aumentando così
anche la loro potenza di test.
In questo capitolo vengono discussi le limitazioni, possibili miglioramenti e i possibili campi di utilizzo del componente sviluppato.
Il modulo hardware non presenta sostanziali problematiche rilevate
dall'autore. Soprattutto per i_start
(FSM in stato di
È subito immediato pensare che la migliore modifica al progetto sia
quella di sfruttare le proprietà fisiche del circuito e quindi di
implementare un modulo hardware in grado di codificare una parola in un
solo ciclo di clock. Questa modifica sarebbe possibile eliminando i flip
flop che tengono in memoria gli stati precedenti del codificatore
convoluzionale e collegando a cascata 8 codificatori convoluzionali
modificati come precedentemente descritto. Il design della macchina a
stati di questo componente non sarebbe diversa da quelle riportata in
figura 3{reference-type="ref" reference="seconda_fsm"},
con unica eccezione che lo stato
\end{gathered}$$ Quindi per
Tale approccio, seppur considerato, non è stato intrapreso in quanto
avrebbe "snaturato" il convolutore riportato in figura
1{reference-type="ref"
reference="codificatore_convoluzionale_image"}.
Come già descritto nel capitolo 1, un codificatore convoluzionale trova applicazione in sistemi di telecomunicazione dove l'integrità dell'informazione scambiata è essenziale. Date le dimensioni ridotte dell'implementato trova i maggiori campi d'utilizzo in dispositivi IoT ove non è necessario l'integrazione di una Generic Purpose CPU. Alcuni possibili esempi possone essere :
-
telecamere
-
dispositivi di domotica4
Footnotes
-
FSM dall'inglese Finite state machine, significa macchina a stati finiti ↩
-
Per esempio non vengono in alcun modo testati ricodifiche successive o reset della FSM ↩
-
Nota : il tool non viene rilasciato immediatamente in quanto risiedente nella stessa repository del source code del progetto stesso. ↩
-
In particolare si intendono quei dispositivi dove la correttezza del dato ricevuto è essenziale ↩