DMI – Corso di laurea magistrale in Informatica
Copyleft
2018 Giuseppe Scollo
di che si tratta:
FSM, un comune modello del controllo per la descrizione dell'hardware (e altro):
diverse varianti:
i modelli FSM sono spesso presentati come grafi di transizioni etichettate
ecco un esempio di FSM di Mealy per il riconoscimento di un pattern binario
Schaumont, Figure 5.5 - Mealy FSM of a recognizer for the pattern ‘110’
l'output '1' segnala il riconoscimento di un'occorrenza del pattern nella stringa binaria in ingresso
è possibile costruire una FSM di Moore equivalente, con un metodo generale
una semplice procedura per convertire una FSM di Mealy in una FSM di Moore equivalente:
questa procedura, con la corrispondenza (s0,0) ↔ SA, (s0,1) ↔ SB, (s1,0) ↔ SC, (s2,0) ↔ SD, dà la FSM di Moore equivalente per il riconoscitore di pattern '110' presentata in figura:
Schaumont, Figure 5.6 - Moore FSM of a recognizer for the pattern ‘110’
il modello FSMD combina l'elaborazione dataflow con il suo controllo, descritto da una FSM
serve a tal fine la definizione di istruzioni eseguibili da un datapath, sotto il controllo di una FSM
in Gezel, blocchi sfg (signal flow graph) rappresentano le istruzioni
un controllore FSM è definito per uno specifico datapath:
il contatore, qui descritto in Gezel, è inizializzato a 0, quindi alterna:
dp updown(out c :ns(3)) {
reg a : ns(3);
always { c = a; }
sfg inc { a = a + 1; } // instruction inc
sfg dec { a = a - 1; } // instruction dec
sfg clr { a = 0; } // instruction clr
}
Schaumont, Listing 5.12 - Datapath for an up-down counter with three instructions
fsm ctl_updown(updown) {
initial s0;
state s1, s2;
@s0 (clr) -> s1;
@s1 if (a < 3) then (inc) -> s1;
else (dec) -> s2;
@s2 if (a > 0) then (dec) -> s2;
else (inc) -> s1;
}
Schaumont, Listing 5.13 - Controller for the up-down counter
la tabella accanto mostra cosa accade a ogni ciclo di clock, per i primi dieci cicli
FSM | DP | DP | ||
Cycle | curr | instr | expr | a curr |
/next | /next | |||
0 | s0/s1 | clr | a = 0 | 0/0 |
1 | s1/s1 | inc | a = a+1 | 0/1 |
2 | s1/s1 | inc | a = a+1 | 1/2 |
3 | s1/s1 | inc | a = a+1 | 2/3 |
4 | s1/s2 | dec | a = a-1 | 3/2 |
5 | s2/s2 | dec | a = a-1 | 2/1 |
6 | s2/s2 | dec | a = a-1 | 1/0 |
7 | s2/s1 | inc | a = a+1 | 0/1 |
8 | s1/s1 | inc | a = a+1 | 1/2 |
9 | s1/s1 | inc | a = a+1 | 2/3 |
Schaumont, Table 5.4 - Behavior of the FSMD in Listing 5.13
l'algoritmo è un po' diverso da quello visto nell'esercitazione precedente:
dp euclid(in m_in, n_in : ns(16);
out gcd : ns(16)) {
reg m, n : ns(16);
reg done : ns(1);
sfg init { m = m_in;
n = n_in;
done = 0;
gcd = 0; }
sfg reduce { m = (m >= n) ? m - n : m;
n = (n > m) ? n - m : n; }
sfg outidle { gcd = 0;
done = ((m == 0) | (n == 0)); }
sfg complete{ gcd = ((m > n) ? m : n);
$display(‘‘gcd = ’’, gcd); }
}
Schaumont, Listing 5.14 - Euclid’s GCD as an FSMD
fsm euclid_ctl(euclid) {
initial s0;
state s1, s2;
@s0 (init) -> s1;
@s1 if (done) then (complete) -> s2;
else (reduce, outidle) -> s1;
@s2 (outidle) -> s2;
}
elementi di controllo introdotti con la FSM: quasi tutti quelli proposti nella precedente esperienza di laboratorio
N.B.: l'esecuzione di reduce e outidle attivata dalla FSM nello stato s1 è concorrente
un modello dataflow può vedersi come una FSM, con spazio degli stati definito dai registri
Schaumont, Figure 5.7 - An FSMD consists of two stacked FSMs
attività delle FSM a ogni ciclo di clock:
in pratica conviene descrivere solo la FSM controllore con transizioni di stato
se un datapath, riconducibile a una FSM, può essere descritto da espressioni, questo dovrebbe essere possibile anche per la FSM controllore
dp updown_ctl(in a_sm_3, a_gt_0 : ns(1);
out instruction : ns(2)) {
reg state_reg : ns(2);
// state encoding: s0 = 0, s1 = 1, s2 = 2
// instruction encoding: clr = 0, inc = 1, dec = 2
always {
state_reg = (state_reg == 0) ? 1 :
((state_reg == 1) & a_sm_3) ? 1 :
((state_reg == 1) & ˜a_sm_3) ? 2 :
((state_reg == 2) & a_gt_0) ? 2 : 1;
instruction = (state_reg == 0) ? 0 :
((state_reg == 1) & a_sm_3) ? 1 :
((state_reg == 1) & ˜a_sm_3) ? 2 :
((state_reg == 2) & a_gt_0) ? 2 : 1;
}
}
Schaumont, Listing 5.15 - FSM controller for updown counter using expressions
il confronto con la descrizione dell'esempio nel Listing 5.13 mostra:
per contro, descrizioni separate di controllore e datapath, entrambe mediante espressioni, possono essere combinate in una descrizione singola, il che può migliorare la prestazione
dp updown_ctl(out c : ns(3)) {
reg a : ns(3);
reg state : ns(2);
sig a_sm_3 : ns(1);
sig a_gt_0 : ns(1);
// state encoding: s0 = 0, s1 = 1, s2 = 2
always {
state = (state == 0) ? 1 :
((state == 1) & a_sm_3) ? 1 :
((state == 1) & ˜a_sm_3) ? 2 :
((state == 2) & a_gt_0) ? 2 : 1;
a_sm_3 = (a < 3);
a_gt_0 = (a > 0);
a = (state == 0) ? 0 :
((state == 1) & a_sm_3) ? a + 1 :
((state == 1) & ˜a_sm_3) ? a - 1 :
((state == 2) & a_gt_0) ? a + 1 : a - 1;
c = a;
}
}
Schaumont, Listing 5.16 - updown counter using expressions
il confronto fra la descrizione di FSMD in due parti data nei Listing 5.12 e 5.13 con questa descrizione monolitica mostra che in quest'ultima:
per contro, la descrizione singola offre più opportunità di ottimizzazione:
per applicazioni complesse, molto strutturate, la descrizione di FSMD con descrizioni separate di FSM e datapath sembra preferibile
una FSMD ben formata è una che esibisce comportamento deterministico
per una realizzazione hardware di FSMD, comportamento deterministico significa che l'hardware è esente da situazioni di corsa
un modello FSMD è ben formato se soddisfa le seguenti proprietà:
letture raccomandate:
per ulteriore consultazione: