DMI – Corso di laurea magistrale in Informatica
Copyleft
2020 Giuseppe Scollo
in questa esercitazione si trattano:
realizzazione hardware di espressioni del datapath: stesse regole di base che in blocchi always, tuttavia:
Schaumont, Figure 5.8 - Implementation of the up-down counter FSMD
specifica della funzione: calcolo della mediana in una lista di cinque numeri
problema: progettare un filtro che elabori una stream di dati, con un nuovo output per ogni nuovo input
per un algoritmo rapido, senza ordinamento della lista:
dp median(in a1, a2, a3, a4, a5 : ns(32); out q1 : ns(32)) {
sig z1, z2, z3, z4, z5, z6, z7, z8, z9, z10 : ns(3);
sig s1, s2, s3, s4, s5 : ns(1);
always {
z1 = (a1 < a2);
z2 = (a1 < a3);
z3 = (a1 < a4);
z4 = (a1 < a5);
z5 = (a2 < a3);
z6 = (a2 < a4);
z7 = (a2 < a5);
z8 = (a3 < a4);
z9 = (a3 < a5);
z10 = (a4 < a5);
s1 =
(( z1 + z2 +
z3 + z4) == 2);
s2 =
(((1-z1) + z5 +
z6 + z7) == 2);
s3 =
(((1-z2) + (1-z5) +
z8 + z9) == 2);
s4 =
(((1-z3) + (1-z6) + (1-z8) + z10) == 2);
q1 =
s1 ? a1 : s2 ? a2 : s3 ? a3 : s4 ? a4 : a5;
}
}
Schaumont, Listing 5.19 - GEZEL Datapath of a median calculation of five numbers
l'algoritmo esposto da questo datapath funziona anche quando alcuni elementi sono uguali
l'algoritmo esposto impegna 192 linee di I/O e 10 comparatori
a tal fine l'hardware usa registri per i quattro dati precedenti l'ultimo dalla stream di input e a ogni iterazione con un nuovo dato in input riusa i risultati memorizzati di sei confronti dalle tre iterazioni precedenti
Schaumont, Figure 5.9 - Median-calculation datapath for a stream of values
dp median(in a1 : ns(32); out q1 : ns(32)) {
reg a2, a3, a4, a5 : ns(32);
sig z1, z2, z3, z4;
reg z5, z6, z7, z8, z9, z10 : ns(3);
sig s1, s2, s3, s4, s5 : ns(1);
always {
a2 = a1;
a3 = a2;
a4 = a3;
a5 = a4;
z1 = (a1 < a2);
z2 = (a1 < a3);
z3 = (a1 < a4);
z4 = (a1 < a5);
z5 = z1;
z6 = z2;
z7 = z3;
z8 = z5;
z9 = z6;
z10 = z8;
s1 =
(( z1 + z2 +
z3 + z4) == 2);
s2 =
(((1-z1) + z5 +
z6 + z7) == 2);
s3 =
(((1-z2) + (1-z5) +
z8 + z9) == 2);
s4 =
(((1-z3) + (1-z6) + (1-z8) + z10) == 2);
q1 =
s1 ? a1 : s2 ? a2 : s3 ? a3 : s4 ? a4 : a5;
}
}
il filtro in fig. 5.9 accetta un nuovo input e produce un nuovo output a ogni ciclo di clock
la figura illustra la schedule, la FSMD che realizza questa idea è in Schaumont Sez. 5.5.4, dove è anche presentata la FSMD di un testbench riprodotta qui accanto
Schaumont, Figure 5.10 - Sequential schedule median-calculation datapath for a stream of values
dp t_median {
sig istr, ostr : ns(1);
sig a1_in, q1 : ns(32);
use median(istr, a1_in, ostr, q1);
reg r : ns(1);
reg c : ns(16);
always { r = ostr; }
sfg init { c = 0x1234; }
sfg sendin { a1_in = c;
c = (c[0] ˆ c[2] ˆ c[3] ˆ c[5]) # c[15:1];
istr = 1; }
sfg noin { a1_in = 0;
istr = 0; }
}
fsm ctl_t_median(t_median) {
initial s0;
state s1, s2;
@s0 (init, noin) -> s1;
@s1 (sendin) -> s2;
@s2 if (r) then (noin) -> s1;
else (noin) -> s2;
}
un semplice esempio: controllore di memoria
Diagramma delle transizioni di un controllore di memoria
struttura generale hardware di FSM
Struttura hardware di FSM
nella descrizione VHDL, gli stati formano un tipo enumerato
stili di descrizione (v. codice allegato):
serve una codifica binaria del tipo enumerato dello stato per la sintesi di una descrizione in HDL di FSM
codifiche in uso frequente:
la codifica esplicita può descriversi in VHDL definendo il tipo degli stati quale sottotipo di STD_LOGIC_VECTOR e dichiarando le codifiche come costanti di tale tipo; per esempio, ecco codifiche sequenziale e one-hot degli stati nell'esempio visto:
subtype stato is std_logic_vector(1 downto 0);
constant idle : stato := "00";
constant scelta : stato := "01";
constant leggi : stato := "10";
constant scrivi : stato := "11";
subtype stato is std_logic_vector(3 downto 0);
constant idle : stato := "0001";
constant scelta : stato := "0010";
constant leggi : stato := "0100";
constant scrivi : stato := "1000";
se la codifica non è suriettiva, e.g. una codifica one-hot, il costrutto case stato is when ... deve avere la clausola finale when others ...
Uscite in funzione dello stato corrente (FSM di Moore)
lo schema a blocchi corrisponde alle descrizioni con due processi e con un solo processo nel codice allegato
Uscite in funzione dello stato futuro
si può ridurlo al ritardo clock-to-q dei flip-flop calcolando le uscite in base al prossimo stato e anteponendo registri alle uscite
N.B. poiché i processi sono sequenziali, l'ottimizzazione è applicabile anche in un'architettura con due processi o con uno solo, posponendo l'aggiornamento delle uscite a quello dello stato
Riduzione del ritardo clock-uscita
un'altra tecnica di ottimizzazione consiste nel codificare lo stato in modo da far coincidere le uscite con alcuni dei bit di stato
e.g. nell'esempio visto:
questa esperienza ha un duplice obiettivo:
l'I/O del modello da realizzare per il primo obiettivo consta di
si suggerisce che la FSM di controllo, dopo lo stato iniziale di inizializzazione del generatore, attraversi in sequenza quattro stati:
per il secondo obiettivo, si può riusare il decodificatore per display a 7 segmenti impiegato nelle due esercitazioni precedenti, ma occorre alimentarlo con rappresentazioni BCD delle cifre dell'output a 16 bit: per questo occorrono cinque display ed è disponibile il package bcd, che fornisce la funzione BCD_encode
letture raccomandate:
letture per ulteriori approfondimenti:
materiali utili per l'esperienza di laboratorio proposta
sorgenti di esempi in questa presentazione: