progettazione digitale e VHDL 2013-11-04 -...

63
Sergio Ricciarini ~ INFN Firenze Corso di Elettronica Generale I Laurea Magistrale in Scienze Fisiche e Astrofisiche Università di Firenze 2013-10-27 Progettazione di circuiti digitali e linguaggio VHDL

Transcript of progettazione digitale e VHDL 2013-11-04 -...

Sergio Ricciarini~

INFN Firenze

Corso di Elettronica Generale I

Laurea Magistrale in Scienze Fisiche e Astrofisiche

Università di Firenze

2013-10-27

Progettazione di circuiti digitali e linguaggio VHDL

2

Sommario

� Circuiti digitali integrati.

� Descrizione di un circuito digitale in VHDL.

� Compilazione e verifica del progetto.

� Temporizzazioni dei segnali e macchine sincrone.

� Struttura della macchina sincrona e realizzazione in VHDL.

� Upset da asincronia; risincronizzazione.

� Upset da perturbazioni esterne.

� Bibliografia

S. Ricciarini – progettazione circuiti digitali

3

� Circuiti digitali integrati.

S. Ricciarini – progettazione circuiti digitali

4

Circuito digitale integrato� Un circuito digitale integrato è un

dispositivo elettronico (“chip”) che contiene al suo interno un insieme di celle logiche opportunamente interconnesse in modo da realizzare la funzionalità desiderata.

� Ogni cella logica è formata da una combinazione di elementi logici di base: flip-flop, porte AND e porte NOT.

� ASIC: application specific integrated

circuit (Analog Device, Texas...).• Circuito digitale integrato caratterizzato da

interconnessioni scelte e fissate dal

produttore al momento della fabbricazione

del chip, in base all’applicazione richiesta.

S. Ricciarini – progettazione circuiti digitali

5

Circuito digitale integrato� FPGA: field programmable gate array

(Altera, Xilinx, Actel, Quicklogic...)• Circuito digitale integrato caratterizzato da

interconnessioni configurabili dall’utente in

base al campo (“field”) di applicazione.

• Le interconnessioni sono realizzate in vari modi: ad esempio, con transistor NMOS.

S. Ricciarini – progettazione circuiti digitali

• La configurazione avviene con speciali dispositivi (“programmatori”) oppure direttamente nel circuito stampato (“scheda” o “printed circuit board” PCB).

• Dopo la configurazione una parte della FPGA risulta inutilizzata.

6

Cella logica di una FPGA� Cella logica della FPGA: struttura di porte logiche e flip-flop predefinita dal

produttore.

� Un esempio di cella logica (FPGA Actel).(a) Cella combinatoria: solo logica combinatoria: combinazione di porte AND e NOT;

(b) Cella sequenziale: un flip-flop (registro a 1 bit) e logica combinatoria.

S. Ricciarini – progettazione circuiti digitali

7

Cella logica di una FPGA� Altro esempio di cella logica (FPGA Altera): un solo tipo di cella logica, di tipo sequenziale

che integra una parte combinatoria più complessa del caso Actel. Progettata per massima versatilità.

S. Ricciarini – progettazione circuiti digitali

8

� Descrizione di un circuito digitale in VHDL

S. Ricciarini – progettazione circuiti digitali

9

Linguaggio VHDL� VHDL: Very-high-speed-integrated-circuits Hardware Description Language.

� Uno dei linguaggi per la descrizione funzionale di qualsiasi circuito digitale (FPGA, ASIC...), indicati genericamente come HDL.

� Il VHDL è largamente diffuso a livello mondiale (standard IEEE).• Un altro linguaggio spesso utilizzato è il “Verilog HDL”.

� La descrizione funzionale rappresenta strutture logiche in modo astratto, cioè senza necessariamente indicare una specifica realizzazione del circuito in termini di rete di NOT, AND e flip-flop, fra tutte quelle equivalenti che danno la stessa funzione logica (cioè larelazione fra uscite e ingressi del circuito).

� Un compilatore (software installato su PC) traduce la struttura VHDL astratta in una struttura specifica da poter riprodurre in un dato dispositivo (ASIC o FPGA).

S. Ricciarini – progettazione circuiti digitali

10

Descrizione funzionale o strutturale?� In una descrizione strutturale (ad esempio un disegno schematico) viene specificata una

sola struttura logica del circuito fra le tante equivalenti.• La descrizione strutturale diventa utile quando ci sono esigenze molto particolari in termini di

numero di celle utilizzate per realizzare il circuito, ritardi fra ingressi e uscite del circuito ecc.

� La descrizione funzionale (“behavioural”, ad esempio un codice HDL), in quanto astratta, evita di specificare la struttura logica.

• Risparmio di tempo durante la codifica del circuito e le successive modifiche/correzioni.

• Minore possibilità di introdurre errori umani nel codice.

• Maggiore leggibilità del codice da parte degli utenti.

• Diventa in pratica indispensabile per circuiti di media o alta complessità (> 100 flip-flop).

� Analogia con C (FORTRAN ecc.) rispetto a linguaggio macchina per un processore: entrambi descrivono sequenze di operazioni: C lo fa in modo astratto, l.m. individua una specifica sequenza fra tutte quelle equivalenti (cioè con stesso risultato finale).

� Nota: in HDL è anche possibile codificare una descrizione strutturale (porte AND, NOT e flip-flop) del tutto analoga al disegno schematico.

• In genere un codice HDL contiene un insieme di descrizioni funzionali e strutturali.

S. Ricciarini – progettazione circuiti digitali

11

(Es. 1) Semplice progetto VHDL-- i COMMENTI sono preceduti da "--" in modo che il compilatore li riconosca e li ignori

-- Questo è un esempio di progetto elementare (solo combinatorio per semplicità)

-- In blu sono evidenziate alcune delle parole riservate per la codifica del linguagguo VHDL

-- In rosso: nomi di oggetti che devono essere scelti dal progettista (in modo se possibile da

essere facilmente compresi nella rilettura del codice)

library IEEE;

use IEEE.std_logic_1164.all; -- libreria di base (da indicare sempre)

entity ex1 is -- entità = interfaccia esterna; "ex1" è il nome, definito dal progettista

port ( -- elenco dei segnali esterni di ex1

input1, input2: in std_logic; -- std_logic (tipo del segnale): due valori logici

possibili, '1' o '0'

output: out std_logic

); -- un singolo enunciato puo’ essere scritto su più righe

end ex1;

S. Ricciarini – progettazione circuiti digitali

12

(Es. 1) Semplice progetto VHDL

architecture struct1 of ex1 is -- architettura = struttura/funzionalità interna; struct1 è il

nome scelto dal progettista

-- elenco dei segnali interni

signal int1 : std_logic;

begin

int1 <= NOT input2;

output <= input1 OR int1;

end struct1; -- questa descrizione è strutturale (viene indicata una specifica combinazione di

porte logiche). Vedremo in seguito un esempio di descrizione funzionale.

S. Ricciarini – progettazione circuiti digitali

13

(Es. 1) Semplice progetto VHDLarchitecture behav1 of ex1 is -- architettura = struttura/funzionalità interna; behav è il nome

scelto dal progettista

-- non ci sono segnali interni!!!

begin

process (input1, input2) -- lista di sensibilità (“sensitivity list”): contiene

gli ingressi del componente che vengono valutati nelle condizioni “if...end if” e simili

che costituiscono la descrizione funzionale interna

begin -- descrizione interna del componente, funzionale: non indica una specifica

combinazione di NOT e AND fra quelle equivalenti (ne sono riportate ad esempio due nelle

figure), ma piuttosto indica astrattamente la funzione desiderata, cioè le combinazioni di

valori di ingresso per cui l’uscita e’ 1

if input1 = '1' then

output <= '1';

elsif input2 = '0' then

output <= '1';

else -- ATTENZIONE: può essere omesso, ma allora cambia la funzionalità!

-- (come?)

output <= '0';

end if;

end process;

end behav1;

S. Ricciarini – progettazione circuiti digitali

14

Progettare un generico circuito logico� Un generico circuito logico (circuito sequenziale, macchina logica) è composto di un

insieme di flip-flop e di una rete combinatoria (combinazione di porte NOT e AND).• I flip-flop memorizzano lo “stato logico” della macchina.

• La rete combinatoria definisce con la propria struttura la sequenza degli stati del circuito.

� Per comodità pratica il progettista suddivide il circuito logico in un certo numero di blocchi

logici o componenti organizzati in maniera gerarchica.• Si noti l'analogia con la subroutine nella programmazione di un processore.

• Conviene definire la gerarchia in modo da poter ripetere più volte nel progetto lo stesso

componente e, se possibile, far coincidere la funzionalità di un componente con quella di una “macro”.

S. Ricciarini – progettazione circuiti digitali

15

Macrofunzioni (“macro”)� I componenti più comuni possono in genere essere ottenuti senza codificarli a mano (in

HDL o disegno schematico), utilizzando un software generatore di macrofunzioni, di solito accessibile tramite interfaccia grafica nell'ambiente software di sviluppo (nell'ambiente Quartus di Altera: MegaWizard Plug-in Manager).

• Contatori, registri, multiplexer, decodificatori...

• Configurabili dall’utente: numero di bit, presenza di ingressi asincroni preset e/o clear, presenza di ingressi sincroni addizionali (enable, load, reset ecc.)

� Ogni macrofunzione generata è un blocco logico che può essere incluso nella struttura gerarchica del progetto come tutti gli altri componenti descritti a mano dall'utente.

� Prima di scrivere il codice per realizzare una data funzione logica, conviene verificare

se è possibile utilizzare una o più macro.

• Risparmio di tempo notevole (servono pochi secondi per generare una macro).

• A meno che ci siano esigenze molto particolari, per cui serve una descrizione manuale, strutturale e ottimizzata (ritardi, numero di celle utilizzate...).

• Nota: in genere la macro non è esportabile in un diverso ambiente software di sviluppo. In genere è però possibile creare automaticamente il codice VHDL funzionale equivalente, che può essere utilizzato in qualsiasi ambiente.

S. Ricciarini – progettazione circuiti digitali

16

(Es. 2) Architettura a blocchi logici-- Architettura gerarchica a blocchi logici (un solo componente interno)

architecture arch of ex2 is

-- segnali interni

signal in1_and_in2 : std_logic;

-- componenti interni di questa architettura

component logic_function -- componente = blocco logico, la cui architettura NON è

-- specificata qui (il nome e i segnali esterni del componente devono corrispondere a

-- un’entità decritta altrove)

port (input1, input2: in std_logic;

output: out std_logic

);

end component;

begin

in1_and_in2 <= in1_pin AND in2_pin;

logic_function_inst1: logic_function port map (

-- chiamata (“instance”) del componente con mappatura

-- dei suoi segnali esterni sui segnali interni o esterni di ex2

input1 => in1_and_in2, -- segnale interno di ex2

input2 => in3_pin, -- segnale esterno di ex2

output => out_pin

);

end arch;

S. Ricciarini – progettazione circuiti digitali

17

(Es. 2) Descrizione del componente-- Tipicamente il componente è descritto in un file separato, come blocco logico indipendente

library IEEE;

use IEEE.std_logic_1164.all;

entity logic_function is -- l’interfaccia deve essere coerente con quanto dichiarato nella

architettura dove il componente viene chiamato (~ subroutine)

port (

input1, input2: in std_logic;

output: out std_logic

);

end logic_function;

architecture struct1 of logic_function is -- in questo esempio, il nome e la descrizione

(strutturale) dell'architettura sono gli stessi usati nell'esempio 1 (ma si noti il diverso

formalismo permesso dalla sintassi del VHDL)

begin

output <= input1 OR NOT input2;

end struct1;

S. Ricciarini – progettazione circuiti digitali

18

Vantaggi della descrizione gerarchica� Lo stesso componente (blocco logico) può essere inserito in N copie (cioè chiamato N

volte) in uno stesso progetto VHDL.• Ogni copia è identificata da una diversa “etichetta” (label) scelta dal progettista:

logic_function_inst1: logic_function port map (…);

logic_function_inst2: logic_function port map (…);

� Per modificare tutte le copie è sufficiente cambiare una sola volta la descrizione dell’architettura del componente (parametri della macro, oppure codice scritto a mano nel caso di componente codificato dal progettista).

� È possibile anche definire diverse architetture (strutture interne) per una stessa entità (interfaccia) e poi scegliere quella da utilizzare in compilazione per ciascuna copia o gruppo di copie; ad esempio:

component … end component;

for logic_function_inst1, logic_function_inst2 : logic_function use entity

work.logic_function(arch1);

for logic_function_inst3 : logic_function use entity work.logic_function(arch2);

oppure ad esempio:component … end component;

for all: logic_function use entity work.logic_function(arch1);

S. Ricciarini – progettazione circuiti digitali

19

Come descrivere un’architettura in VHDL� Un’architettura in VHDL può contenere 3 diverse tipologie descrittive (inserite fra begin e

end):

architecture arch of logic_function is

begin

........................ <<---------- INSERIRE QUI

end arch_simple;

• Prima tipologia: chiamata di un componente la cui architettura è indicata altrove.

logic_function_inst1: logic_function port map (

input1 => in1_and_in2,

input2 => in3_pin,

output => out_pin

);

• Seconda tipologia: assegnazione (descrizione strutturale):

output <= input1 OR NOT input2;

S. Ricciarini – progettazione circuiti digitali

20

Come descrivere un’architettura in VHDL• Terza tipologia: processo (descrizione funzionale):

process (input1, input2) -- lista di sensibilità (“sensitivity list”): contiene i

segnali che vengono valutati nelle condizioni “if...end if” e simili che costituiscono la

descrizione funzionale

begin -- descrizione funzionale: non indica una specifica combinazione di NOT e

AND fra quelle equivalenti, ma piuttosto indica astrattamente la funzione desiderata, cioè

le combinazioni di valori dei segnali valutati per cui l’uscita e’ 1

if input1 = '1' then

output <= '1';

elsif input2 = '0' then

output <= '1';

else -- ATTENZIONE: può essere omesso, ma allora cambia la funzionalità!

-- (come?)

output <= '0';

end if;

end process;

S. Ricciarini – progettazione circuiti digitali

21

Concetto di “concorrenza”� L’ordine, all’interno dell’architettura, in cui vengono scritti chiamate, assegnazioni e

processi non ha effetto sulla struttura del circuito logico.

• Il codice VHDL è una rappresentazione “unidimensionale” (un elenco) dei componenti del circuito.

• Il disegno schematico è una rappresentazione “bidimensionale”.

� Il codice VHDL, quindi, è analogo al codice C ecc., ma solo per certi aspetti.In particolare, l’elenco di descrizioni nell’architettura VHDL non ha nulla a che vedere con l’elenco di istruzioni, da eseguire ordinatamente nel tempo, codificate in un programma C.

� Tutte le decrizioni elencate nel codice VHDL sono concorrenti simultaneamente a definire la funzionalità dell'intero circuito, in quanto rappresentano parti del circuito interconnesse fra loro.

• Consideriamo un processo: la variazione di un segnale nella lista di sensibilità del processo implica in generale la variazione delle uscite del processo e quindi degli ingressi di altre parti del circuito (assegnazioni, processi, componenti), indipendentemente dal punto del codice in cui sono descritti.

� Viceversa, le istruzioni codificate in un programma C sono per costruzione attive in

successione nel tempo.S. Ricciarini – progettazione circuiti digitali

22

� Compilazione e verifica del progetto.

S. Ricciarini – progettazione circuiti digitali

23

Compilazione del progetto: sintesi� La compilazione avviene in due fasi.

• Un software (compilatore) permette di automatizzare il lavoro.

• Eventuali raffinamenti, in entrambe le fasi, sono operati a mano.

� Prima fase: sintesi.

Il codice VHDL (descrizione funzionale) è tradotto dal software di sintesi in una specifica

struttura di elementi logici di base (AND, NOT e flip-flop), la netlist.

� Come viene individuata la netlist? Seguendo criteri di ottimizzazione (ad es. minimizzare il numero totale di elementi logici necessari) sfruttando le equivalenze logiche.

• Input: il codice VHDL (uno o più file di testo .vhd).

• Output: tipicamente un file .edf cioè con formato EDIF (Electronic Design Interchange Format, altro standard industriale).

� La netlist non fa riferimento ad alcun dispositivo specifico (FPGA o ASIC).

� Il disegno schematico (descrizione strutturale) è anch’esso tradotto in edf (vengono operate delle ottimizzazioni).

S. Ricciarini – progettazione circuiti digitali

24

� Con la sintesi la struttura logica viene in genere ottimizzata a partire dalla descrizione funzionale o strutturale del circuito desiderato.

• Un esempio di ottimizzazione: sono eliminate le parti logiche ridondanti (duplicate

nel codice originale) in modo da ridurre il numero di elementi logici necessari.• Si ricordi che il numero di elementi logici disponibili in un dato dispositivo è limitato.

• In genere, così si riduce la potenza assorbita (consumo).

• Il codice che descrive il circuito logico può così essere scritto dall'utente in maniera non necessariamente sintetica, quindi più naturale e meglio leggibile.

• Un caso pratico: la descrizione del circuito comporta due flip-flop che pilotano parti diverse del circuito, ma che finiscono con l’avere lo stesso segnale logico in ingresso: uno dei due flip-flop può quindi essere omesso (ma attenzione: il fan-out sull'altro aumenta!).

Sintesi e ottimizzazioni

S. Ricciarini – progettazione circuiti digitali

25

Compilazione del progetto: configurazione� Seconda fase: configurazione del dispositivo o place and route (“posizionamento e

interconnessione”).

La netlist viene tradotta in un codice di configurazione per un determinato dispositivo e salvato in uno o più file di configurazione.

� Il codice di configurazione descrive una specifica struttura reale del circuito logico (cioè la disposizione degli elementi logici e delle interconnesioni in un dato tipo di dispositivo) fra tutte quelle che realizzano la struttura descritta nella netlist.

• Il codice di configurazione viene utilizzato nella fase di realizzazione del circuito nel dispositivo.

• Per il formato del file di configurazione esistono vari standard, a seconda della tecnica di fabbricazione della ASIC o di programmazione della FPGA.

• Per una FPGA la configurazione si basa sulle celle e interconnessioni messe a disposizione.

• Per una ASIC la struttura reale viene definita tenendo conto dei vincoli costruttivi legati alla tecnologia di fabbricazione utilizzata (spessore delle piste, dimensioni dei transistor ecc.).

� Anche nella fase di configurazione avvengono ottimizzazioni.� Ad esempio: minimizzazione dei ritardi nelle interconnessioni, tenendo conto della tecnologia di

fabbricazione del dispositivo.

S. Ricciarini – progettazione circuiti digitali

26

Verifica del progetto� Ci sono due modi per verificare la corretta funzionalità del circuito digitale progettato:

simulazione e prove in laboratorio.• In entrambi i casi si forniscono al circuito i necessari segnali digitali di ingresso, variabili nel

tempo, e si osserva il comportamento nel tempo dei segnali in uscita.

• Conviene passare alle prove in laboratorio solo quando la simulazione ha dato esito positivo.

� Simulazione.• La simulazione avviene mediante un apposito software; le forme d’onda sulle uscite del circuito

sono visualizzate in una finestra grafica.

• E’ possibile assegnare le forme d’onda di ingresso tramite interfaccia grafica.

• Il VHDL contiene la sintassi necessaria per codificare forme d’onda digitali per il simulatore.

Ad esempio:

process (input1)

begin

input1 = '1';

wait for 100 ns;

input1 = '0';

wait for 100 ns;

...

end process;

S. Ricciarini – progettazione circuiti digitali

27

Verifica del progetto� La simulazione è solitamente di tipo temporale. Il simulatore riproduce le temporizzazioni

(tempi di propagazione) attese dei segnali nel circuito, per uno specifico dispositivo e per determinati valori dei parametri operativi (Valim, T).

• si ricorda che le temporizzazioni in un dispositivo elettronico dipendono dai parametri operativi.

� È possibile anche una simulazione di tipo funzionale (più rapida), assumendo che le temporizzazioni nel circuito non influiscano sul comportamento del circuito (ipotesi realistica solo in pochissimi casi pratici).

� Limiti della verifica del progetto:• in simulazione le temporizzazioni reali sono riprodotte in modo necessariamente approssimato;

• in simulazione e in laboratorio non è generalmente possibile provare:

• tutte le possibili combinazioni di valori dei parametri operativi in cui il circuito opererà;

• tutte le possibili casistiche di utilizzo (sequenze di segnali in ingresso) in cui il circuito opererà.

• Conviene quindi scegliere un metodo di progettazione che permetta di ottenere un circuito affidabile nonostante i limiti di cui sopra (quale? vedremo nel seguito).

S. Ricciarini – progettazione circuiti digitali

28

� Temporizzazioni dei segnali e macchine sincrone.

S. Ricciarini – progettazione circuiti digitali

29

Flip-flop: ingressi “sincroni” e “asincroni”

S. Ricciarini – progettazione circuiti digitali

Ingressi “sincroni”.

• Internamente: hanno effetto sull’uscita solo

in corrispondenza del fronte di salita

(“leading edge” o “rising edge”) di clock.

• Setup time e hold time definiscono l’intervallo temporale nell’intorno del fronte di salita del clock, in cui questi ingressi devono essere stabili per non introdurre upset in uscita.

• Esternamente: possono essere pilotati da

linee sincrone (che variano cioè con lo stesso segnale di clock del flip-flop) o asincrone.

Ingressi “asincroni”.

• Internamente: hanno effetto sull’uscita immediatamente, indipendentemente dal clock.

• Esternamente: possono essere pilotati da linee sincrone o

asincrone.

30

Temporizzazioni� Se il setup time o hold time di un flip-flop non viene rispettato, c'è una probabilità non

nulla che il flip-flop carichi in uscita il valore sbagliato (upset).

• Quindi, in una macchina logica reale (FPGA o ASIC), il valore caricato in uscita su ciascun flip-flop non dipende solo dalla struttura logica ma anche dalle temporizzazioni dei segnali.

� Temporizzazioni dei segnali: indicano genericamente il ritardo fra la transizione in un

punto fisico di una linea facente parte del circuito logico e la transizione logicamente

conseguente in un altro punto fisico.

� Esse dipendono da:• struttura reale del circuito: struttura logico/fisica realizzata nel dispositivo;

• tecnologia del dispositivo (circuito integrato): caratteristiche fisiche delle celle logiche (transistor) e delle interconnessioni (piste metalliche).

� Esse variano con:• tolleranze di fabbricazione: ogni singolo dispositivo di una serie ha caratteristiche che fluttuano

in un intorno delle specifiche nominali della serie;

• condizioni ambientali: temperatura e tensione di alimentazione;

• invecchiamento (“aging”) del dispositivo: da normale usura (passaggio di corrente, variazioni di temperatura...) o da radiazione assorbita.

S. Ricciarini – progettazione circuiti digitali

31

Macchina sincrona: introduzione� Per poter tener conto in maniera efficace delle temporizzazioni nel circuito integrato, la

soluzione più semplice è quella di creare una macchina sincrona o circuito sincrono, cioè un circuito logico caratterizzato dall’avere un unico segnale usato come clock per tutti i

flip-flop.• Il clock è tipicamente generato da un oscillatore periodico ad alta stabilità (si tratta tipicamente

di un altro circuito integrato).

• “Unico segnale” significa che la forma d’onda reale del clock su ogni flip-flop è la stessa, a meno di sfasamenti (“skew”) legati ai diversi tempi di propagazione del segnale dall’oscillatore ai vari flip-flop.

� In pratica il circuito sincrono è diviso in blocchi logichi

strutturati in maniera gerarchica, ciascuno costituito da una

macchina sincrona, e tutti sincroni fra loro (stesso clock).

� In generale potrebbe però essere necessario suddividere il

circuito in diverse macchine sincrone, in genere asincrone

fra loro (usano segnali di clock distinti).• Il circuito complessivo in questo caso è asincrono (ci sono

almeno due segnali di clock).

S. Ricciarini – progettazione circuiti digitali

32

Macchina sincrona e setup time (1/2)� Per un circuito sincrono, la relazione che garantisce la non violazione di setup time per

il flip-flop (j) è:

TCTO(i)max + Tcomb(i)

max + Tskew(i-j)max + Tsetup

max < Tclock (ST)

per ogni flip-flop (i) che contribuisce a pilotare un dato ingresso “sincrono” di (j).

“Max” si riferisce alla variabilità delle temporizzazioni (tolleranze, condizioni ambientali, invecchiamento).

� Tcomb(i) è il ritardo (attraverso un blocco puramente combinatorio) fra la transizione sull’uscita data_out_i del flip-flop (i) e la conseguente transizione sull’ingresso “sincrono” data_in_j del flip-flop (j). Dipende da:

• numero di celle combinatorie attraversate (tipicamente ognuna dà un ritardo < 0.1 ns);

• lunghezza delle piste metalliche attraversate.

S. Ricciarini – progettazione circuiti digitali

33

Macchina sincrona e setup time (2/2)� TCTO(i) (CTO: clock-to-out) è il ritardo di propagazione interno al flip-flop (i).

� Tskew(i-j) = trising(i) - trising(j) rappresenta lo sfasamento, cioè il ritardo (skewness) fra i fronti di salita del clock su flip-flop diversi.

• Stiamo parlando dello stesso segnale esterno di clock, che arriva in diversi punti fisici interni

del circuito: clock_i e clock_j.

• Lo sfasamento deriva dalla diversa lunghezza del cammino del segnale di clock dall’oscillatore ai due flip-flop.

• Può essere positivo o negativo.

• Tipicamente |Tskew(i-j)| << Tclock in ogni condizione.

• Il margine residuo sulla violazione di setup time (“setup margin”) nella connessione i-j si

riduce per frequenze operative (frequenze di clock) maggiori.

Tsetup_margin(j-i) = Tclock - (TCTO(i)max + Tcomb(i)

max + Tskew(i-j)max + Tsetup

max)

Nota: (ST) è soddisfatta se e solo se Tsetup_margin(j) > 0 .

S. Ricciarini – progettazione circuiti digitali

� Nel caso di circuito asincrono, abbiamo almeno due distinti segnali esterni di clock.

• Il circuito è asincrono anche se i due o più oscillatori sono (nominalmente) uguali: infatti essi sono comunque fisicamente diversi (anche se di poco).

� Per esempio: clock_1 (va al flip-flop (1)), clock_2 (va al flip-flop (2)). Consideriamo le temporizzazioni per il setup time del flip-flop (2): necessariamente a un certo punto si avrà una transizione di data_in_2 troppo vicina a quella di clock_2, con violazione di setup time.

• Per un circuito asincrono la relazione (ST) è quindi impossibile da soddisfare sempre.

• Si dice che il flip-flop (2) realizza una risincronizzazione

(o un campionamento asincrono) del segnale data_in_2.

34

Circuito asincrono e setup time

S. Ricciarini – progettazione circuiti digitali

35

Macchina sincrona e hold time� Per un circuito sincrono, la relazione che garantisce la non violazione di hold time è:

TCTO(i)min + Tcomb(i)

min – Tskew(i-j)max > Thold (HT)

per ogni flip-flop (j) e per ogni flip-flop (i) che contribuisce a pilotare un dato ingresso “sincrono” di (j).

� In questo caso la relazione non dipende dalla frequenza operativa (frequenza clock) e quindi può essere soddisfatta in maniera più agevole che la (ST) da parte del compilatore.

� Nel caso asincrono, valgono considerazioni analoghe a quelle svolte per il setup time.

S. Ricciarini – progettazione circuiti digitali

36

Vantaggi della macchina sincrona� Nel caso sincrono, basta un solo oscillatore (perché usarne due se non ce n'è bisogno?).

� Nel caso sincrono, con un segnale di clock unico per tutti i flop-flop, la struttura del circuito è la più semplice possibile.

� Nel caso sincrono, è in genere possibile per il compilatore soddisfare (ST) e (HT) in modo automatico, utilizzando i propri algoritmi di ottimizzazione della fase di sintesi e della fase di configurazione.

� Nel caso asincrono, gli upset sono inevitabili: richiedono quindi di essere trattati opportunamente per garantire la funzionalità desiderata del circuito (vedremo poi come).

� Nel caso asincrono, occorre in genere tenere il conteggio dei cicli dei vari clock impiegati, per assicurare la simultaneità di determinate azioni da parte dei rispettivi blocchi logici (asincroni fra loro).

� Nel caso asincrono, si richiede in sostanza del lavoro addizionale da parte del progettista.

S. Ricciarini – progettazione circuiti digitali

37

Macchina sincrona e compilazione� Il compilatore (nella fase di configurazione) sceglie e ottimizza la struttura reale (tipo di

celle logiche, loro disposizione geometrica e interconnessioni) di ciascuna macchina sincrona che compone in circuito, allo scopo di massimizzare i margini temporali su

setup e hold time.

� Il compilatore si basa su un modello approssimato delle temporizzazioni nel dispositivo (tecnologia, tolleranze, condizioni ambientali ammesse) e sulla massima frequenza

operativa richiesta dal progettista per il clock corrispondente a ciascuna macchina sincrona.

� Il compilatore, se l’algoritmo di place and route non è in grado di trovare una configurazione della macchina sincrona che sia soddisfacente per tutti i flip-flop alle condizioni richieste, indica i cammini di segnale che violano setup o hold time.

S. Ricciarini – progettazione circuiti digitali

38

Tempo di salita/discesa� I tempi di transizione (durata della salita/discesa del segnale) sono stati fin qui trascurati e

i fronti di salita/discesa sono stati approssimati come istantanei (linee verticali).• In realtà il tempo di transizione su una linea è caratterizzato dalla costante di tempo (RC) data

dalla capacità di carico e resistenza della linea.

• La capacità di carico aumenta linearmente col numero di porte o flip-flop pilotati da una

singola linea (cioè con il fan-out).

� Il compilatore ottimizza il circuito in modo che i tempi di transizione siano trascurabili

rispetto alle altre temporizzazioni.

• In pratica il fan-out viene limitato tramite la duplicazione (ridondanza) della porta o flip-flop in questione.

S. Ricciarini – progettazione circuiti digitali

39

� Struttura della macchina sincrona e realizzazione in VHDL.

S. Ricciarini – progettazione circuiti digitali

40

Macchina sincrona: struttura� La macchina sincrona può essere scomposta in due blocchi logici:

• un registro di stato (“status register”) a N bit (l’insieme degli N flip-flop della macchina, con il clock comune) la cui uscita è il bus di stato (“status”);

• una look-up-table (LUT) (cioè un generico circuito combinatorio).

� I flip-flop formano la memoria della macchina, immagazzinando l’informazione relativa allo stato presente della macchina (“status”).

• La macchina sincrona è, per questo, anche chiamata macchina a stati.

• Ogni possibile configurazione di valori caricati nei flip-flop costituisce uno stato.

• Gli stati possibili sono 2N.

• Lo stato durante il ciclo di clock successivo dipende da:• stato presente (“status”);

• LUT;

• valori degli ingressi di controllo (assumiamo per ora

che gli ingressi di controllo siano segnali sincroni).

• Uno stato può durare N cicli di clock.

S. Ricciarini – progettazione circuiti digitali

41

Macchina sincrona e periodicità� Una macchina sincrona generica è non periodica.

• La presenza degli ingressi sincroni di controllo implica che per ogni stato S, lo stato successivo

S' non dipende solo dalla struttura della macchina.

• In altri termini: la sequenza di stati e la loro durata (numero di cicli di clock) non è

necessariamente prefissata.

• Il numero di cicli di clock che intercorre fra due ripetizioni dello stesso stato non è fissato.

� Un caso particolare è la macchina sincrona periodica.

• Nessun ingresso di controllo.

• Quindi: la successione di stati è fissata internamente.

� Si può mostrare che ogni macchina sincrona periodica

con N flip-flop è logicamente equivalente a:• un contatore a N bit;

• una LUT.

S. Ricciarini – progettazione circuiti digitali

42

Macchina sincrona: esempio (1/2)� Esempio pratico: una FPGA contiene una macchina sincrona che esegue una sequenza di

operazioni;• dopo l’accensione della FPGA, stato iniziale: idle oppure no operation (nop);

• avvio da parte di un impulso sincrono esterno (ad es. impulso di trigger da un rivelatore);

• lettura di un ADC esterno e trasferimento del dato in una RAM esterna;

• incremento del numero di evento e suo trasferimento in una RAM;

• di nuovo stato iniziale: attesa di un nuovo trigger.

� La macchina genera sequenze sincrone su un certo

numero di uscite digitali verso ADC e RAM.

S. Ricciarini – progettazione circuiti digitali

43

Macchina sincrona: esempio (2/2)� Conviene scegliere la struttura gerarchica della macchina sincrona in modo opportuno:

• una macchina principale Main che coordina e attiva varie macchine secondarie quando necessario;

• una macchina secondaria SecADC dedicata a leggere l’ADC e immagazzinare il dato in un registro temporaneo (registro? macro! Interfaccia ADC? progettista!);

• un’altra macchina secondaria Seccount che conta il numero di eventi (contatore? macro!);

• un’altra macchina secondaria SecRAM dedicata a trasferire il dato dal registro temporaneo o dal contatore alla RAM (interfaccia dedicata alla RAM utilizzata? codificata dal progettista!).

� Ogni macchina secondaria è dedicata (specializzata) per generare

una specifica sequenza digitale su uno specifico gruppo di uscite.

� Tipicamente la stessa macchina secondaria (~ subroutine)

viene attivata in momenti diversi del funzionamento della

macchina principale:• ad es. la scrittura nella RAM avviene due volte per ogni trigger e implica la stessa sequenza

digitale di controllo verso la RAM (mentre i dati trasferiti possono cambiare ogni volta).

S. Ricciarini – progettazione circuiti digitali

� Scriviamo il codice VHDL che descrive la macchina principale Main dell’esempio precedente.

entity main is

port (

synchro_trigg, adc_read_end, ram_write_end: in std_logic;

adc_read_start, ram_write_start, ram_data_select: out std_logic

);

end main;

� La descrizione dell'interfaccia (entità) di Main

comporta di aver già chiaro quali sono i segnali

di ingresso e di uscita che servono perché la

macchina principale (Main) possa coordinare il

lavoro della altre macchine.

Conviene partire da uno schema a blocchi del

circuito, come quello mostrato qui.

Nota: non sono mostrate le linee: clock, reset

asincrono, segnali di controllo per ADC e RAM.

(Es. 3) Macchina sincrona in VHDL

S. Ricciarini – progettazione circuiti digitali

trigger è un segnale

asincrono rispetto al clock;

il risincronizzatore è

descritto più avanti

� Abbiamo visto che l'architettura di una macchina sincrona è ben descritta

scomponendola in due blocchi logici:• un registro di stato (insieme di flip-flop);

• una LUT (blocco puramente combinatorio).

architecture arch of main is

... -- altri segnali interni?

type st_value is ( -- con questa notazione funzionale (astratta) il bus di stato (uscita

-- del registro di stato) viene rappresentato in maniera ben leggibile

nop, adc_read, ram_write1, ram_write2 -- la macchina che definisco in questo esempio ha

-- 4 diversi stati (equivalenti ai 4 possibili valori di 2 linee digitali: 00,01,10,11);

); -- descrizione funzionale (astratta)

signal st_pres, st_next -- definisco 2 bus di stato di tipo st_value: stato presente

-- (uscita registro) e stato successivo (uscita LUT)

: st_value;

...45

(Es. 3) Macchina sincrona in VHDL

S. Ricciarini – progettazione circuiti digitali

...

begin

process (reset, clock) -- primo blocco logico: è il registro di stato della macchina

-- sincrona (insieme di flip-flop) [processo = descrizione funzionale]

begin

if (reset = '1') then -- “reset” inviato agli ingressi “asincroni” clear o preset

-- (indispensabile per avere uno stato di partenza definito, anche in una macchina

-- sincrona: risolve il problema del transitorio all’accensione)

st_pres <= nop; -- No OPeration

elsif (clock'event and clock = '1') then -- fronte di salita di clock

st_pres <= st_next;

end if;

end process;

process (-- secondo blocco logico: è la LUT della macchina sincrona, che definisce lo stato

-- successivo st_next e le uscite, in funzione dello stato presente st_pres

-- e degli ingressi di controllo [processo = descrizione funzionale]

st_pres,

synchro_trigg, -- trigger sincronizzato con clock (dal blocco "trigger resynch")

adc_read_end, -- segnale di ritorno dalla macchina secondaria SecADC

ram_write_end -- segnale di ritorno dalla macchina secondaria SecRAM

)

begin

...

46

(Es. 3) Macchina sincrona in VHDL

S. Ricciarini – progettazione circuiti digitali

...

-- in alternativa all’uso di:

-- if (“condizione 1”) then...elsif (“condizione N”) then...else...end if

-- [in cui la condizione “else” può anche essere omessa...]

-- è possibile usare:

-- case “segnale” is when “valore 1” =>... when “valore 2” =>...when others =>...end case;

-- ATTENZIONE: con “if” si specificano le assegnazioni derivanti da un sottoinsieme dei

possibili valori di un bus (gli altri valori non modificano il valore in uscita);

con “case” si specificano le assegnazioni derivanti da ciascuno dei

possibili valori del bus (è obbligatorio includere nell’elenco dei “when” TUTTI i

possibili valori del bus: esplicitamente, o implicitamente con “when others”).

-- all'interno del processo, ciascuna assegnazione per ciascun segnale/bus è valida solo

se nel seguito della descrizione del processo (prima di "end process") non sono

presenti altre assegnazioni per lo stesso segnale/bus che siano valide (in genere,

la validità è vincolata, con if/case, a condizioni sui segnali della lista di

sensibilità);

-- all'interno del processo prevale quindi l'ultima assegnazione valida (la validità

dipende dinamicamente dai segnali in ingresso al processo).

st_next <= nop;

adc_read_start <= '0';

ram_write_start <= '0';

ram_data_select <= '0';

...

47

(Es. 3) Macchina sincrona in VHDL

S. Ricciarini – progettazione circuiti digitali

48

(Es. 3) Macchina sincrona in VHDL...

case st_pres is

when nop =>

if (synchro_trigg = '1') then -- c’è un trigger!!

st_next <= adc_read; -- passa allo stato successivo

adc_read_start <= '1'; -- avvia la macchina SecADC (un impulso lungo un ciclo di clock)

-- ram_write_start e ram_data_select non cambiano

end if; -- altrimenti resta nello stato presente (nop)

-- NOTA: il numero di cicli di clock in cui la macchina Main resta in un generico stato dipende

-- dal segnale di controllo (flessibilità)

when adc_read =>

if (adc_read_end = '1') then -- è terminata la lettura dell'ADC (comunicazione da SecADC)

st_next <= ram_write1; -- passa allo stato successivo

ram_write_start <= '1'; -- avvia SecRAM (un impulso lungo un ciclo di clock)

else

st_next <= adc_read; -- altrimenti resta nello stato presente (*)

end if;

...

(*) Perché per adc_read è necessario scriverlo mentre per nop è implicito?

S. Ricciarini – progettazione circuiti digitali

49

(Es. 3) Macchina sincrona in VHDL...

when ram_write1 =>

if (ram_write_end = '1') then -- SecRAM comunica di aver terminato la scrittura nella RAM

st_next <= ram_write2; -- passa allo stato successivo

ram_write_start <= '1'; -- avvia DI NUOVO SecRAM

ram_data_select <= '1'; -- ‘1’ seleziona il dato del contatore

else

st_next <= ram_write1; -- altrimenti resta nello stato presente

end if;

when ram_write2 =>

if (ram_write_end = '1') then -- SecRAM comunica di aver terminato la (seconda) scrittura

-- nella RAM

st_next <= nop; -- passa allo stato successivo (chiusura del ciclo)

else

st_next <= ram_write2; -- altrimenti resta nello stato presente

ram_data_select <= '1'; -- mantiene la selezione attiva, altrimenti la linea torna a 0

-- (davvero necessario? dipende dal funzionamento di SecRAM)

end if;

end case;

end process; -- NOTA: non sono mai stati usati gli operatori AND, NOT ossia non è mai stata

-- data una specifica descrizione strutturale

end arch;

S. Ricciarini – progettazione circuiti digitali

50

� Upset da asincronia; risincronizzazione

S. Ricciarini – progettazione circuiti digitali

51

Upset da violazione setup/hold time� Definizione: il valore caricato in un flip-flop è l’inverso di quello logicamente corretto.

� Qual’è la conseguenza pratica dell’upset?• In generale (non sempre) l’upset nei successivi cicli di clock si propaga ad altri flip-flop nel

circuito, modificandone lo stato logico in maniera imprevedibile (non controllata) e in genere scorrelata dal funzionamento atteso (viene introdotto un errore logico nel funzionamento del circuito).

� Un upset può verificarsi se setup o hold time di un flip-flop sono violati per un certo fronte di salita di clock.

• L’uscita del flip-flop (bistabile) si viene a trovare in uno stato metastabile (cioè di equilibrio instabile), caratterizzato da un valore di tensione intermedio fra lo stato 0 (per circuiti LVTTL: Vout < 0.8 V) e lo stato 1 (per circuiti LVTTL: Vout > 2.0 V).

• Il flip-flop decade dallo stato metastabile in tempi brevi (~ 1 ns) nello stato 0 o nello stato 1 (stati stabili), in maniera sostanzialmente imprevedibile: può quindi decadere nello stato logicamente sbagliato, può cioè avvenire l’inversione (upset) del valore effettivamente caricato rispetto al valore logicamente atteso.

S. Ricciarini – progettazione circuiti digitali

52

Violazione di setup/hold time� Quando avviene la violazione di setup/hold time?

• Esempio: frequenza di clock troppo elevata in una macchina sincrona.

• Altro esempio: due clock di frequenza diversa in un circuito asincrono.

• La probabilità di questo tipo di upset viene azzerata, se il circuito è sincrono e soddisfa (ST) e (HT) viste prima.

TCTO(i)max + Tcomb(i)

max + Tskew(i-j)max + Tsetup

max < Tclock (ST)

TCTO(i)min + Tcomb(i)

min – Tskew(i-j)max > Thold (HT)

• La probabilità di questo tipo di upset in un circuito asincrono non è mai zero.

S. Ricciarini – progettazione circuiti digitali

53

Circuito asincrono� In un circuito asincrono, è però possibile configurare opportunamente lo stadio di

risincronizzazione o campionamento asincrono (flip-flop (2) nello schema sotto) in modo da azzerare la probabilità di errore logico.

S. Ricciarini – progettazione circuiti digitali

54

Campionamento asincrono combinatorio (1/2)� Vediamo un caso pratico di risincronizzazione.

• Una parte del circuito lavora con clock_1, l’altra parte con clock_2, dati da due oscillatori diversi.

• La linea ready_1 (combinatoria) è sincrona con clock_1 e indica quando la macchina 1 è pronta.

• La linea ready_2 è sincrona con clock_2 e avvia una sequenza interna alla macchina 2.

• Sta avvenendo il campionamento asincrono del segnale ready_1 che è uscita di un elemento combinatorio (porta logica, non flip-flop).

S. Ricciarini – progettazione circuiti digitali

55

� Un segnale combinatorio come ready_1 presenta glitch (impulsi spuri) a causa delle temporizzazioni dei segnali nel dispositivo reale.

• Le transizioni di signal_a e signal_b non sono mai esattamente simultanee, nonostante i due segnali siano generati da flip-flop sincroni.

� Nel campionamento asincrono combinatorio, un glitch in corrispondenza del fronte di salita di clock_2 può dare un upset sulla linea ready_2 e quindi portare ad un errore logico nella macchina 2.

• In caso di upset ready_2 cambia stato e la macchina 2 inizia a lavorare senza che la macchina 1

abbia veramente comunicato di essere pronta!

� Nota bene: nel caso di campionamento sincrono (con setup e hold time soddisfatti), il glitch ci sarebbe comunque, ma non avrebbe effetto, in quanto avverrebbe al di fuori dell’intorno del fronte di salita del clock, identificato da setup e hold time.

S. Ricciarini – progettazione circuiti digitali

Campionamento asincrono combinatorio (2/2)

56

Come risincronizzare?� Per evitare di avere il glitch in ingresso allo stadio di risincronizzazione, occorre

evitare di avere campionamenti asincroni di tipo combinatorio.

� Occorre quindi avere solo campionamenti asincroni di tipo sequenziale (cioè direttamente sull’uscita di un flip-flop).

� Attenzione: nella risincronizzazione di tipo sequenziale, pur non avendo glitch, avvengono comunque e inevitabilmente degli upset.• Il vantaggio sta nel fatto che mentre l’upset originato da un glitch introduce sempre un

errore logico, l’upset originato da una transizione logicamente attesa può essere elaborato in maniera tale da non comportare mai errori logici.

S. Ricciarini – progettazione circuiti digitali

57

Campionamento asincrono sequenziale

• ready_2 può ancora avere un upset ma ciò non comporta un errore logico nella macchina 2, che parte quando desiderato, cioè solo dopo

che la macchina 1 ha comunicato di essere pronta con ready_1 .

• ready_2 replica le transizioni di ready_1 a meno di un’incertezza (jitter) nel ritardo, che può variare di volta in volta fra circa 0 e Tclock_2 a seconda della fase fra i due clock al momento del campionamento (asincrono).

• per indicare il ritardo fra i due segnali ready_1 e ready_2:

• si considera il ritardo medio, pari a circa 0.5 · Tclock_2 ;

• si rappresenta il jitter come un’incertezza δt distribuita uniformemente con ampiezza massima pari al ritardo medio: δt = ± 0.5 · Tclock_2

� Inserendo un flip-flop si ha un segnale ready_1 per definizione privo di glitch.

S. Ricciarini – progettazione circuiti digitali

58

� Upset da perturbazioni esterne

S. Ricciarini – progettazione circuiti digitali

59

Upset da perturbazioni esterne� Un upset può anche avvenire a causa di perturbazioni esterne, ad esempio le correnti

parassite indotte nel flip-flop da una particella altamente ionizzante (ad es. un raggio cosmico).

• Non è possibile azzerare la probabilità di questo tipo di upset!

• Non è possibile azzerare la probabilità che questo tipo di upset comporti un errore logico!

S. Ricciarini – progettazione circuiti digitali

60

Upset da perturbazioni esterne� Si può ridurre la probabilità che questo upset comporti un errore logico, introducendo

un qualche tipo di ridondanza (che funziona come sistema di correzione automatica dell'errore logico).

� Un paio di esempi.

• Tripla ridondanza.

Un segnale logico è realizzato da 3 flip-flop (scritto simultaneamente sui 3 flip-flop).

Il valore associato (letto) è dato da quello presente in maggioranza (serve la opportuna logica combinatoria).

Il numero di flip-flop necessario è triplo.

• Codifica Hamming.

Quando un valore viene scritto in un registro a N bit, viene anche scritto un codice in un registro ausiliario di H bit.

Il valore letto è una combinazione logica delle N+H uscite, tale che in caso di upset di uno o più flip-flop fra gli N+H, il valore letto nel registro resti identico a quello scritto.

� Anche con la ridondanza, l'errore logico è sempre possibile: ad esempio, nel caso di tripla ridondanza, un doppio upset (su due flip-flop simultaneamente) non verrebbe corretto automaticamente.

S. Ricciarini – progettazione circuiti digitali

61

Rivelazione dell'errore logico� Come rivelare la presenza di un errore logico?

• Si configura la logica di ridondanza in modo da segnalare gli errori logici che essa

non può correggere: ad esempio, una codifica Hamming con N=10, H=5 è in grado di correggere un singolo upset e segnalare un doppio upset.

• Si verifica che il circuito risponda in un tempo massimo prefissato:• watchdog (“cane da guardia”): un contatore sempre attivo all'interno del circuito deve essere

azzerato dal circuito stesso prima che venga raggiunto un determinato conteggio, che genererebbe automaticamente un segnale di allarme (ad esempio: un reset asincrono per tutti i flip-flop del circuito);

• time-out sull’esecuzione di un comando: la risposta a un comando esterno deve avvenire entro un tempo massimo prefissato. Altrimenti il circuito logico esterno, che ha inviato il comando, interviene (esempio: reset asincrono, spengimento/riaccensione).

• Si controllano le sequenze di bit in uscita dalla macchina:• codici di controllo: controllo di parità, cioè un bit che rappresenta il numero di 1 presenti

nei dati (è pari o dispari?); oppure controlli più sofisticati (ad es. CRC: Cyclic Redundancy Check);

• controlli sul formato dei dati: presenza di sequenze prefissate (“pattern”, “frame”).

S. Ricciarini – progettazione circuiti digitali

62

Contromisure all'errore logico� Come si riporta il circuito in una configurazione corretta dopo aver rivelato la

presenza di errore logico?

• Con un impulso di reset asincrono inviato a tutti i flip-flop attraverso i loro ingressi “asincroni” (clear o preset), che riportano i singoli flip-flop nello stato iniziale

desiderato: 0 (clear) o 1 (preset).

• NOTA: si ricorda che gli ingressi “asincroni” clear e preset sono caratterizzati dall’agire sullo stato del flip-flop indipendentemente dal clock.

• Con lo spengimento e riaccensione del circuito.

S. Ricciarini – progettazione circuiti digitali

63

Bibliografia (non aggiornata)

� http://mikro.e-technik.uni-ulm.de/vhdl/anl-engl.vhd/html/vhdl-all-e.html

� http://www.csee.umbc.edu/help/VHDL/index.shtml

� http://www.eng.auburn.edu/department/ee/mgc/vhdl.html

� http://instruct1.cit.cornell.edu/courses/ee475/tutorial/VHDL3651.html

� http://www.disi.unige.it/person/AnconaD/Architettura/vhdl.htm

� ricerca su google etc.: "vhdl manual"

� biblioteche di Ateneo (non Polo Scientifico)

S. Ricciarini – progettazione circuiti digitali