Università degli studi di Pavia
Facoltà di Ingegneria
Corso di Laurea Specialistica in Ingegneria Elettronica
INTERFACCIA I2C PER LA LETTURA
E LA PROGRAMMAZIONE DEL CIRCUITO
INTEGRATO DI CONTROLLO DI UNA MATRICE DI
SENSORI DI GAS
Relatore:
Chiar.mo Prof. Piero Malcovati
Correlatori:
Dott. Ing. Marco Grassi
Ing. Fabrizio Conso
Tesi di Laurea di
Claudio De Berti
Anno Accademico 2010/2011
Indice
Elenco delle figure
5
Elenco delle tabelle
7
Introduzione
9
1
2
3
Descrizione del Sistema
1.1 Matrice di sensori . . . . . . . . . . . . . .
1.2 Interfaccia di controllo e lettura dei sensori
1.2.1 Circuito per la lettura dei sensori . .
1.2.2 Interfaccia seriale . . . . . . . . . .
Linguaggi HDL
2.1 VHDL . . . . . . . . . . . .
2.1.1 Livelli di astrazione .
2.2 Verilog . . . . . . . . . . . .
2.3 Macchina a stati finiti . . . .
2.3.1 FSM adottata . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Interfaccia seriale
3.1 Protocollo I2 C . . . . . . . . . . . . . . .
3.1.1 Regole di comunicazione . . . . .
3.1.2 Temporizzazioni . . . . . . . . .
3.2 Registri . . . . . . . . . . . . . . . . . .
3.2.1 Registri di controllo . . . . . . .
3.2.2 Registri di lettura . . . . . . . . .
3.3 Realizzazione dell’interfaccia . . . . . . .
3.3.1 Sequenze di trasmissione . . . . .
3.3.2 Schema a blocchi dell’interfaccia
3.3.3 Sistema descritto in VHDL . . . .
3.3.4 Simulazioni . . . . . . . . . . . .
Claudio De Berti
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
11
11
13
13
15
.
.
.
.
.
17
17
18
19
19
20
.
.
.
.
.
.
.
.
.
.
.
23
23
24
25
26
28
31
32
32
34
34
37
3
INDICE
4
5
Sintesi e Place and Route
4.1 Sintesi . . . . . . . . . . . . . .
4.1.1 Esecuzione della sintesi
4.1.2 Risultati della sintesi . .
4.1.3 Simulazioni post-sintesi
4.2 Place and Route . . . . . . . . .
4.2.1 Realizzazione del layout
4.2.2 Simulazioni post-layout
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Simulazioni in Cadence Virtuoso
5.1 Simulazioni con segnali misti . . . . . . . . .
5.2 Programmazione del master I2 C . . . . . . .
5.3 Test Bench per l’interfaccia I2 C . . . . . . . .
5.3.1 Simulazioni . . . . . . . . . . . . . .
5.3.2 Valutazione dei consumi . . . . . . .
5.4 Inserimento dell’interfaccia nel microsistema
5.4.1 Simulazione dell’intero sistema . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
45
45
46
46
48
50
51
54
.
.
.
.
.
.
.
59
59
60
60
61
61
63
63
Conclusioni
67
Bibliografia
69
Ringraziamenti
71
A Codici HDL
A.1 Codici VHDL . . . . . . . . . . . . . . . .
A.1.1 Descrizione dell’interfaccia . . . .
A.1.2 Test Bench . . . . . . . . . . . . .
A.1.3 Package . . . . . . . . . . . . . . .
A.2 Codici Verilog . . . . . . . . . . . . . . . .
A.2.1 Descrizione della cella master . . .
A.2.2 Descrizione della cella altri segnali
.
.
.
.
.
.
.
73
73
73
81
87
92
92
96
B Script
B.1 Script per l’esecuzione della sintesi . . . . . . . . . . . . . . . . . . . . .
B.2 Script per la realizzazione del layout . . . . . . . . . . . . . . . . . . . .
99
99
99
4
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Claudio De Berti
Elenco delle figure
1.1
1.2
1.3
1.4
Schema semplificato della griglia di sensori di gas . . . . . . . . . . . .
Schema a blocchi del circuito di lettura e di controllo della temperatura
Schematico semplificato del circuito di misura di resistenza . . . . . . .
Schema a blocchi del microsistema con interfaccia I2 C . . . . . . . . .
.
.
.
.
12
13
14
16
2.1
Diagramma a bolle di una FSM . . . . . . . . . . . . . . . . . . . . . . .
20
3.1
3.2
3.3
3.4
24
24
25
3.6
3.7
3.8
3.9
3.10
3.11
3.12
3.13
3.14
3.15
3.16
3.17
3.18
Condizione di Start e condizione di Stop . . . . . . . . . . . . . . . . . .
Trasferimento di un bit . . . . . . . . . . . . . . . . . . . . . . . . . . .
Invio di un byte sul bus . . . . . . . . . . . . . . . . . . . . . . . . . . .
Sequenza di scrittura di un singolo registro (sopra) e di registri con indirizzi consecutivi (sotto) . . . . . . . . . . . . . . . . . . . . . . . . . . .
Sequenza di lettura di un singolo registro (sopra) e di registri con indirizzi
consecutivi (sotto) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Temporizzazioni del protocollo . . . . . . . . . . . . . . . . . . . . . . .
Sequenza di trasmissione per la lettura dei registri OUT REG . . . . . . .
Sequenza di trasmissione per la lettura dei registri CTRL REG . . . . . .
Sequenza di trasmissione per la scrittura dei registri CTRL REG . . . . .
Schema a blocchi dell’algoritmo per l’interfaccia . . . . . . . . . . . . .
Il processo rilevatore condizioni . . . . . . . . . . . . . . . . . . . . . .
Il processo registri lettura . . . . . . . . . . . . . . . . . . . . . . . . . .
Il processo FSM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Buffer linea SDA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Il processo registri scrittura . . . . . . . . . . . . . . . . . . . . . . . . .
Sistema digitale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Simulazione della lettura della misura di default . . . . . . . . . . . . . .
Simulazione della scrittura dei registri di controllo . . . . . . . . . . . . .
26
27
33
33
33
35
36
37
38
38
38
39
41
42
4.1
4.2
4.3
4.4
4.5
4.6
Schematico generato da Encounter
Un dettaglio dello schematico . .
Floorplanning del circuito . . . . .
Layout delle alimentazioni . . . .
Posizionamento delle celle . . . .
Layout completato . . . . . . . .
47
47
51
52
53
53
3.5
Claudio De Berti
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
26
5
ELENCO DELLE FIGURE
6
4.7
4.8
4.9
Simulazione con annotazione SDF, prima parte . . . . . . . . . . . . . .
Simulazione con annotazione SDF, seconda parte . . . . . . . . . . . . .
Simulazione con annotazione SDF, terza parte . . . . . . . . . . . . . . .
55
56
57
5.1
5.2
5.3
5.4
Cella master . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Schematico del Test Bench . . . . . . . . . . . . . . . . . . . . . . . . .
Schematico del sistema . . . . . . . . . . . . . . . . . . . . . . . . . . .
Segnale di controllo e oscillazioni generate dal circuito di misura (sopra)
- Lettura della misura e scrittura dei registri di controllo (sotto) . . . . . .
60
62
64
65
Claudio De Berti
Elenco delle tabelle
3.1
3.2
3.3
3.4
3.5
3.6
3.7
3.8
3.9
Specifiche di temporizzazione dei segnali . .
Set di registri . . . . . . . . . . . . . . . . .
Bit del registro SET REG1 . . . . . . . . . .
Bit del registro SET REG2 . . . . . . . . . .
Bit dei registri TEMP REGx . . . . . . . . .
Bit del registro CTRL REG1 . . . . . . . . .
Bit del registro CTRL REG2 . . . . . . . . .
Bit dei registri OUT REGx . . . . . . . . . .
Bit dei registri OUT TEMP1 e OUT TEMP2
Claudio De Berti
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
27
28
28
29
30
30
30
31
32
7
Introduzione
Il progetto di tesi è stato realizzato nel laboratorio di Sensori e Microsistemi (SMS)
dell’Università degli Studi di Pavia. L’attività si è svolta all’interno del Programma di
ricerca di Rilevante Interesse Nazionale (PRIN) 20085AJSEB intitolato “Nuova metodologia per la rivelazione di gas basata su una griglia bidimensionale di microsensori
interconnessi”. L’attività è finanziata dal Ministero dell’Istruzione, dell’Università e della
Ricerca della Repubblica Italiana.
I sensori per la rivelazione di gas sono ampiamente utilizzati in diverse applicazioni,
ad esempio per il monitoraggio della qualità dell’aria o il controllo di processi industriali.
Recenti direttive del Parlamento Europeo, volte alla protezione della salute umana, mirano
a collocare un maggior numero di punti di campionamento sul territorio per una migliore
valutazione della qualità dell’aria e prevedono anche il monitoraggio delle aree rurali per
la protezione della vegetazione e degli ecosistemi naturali [1]. Queste sono alcune delle
ragioni per cui è divenuto molto importante lo sviluppo di sistemi per il rilevamento di
gas caratterizzati da dimensioni contenute, consumi ridotti, un’alta efficienza e un basso
costo di produzione. Per raggiungere questi obiettivi, è possibile adottare soluzioni tecnologiche tipiche della fabbricazione dei circuiti integrati. Tale scelta progettuale permette
la miniaturizzazione dei sensori e l’abbattimento dei costi di produzione.
I microsistemi per il rilevamento di gas, oggetto di continuo sviluppo da parte dei ricercatori, sono costituiti principalmente da tre componenti: una serie di sensori di gas, un
circuito elettronico di lettura e un elaboratore digitale delle misure acquisite. L’innovazione di questo progetto consiste nell’utilizzo di una matrice di microsensori interconnessi,
soluzione mai adottata prima nel campo dei rivelatori di gas.
Per semplificare il futuro utilizzo del microsistema in sistemi embedded, si è deciso di
implementare al suo interno un’interfaccia seriale con protocollo I2 C , attraverso la quale
poter leggere e programmare il circuito di controllo del sensore. Il progetto di tesi ha
avuto come obiettivo la realizzazione della suddetta interfaccia seriale.
Nella presente tesi si andranno ad esporre le fasi che hanno caratterizzato il conseguimento dei risultati richiesti dal progetto. Lo scritto è cosı̀ strutturato:
• Il Capitolo 1 è dedicato alla descrizione dei componenti del microsistema. In particolare, viene approfondita la struttura del circuito d’interfaccia della matrice di
sensori. Il circuito è in sviluppo nel laboratorio SMS dell’Università di Pavia.
Claudio De Berti
9
INTRODUZIONE
• Il Capitolo 2 è dedicato all’illustrazione dei linguaggi di descrizione hardware che
sono stati adottati nella realizzazione del progetto di tesi.
• Nel Capitolo 3, il primo paragrafo è dedicato allo studio del protocollo I2 C. Nel secondo paragrafo vengono definiti i registri ideati per leggere e controllare il sistema.
Nel terzo paragrafo viene illustrato il lavoro svolto per la descrizione comportamentale dell’interfaccia seriale.
• La prima sezione del Capitolo 4 è dedicata alla sintesi in standard cells della descrizione hardware programmata. La seconda parte del capito è dedicata alla realizzazione del layout del circuito ottenuto dalla sintesi.
• Il Capitolo 5 è dedicato alle simulazioni dell’interfaccia progettata in ambiente
Cadence Virtuoso.
10
Claudio De Berti
Capitolo 1
Descrizione del Sistema
Il progetto PRIN 20085AJSEB, finanziato dal Governo Italiano, prevede lo sviluppo di
una nuova metodologia a basso costo per la rivelazione di gas basata su un microsistema
integrato. Esso è composto da una matrice di sensori di gas, da un circuito integrato
di lettura della matrice, che include anche il circuito di controllo della temperatura dei
sensori, e infine da algoritmi di elaborazione dei dati raccolti. Sono tre le unità di ricerca
a partecipare al progetto: lo studio e la realizzazione della matrice di sensori di gas è stato
assegnato al CNR di Lecce; l’Università degli Studi di Pavia si occupa della progettazione
dell’interfaccia di lettura per la matrice, nonché del circuito di controllo della temperatura;
all’Università degli Studi di Roma “Tor Vergata” spetta la programmazione di algoritmi
per l’elaborazione dei dati acquisiti.
1.1
Matrice di sensori
In natura sono diffuse strutture ricettive in cui selettività e sensibilità elevate sono ottenute
con l’interconnessione di elementi di per sé poco sensibili o selettivi. Ad esempio, il senso del gusto nell’essere umano ha come recettori funzionali migliaia di gemme gustative;
ognuna di queste è in grado di distinguere una delle cinque sensazioni gustative [2]. Di
conseguenza, il senso del gusto dipende dalla percezione sinergica di cinque gusti fondamentali. Una matrice di sensori di gas interconnessi può quindi considerarsi un dispositivo
“bio-ispirato”.
L’unità di Lecce ha sviluppato una matrice 5 × 5, per un totale di 25 sensori. La
schematizzazione della matrice è rappresentata in Figura 1.1. I sensori di gas sono di
tipo resistivo e vengono realizzati con micromembrane in silicio; su ogni membrana viene deposto un materiale sensibile a particolari concentrazioni di gas che viene contattato
tramite quattro elettrodi. Ogni sensore è dotato di un riscaldatore, realizzato con una resistenza in platino (indicata con la lettera H nello schema), ed è dotato di un sensore di
temperatura, anch’esso realizzato con una resistenza in platino (indicata con la lettera T
nello schema). Gli elettrodi di ciascuna micromembrana sono direttamente connessi agli
elettrodi delle micromembrane adiacenti, andando cosı̀ a creare la struttura matriciale. Le
micromembrane posizionate ai bordi della griglia presentano uno o due elettrodi connessi
Claudio De Berti
11
CAPITOLO 1. DESCRIZIONE DEL SISTEMA
Figura 1.1: Schema semplificato della griglia di sensori di gas
direttamente ai terminali del dispositivo. Ciascuna riga della matrice presenta le resistenze del riscaldatore e del sensore di temperatura delle cinque micromembrane connesse
in serie, permettendo cosı̀ di controllare indipendentemente la temperatura di lavoro di
ciascuna riga. Il dispositivo è quindi in grado di rispondere in modo diverso ai gas da
rilevare non solo per l’utilizzo di differenti strati sensibili applicati ai sensori, ma anche
grazie al funzionamento a temperature differenti.
È possibile utilizzare come materiale sensibile, da deporre su una micromembrana,
sia un composto inorganico, sia un composto organico. Per quel che riguarda i materiali
inorganici si adoperano i seguenti ossidi metallici:
• Ossido di stagno (SnO2 );
• Ossido di stagno drogato (SnO2 /X);
• Ossido di indio (In3 O3 );
• Ossido di tungsteno (WO3 ).
Gli ossidi di metallo vengono sintetizzati mediante opportuni metodi chimici che consentono di ottenere nanopolveri del materiale. Queste polveri vengono utilizzate nella
preparazione delle paste serigrafiche che in seguito sono deposte per drop-coating sulle
aree sensibili della matrice. Il processo di deposizione viene concluso sottoponendo il
dispositivo a trattamenti termici.
Per quel che riguarda i materiali organici si possono prendere in considerazione:
• Polimeri conduttori;
12
Claudio De Berti
1.2. INTERFACCIA DI CONTROLLO E LETTURA DEI SENSORI
Figura 1.2: Schema a blocchi del circuito di lettura e di controllo della temperatura
• Materiali molecolari basati su ftalocianine e porfirine.
La deposizione dei materiali organici avviene con tecniche standard come lo spray casting
o con tecniche più avanzate basate su ink-jet. Lo studio della deposizione dei materiali
organici è affinato all’unità di ricerca di Roma.
1.2
Interfaccia di controllo e lettura dei sensori
Lo schema a blocchi del circuito integrato di controllo e lettura per la matrice, realizzato
dall’unità di Pavia, è mostrato in Figura 1.2. Il blocco digitale (Digital Control) è finalizzato al controllo della sequenza di misure; in particolare agisce sui multiplexer (Mux)
che permettono di selezionare i terminali della matrice da utilizzare per ogni singola misura. I multiplexer connettono i terminali selezionati del dispositivo al circuito di lettura
vero e proprio. All’interno del sistema è presente anche un blocco per il controllo della
temperatura, effettuato separatamente per ogni riga della matrice di sensori.
1.2.1
Circuito per la lettura dei sensori
I sensori di gas considerati si comportano elettricamente come resistenze di valore variabile con la concentrazione del misurando [3]. Il circuito integrato di interfaccia per
sensori deve essere in grado di leggere il valore di resistenza tra qualunque coppia di
terminali della griglia. Questa resistenza è data dalla combinazione delle resistenze dei
sensori interconnessi e il suo valore dipende dal misurando e dalla coppia di terminali
scelti per la misura, in quanto la resistenza presente tra ciascuna coppia di terminali è data
da una diversa combinazione di sensori con diversi strati sensibili e funzionanti a temperatura diversa. La matrice presenta in tutto 20 terminali, quindi le coppie di terminali
che si ottengono sono 20 × 19 = 380; siccome la resistenza equivalente tra due terminali
dipende anche dal verso di misurazione, in tutto le resistenze da considerare sono 380.
Ne deriva che per ogni composto chimico da rilevare si può contare su un insieme di 380
Claudio De Berti
13
CAPITOLO 1. DESCRIZIONE DEL SISTEMA
Figura 1.3: Schematico semplificato del circuito di misura di resistenza
misure individuali. Ogni singolo valore di resistenza (R sens ) è dato dalla combinazione di
tre variabili indipendenti: la prima è la resistenza di base Rbl che dipende dalla tecnologia
di fabbricazione utilizzata; la seconda è la variazione della resistenza di base ∆Rbl che è in
funzione sia della temperatura di utilizzo, sia delle alterazioni del dispositivo dovute all’invecchiamento o al processo produttivo; la terza è la resistenza ∆Rgas che è in funzione
della concentrazione di gas sotto esame ed ha una dinamica di un paio di decadi. Quindi
la i-esimia resistenza tra due terminali, con i = [0 ÷ 379], vale:
R sens,i = Rbl + ∆Rbl + ∆Rgas
(1.1)
La resistenza equivalente R sens che si ottiene dalla (1.1) ha un range dinamico estremamente elevato, con valori che possono variare da 1 kΩ a 1 GΩ. Questo implica che il
circuito di lettura deve avere una dinamica operativa di almeno 5 decadi.
L’unità di Pavia ha progettato un circuito di interfaccia basato su un oscillatore controllato in corrente, il cui periodo di oscillazione dipende in maniera direttamente proporzionale dalla resistenza del sensore [4]. L’architettura, mostrata in Figura 1.3 nel caso di
un singolo sensore, presenta una tensione costante Vre f applicata alla resistenza R sens in
modo da garantire il corretto funzionamento del dispositivo. La corrente che si ottiene
(I sens = Vre f /R sens ) viene specchiata e in seguito iniettata, con verso positivo o negativo,
in un integratore sigle-ended. L’uscita dell’integratore è mantenuta in un intervallo di
tensione ∆V = VH − VL grazie ai due comparatori. Essa viene quindi squadrata tramite dei flip-flop set-reset dotati di due uscite, l’una l’inverso dell’altra. Le forme d’onda
quadra ottenute (CT RH e CT RL ) pilotano gli interruttori dello specchio che determinano il verso della corrente applicata all’integratore. Come risultato si ottiene, all’uscita
dell’integratore, un’onda triangolare con periodo dato da:
T=
14
2 · ∆V · R sens
Vre f
(1.2)
Claudio De Berti
1.2. INTERFACCIA DI CONTROLLO E LETTURA DEI SENSORI
I componenti del circuito sono stati dimensionati per ottenere il miglior trade-off tra
velocità di conversione e consumo di potenza; ne risulta una frequenza di oscillazione
dell’onda compresa tra 2.5 MHz e 2.5 Hz.
La conversione in digitale del valore di R sens si ottiene dal rapporto trapl’uscita di un
fmin · fmax =
contatore di riferimento, operante ad una frequenza intermedia fmind =
2.5 kHz, e l’uscita di un contatore operante alla frequenza di oscillazione del circuito
[5]. La conversione termina quando il più lento dei due contatori giunge a un valore
N ∗ assegnato, sufficiente all’ottenimento dell’accuratezza necessaria (con N ∗ = 256 si
ottiene una precisione equivalente a 8 bit per decade). Il valore di resistenza misurato
Rmeas è quindi dato da:
Nre f
+β
(1.3)
Rmeas = α · Rmid ·
Nosc
Nella (1.3) Nre f indica il valore dell’uscita del contatore di riferimento a fine conversione, mentre Nosc indica il valore dell’uscita del contatore pilotato dall’oscillatore, sempre
calcolato a fine conversione. La resistenza Rmid è il valore centrale della scala logaritmica, mentre α e β rappresentano il guadagno e l’offset del circuito di interfaccia. Non è
necessario compensare questi due coefficienti perché non alterano la linearità della conversione; la conoscenza esatta del valore della resistenza equivalente è superflua al fine di
valutare la concentrazione di gas. Il minimo numero di bit necessario per ogni contatore
è dato da:
!
!
1GΩ
∗ Rmax
≈ log2 256 ·
> 18
(1.4)
Nbit > log2 N ·
Rmid
1MΩ
Di conseguenza, ogni misura effettuata viene espressa da 19 bit, ottenendo una precisione
intorno al 0.5%. Il tempo massimo di conversione, per ogni singolo sensore, vale 256 ·
T max ≈ 102.4 s, quindi la conversione completa della matrice, ottenuta effettuando 380
singole conversioni, richiederebbe un tempo inaccettabile (più di 10 ore). Per ovviare a
questo problema, il circuito è dotato di un sistema per ridurre di un fattore 100 il tempo
di conversione dei valori di resistenza più elevati; in pratica il circuito esegue una prima
conversione a bassa risoluzione che impiega al massimo 12.8 ms (corrispondenti a 32
periodi del clock di riferimento). Se il risultato della conversione rapida satura verso valori
alti, la capacità dell’integratore viene diminuita, andando cosı̀ ad aumentare la frequenza
di oscillazione.
Il circuito è stato progettato in tecnologia CMOS da 0.35 µm con una tensione di alimentazione nominale di 3.3 V. L’utilizzo di una tecnologia diversa da quella impiegata
per la realizzazione della matrice di sensori permette di abbattere i costi di produzione e di aumentare l’efficienza del sistema. Questo soluzione è nota come “approccio
micromodulare”.
1.2.2
Interfaccia seriale
L’obiettivo di questo lavoro di tesi è la progettazione e simulazione di un’interfaccia seriale I2 C da inserire all’interno del sistema appena descritto (Figura 1.4). La lettura e il
controllo del sensore dall’esterno avverrebbero quindi secondo le regole del protocollo
Claudio De Berti
15
CAPITOLO 1. DESCRIZIONE DEL SISTEMA
MATRICE DI
SENSORI
CIRCUITO DI
CONTROLLO
SDA
REGISTRI
I2C
SCL
Figura 1.4: Schema a blocchi del microsistema con interfaccia I2 C
I2 C, da anni utilizzato come standard di comunicazione in molti microsensori commerciali [6]; esso viene inoltre utilizzato spesso per la configurazione e il controllo di microsistemi integrati di elevata complessità [7]. L’adozione di un protocollo seriale consente
la riduzione dei costi di produzione legati al packaging, infatti l’interfaccia I2 C utilizza
solo due pin oltre alle alimentazioni. Alla progettazione dell’interfaccia seriale è associata anche la realizzazione di un set di registri, nei quali vengono raggruppati tutti i segnali
necessari al funzionamento e alla programmazione del circuito di controllo e lettura della
matrice di sensori.
16
Claudio De Berti
Capitolo 2
Linguaggi HDL
Alla fine degli anni ’70 i circuiti integrati digitali iniziarono ad avere un livello di complessità tale da evidenziare l’inadeguatezza degli strumenti di progetto a livello di porte
logiche (gate-level). Questo fatto diede inizio agli studi di linguaggi descrittivi astratti,
in grado di aumentare l’efficienza nella progettazione di sistemi digitali complessi. Gli
HDL (Hardware Description Languages) sono linguaggi usati per descrivere un sistema
in forma testuale. Rispetto al disegno schematico, gli HDL permettono di utilizzare livelli
di astrazione più alti, estremamente utili nei progetti complessi.
Il primo HDL è stato PALASM (PAL ASseMbler) che serviva a specificare reti logiche per dispositivi programmabili tipo PAL. Un linguaggio simile è ABEL (Advanced
Boolean Equation Language). Questi linguaggi permettono di descrivere il sistema attraverso equazioni logiche, tabelle della verità e diagrammi a stati (in forma testuale).
Tra gli HDL, quelli considerati di alto livello, principalmente VHDL e Verilog, permettono anche rappresentazioni astratte del sistema, e descrizioni algoritmiche simili a quelle
dei linguaggi di programmazione software. Sia VHDL che Verilog sono linguaggi di
descrizione dell’hardware adatti a modellizzare sistemi digitali sia per scopi di sola simulazione, che per scopi di sintesi e successiva implementazione su dispositivi reali. La loro
principale caratteristica è l’indipendenza dalla tecnologia, ovvero la capacità di descrivere qualsiasi sistema digitale senza vincolare la descrizione ad una specifica tecnologia di
integrazione. Questa è la base per costruire codice portabile e riutilizzabile permettendo
una progettazione più efficiente.
2.1
VHDL
Il linguaggio VHDL viene utilizzato per la descrizione di sistemi hardware digitali. È
simile ai linguaggi di programmazione per la costruzione di programmi software, ma è
dotato di caratteristiche particolari, necessarie alla diversa natura dell’oggetto da descrivere. La prima versione standard del VHDL fu definita nel 1987 da IEEE (Institute of
Electrical and Electronics Engineers) con il nome IEEE-1076-1987. Nel 1993 è stata aggiornata in IEEE-1076-1993. Le due versioni principali del linguaggio definite da questi
standard sono pubblicate nel Language Reference Manual (LRM).
Claudio De Berti
17
CAPITOLO 2. LINGUAGGI HDL
Il principio su cui si basa il VHDL è che un sistema hardware di qualsiasi livello
di complessità può essere schematizzato come un dispositivo che riceve degli ingressi
(input), li elabora secondo precise operazioni e produce delle uscite (output) legate alle
operazioni svolte. Inoltre, ogni sistema può essere scomposto in più sottosistemi, ognuno
schematizzabile nel modo precedentemente descritto.
In VHDL il modello di un sottosistema è detto design entity ed è costituito da due
parti: una entity (che descrive l’interfaccia esterna) ed una architecture (che descrive il
funzionamento interno). Per descrivere un sistema si devono, quindi, definire:
• la sua interfaccia esterna, ovvero gli ingressi e le uscite che mettono in comunicazioni l’entity con l’esterno;
• il suo funzionamento interno, ovvero le operazioni che l’entity deve svolgere sui
segnali di ingresso per generare i segnali d’uscita.
Nella descrizione hanno un ruolo fondamentale i segnali che mettono in comunicazione
parti diverse del sistema. Le porte sono segnali particolari poiché permettono ai dati
l’ingresso e l’uscita dall’entity. Package e library sono parole chiave che permettono di
creare dei contenitori di porzioni di codice. Questa tecnica è usata sia per isolare porzioni
di codice dal resto della descrizione sia per riutilizzarle in più ambiti.
2.1.1
Livelli di astrazione
Una descrizione più astratta si limita ad indicare cosa debba fare il sistema senza specificare come, ed è quindi più vicina alle esigenze descrittive del progettista. Una descrizione
meno astratta invece contiene dettagli implementativi e specifica come è effettivamente
costituito il sistema. Il VHDL supporta tre livelli di astrazione:
• il livello di astrazione più basso è la Descrizione Strutturale: il sistema viene rappresentato direttamente nella sua struttura come rete di porte logiche. Si indicano
i componenti del sistema e le interconnessioni tra di essi. Questa descrizione è
l’equivalente testuale di un disegno schematico;
• la Descrizione Funzionale o Comportamentale (behavioural) è il livello di astrazione più alto. Il progettista tramite il linguaggio VHDL definisce come il dispositivo
debba agire. Nel definire cosa il sistema debba fare, il progettista utilizza descrizioni algoritmiche tramite istruzioni simili a quelle dei linguaggi di programmazione
software;
• ad un livello intermedio di astrazione troviamo la Descrizione Dataflow, che contiene una rappresentazione del flusso dei dati: per mezzo di equazioni logiche si
descrive l’effetto sui segnali in uscita di un flusso di segnali in ingresso.
Efficacia ed efficienza sono due aspetti contrapposti da valutare per la scelta del livello
di astrazione da utilizzare. L’efficacia rappresenta esigenza che il modello possa essere
18
Claudio De Berti
2.2. VERILOG
interpretato correttamente dallo strumento di sviluppo in fase di sintesi, mentre l’efficienza rappresenta l’esigenza del progettista di poter utilizzare un linguaggio descrittivo il più
possibile vicino alla propria visione del sistema da modellizzare.
Nella fase di programmazione le istruzioni vengono spesso scritte in sequenza, ma, a
differenza di quanto accade per i linguaggi di programmazione software, in VHDL questo
non implica che esse agiranno in sequenza. I concetti di concorrenzialità e sequenzialità
vengono in aiuto: più elementi si definiscono concorrenti quando la loro esecuzione è
parallela o contemporanea, si dicono invece sequenziali se la loro esecuzione avviene un
elemento dopo l’altro, ossia in serie. I processi raggruppano un insieme di istruzioni e
sono concorrenti fra loro; il loro scopo è quello di contenere istruzioni sequenziali per la
descrizione del sistema.
2.2
Verilog
Il linguaggio Verilog attualmente si spartisce con il VHDL il mercato dei linguaggi destinati alla progettazione e simulazione digitale.
Lo sviluppo del linguaggio Verilog venne avviato nel 1984 nei laboratori della Gateway Design Automation Inc. Venne ideato ispirandosi alle funzionalità dei linguaggi
HDL al tempo più diffusi e alle caratteristiche di linguaggi di programmazione tradizionali, come il C. Essendo un linguaggio proprietario, il Verilog non venne subito standardizzato e subı̀ diverse modifiche in occasione delle numerose revisioni effettuate fino alla
fine degli anni ’80. Nel 1990 Cadence Design System, tutt’oggi il principale produttore
di software per la progettazione hardware, acquisı̀ la Gateway Design Automation Inc.,
divenendo cosı̀ proprietaria del linguaggio Verilog. Cadence riconobbe che se il Verilog
fosse rimasto un linguaggio proprietario chiuso, le altre aziende di progettazione hardware
avrebbero utilizzato un linguaggio più flessibile, come il VHDL. Di conseguenza Cadence
creò l’Open Verilog International (OVI) e nel 1991 fornı̀ la documentazione del Verilog,
evento che sancı̀ “l’apertura” del linguaggio di descrizione hardware. Il linguaggio venne
poi standardizzato nel 1995 con il nome IEEE-1364.
Il linguaggio verilog è in grado di descrivere un sistema digitale come un insieme di
moduli (modules). Ogni modulo è dotato di un’interfaccia con altri moduli in base alla
descrizione del suo contenuto. Un modulo rappresenta un’unità logica che può essere
descritta sia specificando la sua struttura logica interna, sia descrivendo il suo comportamento logico con un linguaggio più simile alla programmazione informatica. Nel primo
caso, la descrizione permette la sintesi a livello di gate del sistema digitale, nel secondo caso ci si concentra sul comportamento che il sistema deve avere [8]. I moduli sono
interconnessi con delle nets che ne permettono la comunicazione.
2.3
Macchina a stati finiti
Se il sistema da descrivere ha una certa complessità, l’utilizzo di macchine a stati finiti (FSM) permette di semplificare dal punto di vista logico la programmazione. Una
Claudio De Berti
19
CAPITOLO 2. LINGUAGGI HDL
et
res
START
X=go_mid
X=go_start
MIDDLE
X=go_stop
STOP
Figura 2.1: Diagramma a bolle di una FSM
macchina a stati finiti consiste in un insieme di stati e di direzioni di evoluzione degli stati. Il funzionamento di questi sistemi, sensibili ad un segnale di temporizzazione
(clock ), si basa sulla valutazione degli ingressi che determinano l’evoluzione degli stati
della macchina.
Esistono due tipologie di FSM [9]: la macchina di Moore e la macchina di Mealy.
Nella macchina di Moore ad ogni istante il valore delle uscite dipende esclusivamente
dallo stato attuale. Nella macchina di Mealy ad ogni istante il valore delle uscite dipende sia dallo stato attuale che dall’attuale valore degli ingressi. Durante la permanenza
in uno stato, una variazione dell’ingresso di una macchina di Mealy può ripercuotersi
immediatamente sull’uscita.
La macchina a stati viene a formarsi dall’unione di un processo sequenziale e di uno o
più combinatori; il processo combinatorio ha il compito di valutare i segnali in ingresso e
in base a questi gestire il segnale che indica il prossimo stato (stato futuro) della macchina;
il processo sequenziale dovrà occuparsi di far commutare lo stato presente nello stato
futuro, permettendo l’avanzamento di stato.
2.3.1
FSM adottata
La struttura della macchina a stati utilizzata in questo lavoro di tesi viene definita come
One ‘State’ Process [10]. Il codice VHDL basilare di una macchina di tale tipologia è
riportato qui di seguito:
1
2
3
4
20
FSM FF : p r o c e s s (CLK, RESET )
begin
i f RESET= ’1 ’ t h e n
STATE <= START ;
Claudio De Berti
2.3. MACCHINA A STATI FINITI
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
e l s i f CLK’ e v e n t and CLK= ’1 ’ t h e n
c a s e STATE i s
when START
=> i f X=GO MID t h e n
STATE <= MIDDLE ;
end i f ;
when MIDDLE => i f X=GO STOP t h e n
STATE <= STOP ;
end i f ;
when STOP
=> i f X=GO START t h e n
STATE <= START ;
end i f ;
when o t h e r s => STATE <= START ;
end c a s e ;
end i f ;
end p r o c e s s FSM FF ;
Il comportamento del codice è mostrato nel diagramma a bolle di Figura 2.1: se la
condizione associata alla freccia è vera in corrispondenza di un fronte positivo di clock,
la macchina cambia di stato. Il comportamento è quindi sincrono con il clock. Solo il reset agisce in modo asincrono e, se attivo, riporta la macchina allo stato iniziale
immediatamente.
Claudio De Berti
21
Capitolo 3
Interfaccia seriale
La fase iniziale del progetto di tesi è stata caratterizzata dalla programmazione in VHDL
dell’interfaccia seriale con cui il sensore sarà in grado di fornire informazioni verso l’esterno. Nell’interfaccia progettata non solo si rispettano le regole del protocollo I2 C, ma
si sono adottate soluzioni comportamentali specifiche per il corretto controllo del dispositivo, che verranno esposte in dettaglio nei paragrafi seguenti. Inoltre, in questa fase di
progettazione, si sono definiti, in numero e in tipologia, i registri necessari al controllo e
alla lettura del circuito d’interfaccia della matrice.
3.1
Protocollo I2C
Il sistema di comunicazione seriale I2 C, acronimo di Inter Integrated Circuit, è stato sviluppato dalla Philips come interfaccia seriale utilizzata nei propri circuiti integrati. Il
rilascio della prima versione del protocollo risale al 1992. Nel corso degli anni essa ha
subito diversi aggiornamenti e dall’Ottobre del 2006 può essere usato liberamente.
L’I2 C è un sistema di comunicazione seriale bifiliare che permette l’interconnessione
con più dispositivi, quindi si può definire un bus di comunicazione. Trattandosi di un
protocollo seriale, ha il vantaggio di utilizzare solo due linee, ovvero occupa solo due
pin del package, mentre ha come svantaggio una limitata velocità di comunicazione. La
velocità di trasferimento dati previsto dallo Standard-Mode, utilizzato in questo progetto,
ha un bitrate massimo di 100 Kbit/s. Le linee seriali sono:
• SDA (Serial Data Line) che viene utilizzata per la trasmissione dei dati;
• SCL (Serial Clock Line) che viene utilizzata per il segnale di clock di trasmissione.
La trasmissione del clock rende il sistema un bus sincrono.
Entrambe le linee devono essere connesse all’alimentazione tramite resistenze di pullup [11]. Un bus I2 C è composto da almeno un master ed uno slave; un dispositivo di tipo
master emette il segnale di clock, mentre un dispositivo di tipo slave si sincronizza sul
segnale di clock senza poterlo controllare. Ogni dispositivo collegato al bus è identificato
da un indirizzo univoco a 7 bit.
Claudio De Berti
23
CAPITOLO 3. INTERFACCIA SERIALE
Figura 3.1: Condizione di Start e condizione di Stop
Figura 3.2: Trasferimento di un bit
L’interfaccia I2 C realizzata in questa tesi è di tipo slave, dato che si vorrà leggere e
controllare il sensore tramite un dispositivo master, soluzione universalmente adottata per
tutti i sensori che utilizzano tale protocollo.
3.1.1
Regole di comunicazione
Il protocollo prevede una condizione di inizio trasmissione ed una di fine della stessa
(Figura 3.1):
• condizione di Start: con SCL alto, SDA passa dallo stato alto a quello basso;
• condizione di Stop: con SCL alto, SDA passa dallo stato basso a quello alto.
Un bit, per essere valido, deve essere tale da mantenere la linea SDA stabile per l’intera
durata del periodo positivo di SCL (Figura 3.2). I dati sulle linee SDA e SCL vengono
trasmessi un byte alla volta Ad ogni byte trasmesso segue sul bus una conferma di avvenuta ricezione da parte del dispositivo interessato; in pratica vengono trasmessi otto bit
di dati, mentre il nono ha la funzione di acknowledgement (Figura 3.3). Durante il “bit
di acknowledge”, il trasmittente lascia la linea SDA alta ed il ricevente l’abbassa in caso
di avvenuta ricezione o la lascia alta in caso contrario. Un mancato acknowledge può
avvenire, quindi, nel caso in cui il byte immediatamente precedente non sia stato ricevuto
correttamente: questo può essere un byte di dati effettivo, l’indirizzo di un registro in cui
scrivere o leggere il dato, oppure l’indirizzo stesso del dispositivo. Nel caso di mancato
acknowledgement, è necessario ripetere la trasmissione.
24
Claudio De Berti
3.1. PROTOCOLLO I2 C
Figura 3.3: Invio di un byte sul bus
Sequenze di lettura e scrittura dei registri
L’indirizzo slave a 7 bit viene completato a 8 bit con l’aggiunta del bit di lettura/scrittura
che va ad occupare la posizione meno significativa nel byte:
• il bit “0” determina la scrittura (W) da parte del master sullo slave;
• il bit “1” determina la lettura (R) da parte del master dallo slave.
L’indirizzo dello slave con il bit di scrittura viene inviato dopo la condizione di Start (ST).
Se la ricezione avviene con successo, lo slave invia il bit di acknowledgement (SAK). Si
può quindi passare all’invio dell’indirizzo del registro (SUB) in cui si vuole andare a
scrivere/leggere. I registri, di cui si parlerà in dettaglio più avanti, hanno indirizzi a 6 bit
e vengono completati a 8 bit con l’aggiunta di due bit più significativi (MSB):
• se i due bit MSB sono “00” si potrà leggere/scrivere solo nel registro associato
all’indirizzo;
• se i due bit MSB sono “10”, l’indirizzo verrà automaticamente incrementato permettendo di leggere/scrivere in più registri consecutivi.
Per poter leggere il contenuto di un registro è necessario effettuare, dopo l’invio del
suo indirizzo, una condizione di Start ripetuta (SR): con SCL alto, SDA passa dallo
stato alto a quello basso. A questa condizione segue l’invio dell’indirizzo dello slave con
il bit di lettura (R). In lettura è il master a inviare il bit di acknowledgement (MAK)
in risposta ad ogni byte ricevuto. Per fermare l’invio di byte da parte dello slave, il
master non effettua l’invio del bit di acknowledgement (NMAK). Sia la lettura che la
scrittura terminano con la condizione di Stop (SP). Le procedure appena descritte sono
schematizzate nella Figura 3.4 per la scrittura e nella Figura 3.5 per la lettura.
3.1.2
Temporizzazioni
L’interfaccia I2 C deve rispettare i valori di temporizzazione imposti dal protocollo. Per
la realizzazione del progetto si è scelto di adottare il modello standard del bus di comunicazione, dato che per la lettura e il controllo del sensore la velocità offerta da tale
Claudio De Berti
25
CAPITOLO 3. INTERFACCIA SERIALE
Master
Slave
ST
Master
Slave
ST
SAD + W
SUB
DATA
SAK
SP
SAK
SAD + W
SUB
SAK
DATA
SAK
DATA
SAK
SAK
SP
SAK
Figura 3.4: Sequenza di scrittura di un singolo registro (sopra) e di registri con indirizzi
consecutivi (sotto)
Master
Slave
ST
Master
Slave
ST
SAD + W
SUB
SAK
SAD + W
SR
SUB
SAK
SAD + R
SAK
SR
SAK
NMAK
SAK
SP
DATA
SAD + R
MAK
SAK
DATA
NMAK
SP
DATA
Figura 3.5: Sequenza di lettura di un singolo registro (sopra) e di registri con indirizzi
consecutivi (sotto)
soluzione è più che sufficiente. In fase progettuale è necessario adottare soluzioni tali da
poter garantire il rispetto totale delle regole di temporizzazione imposte dal protocollo; in
particolare, durante le simulazioni, si andrà a valutare il comportamento dell’interfaccia
in presenza di segnali caratterizzati da temporizzazioni corrispondenti al limite teorico
di velocità imposto dal protocollo. Le specifiche di temporizzazione sono riportate nella
Tabella 3.1 e fanno riferimento alla Figura 3.6.
3.2
Registri
Per poter interagire con il circuito d’interfaccia del sensore, si è creato un set di registri
accessibile dall’esterno tramite il bus I2 C. Un registro di un dispositivo slave può essere di
sola lettura (r), di sola scrittura (w), oppure di lettura/scrittura (rw). Per il controllo dell’interfaccia del sensore è risultato necessario l’utilizzo di 10 registri, mentre per fornire
le misure di gas e temperatura ne sono stati utilizzati altri 5.
Ai registri sono stati assegnati indirizzi a 6 bit, anche se per la loro identificazione
ne basterebbero 4: nell’ipotesi di sviluppi futuri, si è scelto di poter avere la possibilità
di aumentare il numero di registri senza apportare radicali modifiche all’interfaccia I2 C.
L’elenco dei registri è mostrato nella Tabella 3.2. Gli indirizzi dei registri di controllo
hanno valori consecutivi, come pure gli indirizzi dei registri di lettura: questa caratteristica
permette l’utilizzo delle sequenze di lettura o scrittura di più byte di dati mostrate nel
paragrafo precedente.
26
Claudio De Berti
3.2. REGISTRI
REPEATED
START
START
tsu(SR)
tw(SP:SR)
SDA
tf(SDA)
tsu(SDA)
tr(SDA)
START
th(SDA)
tsu(SP)
STOP
SCL
th(ST)
tw(SCLL)
tw(SCLH)
tr(SCL)
tf(SCL)
Figura 3.6: Temporizzazioni del protocollo
Symbol
f(SCL)
Parameter
SCL clock frequency
I2C standard mode
Min
Max
0
100
tw(SCLL)
SCL clock low time
4.7
tw(SCLH)
SCL clock high time
4.0
tsu(SDA)
SDA setup time
250
th(SDA)
SDA data hold time
0
ns
3.45
SDA and SCL rise time
1000
tf(SDA) tf(SCL)
SDA and SCL fall time
300
START condition hold time
4
tsu(SR)
Repeated START condition
setup time
4.7
tsu(SP)
STOP condition setup time
4
tw(SP:SR)
Bus free time between STOP
and START condition
KHz
µs
tr(SDA) tr(SCL)
th(ST)
Unit
µs
ns
µs
4.7
Tabella 3.1: Specifiche di temporizzazione dei segnali
Claudio De Berti
27
CAPITOLO 3. INTERFACCIA SERIALE
Nome del registro
Indirizzo del registro
Tipo
Binario
Esadecimale
TEMP_REG1
w
010000
10
TEMP_REG2
w
010001
11
TEMP_REG3
w
010010
12
TEMP_REG4
w
010011
13
TEMP_REG5
w
010100
14
TEMP_REG6
w
010101
15
SET_REG1
w
010110
16
SET_REG2
w
010111
17
CTRL_REG1
rw
011000
18
CTRL_REG2
rw
011001
19
OUT_REG1
r
110000
30
OUT_REG2
r
110001
31
OUT_REG3
r
110010
32
OUT_TEMP1
r
110011
33
OUT_TEMP2
r
110100
34
Tabella 3.2: Set di registri
3.2.1
Registri di controllo
Variando il contenuto dei registri di controllo, è possibile modificare le modalità operative
del circuito d’interfaccia del sensore; in pratica, i bit dei registri andranno a pilotare le
porte logiche dei blocchi digitali di controllo del circuito. All’accensione del dispositivo
i bit devono assumere valori di default. Le funzionalità di ogni singolo registro verranno
esposte di seguito.
Registro SET REG1
GRE
VEL
res
res
res
TM2
TM1
TM0
Tabella 3.3: Bit del registro SET REG1
• GRE: bit che permette di selezionare la modalità di conversione delle misure di gas
effettuate dalla matrice.
1. “0”: modalità di conversione con risoluzione massima;
2. “1”: modalità di conversione grezza, ovvero a bassa risoluzione.
28
Claudio De Berti
3.2. REGISTRI
Il valore di default assegnato al bit GRE è “0”.
• VEL: bit che permette di selezionare la velocità con cui effettuare la conversione
1. “0”: velocità di conversione normale;
2. “1”: conversione in modalità rapida.
Anche per il bit VEL il valore di default è “0”.
• TM0, TM1 e TM3: bit utilizzati per selezionare, pilotando un multiplexer, un
valore di temperatura sui cinque rilevati dal circuito, ognuno corrispondente a una
riga di sensori della matrice. Il valore selezionato viene cosı̀ reso disponibile nei
registri d’uscita dedicati alla temperatura.
1. “001”: temperatura relativa alla prima riga di sensori;
2. “010”: temperatura relativa alla seconda riga di sensori;
3. “011”: temperatura relativa alla terza riga di sensori;
4. “100”: temperatura relativa alla quarta riga di sensori;
5. “101”: temperatura relativa alla quinta riga di sensori.
I tre bit hanno come valore di default “001”.
• I bit res non assumono alcuna funzione. Potranno essere utilizzati in eventuali
sviluppi futuri.
Registro SET REG2
SW7
SW6
SW5
SW4
SW3
SW2
SW1
SW0
Tabella 3.4: Bit del registro SET REG2
Ogni bit del registro SET REG2 può essere utilizzato per pilotare uno switch che
consente di abilitare l’uscita, su pin del package, di tensioni analogiche provenienti dal
circuito d’interfaccia del sensore. Le tensioni che si vorranno avere in uscita verranno
decise nelle fasi finali di progettazione del sistema integrato e serviranno nelle operazione
di test del dispositivo dopo la sua realizzazione.
Registri TEMP REGx
Con i registri TEMP REGx è possibile impostare la temperatura di funzionamento delle cinque serie di riscaldatori della matrice. La temperatura che si vuole ottenere dai
riscaldatori è espressa con 9 bit di risoluzione.
• Bit da TE1 8 a TE1 0: temperatura dei riscaldatori della prima riga di sensori.
Claudio De Berti
29
CAPITOLO 3. INTERFACCIA SERIALE
TEMP_REG1:
res
res
res
TE5_8
TE5_7
TE5_6
TE5_5
TE5_4
TE5_1
TE5_0
TE4_8
TE4_7
TE4_6
TE4_5
TE4_2
TE4_1
TE4_0
TE3_8
TE3_7
TE3_6
TE3_3
TE3_2
TE3_1
TE3_0
TE2_8
TE2_7
TE2_4
TE2_3
TE2_2
TE2_1
TE2_0
TE1_8
TE1_5
TE1_4
TE1_3
TE1_2
TE1_1
TE1_0
TEMP_REG2:
TE5_3
TE5_2
TEMP_REG3:
TE4_4
TE4_3
TEMP_REG4:
TE3_5
TE3_4
TEMP_REG5:
TE2_6
TE2_5
TEMP_REG6:
TE1_7
TE1_6
Tabella 3.5: Bit dei registri TEMP REGx
• Bit da TE2 8 a TE2 0: temperatura dei riscaldatori della seconda riga di sensori.
• Bit da TE3 8 a TE3 0: temperatura dei riscaldatori della terza riga di sensori.
• Bit da TE4 8 a TE4 0: temperatura dei riscaldatori della quarta riga di sensori.
• Bit da TE5 8 a TE5 0: temperatura dei riscaldatori della quinta riga di sensori.
I valori di default verranno assegnati nelle fasi finali di progettazione del microsistema.
Registri CTRL REG1 e CTRL REG2
I registri CTRL REG1 e CTRL REG2 sono gli unici due registri che possono essere sia
scritti che letti.
MC8
MC7
MC6
MC5
MC4
MC3
MC2
RM1
Tabella 3.6: Bit del registro CTRL REG1
MC1
MC0
res
res
res
res
res
RM2
Tabella 3.7: Bit del registro CTRL REG2
30
Claudio De Berti
3.2. REGISTRI
• Bit da MC8 a MC0: il contenuto di questi 9 bit permette di scegliere una tra le
380 misure effettuabili con la matrice di sensori di gas. Il valore scritto nei registri
viene inviato al blocco digitale di controllo del circuito d’interfaccia del sensore; il
blocco, in base al valore ricevuto, andrà a pilotare i multiplexer che consentono la
selezione dei terminali della matrice. Il valore di default di questi bit corrisponde
alla prima misura effettuata in automatico all’accensione del dispositivo.
• Bit RM1 e RM2: questi due bit determinano l’avvio di una nuova procedura di
misurazione di gas:
1. se entrambi sono a “1”, il circuito di interfaccia inizia ad effettuare la misura
selezionata dai bit MC;
2. se entrambi sono a “0”, una nuova misura di concentrazione di gas è disponibile nei registri di lettura.
I due bit sono di default a “1” e vengono abbassati a “0” quando la misura è terminata; una nuova procedura di misura non verrà avviata finché i due bit saranno reimpostati a “1” attraverso la scrittura di entrambi i registri con un’idonea trasmissione
sul bus I2 C.
3.2.2
Registri di lettura
I registri di lettura permettono l’acquisizione dall’esterno di tutte le misure effettuate dal
sistema; il loro contenuto viene letto dal dispositivo master che stabilisce la connessione
I2 C con il sensore.
Registri OUT REG1, OUT REG2 e OUT REG3
OUT_REG1:
CNT
res
res
res
res
GM18
GM17
GM16
GM14
GM13
GM12
GM11
GM10
GM9
GM8
GM6
GM5
GM4
GM3
GM2
GM1
GM0
OUT_REG2:
GM15
OUT_REG3:
GM7
Tabella 3.8: Bit dei registri OUT REGx
• Bit da MC18 a MC0: rappresentano il valore della concentrazione di gas rivelata dal sensore, relativa alla misura effettuata secondo il contenuto dei registri di
controllo.
Claudio De Berti
31
CAPITOLO 3. INTERFACCIA SERIALE
• Bit CNT: la sua lettura permette di conoscere quale dei due contatori è stato utilizzato per determinare il risultato della conversione A/D.
1. “0”: è stato utilizzato il risultato del contatore operante alla frequenza intermedia di riferimento;
2. “1”: è stato utilizzato il risultato del contatore operante alla frequenza di
oscillazione del circuito.
Registri OUT TEMP1 e OUT TEMP2
I registri OUT TEMP1 e OUT TEMP2 offrono in uscita dal sistema la temperatura
di funzionamento della riga di sensori selezionata dai registri di controllo. Il valore è
espresso con una risoluzione di 9 bit (da OT8 a OT0).
OUT_TEMP1:
res
res
res
res
res
OT6
OT5
OT4
OT3
res
res
OT8
OT1
OT0
OUT_TEMP2:
OT7
OT2
Tabella 3.9: Bit dei registri OUT TEMP1 e OUT TEMP2
3.3
Realizzazione dell’interfaccia
L’interfaccia I2 C di tipo slave e la gestione dei registri che si vogliono implementare
nel microsistema integrato sono stati descritti in VHDL. La scrittura dei codici e la loro
simulazione è stata effettuata utilizzando il programma ModelSim della Mentor Graphics.
3.3.1
Sequenze di trasmissione
Prima della scrittura del codice, si è stabilito quali debbano essere le sequenze di trasmissione che un generico dispositivo master dovrà generare per dialogare con il dispositivo
slave che si vuole progettare.
Lettura della misura di default
All’accensione del sistema, viene effettuata in automatico da parte del sensore la misura
selezionata dal valore di default dei registri di controllo. Un dispositivo I2 C master ha due
opzioni:
1. attendere, dall’accessione del sensore, per almeno il tempo massimo necessario al
completamento della conversione del valore di concentrazione di gas e, in seguito,
andare a leggere il contenuto dei registri d’uscita;
32
Claudio De Berti
3.3. REALIZZAZIONE DELL’INTERFACCIA
Master
Slave
ST
SAD + W
SUB
SAK
SR SAD + R
SAK
MAK
SAK
OUT_REG1
MAK
OUT_REG2
NMAK SP
OUT_REG2
Figura 3.7: Sequenza di trasmissione per la lettura dei registri OUT REG
Master
Slave
ST
SAD + W
SUB
SAK
SR
SAD + R
SAK
MAK
SAK
CTRL_REG1
NMAK
SP
CTRL_REG2
Figura 3.8: Sequenza di trasmissione per la lettura dei registri CTRL REG
2. leggere ripetutamente il contenuto dei registri CTRL REG; quando i due bit RM1
e RM2 passano da “1” a “0”, si potrà andare a leggere il contenuto dei registri
d’uscita.
Durante le fasi di misurazione e conversione, la lettura dei registri d’uscita OUT REGx
è interdetta, come anche la scrittura dei registri di controllo. Questo permette di non
acquisire valori di gas che non corrispondono alla misurazione desiderata. La sequenza
di trasmissione che si avrà sul bus I2 C per il primo caso è mostrata nella Figura 3.7. Nel
secondo caso, verrà ripetuta la sequenza della Figura 3.8 fino all’abbassamento dei due
bit; seguirà poi la sequenza mostrata per il primo caso.
Scrittura dei registri di controllo
Completata la prima misura di default, è possibile andare a modificare il contenuto di
tutti i registri di controllo. Condizione necessaria e sufficiente per avviare una nuova
misurazione, è la scrittura dei registri CTRL REG1 e CTRL REG2 (Figura 3.9) che
permette di riportare a “1” i bit RM1 e RM2. La scrittura di registri di controllo con
indirizzi consecutivi ha una sequenza di trasmissione analoga.
Master
Slave
ST
SAD + W
CTRL_REG1
SUB
SAK
SAK
CTRL_REG2
SAK
SP
SAK
Figura 3.9: Sequenza di trasmissione per la scrittura dei registri CTRL REG
Lettura della misura effuttuata
Effettuata la scrittura dei registri di controllo CTRL REG1 e CTRL REG2, una nuova
procedura di misurazione viene avviata da parte dell’interfaccia del sensore. Per la lettura
dei valori ottenuti, si ha una sequenza di trasmissione identica a quella illustrata per la
misura di default.
Claudio De Berti
33
CAPITOLO 3. INTERFACCIA SERIALE
Lettura della temperatura
La lettura dei registri OUT TEMP può essere effettuata in qualsiasi momento dal completamento della misurazione di default. La sequenza di trasmissione sul bus è analoga a
quella della lettura dei registri OUT REG, basta cambiare l’indirizzo del primo registro
in cui leggere (SUB).
3.3.2
Schema a blocchi dell’interfaccia
Le sequenze di trasmissioni sul bus I2 C, descritte nel paragrafo precedente, devono essere
interpretate e rispettate dal dispositivo slave che si vuole andare a programmare. Si è
quindi pensato ad un algoritmo per l’interfaccia che il codice VHDL dovrà descrivere; il
suo schema a blocchi è mostrato in Figura 3.10. Nel disegno si è omesso il comportamento dello slave nel caso di ricezione della sequenza di stop: se si presenta, in qualsiasi
momento, tale condizione sul bus, l’interfaccia deve ritornare nella fase di ‘attesa condizione start’. Inoltre, nella fase in cui si stabilisce se l’indirizzo del registro ricevuto è
corretto, si deve tener conto anche dei permessi di lettura e scrittura dei registri che dipendono dall’esecuzione della conversione della misura di gas: se un dispositivo master non
rispetta le sequenze di trasmissioni descritte precedentemente, lo slave deve interrompere
la trasmissione non inviando l’acknowledge.
3.3.3
Sistema descritto in VHDL
Il sistema digitale è stato descritto con una entity al cui interno sono stati creati quattro
processi paralleli. Tutti i processi utilizzano un clock con frequenza di 1 MHz e sono
dotati di un reset attivo basso. Nella Figura 3.16 viene mostrata l’entity dello slave. Le
porte dell’entity sono le seguenti:
• clock e reset sono segnali in ingresso che verranno generati all’interno del microsistema integrato;
• sda e scl sono le porte per i segnali del bus e verranno direttamente connesse ai pin
del package; il primo è un segnale di tipo inout, mentre scl è solo d’ingresso.
• data ready è una porta connessa al circuito d’interfaccia della matrice e ha in ingresso un segnale che viene alzato quando la conversione della misura di gas è
terminata;
• le porte da 8 bit OUT REGx e OUT TEMPx vengono connesse alla parte digitale
del circuito d’interfaccia per acquisire i valori da inserire negli omonimi registri di
lettura; essi sono segnali in ingresso all’entity;
• le porte da 8 bit TEMP REGx, SET REGx e CTRL REGx vengono anch’esse connesse alla parte digitale del circuito d’interfaccia e i loro segnali corrispondono al
contenuto dei registri di controllo; essi sono segnali in uscita dall’entity.
34
Claudio De Berti
3.3. REALIZZAZIONE DELL’INTERFACCIA
ACCENSIONE SLAVE
ATTESA CONDIZIONE
START
START RILEVATA?
NO
SI
LETTURA INDIRIZZO
SLAVE
INDIRIZZO
CORRETTO?
NO
SI
INVIO SAK
LETTURA INDIRIZZO
REGISTRO
INDIRIZZO
CORRETTO?
NO
SI
INVIO SAK
LETTURA BYTE
NO
NO
MASTER VUOLE
LEGGERE?
ATTESA CONDIZIONE
START
SI
START RILEVATA?
BYTE RICEVUTO?
NO
SI
SI
LETTURA INDIRIZZO
SLAVE
INVIO SAK
INDIRIZZO
CORRETTO?
NO
SI
INVIO SAK
INVIO BYTE
SI
NACK RICEVUTO?
NO
Figura 3.10: Schema a blocchi dell’algoritmo per l’interfaccia
Claudio De Berti
35
CAPITOLO 3. INTERFACCIA SERIALE
Nelle porte da 8 bit, quelle che corrispondono a dei bit res non andranno connesse a
nessun’altra porta. Per la consultazione del codice scritto si rimanda alla lettura dell’appendice A, invece di seguito viene descritto il comportamento di ogni processo.
Processi dell’entity
Il processo rilevatore condizioni (Figura 3.11) ha lo scopo di analizzare l’andamento
temporale dei sagnali SDA e SCL che ha in ingresso; l’analisi fornisce in uscita cinque
segnali:
rilevatore_condizioni
sda
start_cnd
scl
stop_cnd
scl_f
clock
reset
scl_r
sda_d
Figura 3.11: Il processo rilevatore condizioni
1. start cnd: viene alzato per un periodo di clock quando il processo rileva una
condizione di start trasmessa sul bus;
2. stop cnd: iene alzato per un periodo di clock quando il processo rileva una condizione di stop trasmessa sul bus;
3. scl f: segnale tenuto alto per un periodo di clock quando viene rivelato un fronte
negativo del segnale SCL;
4. scl r:segnale tenuto alto per un periodo di clock quando viene rivelato un fronte
positivo del segnale SCL;
5. sda q: fornisce il segnale della linea SDA sincronizzato con i fronti di clock del
sistema.
Il processo registri lettura (Figura 3.12) gestisce e fornisce il contenuto dei registri di
lettura all’interfaccia I2 C. Il segnale register adr, ovvero l’indirizzo espresso su 6 bit di
un registro, seleziona il contenuto del corrispondente registro e lo rende disponibile sul
segnale in uscita byte out.
Il processo registri scrittura (Figura 3.15) consente la scrittura dei registri da parte
dell’interfaccia I2 C. Il segnale byte in contiene il byte ricevuto dal master e viene scritto
36
Claudio De Berti
3.3. REALIZZAZIONE DELL’INTERFACCIA
8 bit
8 bit
8 bit
8 bit
8 bit
8 bit
6 bit
registri_lettura
OUT_REG1
OUT_REG2
OUT_REG3
OUT_TEMP1
OUT_TEMP2
byte_out
8 bit
CTRL_REG1
CTRL_REG2
register_adr
clock
reset
8 bit
Figura 3.12: Il processo registri lettura
nel registro selezionato dal segnale register adr. In uscita dal processo si ha il contenuto
dei registri di controllo che all’accensione del dispositivo avranno i valori di default. Il
segnale in uscita mis ended si abbassa quando viene ricevuta la condizione di fine conversione sul segnale data ready e ritorna alto quando viene effettuata la scrittura corretta
dei registri CTRL REG1 e CTRL REG2.
Il processo FSM (Figura 3.13) è il “cuore” dell’entity descritta. È caratterizzato da
un macchina a stati finiti che permette di controllare le fasi di trasmissione sul bus secondo le regole del protocollo I2 C, seguendo la logica mostrata nel diagramma a blocchi
di Figura 3.10. Per regolare le fasi della trasmissione, esso utilizza i segnali provenienti dal processo rilevatore condizioni e il segnale mis ended generato dal processo registri scrittura. In uscita offre l’indirizzo del registro su cui si sta operando e, in caso di
scrittura da parte del master, il byte ricevuto. Per la lettura dei bit trasmessi sul bus esso
utilizza il segnale sda q.
Il blocco logico controllo sda (Figura 3.14) permette il controllo della linea di trasmissione da parte dello slave: si tratta di un buffer tri-state. In pratica lo slave accede
alla linea sda solo quando deve inviare sul bus un livello logico basso attivando il buffer
tri-state [12]. Quando il buffer non è attivo, offre in uscita un valore d’alta impedenza,
consentendo l’utilizzo della linea da parte di un altro dispositivo (in questo caso il master).
3.3.4
Simulazioni
Le simulazioni sono state eseguite utilizzando un Test bench appositamente scritto per il
sistema descritto in VHDL. Il Test bench ha il compito di simulare sia il comportamento
di un dispositivo I2 C master, sia i segnali che proverrebbero dal microsistema integrato.
Claudio De Berti
37
CAPITOLO 3. INTERFACCIA SERIALE
FSM
8 bit
byte_out
register_adr
start_cnd
byte_in
6 bit
8 bit
stop_cnd
scl_f
sda_out
scl_r
sda_ack
sda_d
clock
reset
mis_ended
Figura 3.13: Il processo FSM
controllo_sda
sda_out
sda
scl_ack
Figura 3.14: Buffer linea SDA
registri_scrittura
TEMP_REG1
TEMP_REG2
8 bit
byte_in
TEMP_REG3
TEMP_REG4
6 bit
register_adr
TEMP_REG5
TEMP_REG6
SET_REG1
data_ready
SET_REG2
CTRL_REG1
clock
reset
CTRL_REG2
8 bit
8 bit
8 bit
8 bit
8 bit
8 bit
8 bit
8 bit
8 bit
8 bit
mis_ended
Figura 3.15: Il processo registri scrittura
38
Claudio De Berti
3.3. REALIZZAZIONE DELL’INTERFACCIA
OUT_TEMP2
reset
OUT_TEMP1
byte_out
registri_lettura
OUT_REG1
OUT_REG2
OUT_REG3
OUT_TEMP1
OUT_TEMP2
8 bit
8 bit
FSM
6 bit
8 bit
8 bit
6 bit
sda
mis_ended
CTRL_REG2
CTRL_REG1
SET_REG2
SET_REG1
TEMP_REG6
TEMP_REG5
TEMP_REG4
TEMP_REG3
TEMP_REG2
TEMP_REG1
registri_scrittura
byte_in
register_adr
data_ready
clock
sda_out
byte_in
scl_ack
register_adr
sda_out
controllo_sda
sda_ack
byte_out
data_ready
start_cnd
stop_cnd
scl_f
sda_d
scl_r
clock
mis_ended
reset
8 bit
8 bit
8 bit
8 bit
8 bit
8 bit
CTRL_REG1
CTRL_REG2
reset
8 bit
6 bit
clock
register_adr
stop_cnd
start_cnd
rilevatore_condizioni
sda
scl
scl_f
scl_r
sda_d
reset
OUT_REG1
clock
reset
8 bit
8 bit
8 bit
8 bit
8 bit
8 bit
8 bit
8 bit
8 bit
8 bit
TEMP_REG1
TEMP_REG2
TEMP_REG3
TEMP_REG4
TEMP_REG5
TEMP_REG6
SET_REG1
SET_REG2
CTRL_REG2
CTRL_REG1
39
Claudio De Berti
sda
scl
clock
OUT_REG3
OUT_REG2
Figura 3.16: Sistema digitale
CAPITOLO 3. INTERFACCIA SERIALE
Per la simulazione delle sequenze di trasmissione del master, è stato realizzato un
apposito Package VHDL che viene richiamato all’inizio del Test bench. Il Package racchiude al suo interno delle procedure che applicano le varie condizioni del protocollo ai
segnali SDA e SCL. In base alla trasmissione che si vuole simulare, si richiamano nel Test
bench le procedure da utilizzare. La soluzione adottata rende flessibile la programmazione del Test bench, permettendo rapide modifiche del codice in funzione alla trasmissione
che si vuole simulare. I codici del Test bench e del Package sono riportati nell’appendice
A.
Simulazioni delle sequenze di trasmissione
In questo paragrafo vengono riportate le simulazioni svolte relative alle “sequenze di
trasmissione”, descritte precedentemente nel capitolo.
La prima simulazione effettuata è relativa alla lettura della misura svolta di default
all’accensione del sensore. Il Test bench è in grado di stampare alcune informazioni utili
alla verifica della simulazione:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
** Note :
Time :
** Note :
Time :
** Note :
Time :
** Note :
Time :
** Note :
Time :
** Note :
Time :
** Note :
Time :
** Note :
Time :
** Note :
Time :
** Note :
Time :
b y t e CTRL REG1 : 169
385211 n s
Iteration : 0 Instance :
b y t e CTRL REG2 : 85
475219 n s
Iteration : 0 Instance :
b y t e CTRL REG1 : 169
870230 n s
Iteration : 0 Instance :
b y t e CTRL REG2 : 85
960238 n s
Iteration : 0 Instance :
b y t e CTRL REG1 : 168
1355249 n s
Iteration : 0 Instance
b y t e CTRL REG2 : 84
1445257 n s
Iteration : 0 Instance
Misura d i s p o n i b i l e n e i r e g i s t r i
1455257 n s
Iteration : 0 Instance
b y t e OUT REG1 : 15
1840268 n s
Iteration : 0 Instance
b y t e OUT REG2 : 240
1930276 n s
Iteration : 0 Instance
b y t e OUT REG3 : 170
2020284 n s
Iteration : 0 Instance
/ test
/ test
/ test
/ test
: / test
: / test
: / test
: / test
: / test
: / test
Il Test bench legge dallo slave, ovvero il codice sotto test, il contenuto dei registri
CTRL REG1 e CTRL REG2 (i valori sono stati assegnati arbitrariamente). I bit meno
significativi dei due registri vengono posti a “0” quando viene ricevuto un “1” dal segnale
data ready. Qundo il Test bench riceve i contenuti dei registri decrementati di un’unità
e passa alla lettura dei registri OUT REG1, OUT REG2 e OUT REG3 (contenenti anch’essi valori arbitrari). L’andamento temporale dei segnali sotto analisi è riportato in
Figura 3.17.
La seconda simulazione riguarda la scrittura dei registri di controllo CTRL REG1
e CTRL REG2, necessaria a far eseguire una nuova conversione della misura di gas.
40
Claudio De Berti
3.3. REALIZZAZIONE DELL’INTERFACCIA
SCL
SDA
data_ready
CTRL_REG2
CTRL_REG1
SCL
SDA
data_ready
CTRL_REG2
CTRL_REG1
SCL
SDA
data_ready
CTRL_REG2
CTRL_REG1
SCL
SDA
data_ready
CTRL_REG2
41
Claudio De Berti
CTRL_REG1
Figura 3.17: Simulazione della lettura della misura di default
CAPITOLO 3. INTERFACCIA SERIALE
SDA
SCL
data_ready
CTRL_REG1
CTRL_REG2
SDA
SCL
data_ready
CTRL_REG1
CTRL_REG2
Figura 3.18: Simulazione della scrittura dei registri di controllo
All’avvio viene eseguita anche la sequenza di trasmissione utilizzata nella precedente
simulazione dal Test bench, dato che bisogna attendere il completamento della misura di
default. Le note generate, relative alla parte di trasmissione aggiunta, sono le seguenti:
21
22
23
24
# ** Note : b y t e s c r i t t o
#
Time : 2310287 n s
# ** Note : b y t e s c r i t t o
#
Time : 2400288 n s
i n CTRL REG1 :
Iteration : 0
i n CTRL REG2 :
Iteration : 0
171
Instance : / test
241
Instance : / test
Il grafico dei segnali per questa simulazione è riportato in figura Figura 3.18: si nota
immediatamente la variazione del contenuto dei registri CTRL REG1 e CTRL REG2.
Completata la seconda simulazione, si è aggiunto un altro segmento alla trasmissione:
la sequenza di lettura della misura effettuata. La terza simulazione ha generato le seguenti
righe di note:
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
42
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
** Note :
Time :
** Note :
Time :
** Note :
Time :
** Note :
Time :
** Note :
Time :
** Note :
Time :
** Note :
Time :
** Note :
Time :
b y t e CTRL REG1 : 171
2795299 n s
Iteration
b y t e CTRL REG2 : 241
2885307 n s
Iteration
b y t e CTRL REG1 : 171
3280318 n s
Iteration
b y t e CTRL REG2 : 241
3370326 n s
Iteration
b y t e CTRL REG1 : 171
3765337 n s
Iteration
b y t e CTRL REG2 : 241
3855345 n s
Iteration
b y t e CTRL REG1 : 170
4250356 n s
Iteration
b y t e CTRL REG2 : 240
4340364 n s
Iteration
: 0
Instance : / test
: 0
Instance : / test
: 0
Instance : / test
: 0
Instance : / test
: 0
Instance : / test
: 0
Instance : / test
: 0
Instance : / test
: 0
Instance : / test
Claudio De Berti
3.3. REALIZZAZIONE DELL’INTERFACCIA
41
42
43
44
45
46
47
48
#
#
#
#
#
#
#
#
** Note :
Time :
** Note :
Time :
** Note :
Time :
** Note :
Time :
Misura d i s p o n i b i l e n e i
4350364 n s
Iteration :
b y t e OUT REG1 : 15
4735375 n s
Iteration :
b y t e OUT REG2 : 240
4825383 n s
Iteration :
b y t e OUT REG3 : 170
4915391 n s
Iteration :
registri
0 Instance : / test
0
Instance : / test
0
Instance : / test
0
Instance : / test
In pratica il Test bench ripete nuovamente le sequenze di trasmissione della prima
simulazione: anche in questo caso, al decremento del contenuto dei registri di controllo
corrisponde una nuova misura disponibile. Per l’andamento temporale dei segnali si può
fare riferimento alla Figura 3.18, dato che la sequenza di trasmissione è analoga.
Simulazioni di trasmissioni errate
Sono state eseguite diverse simulazioni per verificare il corretto comportamento del dispositivo slave in caso di sequenze sul bus non corrette:
• Se il master invia, dopo la condizione di start, un indirizzo diverso da quello assegnato allo slave, questo non deve inviare l’acknowledgement. La simulazione della
trasmissione per questo caso ha generato la seguente stampa:
1
2
# ** Note : Ack non r i c e v u t o d a l l o s l a v e .
#
Time : 100201 n s
Iteration : 0 Instance : / test
Il comportamento del dispositivo progettato è corretto.
• Se si cerca di eseguire la scrittura dei registri di controllo quando è in corso una
conversione da parte del microsistema, lo slave deve terminare la trasmissione non
inviando l’ack. L’esecuzione all’accensione della seconda simulazione, descritta
nel sotto-paragrafo precedente, genera le seguenti note:
1
2
# ** Note : Ack non r i c e v u t o d a l l o s l a v e .
#
Time : 280203 n s
Iteration : 0 Instance : / test
La trasmissione termina per mancata ricezione dell’ack a circa 280 µs dall’avvio. Il
contenuto dei registri non viene modificato.
• In maniera analoga, se il master richiede la lettura dei registri OUT REGx quando una misura non è stata completata, lo slave deve interrompere la trasmissione. Eseguendo immediatamente la lettura dei registri all’accensione del sistema, la
simulazione riporta:
1
2
# ** Note : Ack non r i c e v u t o d a l l o s l a v e .
#
Time : 190202 n s
Iteration : 0 Instance : / test
Claudio De Berti
43
CAPITOLO 3. INTERFACCIA SERIALE
La trasmissione viene terminata dallo slave a circa 190 µs dall’avvio: la lettura dei
registri viene correttamente inibita quando il loro contenuto è in elaborazione dal
circuito.
Le simulazioni svolte confermano il corretto funzionamento del codice VHDL che è
in grado di rispettare pienamente l’algoritmo logico mostrato nella Figura 3.10.
Si può ora passare, nel capitolo successivo, alla descrizione delle fasi di progettazione
necessarie alla sintesi, con la tecnologia CMOS adottata, del codice scritto.
44
Claudio De Berti
Capitolo 4
Sintesi e Place and Route
La prima parte di questo capitolo riguarda la descrizione del processo di sintesi applicato
al codice VHDL sviluppato. La seconda parte del capitolo è dedicata, invece, alla descrizione del “Place and Route” del circuito, ovvero dell’insieme delle operazioni da svolgere
per ottenere il layout dell’interfaccia.
4.1
Sintesi
Nei programmi per la sintesi logica, al fine di ottenere uno schema a livello di porte logiche del circuito che deve essere progettato, l’utente ne fornisce una descrizione realizzata
in linguaggio HDL, corredata di tutti i vincoli e i requisiti richiesti:
• i vincoli di natura elettronica, che impongono limitazioni sul fanout delle porte e
sul carico d’uscita;
• i vincoli sull’area, che permettono di imporre dei limiti sulle dimensioni di un
determinato componente o dell’intero circuito integrato;
• i vincoli sulla velocità, che specificano i valori massimi di ritardo ammessi per la
propagazione dei segnali; anche in questo caso, si può sintetizzare il codice con
una direttiva generale finalizzata alla massimizzazione della velocità in funzione
del periodo di clock applicato.
Un programma di sintesi necessita l’accesso alle librerie tecnologiche (technology
library) che elencano e descrivono gli elementi logici disponibili; ogni elemento è corredato dalle caratteristiche di ritardo e carico necessarie per consentire di soddisfare i
vincoli imposti [13]. Il processo di sintesi logica trasforma una descrizione HDL di un
circuito in un elenco (netlist) di elementi di memoria e componenti combinatori presenti
nella libreria tecnologica utilizzata.
La prima fase di un processo di sintesi consiste nella traduzione della descrizione
HDL in una rappresentazione intermedia, che descrive il circuito come interconnessione
tra porte ed elementi di memoria generici, non facenti parte delle librerie tecnologiche.
Claudio De Berti
45
CAPITOLO 4. SINTESI E PLACE AND ROUTE
La seconda fase consiste nella pre-ottimizzazione della rappresentazione intermedia del circuito: questa viene elaborata al fine di semplificarne la forma, ad esempio
condividendo parti di circuito che erano separate nella descrizione di partenza.
Infine, nella fase di ottimizzazione, ogni elemento logico è sostituito dall’elemento corrispondente contenuto nelle librerie tecnologiche e, con opportune elaborazioni, il
programma di sintesi tenta di soddisfare i vincoli specificati. Se il rispetto dei vincoli non
è realizzabile, è necessario rivedere le specifiche progettuali o modificare la descrizione
HDL di partenza.
In questo progetto la sintesi è stata svolta usando il programma Encounter RTL Compiler prodotto da Cadence per ambiente Linux.
4.1.1
Esecuzione della sintesi
Encounter RTL Compiler è un programma con un’interfaccia grafica ridotta e i comandi
da eseguire devono essere impartiti da riga di comando. Per semplificare il flusso di progetto, è stato realizzato uno script contenente tutti i comandi utilizzati [14]. L’esecuzione
dello script non solo avvia la sintesi, ma genera anche tutti i risultati utili alle successive analisi del circuito sintetizzato, riportate nel prossimo paragrafo. Per la consultazione
dello script si rimanda all’appendice B.
La libreria tecnologica utilizzata è la c35 CORELIB 2.21 dell’austriamicrosystem. La
libreria è sviluppata sullo stesso processo produttivo a 0.35 µm con cui è stato progettato
il circuito d’interfaccia della matrice.
Per la sintesi non si sono assegnati vincoli specifici sull’area e la velocità: Encounter
utilizza direttive generali per calcolare il migliore trade-off tra area occupata e velocità
del circuito. La scelta e il dimensionamento dei componenti logici vengono unicamente
svolti in funzione della frequenza operativa del segnale di clock, parametro descritto, con
l’opportuno comando, all’interno dello script.
4.1.2
Risultati della sintesi
Se la sintesi avviene con successo, Encounter genera lo schematico del circuito descritto
come interconnessione di componenti logici provenienti dalla libreria tecnologica (Figura 4.1); a scopo esemplificativo, nella Figura 4.2 viene riportato un dettaglio dello
schematico che mostra alcune porte logiche utilizzate e il registro d’ingresso del segnale
scl.
L’elenco dei componenti utilizzati nel circuito generato è il seguente:
Gate
Instances
Area
Library
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
ADD22
3
436.800
c35 CORELIB
AOI211
4
291.200
c35 CORELIB
AOI2111
3
273.000
c35 CORELIB
AOI221
43
3913.000
c35 CORELIB
AOI311
2
182.000
c35 CORELIB
BUFE2
1
145.600
c35 CORELIB
46
Claudio De Berti
4.1. SINTESI
Figura 4.1: Schematico generato da Encounter
Figura 4.2: Un dettaglio dello schematico
Claudio De Berti
47
CAPITOLO 4. SINTESI E PLACE AND ROUTE
CLKIN1
1
36.400
c35 CORELIB
CLKIN2
3
109.200
c35 CORELIB
CLKIN3
10
364.000
c35 CORELIB
DFC3
25
7735.000
c35 CORELIB
DFCP3
1
327.600
c35 CORELIB
DFEC1
103 3 5 6 1 7 . 4 0 0
c35 CORELIB
DFECP1
2
764.400
c35 CORELIB
DFEP1
7
2420.600
c35 CORELIB
DFP3
6
1856.400
c35 CORELIB
IMUX20
3
273.000
c35 CORELIB
IMUX21
1
91.000
c35 CORELIB
INV1
2
72.800
c35 CORELIB
INV2
11
400.400
c35 CORELIB
INV3
6
218.400
c35 CORELIB
NAND20
1
54.600
c35 CORELIB
NAND22
38
2074.800
c35 CORELIB
NAND31
6
436.800
c35 CORELIB
NAND41
10
910.000
c35 CORELIB
NOR21
45
2457.000
c35 CORELIB
NOR31
7
509.600
c35 CORELIB
NOR40
5
364.000
c35 CORELIB
OAI2111
7
637.000
c35 CORELIB
OAI212
12
873.600
c35 CORELIB
OAI222
6
546.000
c35 CORELIB
OAI311
2
182.000
c35 CORELIB
XNR21
2
218.400
c35 CORELIB
XOR21
2
254.800
c35 CORELIB
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
total
380 6 5 0 4 6 . 8 0 0
Nello schematico ottenuto non è presente alcun tipo di latch : questo significa che il codice
VHDL di partenza permette una corretta sintesi in logica sequenziale sincrona. L’area
totale occupata è di circa 0,065 mm2 , ed è cosı̀ suddivisa:
Type
Instances
Area
Area %
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
sequential
144 4 8 7 2 1 . 4 0 0
74.9
inverter
33 1 2 0 1 . 2 0 0
1.8
tristate
1
145.600
0.2
logic
202 1 4 9 7 8 . 6 0 0
23.0
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
total
380 6 5 0 4 6 . 8 0 0 1 0 0 . 0
Circa tre quarti dell’area sono occupati da componenti di logica sequenziale, inverter e
porte logiche occupano lo spazio restante; il componente tristate è il buffer utilizzato per
il controllo del segnale sulla linea SDA del bus.
Completata la sintesi, Encounter genera un file Verilog che descrive la netlist del
circuito ottenuto: questo file è fondamentale nella successiva fase di layout del sistema. Il
programma inoltre genera un file SDF (Standard Delay Format), al cui interno vengono
specificati tutti i ritardi introdotti dai componenti logici utilizzati.
4.1.3
Simulazioni post-sintesi
Il file Verilog e il relativo file SDF possono essere utilizzati per simulare il comportamento del circuito sintetizzato. Le simulazioni sono state svolte in ModelSim. Il programma
48
Claudio De Berti
4.1. SINTESI
consente l’utilizzo della libreria tecnologica c35 CORELIB che rende possibile la corretta interpretazione delle netlist generate da Encounter. Nonostante la netlist sia descritta
in Verilog, è possibile riutilizzare il Test bench precedentemente scritto in VHDL. L’esecuzione di una simulazione con le annotazioni del file SDF permette di verificare, in
prima approssimazione, l’effettivo funzionamento del circuito.
La simulazione riportata in questo paragrafo comprende le esecuzioni della sequenza
per la lettura della misura di default, della sequenza per la scrittura di tutti i registri di
controllo e della sequenza per la lettura di tutti i registri contenenti misure. L’elenco delle
note generate dal Test bench è il seguente:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# ** Note : ( vsim −3587) SDF B a c k a n n o t a t i o n S u c c e s s f u l l y C o m p l e t e d .
#
Time : 0 f s
I t e r a t i o n : 0 Region : / t e s t
F i l e : D : / VHDL/
I 2 C S l a v e p o s t s i n t e s i / t e s t s l a v e . vhd
# ** Note : b y t e CTRL REG1 : 169
#
Time : 427988777735 f s
Iteration : 0 Instance : / test
# ** Note : b y t e CTRL REG2 : 85
#
Time : 527996777725 f s
Iteration : 0 Instance : / test
# ** Note : b y t e CTRL REG1 : 169
#
Time : 966896666570 f s
Iteration : 0 Instance : / test
# ** Note : b y t e CTRL REG2 : 85
#
Time : 1066904666560 f s
Iteration : 0 Instance : / test
# ** Note : b y t e CTRL REG1 : 168
#
Time : 1505804555405 f s
Iteration : 0 Instance : / test
# ** Note : b y t e CTRL REG2 : 84
#
Time : 1605812555395 f s
Iteration : 0 Instance : / test
# ** Note : M i s u r a d i s p o n i b i l e n e i r e g i s t r i
#
Time : 1616923666505 f s
Iteration : 0 Instance : / test
# ** Note : b y t e OUT REG1 : 15
#
Time : 2044712444240 f s
Iteration : 0 Instance : / test
# ** Note : b y t e OUT REG2 : 240
#
Time : 2144720444230 f s
Iteration : 0 Instance : / test
# ** Note : b y t e OUT REG3 : 170
#
Time : 2244728444220 f s
Iteration : 0 Instance : / test
# ** Note : b y t e s c r i t t o i n TEMP REG1 : 64
#
Time : 2566953666410 f s
Iteration : 0 Instance : / test
# ** Note : b y t e s c r i t t o i n TEMP REG2 : 45
#
Time : 2666954666400 f s
Iteration : 0 Instance : / test
# ** Note : b y t e s c r i t t o i n TEMP REG3 : 78
#
Time : 2766955666390 f s
Iteration : 0 Instance : / test
# ** Note : b y t e s c r i t t o i n TEMP REG4 : 16
#
Time : 2866956666380 f s
Iteration : 0 Instance : / test
# ** Note : b y t e s c r i t t o i n TEMP REG5 : 12
#
Time : 2966957666370 f s
Iteration : 0 Instance : / test
# ** Note : b y t e s c r i t t o i n TEMP REG6 : 121
#
Time : 3066958666360 f s
Iteration : 0 Instance : / test
# ** Note : b y t e s c r i t t o i n SET REG1 : 23
#
Time : 3166959666350 f s
Iteration : 0 Instance : / test
# ** Note : b y t e s c r i t t o i n SET REG2 : 33
#
Time : 3266960666340 f s
Iteration : 0 Instance : / test
# ** Note : b y t e s c r i t t o i n CTRL REG1 : 91
#
Time : 3366961666330 f s
Iteration : 0 Instance : / test
# ** Note : b y t e s c r i t t o i n CTRL REG2 : 81
#
Time : 3466962666320 f s
Iteration : 0 Instance : / test
# ** Note : b y t e CTRL REG1 : 90
#
Time : 3905862555165 f s
Iteration : 0 Instance : / test
# ** Note : b y t e CTRL REG2 : 80
#
Time : 4005870555155 f s
Iteration : 0 Instance : / test
# ** Note : M i s u r a d i s p o n i b i l e n e i r e g i s t r i
#
Time : 4016981666265 f s
Iteration : 0 Instance : / test
# ** Note : b y t e OUT REG1 : 15
Claudio De Berti
49
CAPITOLO 4. SINTESI E PLACE AND ROUTE
50
51
52
53
54
55
56
57
58
#
#
#
#
#
#
#
#
#
Time :
** Note :
Time :
** Note :
Time :
** Note :
Time :
** Note :
Time :
4444770444 p s
Iteration : 0
b y t e OUT REG2 : 240
4544778443990 f s
Iteration :
b y t e OUT REG3 : 170
4644786443980 f s
Iteration :
b y t e OUT TEMP1 : 85
4744794443970 f s
Iteration :
b y t e OUT TEMP2 : 204
4844802443960 f s
Iteration :
Instance : / test
0
Instance : / test
0
Instance : / test
0
Instance : / test
0
Instance : / test
Dai risultati ottenuti, consegue che il codice VHDL è stato correttamente sintetizzato
e la netlist generata può essere utilizzata nella successiva fase del progetto, ovvero la
realizzazione del layout del circuito.
4.2
Place and Route
Con il processo di ‘Place and Route’ si ottiene il layout di un circuito partendo dalla netlist
generata da un programma di sintesi. Il processo è composto dalle seguenti fasi [15]:
1. Floorplanning. In questa fase si determina quale debba essere l’area occupata su
silicio dal circuito, nonché il rapporto tra altezza e larghezza di quest’ultima. Inoltre, si stabilisce il posizionamento dei pin e la loro tipologia. È possibile anche
suddividere lo spazio a disposizione in blocchi, nel caso si voglia svolgere il layout
di più netlist.
2. Placement. In questa fase vengono posizionati, all’interno dell’area a disposizione,
i componenti logici presenti nella netlist, prelevati dalla libreria tecnologica utilizzata; è possibile posizionare anche macro blocchi non descritti con celle standard,
ma di cui si è già eseguito il layout. Il posizionamento è ottimizzato per minimizzare l’area occupata e per rispettare eventuali vincoli sulle temporizzazioni di specifici
segnali.
3. Routing. In questa fase vengono generate le interconnessioni tra celle e le connessioni dalle celle ai pin. Le piste vengono realizzate utilizzando i livelli di metal a
disposizione.
4. Layout Completion. In questa fase viene perfezionato il layout. Ad esempio, il programma può inserire, negli spazi rimasti liberi, delle capacità di disaccoppiamento per migliorare la distribuzione dell’alimentazione; oppure può inserire sezioni
dummy di metal per migliorare la resa del processo produttivo del circuito; è anche
possibile verificare violazioni sulle lunghezze delle linee che potrebbero causare
l’imprigionamento di cariche elettriche nelle metal durante la realizzazione fisica
dell’integrato, danneggiando cosı̀ l’ossido dei gate.
5. Layout Verification. Ottenuto il layout del circuito, il programma verifica che le regole di layout siano state rispettate. In questa fase è possibile calcolare le resistenze
e le capacità parassite introdotte nel circuito dalla realizzazione fisica delle celle e
50
Claudio De Berti
4.2. PLACE AND ROUTE
Figura 4.3: Floorplanning del circuito
delle interconnessioni; il calcolo delle RC parassite consente di simulare la netlist
estratta dal layout con la giusta accuratezza delle temporizzazioni dei segnali.
4.2.1
Realizzazione del layout
Per ottenere il layout del circuito si è utilizzato il programma Encounter Ditital Implementation System RTL-to-GDSII sviluppato da Cadence. Come per il programma di
sintesi, anche in questo tool di Enconter l’interfaccia grafica è ridotta e tutti i comandi da
impartire per l’esecuzione del flusso sono testuali. Per questo motivo è stato realizzato
uno script (appendice B), con la cui esecuzione si ottiene il layout finito del circuito e la
generazione di tutti i file necessari alle successive fasi di progettazione e simulazione. I
passaggi eseguiti per l’ottenimento del layout dell’interfaccia sono descritti di seguito in
questo paragrafo.
Floorplanning
Al momento si è assegnata all’area del circuito una forma quadrata. Quando verrà assemblato il layout di tutto il microsistema, probabilmente sarà necessario modificare la forma
in funzione dell’ottimizzazione della superficie totale occupata da tutti i componenti. L’area è calcolata dal programma al fine di minimizzare lo spazio occupato e risulta essere
di 0,075 mm2 . Ai bordi dell’area del circuito vengono posizionati i pin, procedura svolta
manualmente al primo avvio del processo di “Place and Route”; il posizionamentod dei
pin è poi salvato in uno specifico file che verrà richiamato dallo script. Anche l’orientamento dei pin potrà subire modifiche in funzione delle richieste di layout del sistema.
La struttura che si ottiene è mostrata in Figura 4.3. Il circuito presenta un’area centrale
suddivisa in righe che è dedicata al posizionamento delle celle.
Claudio De Berti
51
CAPITOLO 4. SINTESI E PLACE AND ROUTE
Figura 4.4: Layout delle alimentazioni
Placement
Il primo passo della fase di placement consiste nel posizionamento degli anelli di alimentazione (Power Ring) realizzati in metal: il più esterno per la vdd e il più interno per
la gnd (blu=Metal 1, rosso=Metal 2). Le righe destinate alle celle vengono dotata delle
alimentazioni tramite delle linee in Metal 1 (Power Stripes) che corrono per tutta la loro
lunghezza. L’adattamento tra gli anelli e le righe di alimentazione viene svolto da delle
apposite celle posizionate all’inizio e alla fine di ogni riga (End Cap Cells). Dopo questi
passaggi, la struttura si presenta come in Figura 4.4.
A questo punto viene effettuato il posizionamento dei componenti logici richiamati dalla netlist (Figura 4.5). Il programma cerca di trovare l’ordine di posizionamento
ottimale per ridurre al minimo le lunghezze delle successive interconnessioni tra le celle.
Una volta posizionate le celle, viene eseguita la sintesi del clock tree (CTS) [16]. Le
interconnessioni fisiche introducono capacità parassite e rumore sui segnali che trasportano; inoltre i carichi capacitivi sono distribuiti in maniera non uniforme. Nonostante
questo inconveniente, il layout deve offrire un segnale di clock idealmente identico a tutti
i componenti sincroni del circuito. Per questa ragione, il programma utilizza algoritmi
per il calcolo della distribuzione ottimale del segnale di clock, in funzione dei vincoli assegnati sulle temporizzazioni. Il processo di sintesi introduce, dove necessario, dei buffer
per ripristinare le caratteristiche del segnale e delle capacità per uniformare la distribuzione dei carichi. Il risultato della CTS è chiamato “albero” di distribuzione del clock : i
buffer introdotti rappresentano le ramificazioni, mentre i carichi capacitivi e i componenti
sincroni rappresentano le foglie.
Terminata la CTS, nessun altro componete dovrà essere posizionato. Gli spazi rimasti liberi dell’area a disposizione vengono riempiti da celle prive di alcuna funzione
(Filler Cells) con lo scopo di aumentare l’omogeneità superficiale del layout, andando a
52
Claudio De Berti
4.2. PLACE AND ROUTE
Figura 4.5: Posizionamento delle celle
migliorare la resa del processo produttivo.
Routing
Il passo finale per completare il layout è la realizzazione delle interconnessioni. Encounter
calcola la migliore disposizione possibile per le linee dei segnali in funzione del posizionamento delle celle e dei pin, tenendo anche conto del clock tree calcolato nella CTS. Il
layout del circuito, completo di interconnessioni, è mostrato in Figura 4.6.
Figura 4.6: Layout completato
Claudio De Berti
53
CAPITOLO 4. SINTESI E PLACE AND ROUTE
Il layout generato viene quindi esportato nel formato GDSII, standard utilizzato nei
programmi per il layout nonché nella fabbricazione delle maschere per la realizzazione
dei circuiti integrati. Il file GDSII che si ottiene verrà utilizzato per inserire l’interfaccia
progettata all’interno del layout del sistema.
L’esecuzione dello script esporta una nuova netlist descritta in Verilog relativa allo
schematico corrispondente al layout, che contiene anche la struttura del clock tree.
Infine Encounter esegue il calcolo dei parassiti RC introdotti dal layout. Il file SDF
che si può ora generare, oltre a contenere i ritardi introdotti dai componenti logici, descrive anche i ritardi delle interconnessioni dovuti alle RC parassite.
4.2.2
Simulazioni post-layout
In maniera analoga a quanto è stato svolto per le simulazioni post-sintesi, è possibile valutare il funzionamento del circuito ottenuto importando in ambiente ModelSim il file
Verilog della netlist e il corrispondente file SDF post-layout. Le simulazioni permettono
di valutare, con buona approssimazione, il corretto comportamento dell’interfaccia a layout completato. La simulazione riportata in questo paragrafo è relativa alla sequenza di
trasmissione già utilizzata per analizzare il circuito post-sintesi. Il grafico dei principali
segnali è mostrato in Figura 4.7, Figura 4.8 e Figura 4.9. Queste simulazioni confermano
il corretto funzionamento dell’interfaccia.
54
Claudio De Berti
4.2. PLACE AND ROUTE
SCL
SDA
data_ready
TEMP_REG1
TEMP_REG2
TEMP_REG3
TEMP_REG4
TEMP_REG5
SET_REG2
SET_REG1
TEMP_REG6
CTRL_REG2
CTRL_REG1
SCL
SDA
data_ready
TEMP_REG1
TEMP_REG2
TEMP_REG3
TEMP_REG4
TEMP_REG5
SET_REG1
TEMP_REG6
SET_REG2
CTRL_REG2
CTRL_REG1
SCL
SDA
data_ready
TEMP_REG1
TEMP_REG2
TEMP_REG3
TEMP_REG5
TEMP_REG4
SET_REG1
55
Claudio De Berti
TEMP_REG6
SET_REG2
CTRL_REG2
CTRL_REG1
Figura 4.7: Simulazione con annotazione SDF, prima parte
CAPITOLO 4. SINTESI E PLACE AND ROUTE
SCL
SDA
data_ready
TEMP_REG1
TEMP_REG2
TEMP_REG3
TEMP_REG5
TEMP_REG4
SET_REG2
SET_REG1
TEMP_REG6
CTRL_REG2
CTRL_REG1
SCL
SDA
data_ready
TEMP_REG1
TEMP_REG2
TEMP_REG3
TEMP_REG5
TEMP_REG4
SET_REG2
SET_REG1
TEMP_REG6
CTRL_REG2
CTRL_REG1
SCL
SDA
data_ready
TEMP_REG1
TEMP_REG2
TEMP_REG3
TEMP_REG5
TEMP_REG4
SET_REG2
SET_REG1
TEMP_REG6
CTRL_REG2
Claudio De Berti
56
CTRL_REG1
Figura 4.8: Simulazione con annotazione SDF, seconda parte
4.2. PLACE AND ROUTE
SCL
SDA
data_ready
TEMP_REG1
TEMP_REG2
TEMP_REG3
TEMP_REG5
TEMP_REG4
SET_REG1
TEMP_REG6
SET_REG2
CTRL_REG2
CTRL_REG1
SCL
SDA
data_ready
TEMP_REG1
TEMP_REG2
TEMP_REG3
TEMP_REG4
TEMP_REG5
SET_REG1
TEMP_REG6
SET_REG2
CTRL_REG2
CTRL_REG1
SCL
SDA
data_ready
TEMP_REG1
TEMP_REG2
TEMP_REG3
TEMP_REG5
TEMP_REG4
SET_REG1
57
Claudio De Berti
TEMP_REG6
SET_REG2
CTRL_REG2
CTRL_REG1
Figura 4.9: Simulazione con annotazione SDF, terza parte
Capitolo 5
Simulazioni in Cadence Virtuoso
I risultati ottenuti nelle fasi di sintesi e layout possono essere importati in ambiente Cadence Virtuoso, programma utilizzato nella progettazione del circuito d’interfaccia della
matrice di sensori. In questo capitolo viene descritta la metodologia seguita per consentire la simulazione della netlist creata da Encounter RTL Compiler e relativa al layout del
circuito.
5.1
Simulazioni con segnali misti
Il programma Cadence Virtuoso consente la simulazione di sistemi a segnali misti, ovvero
circuiti integrati dotati sia di sezioni analogiche sia digitali. All’interno del sistema, ogni
cella digitale può essere descritta in diversi modi:
• La descrizione functional prevede la rappresentazione del circuito in linguaggio
HDL. Questo permette di eseguire simulazioni caratterizzate da ridotti tempi d’esecuzione. Il comportamento della cella, in caso di descrizione HDL con alto livello
di astrazione, è puramente ideale. Invece, se la descrizione è in codice HDL generato da un programma di sintesi o di layout a cui è associato un file SDF, il risultato
della simulazione è prossimo al comportamento reale del circuito. Nel caso in esame, la cella digitale viene simulata utilizzando la descrizione in Verilog della netlist
generata dal programma di Place and Route. Le simulazioni che si ottengono sono
analoghe a quelle svolte in ModelSim riportate nel capitolo precedente.
• La descrizione symbol ricorre allo schematico del circuito digitale. Partendo dalla
descrizione in Verilog della netlist, Virtuoso crea lo schematico del circuito, utilizzando le celle logiche della libreria tecnologica. Il comportamento del circuito
rimane ideale, ma è possibile introdurre parametri sui segnali in ingresso e uscita
utili nelle simulazioni con segnali provenienti o destinati a circuiti analogici. Inoltre, si possono introdurre i ritardi delle porte logiche dichiarati dal fornitore della
tecnologia in uso.
Claudio De Berti
59
CAPITOLO 5. SIMULAZIONI IN CADENCE VIRTUOSO
• La descrizione cmos sch ricorre anch’essa allo schematico del circuito digitale. In
questo caso ogni porta logica utilizzata viene simulata a livello di transistor. I risultati che si ottengono rispecchiano fedelmente il comportamento reale del circuito a
scapito di tempi d’esecuzione estremamente lunghi.
In sistemi a segnali misti è quindi possibile simulare simultaneamente la parte analogica a livello di transistor e la parte digitale a livello comportamentale. Questa soluzione
consente, in fase di sviluppo della sezione analogica, di ridurre notevolmente i tempi
necessari alle simulazioni del comportamento dell’intero sistema.
Nella progettazione del microsistema è stato utilizzato, tra quelli offerti da Virtuoso,
il simulatore a segnali misti SpectreVerilog. Tale scelta progettuale implica che la descrizione comportamentale delle celle digitali avvenga utilizzando il linguaggio Verilog.
5.2
Programmazione del master I2C
Per poter generare le sequenze di trasmissioni dei segnali scl e sda, con cui simulare il
comportamento dell’interfaccia progettata, è stato necessario programmare una cella in
linguaggio Verilog che descriva il comportamento di un dispositivo I2 C di tipo master
(Figura 5.1). Dato che la cella viene utilizzata solo per la generazione dei segnali e non
deve essere sintetizzata in standard cells, si può utilizzare una sintassi del codice Verilog
simile ai linguaggi di programmazione informatica. Dal punto di vista pratico, l’interfaccia master progettata è analoga, nel comportamento e nell’utilizzo, al Test bench in
VHDL utilizzato nello sviluppo in ambiente ModelSim: le sequenze di trasmissione si
creano richiamando delle funzioni (task ) che controllano l’andamento temporale dei segnali sul bus. Durante l’esecuzione della trasmissione, la cella è in grado di generare delle
notifiche che vengono riportate nel report della simulazione consentendo una verifica rapida del comportamento del dispositivo in esame. Il codice relativo alla cella è riportato
nell’appendice A.
Figura 5.1: Cella master
5.3
Test Bench per l’interfaccia I2C
L’interfaccia progettata è stata importata in uno schematico di Test Bench creato appositamente per effettuare le simulazioni comportamentali del circuito al fine di verificarne
60
Claudio De Berti
5.3. TEST BENCH PER L’INTERFACCIA I2 C
il corretto funzionamento in ambiente Virtuoso, prima del suo inserimento all’interno
del microsistema. Nel programma è stata creata la cella slave PostLayout che ha come
descrizione functional la netlist generata da Encounter RTL Compiler. La cella è stata
dotata anche di descrizione symbol e cmos sch. Le porte sda e scl sono connesse alla
cella master. I segnali che dovrebbero provenire dal circuito d’interfaccia della matrice
vengono generati dalla cella altri segnali, descritta anch’essa in linguaggio Verilog (codice nell’appendice A). Per le alimentazioni e il clock vengono utilizzati appositi generatori.
Lo schematico appena descritto è mostrato in Figura 5.2.
5.3.1
Simulazioni
Le prime simulazioni effettuate sono stata eseguite utilizzando la descrizione functional
della cella slave PostLayout, associando al codice Verilog le annotazioni SDF. La sequenza di trasmissione riportata riguarda la lettura della misura di default ed è analoga a quella
utilizzata nella prima simulazione svolta nel Capitolo 3. Al termine della simulazione,
all’interno del report generato da Virtuoso, vengono riportate le seguenti annotazioni:
I n d i r i z z o s l a v e i n v i a t o . Ack r i c e v u t o ? [ 1 =>
B y t e c o n t e n u t o i n CTRL REG1 : 169
B y t e c o n t e n u t o i n CTRL REG2 : 85
I n d i r i z z o s l a v e i n v i a t o . Ack r i c e v u t o ? [ 1 =>
B y t e c o n t e n u t o i n CTRL REG1 : 169
B y t e c o n t e n u t o i n CTRL REG2 : 85
I n d i r i z z o s l a v e i n v i a t o . Ack r i c e v u t o ? [ 1 =>
B y t e c o n t e n u t o i n CTRL REG1 : 168
B y t e c o n t e n u t o i n CTRL REG2 : 84
Misura d i s p o n i b i l e n e i r e g i s t r i di l e t t u r a .
I n d i r i z z o s l a v e i n v i a t o . Ack r i c e v u t o ? [ 1 =>
B y t e c o n t e n u t o i n OUT REG1 : 130
B y t e c o n t e n u t o i n OUT REG2 : 230
B y t e c o n t e n u t o i n OUT REG3 : 240
NO] [ 0 => S I ] :
0
NO] [ 0 => S I ] :
0
NO] [ 0 => S I ] :
0
NO] [ 0 => S I ] :
0
Ne deriva che l’interfaccia importata in ambiente Cadence Virtuoso risponde correttamente alla trasmissione effettuata dalla cella master.
Ripetendo la simulazione utilizzando la descrizione symbol della cella, il risultati che
si ottengono non differiscono: lo schematico ricostruito dal programma partendo dalla netlist funziona correttamente ed è cosı̀ possibile utilizzare la cella slave PostLayout
all’interno del microsistema in sviluppo.
5.3.2
Valutazione dei consumi
Sempre utilizzando lo schematico di Test Bench, si è valutato il consumo medio di potenza
della sola interfaccia I2 C. Questo è stato possibile simulando il circuito a livello transistor, ovvero con descrizione cmos sch. Dato l’elevato tempo d’esecuzione richiesto, si
è simulata solamente la sequenza di trasmissione dell’invio dell’indirizzo dello slave seguita dall’invio dell’indirizzo di un registro: si tratta di un transitorio di circa 200 µs e il
tempo richiesto dal programma per completare la simulazione è stato di alcune ore.
Claudio De Berti
61
CAPITOLO 5. SIMULAZIONI IN CADENCE VIRTUOSO
Figura 5.2: Schematico del Test Bench
62
Claudio De Berti
5.4. INSERIMENTO DELL’INTERFACCIA NEL MICROSISTEMA
Nel transitorio in esame la corrente media richiesta dall’interfaccia è di circa 12 µA.
Dato che la tensione d’alimentazione della tecnologia CMOS in uso è di 3.3 V, la potenza
media assorbita risulta essere di circa 40 µW. I valori ottenuti si riferiscono alla velocità
massima di trasmissione consentita dal protocollo I2 C standard. A bit-rate inferiori, i
consumi istantanei saranno minori, ma il tempo necessario per completare la trasmissione
è superiore.
5.4
Inserimento dell’interfaccia nel microsistema
Verificato il corretto funzionamento dell’interfaccia progettata all’interno dell’ambiente
di sviluppo Virtuoso, le celle slave PostLayout e master sono state inserite nello schematico del circuito di controllo e lettura della matrice di sensori. Nella Figura 5.3 viene
mostrata la struttura del top level cosı̀ ottenuto. Tale operazione consente ora di simulare
il comportamento del sistema, con l’interfaccia seriale I2 C.
5.4.1
Simulazione dell’intero sistema
La simulazione svolta riportata riguarda il compimento della procedura per ottenere la
misura di default seguita dall’avvio di una nuova procedura di misura selezionata tramite
la scrittura degli appositi registri. Nella parte superiore della Figura 5.4 vengono mostrati
il segnale di controllo, risultante dall’operazione di and tra i bit RM1 e RM2, e il segnale
generato dall’oscillatore del circuito di misura. Al rilascio del reset, il segnale di controllo
è a livello logico alto e la misura di default viene avviata: la prima oscillazione riguarda
la procedura di conversione grezza; al suo termine, viene avviata l’oscillazione per la
conversione a piena dinamica. Completata la conversione, il valore della misurazione è
disponibile nei registri di lettura e il segnale di controllo si abbassa, ovvero i bit RM1
e RM2 vengono posti a ‘0’. A questo punto viene eseguita la trasmissione sul bus I2 C
riportata nella parte inferiore della Figura 5.4: tale trasmissione permette di leggere dai
tre registri OUT REGx e consente di scrivere nei registri CTRL REGx la nuova misura
da avviare, reimpostando a ‘1’ i bit RM1 e RM2. Quest’ultima operazione alza il valore
logico del segnale di controllo e la procedura relativa alla misura richiesta viene avviata.
Claudio De Berti
63
CAPITOLO 5. SIMULAZIONI IN CADENCE VIRTUOSO
Polarizzazioni dei sensori
Multiplexer
Logica di controllo e interfaccia I2C
Circuito di misura
Figura 5.3: Schematico del sistema
64
Claudio De Berti
5.4. INSERIMENTO DELL’INTERFACCIA NEL MICROSISTEMA
SCL
SDA
SCL
SDA
Figura 5.4: Segnale di controllo e oscillazioni generate dal circuito di misura (sopra) Lettura della misura e scrittura dei registri di controllo (sotto)
Claudio De Berti
65
Conclusioni
In questa tesi è stato riportato l’intero flusso di progettazione di un’interfaccia seriale
con cui leggere e programmare il circuito di controllo di una matrice di sensori di gas.
L’interfaccia progettata rispetta le specifiche imposte dal protocollo I2 C e verrà inserita
all’interno del microsistema integrato in sviluppo per il progetto PRIN 20085AJSEB.
L’adozione di un’interfaccia seriale permetterà di semplificare la realizzazione del sistema necessario all’acquisizione delle misure effettuate dal sensore, sistema che in primo
luogo verrà utilizzato per sviluppare gli algoritmi di elaborazione dei dati. La comunicazione sul bus seriale verrà gestita ricorrendo ad un’interfaccia di tipo master programmata
su FPGA. In sviluppi futuri dell’utilizzo del sensore, si potrà ricorrere anche a un sistema
basato su PIC dotato di porta seriale I2 C, soluzione caratterizzata da costi contenuti.
Durante il lavoro di tesi, si è messo a punto il flusso progettuale da seguire per la
realizzazione di sezioni digitali di circuiti integrati con la tecnologia a 0.35 µm offerta
dall’austriamicrosystem. Gli script realizzati per l’esecuzione di sintesi e layout verranno
utilizzati nel laboratorio di Sensori e Microsistemi per la realizzazione del layout dei
blocchi digitali del microsistema e in generale per progetti futuri che adotteranno tale
processo produttivo.
L’interfaccia I2 C realizzata in VHDL potrà essere implementata, con le opportune
modifiche, in altri microsistemi sviluppati dal laboratorio SMS dell’Università degli Studi
di Pavia.
Claudio De Berti
67
Bibliografia
[1] Direttiva 2008/50/CE relativa alla qualità dell’aria ambiente e per un’aria più pulita
in Europa, Il Parlamento Europeo e il Consiglio dell’Unione Europea, Maggio 2008.
[2] Wheater, Young, Lowe, Stevens, and Heath, Istologia e anatomia microscopica,
5th ed. Elsevier, 2007.
[3] S. Capone, P. Siciliano, N. Barsan, U. Weimar, and L. Vasanelli, “Analysis of
CO and CH4 gas mixtures by using a micromachined sensor array,” Sensors and
Actuators B: Chemical, vol. 78, pp. 40–48, 2001.
[4] F. Conso, M. Grassi, P. Malcovati, and A. Baschirotto, “A very high dynamic range
interface circuit for resistive gas sensor matrix read-out,” Proceedings of IEEE International Symposium on Circuits and Systems (ISCAS), Rio de Janeiro, Brazil, pp.
2209–2212, May 2011.
[5] M. Grassi, P. Malcovati, and A. Baschirotto, “A 141-db dynamic range cmos gassensor interface circuit without calibration with 16-bit digital output word,” SolidState Circuits, IEEE Journal of, pp. 1543 – 1554, 2007.
[6] LIS3LV02DL: MEMS inertial sensor 3-axis - ±2g/±6g digital output low voltage
linear accelerometer, STMicroelectronics, 2008.
[7] TDA9984: HDMI 1.3 transmitter with 1080p upscaler embedded, NXP, 2009.
[8] D. Thomas and P. Moorby, The Verilog Hardware Description Language. Springer,
2008.
[9] M. Zwolinski, VHDL. Progetto di sistemi digitali.
Pearson, 2007.
[10] W. H. Glauert, VHDL Tutorial, Universität Erlangen-Nürnberg, http://www.vhdlonline.de/.
[11] THE I2 C-BUS SPECIFICATION, Version 2.1, Philips, January 2001.
[12] C. C. Lin, What’s a Tri-state Buffer?, 2003.
[13] C. Kime, Reti logiche.
Claudio De Berti
Pearson, 2002.
69
BIBLIOGRAFIA
[14] Using Encounter® RTL Compiler, Cadence Design Systems, June 2007.
[15] P. Lee, Introduction to Place and Route Design in Vlsis.
Lulu.com, 2006.
[16] I. Kourtev, B. Taskin, and E. Friedman, Timing Optimization Through Clock Skew
Scheduling. Springer, 2008.
70
Claudio De Berti
Ringraziamenti
Innanzitutto desidero ringraziare il Prof. Piero Malcovati per avermi dato l’opportunità di
realizzare questo progetto di tesi e per essere stato sempre disponibile nei miei confronti.
Voglio ringraziare l’Ing. Marco Grassi e l’Ing. Fabrizio Conso che mi hanno seguito
durante la realizzazione del progetto, dandomi preziosi consigli e suggerimenti.
Ringrazio i mie genitori che mi son sempre stati vicino e che mi hanno permesso di
concludere il mio ciclo di studi.
Ringrazio i nonni per aver avuto sempre fiducia in me.
Un ringraziamento speciale agli amici di corso: Elia, Ivan, Elisa, Laura, Fabrizio e Matteo. Grazie a loro è stato un piacere trascorrere i due anni della specialistica.
Infine ringrazio tutti i miei amici di sempre e chi mi ha fatto compagnia durante questi
anni a Pavia.
Claudio De Berti
71
Appendice A
Codici HDL
A.1
Codici VHDL
A.1.1
Descrizione dell’interfaccia
1
2
3
l i b r a r y IEEE ;
u s e IEEE . s t d l o g i c 1 1 6 4 . a l l ;
use i e e e . s t d l o g i c a r i t h . a l l ;
4
5
6
7
8
9
10
11
package t o p s l a v e i s
component s l a v e
port (
reset
clock
sda
scl
data ready :
:
:
:
:
in s t d l o g i c ;
in s t d l o g i c ;
inout s t d l o g i c ;
in s t d l o g i c ;
in s t d l o g i c ;
12
−− R e g i s t r i
CTRL REG1
CTRL REG2
SET REG1
SET REG2
TEMP REG1
TEMP REG2
TEMP REG3
TEMP REG4
TEMP REG5
TEMP REG6
13
14
15
16
17
18
19
20
21
22
23
:
:
:
:
:
:
:
:
:
:
di s c r i t t u r a :
out s t d l o g i c
out s t d l o g i c
out s t d l o g i c
out s t d l o g i c
out s t d l o g i c
out s t d l o g i c
out s t d l o g i c
out s t d l o g i c
out s t d l o g i c
out s t d l o g i c
vector
vector
vector
vector
vector
vector
vector
vector
vector
vector
(7
(7
(7
(7
(7
(7
(7
(7
(7
(7
downto
downto
downto
downto
downto
downto
downto
downto
downto
downto
0) ;
0) ;
0) ;
0) ;
0) ;
0) ;
0) ;
0) ;
0) ;
0) ;
di l e t t u r a :
: in s t d l o g i c
: in s t d l o g i c
: in s t d l o g i c
: in s t d l o g i c
: in s t d l o g i c
vector
vector
vector
vector
vector
(7
(7
(7
(7
(7
downto
downto
downto
downto
downto
0) ;
0) ;
0) ;
0) ;
0)
24
−−
OUT
OUT
OUT
OUT
OUT
25
26
27
28
29
30
Registri
REG1
REG2
REG3
TEMP1
TEMP2
31
);
32
33
34
35
36
end component ;
end t o p s l a v e ;
37
Claudio De Berti
73
APPENDICE A. CODICI HDL
38
39
40
l i b r a r y IEEE ;
u s e IEEE . s t d l o g i c 1 1 6 4 . a l l ;
use i e e e . s t d l o g i c a r i t h . a l l ;
41
42
43
44
45
46
47
entity slave is
port (
reset
clock
sda
scl
data ready
:
:
:
:
:
in s t d l o g i c ;
in s t d l o g i c ;
inout s t d l o g i c ;
in s t d l o g i c ;
in s t d l o g i c ;
48
−− R e g i s t r i
CTRL REG1
CTRL REG2
SET REG1
SET REG2
TEMP REG1
TEMP REG2
TEMP REG3
TEMP REG4
TEMP REG5
TEMP REG6
49
50
51
52
53
54
55
56
57
58
59
:
:
:
:
:
:
:
:
:
:
di s c r i t t u r a :
i n o u t s t d l o g i c v e c t o r ( 7 downto 0 ) ;
i n o u t s t d l o g i c v e c t o r ( 7 downto 0 ) ;
o u t s t d l o g i c v e c t o r ( 7 downto 0 ) ;
o u t s t d l o g i c v e c t o r ( 7 downto 0 ) ;
o u t s t d l o g i c v e c t o r ( 7 downto 0 ) ;
o u t s t d l o g i c v e c t o r ( 7 downto 0 ) ;
o u t s t d l o g i c v e c t o r ( 7 downto 0 ) ;
o u t s t d l o g i c v e c t o r ( 7 downto 0 ) ;
o u t s t d l o g i c v e c t o r ( 7 downto 0 ) ;
o u t s t d l o g i c v e c t o r ( 7 downto 0 ) ;
60
−−
OUT
OUT
OUT
OUT
OUT
61
62
63
64
65
66
Registri
REG1
REG2
REG3
TEMP1
TEMP2
di l e t t u r a :
: in s t d l o g i c
: in s t d l o g i c
: in s t d l o g i c
: in s t d l o g i c
: in s t d l o g i c
vector
vector
vector
vector
vector
(7
(7
(7
(7
(7
downto
downto
downto
downto
downto
0) ;
0) ;
0) ;
0) ;
0)
67
);
68
69
end s l a v e ;
70
71
architecture a s l a v e of slave i s
72
73
74
75
76
77
78
79
signal
signal
signal
signal
signal
signal
signal
sda
sda
sda
sda
scl
scl
mis
out
1 q
2 q
ack
1 q
2 q
ended
:
:
:
:
:
:
:
std
std
std
std
std
std
std
signal
signal
signal
signal
start cnd
stop cnd
scl f
scl r
:
:
:
:
boolean ;
boolean ;
boolean ;
boolean ;
logic
logic
logic
logic
logic
logic
logic
;
;
;
;
;
;
;
80
81
82
83
84
85
86
87
88
signal reading
signal sending
signal s e t r e g i s t e r i n
: boolean ;
: boolean ;
: boolean ;
89
90
signal address
: integer ;
91
92
93
94
95
96
97
signal
signal
signal
signal
signal
signal
rx shiftreg
tx shiftreg
rx address
register adr
byte in
byte out
:
:
:
:
:
:
std
std
std
std
std
std
logic
logic
logic
logic
logic
logic
vector
vector
vector
vector
vector
vector
(7
(7
(7
(5
(7
(7
downto
downto
downto
downto
downto
downto
0) ;
0) ;
0) ;
0) ;
0) ;
0) ;
98
99
100
begin
101
102
74
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Claudio De Berti
A.1. CODICI VHDL
103
104
−− d e s c r i z i o n e d e l b u f f e r t r i s t a t e p e r l a l i n e a s d a
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
105
106
c o n t r o l l o s d a : s d a <= ’Z ’ when s d a o u t = ’1 ’ and s d a a c k = ’1 ’ e l s e
’0 ’;
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−− s i n c r o n i z z a z i o n e d i Sda e S c l con c l o c k i n t e r n o .
−− r i l e v a m e n t o d e l l a c o n d i z i o n e d i S t a r t , d i S t o p
−− r i l e v a m e n t o d e i f r o n t i d e l s e g n a l e s c l
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
r i l e v a t o r e c o n d i z i o n i : process ( reset , clock )
variable sda rising
: boolean ;
variable s d a f a l l i n g : boolean ;
begin
i f r e s e t = ’0 ’ t h e n
scl 1 q
<= ’ 1 ’ ;
scl 2 q
<= ’ 1 ’ ;
sda 1 q
<= ’ 1 ’ ;
sda 2 q
<= ’ 1 ’ ;
start cnd
<= f a l s e ;
stop cnd
<= f a l s e ;
scl f
<= f a l s e ;
scl r
<= f a l s e ;
126
127
128
129
130
131
e l s i f r i s i n g e d g e ( c l o c k ) then
s c l 1 q <= t o X 0 1 ( s c l ) ;
s c l 2 q <= s c l 1 q ;
s d a 1 q <= t o X 0 1 ( s d a ) ;
s d a 2 q <= s d a 1 q ;
132
133
134
s d a r i s i n g := s d a 1 q = ’1 ’ and s d a 2 q = ’ 0 ’ ;
s d a f a l l i n g := s d a 1 q = ’0 ’ and s d a 2 q = ’ 1 ’ ;
135
136
137
−− C o n d i z i o n e d i START
s t a r t c n d <= s d a f a l l i n g and s c l 1 q = ’ 1 ’ ;
138
139
140
−− C o n d i z i o n e d i STOP
s t o p c n d <= s d a r i s i n g
and s c l 1 q = ’ 1 ’ ;
141
142
143
−− F a l l i n g Edge SCL
scl f
<= s c l 1 q = ’0 ’ and s c l 2 q = ’ 1 ’ ;
144
145
146
−− R i s i n g Edge SCL
scl r
<= s c l 1 q = ’1 ’ and s c l 2 q = ’ 0 ’ ;
147
148
149
end i f ;
end p r o c e s s ;
150
151
152
153
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−−Macchina A S t a t i
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
154
155
156
157
Macchina : b l o c k
t y p e s t a t e t y p e i s ( IDLE , WT START , RD ADDRESS , RD REG ADR , SEND ACK 1
, SEND ACK 2 , READ ACK, BRANCH 1 , BRANCH 2 , READ BYTE , WRITE BYTE )
;
signal stato : state type ;
158
159
constant s l v a d r
dello slave
: i n t e g e r range 0 t o 1 2 7 : = 1 2 7 ; −− I n d i r i z z o
signal
signal
signal
signal
:
:
:
:
160
161
162
163
164
Claudio De Berti
bit cnt
tx ld
rd reg adress
incremento ind
i n t e g e r range 0 t o 8 ;
boolean ;
boolean ;
std logic ;
75
APPENDICE A. CODICI HDL
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
signal mis ended del
: std logic ;
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
begin
FSM : p r o c e s s ( r e s e t , c l o c k , m i s e n d e d )
variable l d b i t c n t
: boolean ;
begin
i f r e s e t = ’0 ’ t h e n
s t a t o <= IDLE ;
b i t c n t <= 0 ;
r x s h i f t r e g <=” 00000000 ” ;
t x s h i f t r e g <=” 00000000 ” ;
b y t e i n <=” 00000000 ” ;
r x a d d r e s s <=” 00000000 ” ;
r e g i s t e r a d r <=” 000000 ” ;
s d a o u t <= ’1 ’;
s d a a c k <= ’ 1 ’ ;
t x l d <= f a l s e ;
i n c r e m e n t o i n d <= ’0 ’;
r e a d i n g <= f a l s e ;
s e n d i n g <= f a l s e ;
s e t r e g i s t e r i n <= f a l s e ;
m i s e n d e d d e l <= ’1 ’;
188
189
e l s i f r i s i n g e d g e ( c l o c k ) then
190
191
l d b i t c n t := f a l s e ;
192
193
194
case s t a t o i s
195
196
197
198
199
200
201
202
203
204
205
206
207
−− S t a t o i n i z i a l e d i r i p o s o
when IDLE =>
t x l d <= f a l s e ;
r e a d i n g <= f a l s e ;
s e n d i n g <= f a l s e ;
s e t r e g i s t e r i n <= f a l s e ;
s d a a c k <= ’ 1 ’ ;
i f s t o p c n d then
s t a t o <= IDLE ;
else
s t a t o <= WT START ;
end i f ;
208
209
210
211
212
213
214
215
216
217
218
−− A t t e s a d e l l a r i c e z i o n e d e l l a c o n d i z i o n e d i START
when WT START =>
r e a d i n g <= f a l s e ;
s d a a c k <= ’ 1 ’ ;
i f s t o p c n d then
s t a t o <= IDLE ;
e l s i f s t a r t c n d then
s t a t o <= RD ADDRESS ;
l d b i t c n t := t r u e ;
end i f ;
219
220
221
222
223
224
225
226
227
228
76
−− L e t t u r a d e l l ’ i n d i r i z z o s l a v e
when RD ADDRESS =>
s d a a c k <= ’ 1 ’ ;
i f s t o p c n d then
s t a t o <= IDLE ;
e l s i f b i t c n t = 0 then
i f s l v a d r = c o n v i n t e g e r ( u n s i g n e d ( r x s h i f t r e g ( 7 downto
1) ) ) then
r x a d d r e s s <= r x s h i f t r e g ( 7 downto 0 ) ;
i f s c l f then
Claudio De Berti
A.1. CODICI VHDL
s t a t o <=SEND ACK 1 ;
end i f ;
else
s t a t o <= IDLE ;
end i f ;
end i f ;
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
−− L e t t u r a d e l l ’ i n d i r i z z o d e l r e g i s t r o
when RD REG ADR =>
s d a a c k <= ’ 1 ’ ;
i f s t o p c n d then
s t a t o <= IDLE ;
e l s i f b i t c n t = 0 then
r e g i s t e r a d r <= r x s h i f t r e g ( 5 downto 0 ) ;
i n c r e m e n t o i n d <= r x s h i f t r e g ( 7 ) ;
i f s c l f then
s t a t o <= SEND ACK 2 ;
end i f ;
end i f ;
248
249
250
251
252
253
254
255
256
257
258
259
−− I n v i o d e l l ’ACK
when SEND ACK 1 =>
s d a a c k <= ’ 0 ’ ;
i f s t o p c n d then
s t a t o <= IDLE ;
else
i f s c l f then
s t a t o <= BRANCH 1 ;
l d b i t c n t := t r u e ;
end i f ;
end i f ;
260
261
262
263
264
265
266
267
268
269
270
271
272
−− I n v i o d e l l ’ACK ( con c o n t r o l l o d e g l i i n d i r i z z i d e i r e g i s t r i )
when SEND ACK 2 =>
i f r e g i s t e r a d r =” 011000 ”
or r e g i s t e r a d r =” 011001 ”
or r e g i s t e r a d r =” 010110 ”
or r e g i s t e r a d r =” 010111 ”
or r e g i s t e r a d r =” 010000 ”
or r e g i s t e r a d r =” 010001 ”
or r e g i s t e r a d r =” 010010 ”
or r e g i s t e r a d r =” 010011 ”
or r e g i s t e r a d r =” 010100 ”
or r e g i s t e r a d r =” 010101 ”
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
Claudio De Berti
or r e g i s t e r a d r =” 110011 ”
or r e g i s t e r a d r =” 110100 ” t h e n
s d a a c k <= ’ 0 ’ ;
e l s i f ( ( r e g i s t e r a d r =” 110000 ”
or r e g i s t e r a d r =” 110001 ”
or r e g i s t e r a d r =” 110010 ” ) and m i s e n d e d = ’ 0 ’ ) t h e n
s d a a c k <= ’ 0 ’ ;
else
s d a a c k <= ’ 1 ’ ;
s t a t o <= IDLE ;
end i f ;
s e t r e g i s t e r i n <= f a l s e ;
i f s t o p c n d then
s t a t o <= IDLE ;
else
i f s c l f then
i f r e a d i n g and i n c r e m e n t o i n d = ’1 ’ t h e n
s t a t o <= BRANCH 2 ;
e l s i f r e a d i n g then
s t a t o <= IDLE ;
77
APPENDICE A. CODICI HDL
294
295
296
297
298
299
else
s t a t o <= BRANCH 2 ;
end i f ;
l d b i t c n t := t r u e ;
end i f ;
end i f ;
300
301
302
303
304
305
306
307
308
309
310
311
−− L e t t u r a d e l l ’ACK
when READ ACK =>
s d a a c k <= ’ 1 ’ ;
i f s t o p c n d then
s t a t o <= IDLE ;
else
i f s c l r then
i f s d a 1 q = ’1 ’ t h e n
s t a t o <= IDLE ;
end i f ;
end i f ;
312
313
314
315
316
317
318
319
320
321
i f s c l f then
i f i n c r e m e n t o i n d = ’1 ’ t h e n
s t a t o <= BRANCH 2 ;
else
s t a t o <= IDLE ;
end i f ;
l d b i t c n t := t r u e ;
end i f ;
end i f ;
322
323
324
325
326
327
328
329
330
331
332
333
334
−− Primo s t a t o d i Branch : s t a b i l i s c e s e i l m a s t e r v u o l e l e g g e r e o
scrivere
when BRANCH 1 =>
s d a a c k <= ’ 1 ’ ;
i f s t o p c n d then
s t a t o <= IDLE ;
e l s i f r x a d d r e s s ( 0 ) = ’0 ’ t h e n −− I l m a s t e r s c r i v e
s t a t o <= RD REG ADR ;
e l s i f r x a d d r e s s ( 0 ) = ’1 ’ t h e n −− I l m a s t e r l e g g e
s e n d i n g <= t r u e ;
t x l d <= t r u e ;
s t a t o <= BRANCH 2 ;
end i f ;
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
−− S e c o n d o s t a t o d i Branch : g e s t i s c e l ’ e v e n t u a l e i n c r e m e n t o d ’
indirizzo
when BRANCH 2 =>
s d a a c k <= ’ 1 ’ ;
i f s t o p c n d then
s t a t o <= IDLE ;
e l s i f r x a d d r e s s ( 0 ) = ’0 ’ t h e n −− I l m a s t e r i n v i a
s t a t o <= READ BYTE ;
i f r e a d i n g then
i f i n c r e m e n t o i n d = ’1 ’ t h e n
r e g i s t e r a d r <= u n s i g n e d ( r e g i s t e r a d r ( 5 downto 0 ) ) +
1;
else
end i f ;
else
end i f ;
350
351
352
353
354
355
78
e l s i f r x a d d r e s s ( 0 ) = ’1 ’ t h e n
s e n d i n g <= t r u e ;
t x l d <= t r u e ;
s t a t o <= WRITE BYTE ;
t x l d <= t r u e ;
−− I l m a s t e r l e g g e
Claudio De Berti
A.1. CODICI VHDL
else
end i f ;
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
−− L e t t u r a d i un b y t e i n v i a t o d a l m a s t e r
when READ BYTE =>
r e a d i n g <= t r u e ;
s d a a c k <= ’ 1 ’ ;
i f s t a r t c n d then
s t a t o <= RD ADDRESS ;
l d b i t c n t := t r u e ;
e l s i f s t o p c n d then
s t a t o <= IDLE ;
e l s i f ( m i s e n d e d d e l = ’1 ’) then
s t a t o <= IDLE ;
e l s i f b i t c n t = 0 then
s e t r e g i s t e r i n <= t r u e ;
b y t e i n <= r x s h i f t r e g ( 7 downto 0 ) ;
i f s c l f then
s t a t o <= SEND ACK 2 ;
end i f ;
end i f ;
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
−− S c r i t t u r a d i un b y t e v e r s o i l m a s t e r
when WRITE BYTE =>
s d a a c k <= ’ 1 ’ ;
t x l d <= t r u e ;
i f s t o p c n d then
s t a t o <= IDLE ;
e l s i f b i t c n t = 0 then
i f s c l f then
t x l d <= f a l s e ;
i f s e n d i n g and i n c r e m e n t o i n d = ’1 ’ t h e n
r e g i s t e r a d r <= u n s i g n e d ( r e g i s t e r a d r ( 5 downto
0) ) + 1;
end i f ;
s t a t o <= READ ACK ;
end i f ;
end i f ;
393
394
395
396
end c a s e ;
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
397
398
399
400
401
402
403
−− C o n t e g g i o d e i
if ld bit cnt
b i t c n t <=
elsif bit cnt
b i t c n t <=
end i f ;
bit ricevuti
then
8;
> 0 and s c l r t h e n
b i t c n t −1;
404
405
406
407
408
−− L e t t u r a d e i b i t r i c e v u t i
i f s c l r then
r x s h i f t r e g ( 7 downto 0 ) <= r x s h i f t r e g ( 6 downto 0 ) & s d a 2 q ;
end i f ;
409
410
411
412
413
414
415
416
417
418
419
−− I n v i o d e i b i t s u l b u s
i f t x l d then
s d a o u t <= t x s h i f t r e g ( 7 ) ;
i f s c l f then
t x s h i f t r e g ( 7 downto 0 ) <= t x s h i f t r e g ( 6 downto 0 ) & ’ 0 ’ ;
end i f ;
else
t x s h i f t r e g <= b y t e o u t ;
s d a o u t <= ’1 ’;
end i f ;
Claudio De Berti
79
APPENDICE A. CODICI HDL
420
421
422
423
i f s t o p c n d then
m i s e n d e d d e l <=m i s e n d e d ;
end i f ;
424
425
426
427
end i f ;
end p r o c e s s ;
end b l o c k ;
428
429
430
431
432
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−− G e s t i o n e d e i r e g i s t r i d i s c r i t t u r a
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
433
434
435
436
437
438
439
440
441
442
443
444
445
446
r e g i s t r i s c r i t t u r a : process ( r e s e t , data ready , clock , byte in ,
set register in )
begin
i f r e s e t = ’0 ’ t h e n
CTRL REG1 <=” 10101001 ” ;
CTRL REG2 <=” 01010101 ” ;
SET REG1 <=” 00000000 ” ;
SET REG2 <=” 00000000 ” ;
TEMP REG1 <=” 00000000 ” ;
TEMP REG2 <=” 00000000 ” ;
TEMP REG3 <=” 00000000 ” ;
TEMP REG4 <=” 00000000 ” ;
TEMP REG5 <=” 00000000 ” ;
TEMP REG6 <=” 00000000 ” ;
447
448
m i s e n d e d <= ’1 ’;
449
450
451
452
453
e l s i f d a t a r e a d y = ’1 ’ t h e n
CTRL REG1 ( 0 ) <= ’0 ’;
CTRL REG2 ( 0 ) <= ’0 ’;
m i s e n d e d <= ’0 ’;
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
e l s i f r i s i n g e d g e ( c l o c k ) then
i f r e a d i n g and s e t r e g i s t e r i n t h e n
case r e g i s t e r a d r i s
when ” 011000 ” =>
CTRL REG1<= b y t e i n ;
when ” 011001 ” =>
CTRL REG2<= b y t e i n ;
m i s e n d e d <= ’1 ’;
when ” 010000 ” =>
TEMP REG1<= b y t e i n ;
when ” 010001 ” =>
TEMP REG2<= b y t e i n ;
when ” 010010 ” =>
TEMP REG3<= b y t e i n ;
when ” 010011 ” =>
TEMP REG4<= b y t e i n ;
when ” 010100 ” =>
TEMP REG5<= b y t e i n ;
when ” 010101 ” =>
TEMP REG6<= b y t e i n ;
when ” 010110 ” =>
SET REG1<= b y t e i n ;
when ” 010111 ” =>
SET REG2<= b y t e i n ;
when o t h e r s =>
480
481
482
end c a s e ;
end i f ;
483
80
Claudio De Berti
A.1. CODICI VHDL
end i f ;
484
485
end p r o c e s s ;
486
487
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−− G e s t i o n e d e i r e g i s t r i d i l e t t u r a
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
488
489
490
491
r e g i s t r i l e t t u r a : p r o c e s s ( r e s e t , c l o c k , r e g i s t e r a d r , OUT REG1 , OUT REG2
, OUT REG3 , OUT TEMP1 , OUT TEMP2 , CTRL REG1 , CTRL REG2 )
begin
i f r e s e t = ’0 ’ t h e n
b y t e o u t <=” 00000000 ” ;
492
493
494
495
496
e l s i f r i s i n g e d g e ( c l o c k ) then
case r e g i s t e r a d r i s
when ” 011000 ” =>
b y t e o u t <=CTRL REG1 ;
when ” 011001 ” =>
b y t e o u t <=CTRL REG2 ;
when ” 110000 ” =>
b y t e o u t <=OUT REG1 ;
when ” 110001 ” =>
b y t e o u t <=OUT REG2 ;
when ” 110010 ” =>
b y t e o u t <=OUT REG3 ;
when ” 110011 ” =>
b y t e o u t <=OUT TEMP1 ;
when ” 110100 ” =>
b y t e o u t <=OUT TEMP2 ;
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
when o t h e r s =>
514
515
end c a s e ;
end i f ;
516
517
518
end p r o c e s s ;
519
520
521
end a s l a v e ;
A.1.2
1
2
3
Test Bench
l i b r a r y IEEE ;
u s e IEEE . s t d l o g i c 1 1 6 4 . a l l ;
use i e e e . s t d l o g i c a r i t h . a l l ;
4
5
6
−− U t i l i z z o d e l p a c k a g e programmato p e r c o n t r o l l a r e i s e g n a l i s d a e s c l :
u s e work . p a c k a g e t e s t . a l l ;
7
8
9
entity test is
end t e s t ;
10
11
architecture a t e s t of t e s t i s
12
13
14
t y p e TRX TYPE i s ( WRITE DATA , READ DATA) ;
s u b t y p e BYTE i s s t d l o g i c v e c t o r ( 7 downto 0 ) ;
Claudio De Berti
81
APPENDICE A. CODICI HDL
15
16
component s l a v e
17
port
(
clock
reset
18
19
20
21
: in s t d l o g i c ;
: in s t d l o g i c ;
22
: in s t d l o g i c ;
: inout s t d l o g i c ;
scl
sda
23
24
25
d a t a r e a d y : in s t d l o g i c ;
26
27
OUT
OUT
OUT
OUT
OUT
28
29
30
31
32
33
34
REG1
REG2
REG3
TEMP1
TEMP2
: in
: in
: in
: in
: in
s t d l o g i c v e c t o r ( 7 downto 0 ) ;
s t d l o g i c v e c t o r ( 7 downto 0 ) ;
s t d l o g i c v e c t o r ( 7 downto 0 ) ;
s t d l o g i c v e c t o r ( 7 downto 0 ) ;
s t d l o g i c v e c t o r ( 7 downto 0 )
);
end component ;
35
36
37
38
signal clock
signal reset
: std logic ;
: std logic ;
signal scl
s i g n a l sda
: std logic ;
: std logic ;
39
40
41
42
43
signal data ready : std logic ;
44
45
46
47
48
49
signal
signal
signal
signal
signal
OUT
OUT
OUT
OUT
OUT
REG1
REG2
REG3
TEMP1
TEMP2
: s t d l o g i c v e c t o r ( 7 downto 0 ) ;
: s t d l o g i c v e c t o r ( 7 downto 0 ) ;
: s t d l o g i c v e c t o r ( 7 downto 0 ) ;
: s t d l o g i c v e c t o r ( 7 downto 0 ) ;
: s t d l o g i c v e c t o r ( 7 downto 0 ) ;
50
51
52
53
begin
54
55
56
57
58
59
60
61
scl
sda
OUT
OUT
OUT
OUT
OUT
<= ’H ’ ;
<= ’H ’ ;
REG1<=” 00001111 ” ;
REG2<=” 11110000 ” ;
REG3<=” 10101010 ” ;
TEMP1<=” 01010101 ” ;
TEMP2<=” 11001100 ” ;
62
63
r e s e t <= ’ 0 ’ , ’ 1 ’ a f t e r 100 n s ;
64
65
66
67
68
69
70
71
72
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
process
v a r i a b l e ack : s t d l o g i c ;
v a r i a b l e b y t e 1 t x : s t d l o g i c v e c t o r ( 7 downto 0 ) := ” 11111111 ” ;
v a r i a b l e b y t e 2 t x : s t d l o g i c v e c t o r ( 7 downto 0 ) := ” 11111111 ” ;
begin
wait u n t i l r e s e t = ’1 ’;
w a i t f o r 100 n s ;
73
74
75
76
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−− A t t e s a d e l l a d i s p o n i b i l i t à n e i r e g i s t r i
−− d e l l a m i s u r a e f f e t t u a t a d i d e f a u l t :
77
78
w h i l e ( ( b y t e 1 t x ( 0 ) and b y t e 2 t x ( 0 ) ) = ’ 1 ’ ) l o o p
79
82
Claudio De Berti
A.1. CODICI VHDL
80
81
82
s t a r t c o n d ( scl , sda ) ;
s e n d s l a v e a d r ( s c l , sda , 1 2 7 , WRITE DATA , a c k ) ;
e x i t when a c k = ’ 1 ’ ;
83
84
85
86
s e n d b y t e ( s c l , sda , ” 10011000 ” ) ;
c h e c k a c k ( s c l , sda , a c k ) ;
e x i t when a c k = ’ 1 ’ ;
87
88
r e p e a t s t a r t ( scl , sda ) ;
89
90
91
s e n d s l a v e a d r ( s c l , sda , 1 2 7 , READ DATA, a c k ) ;
e x i t when a c k = ’ 1 ’ ;
92
93
94
r e a d b y t e ( s c l , sda , b y t e 1 t x ) ;
send ack ( scl , sda ) ;
95
96
r e p o r t ” b y t e CTRL REG1 : ” & i n t e g e r ’ image ( c o n v i n t e g e r ( u n s i g n e d (
b y t e 1 t x ( 7 downto 0 ) ) ) ) ;
97
98
99
r e a d b y t e ( s c l , sda , b y t e 2 t x ) ;
not ack ( scl , sda ) ;
100
101
r e p o r t ” b y t e CTRL REG2 : ” & i n t e g e r ’ image ( c o n v i n t e g e r ( u n s i g n e d (
b y t e 2 t x ( 7 downto 0 ) ) ) ) ;
102
103
s t o p c o n d ( s c l , s d a ) ; −− F i n e t r a s m i s s i o n e
104
105
end l o o p ;
106
107
108
109
110
111
i f a c k = ’1 ’ t h e n
r e p o r t ” Ack non r i c e v u t o d a l l o s l a v e . ” ;
stop cond ( scl , sda ) ;
wait ;
end i f ;
112
113
report ” Misura d i s p o n i b i l e n e i r e g i s t r i ” ;
114
115
116
117
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−− L e t t u r a d e l l a m i s u r a e f f e t t u a t a d i d e f a u l t :
118
119
120
121
122
loop
s t a r t c o n d ( scl , sda ) ;
s e n d s l a v e a d r ( s c l , sda , 1 2 7 , WRITE DATA , a c k ) ;
e x i t when a c k = ’ 1 ’ ;
123
124
125
126
s e n d b y t e ( s c l , sda , ” 10110000 ” ) ;
c h e c k a c k ( s c l , sda , a c k ) ;
e x i t when a c k = ’ 1 ’ ;
127
128
r e p e a t s t a r t ( scl , sda ) ;
129
130
131
s e n d s l a v e a d r ( s c l , sda , 1 2 7 , READ DATA, a c k ) ;
e x i t when a c k = ’ 1 ’ ;
132
133
134
r e a d b y t e ( s c l , sda , b y t e 1 t x ) ;
send ack ( scl , sda ) ;
135
136
r e p o r t ” b y t e OUT REG1 : ” & i n t e g e r ’ image ( c o n v i n t e g e r ( u n s i g n e d (
b y t e 1 t x ( 7 downto 0 ) ) ) ) ;
137
138
139
r e a d b y t e ( s c l , sda , b y t e 2 t x ) ;
send ack ( scl , sda ) ;
140
Claudio De Berti
83
APPENDICE A. CODICI HDL
141
r e p o r t ” b y t e OUT REG2 : ” & i n t e g e r ’ image ( c o n v i n t e g e r ( u n s i g n e d (
b y t e 2 t x ( 7 downto 0 ) ) ) ) ;
142
143
144
r e a d b y t e ( s c l , sda , b y t e 1 t x ) ;
not ack ( scl , sda ) ;
145
146
r e p o r t ” b y t e OUT REG3 : ” & i n t e g e r ’ image ( c o n v i n t e g e r ( u n s i g n e d (
b y t e 1 t x ( 7 downto 0 ) ) ) ) ;
147
148
149
s t o p c o n d ( s c l , s d a ) ; −− F i n e t r a s m i s s i o n e
exit ;
150
151
end l o o p ;
152
153
154
155
156
157
i f a c k = ’1 ’ t h e n
r e p o r t ” Ack non r i c e v u t o d a l l o s l a v e . ” ;
stop cond ( scl , sda ) ;
wait ;
end i f ;
158
159
160
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−− S c r i t t u r a n e i r e g i s t r i CTRL REG p e r a v v i a r e una nuova m i s u r a z i o n e
161
162
163
164
165
loop
s t a r t c o n d ( scl , sda ) ;
s e n d s l a v e a d r ( s c l , sda , 1 2 7 , WRITE DATA , a c k ) ;
e x i t when a c k = ’ 1 ’ ;
166
167
168
169
s e n d b y t e ( s c l , sda , ” 10011000 ” ) ;
c h e c k a c k ( s c l , sda , a c k ) ;
e x i t when a c k = ’ 1 ’ ;
170
171
172
173
174
s e n d b y t e ( s c l , sda , ” 10101011 ” ) ;
c h e c k a c k ( s c l , sda , a c k ) ;
e x i t when a c k = ’ 1 ’ ;
r e p o r t ” b y t e s c r i t t o i n CTRL REG1 : 171 ” ;
175
176
177
178
179
s e n d b y t e ( s c l , sda , ” 11110001 ” ) ;
c h e c k a c k ( s c l , sda , a c k ) ;
e x i t when a c k = ’ 1 ’ ;
r e p o r t ” b y t e s c r i t t o i n CTRL REG1 : 241 ” ;
180
181
182
s t o p c o n d ( s c l , s d a ) ; −− F i n e t r a s m i s s i o n e
exit ;
183
184
end l o o p ;
185
186
187
188
189
190
191
i f a c k = ’1 ’ t h e n
r e p o r t ” Ack non r i c e v u t o d a l l o s l a v e . ” ;
stop cond ( scl , sda ) ;
wait ;
end i f ;
192
193
194
195
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−− A t t e s a d e l l a d i s p o n i b i l i t à n e i r e g i s t r i
−− d e l l a m i s u r a r i c h i e s t a :
196
197
198
b y t e 1 t x := ” 11111111 ” ;
b y t e 2 t x := ” 11111111 ” ;
199
200
w h i l e ( ( b y t e 1 t x ( 0 ) and b y t e 2 t x ( 0 ) ) = ’ 1 ’ ) l o o p
201
202
203
84
s t a r t c o n d ( scl , sda ) ;
s e n d s l a v e a d r ( s c l , sda , 1 2 7 , WRITE DATA , a c k ) ;
Claudio De Berti
A.1. CODICI VHDL
204
e x i t when a c k = ’ 1 ’ ;
205
206
207
208
s e n d b y t e ( s c l , sda , ” 10011000 ” ) ;
c h e c k a c k ( s c l , sda , a c k ) ;
e x i t when a c k = ’ 1 ’ ;
209
210
r e p e a t s t a r t ( scl , sda ) ;
211
212
213
s e n d s l a v e a d r ( s c l , sda , 1 2 7 , READ DATA, a c k ) ;
e x i t when a c k = ’ 1 ’ ;
214
215
216
r e a d b y t e ( s c l , sda , b y t e 1 t x ) ;
send ack ( scl , sda ) ;
217
218
r e p o r t ” b y t e CTRL REG1 : ” & i n t e g e r ’ image ( c o n v i n t e g e r ( u n s i g n e d (
b y t e 1 t x ( 7 downto 0 ) ) ) ) ;
219
220
221
r e a d b y t e ( s c l , sda , b y t e 2 t x ) ;
not ack ( scl , sda ) ;
222
223
r e p o r t ” b y t e CTRL REG2 : ” & i n t e g e r ’ image ( c o n v i n t e g e r ( u n s i g n e d (
b y t e 2 t x ( 7 downto 0 ) ) ) ) ;
224
225
s t o p c o n d ( s c l , s d a ) ; −− F i n e t r a s m i s s i o n e
226
227
end l o o p ;
228
229
230
231
232
233
i f a c k = ’1 ’ t h e n
r e p o r t ” Ack non r i c e v u t o d a l l o s l a v e . ” ;
stop cond ( scl , sda ) ;
wait ;
end i f ;
234
235
report ” Misura d i s p o n i b i l e n e i r e g i s t r i ” ;
236
237
238
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−− L e t t u r a d e l l a m i s u r a r i c h i e s t a :
239
240
241
242
243
loop
s t a r t c o n d ( scl , sda ) ;
s e n d s l a v e a d r ( s c l , sda , 1 2 7 , WRITE DATA , a c k ) ;
e x i t when a c k = ’ 1 ’ ;
244
245
246
247
s e n d b y t e ( s c l , sda , ” 10110000 ” ) ;
c h e c k a c k ( s c l , sda , a c k ) ;
e x i t when a c k = ’ 1 ’ ;
248
249
r e p e a t s t a r t ( scl , sda ) ;
250
251
252
s e n d s l a v e a d r ( s c l , sda , 1 2 7 , READ DATA, a c k ) ;
e x i t when a c k = ’ 1 ’ ;
253
254
255
r e a d b y t e ( s c l , sda , b y t e 1 t x ) ;
send ack ( scl , sda ) ;
256
257
r e p o r t ” b y t e OUT REG1 : ” & i n t e g e r ’ image ( c o n v i n t e g e r ( u n s i g n e d (
b y t e 1 t x ( 7 downto 0 ) ) ) ) ;
258
259
260
r e a d b y t e ( s c l , sda , b y t e 2 t x ) ;
send ack ( scl , sda ) ;
261
262
r e p o r t ” b y t e OUT REG2 : ” & i n t e g e r ’ image ( c o n v i n t e g e r ( u n s i g n e d (
b y t e 2 t x ( 7 downto 0 ) ) ) ) ;
263
264
r e a d b y t e ( s c l , sda , b y t e 1 t x ) ;
Claudio De Berti
85
APPENDICE A. CODICI HDL
265
not ack ( scl , sda ) ;
266
267
r e p o r t ” b y t e OUT REG3 : ” & i n t e g e r ’ image ( c o n v i n t e g e r ( u n s i g n e d (
b y t e 1 t x ( 7 downto 0 ) ) ) ) ;
268
269
270
s t o p c o n d ( s c l , s d a ) ; −− F i n e t r a s m i s s i o n e
exit ;
271
272
end l o o p ;
273
274
275
276
277
278
i f a c k = ’1 ’ t h e n
r e p o r t ” Ack non r i c e v u t o d a l l o s l a v e . ” ;
stop cond ( scl , sda ) ;
wait ;
end i f ;
279
280
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
281
282
283
wait ;
end p r o c e s s ;
284
285
286
287
288
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−− S e g n a l e c h e s t a b i l i s c e l a d i s p o n i b i l i t à d i una nuova
−− m i s u r a n e i r e g i s t r i d i l e t t u r a :
289
290
291
292
293
294
295
296
297
298
299
300
301
302
s e g n a l e f i n e m i s u r a : process
begin
d a t a r e a d y <= ’0 ’;
w a i t f o r 1260 u s ;
d a t a r e a d y <= ’1 ’;
w a i t f o r 10 u s ;
d a t a r e a d y <= ’0 ’;
w a i t f o r 2500 u s ;
d a t a r e a d y <= ’1 ’;
w a i t f o r 10 u s ;
d a t a r e a d y <= ’0 ’;
wait ;
end p r o c e s s ;
303
304
305
306
307
308
309
310
311
312
313
314
315
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
SEGNALE CLOCK : p r o c e s s
begin
loop
c l o c k <= ’ 0 ’ ;
w a i t f o r 250 n s ;
c l o c k <= ’ 1 ’ ;
w a i t f o r 250 n s ;
end l o o p ;
end p r o c e s s ;
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
316
317
318
319
320
p s l a v e : s l a v e p o r t map
(
clock
=>
clock ,
reset
=>
reset ,
321
322
323
scl
sda
=>
=>
scl ,
sda ,
324
325
d a t a r e a d y => d a t a r e a d y ,
326
327
328
86
OUT REG1
OUT REG2
=>
=>
OUT REG1 ,
OUT REG2 ,
Claudio De Berti
A.1. CODICI VHDL
OUT REG3 =>
OUT TEMP1 =>
OUT TEMP2 =>
329
330
331
OUT REG3 ,
OUT TEMP1 ,
OUT TEMP2
332
);
333
334
335
336
end a t e s t ;
A.1.3
1
2
3
Package
library ieee ;
use i e e e . s t d l o g i c 1 1 6 4 . a l l ;
use i e e e . m a t h r e a l . a l l ;
4
5
package p a c k a g e t e s t i s
6
7
c o n s t a n t I2C FREQ
: r e a l := 1 0 0 . 0 E+03;
8
9
c o n s t a n t I2C PERIOD : t i m e := ( 1 . 0 / I2C FREQ ) * 1 . 0 E3 * ms ;
10
11
12
13
t y p e TRX TYPE i s ( WRITE DATA , READ DATA) ;
s u b t y p e BYTE i s s t d l o g i c v e c t o r ( 7 downto 0 ) ;
s u b t y p e SLV ADR TYPE i s i n t e g e r range 0 t o 1 2 7 ;
14
15
16
17
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−− p r o c e d u r e d e l l a s i m u l a z i o n e
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
18
19
20
21
22
23
procedure s t a r t c o n d
(
s i g n a l s c l : out s t d l o g i c ;
s i g n a l sda : out s t d l o g i c
);
24
25
26
27
28
29
procedure r e p e a t s t a r t
(
s i g n a l s c l : out s t d l o g i c ;
s i g n a l sda : out s t d l o g i c
);
30
31
32
33
34
35
procedure s t o p c o n d
(
s i g n a l s c l : out s t d l o g i c ;
s i g n a l sda : out s t d l o g i c
);
36
37
38
39
40
41
42
procedure s e n d
(
signal scl :
s i g n a l sda :
bit
);
bit
out s t d l o g i c ;
out s t d l o g i c ;
: in s t d l o g i c
43
44
45
procedure s e n d b y t e
(
Claudio De Berti
87
APPENDICE A. CODICI HDL
46
47
48
49
signal scl
: out s t d l o g i c ;
s i g n a l sda : out s t d l o g i c ;
b y t e : i n BYTE
);
50
51
52
53
54
55
56
procedure r e a d
(
signal scl :
s i g n a l sda :
bit
);
bit
out s t d l o g i c ;
inout s t d l o g i c ;
r x : out s t d l o g i c
57
58
59
60
61
62
63
procedure r e a d b y t e
(
signal scl
: out s t d l o g i c ;
s i g n a l sda : inout s t d l o g i c ;
b y t e t x : o u t BYTE
);
64
65
66
67
68
69
70
procedure c h e c k
(
signal scl
:
s i g n a l sda :
ack
);
ack
out
std logic ;
inout s t d l o g i c ;
: out
std logic
71
72
73
74
75
76
procedure s e n d a c k
(
signal scl
: out
std logic ;
s i g n a l sda : inout s t d l o g i c
);
77
78
79
80
81
82
procedure n o t a c k
(
signal scl
: out
std logic ;
s i g n a l sda : inout s t d l o g i c
);
83
84
85
86
87
88
89
90
91
procedure s e n d
(
signal scl
s i g n a l sda
adr
trx
ack
);
slave adr
:
:
:
:
:
out
std logic ;
inout s t d l o g i c ;
i n i n t e g e r range 0 t o 1 2 7 ;
i n TRX TYPE ;
out
std logic
92
93
end package ;
94
95
96
97
98
99
library ieee ;
use i e e e . s t d l o g i c a r i t h . a l l ;
package body p a c k a g e t e s t i s
100
101
102
103
104
105
106
107
108
109
110
88
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−− START CONDITION
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
procedure s t a r t c o n d
(
s i g n a l s c l : out s t d l o g i c ;
s i g n a l sda : out s t d l o g i c
)
is
begin
Claudio De Berti
A.1. CODICI VHDL
111
112
113
114
115
116
s d a <= ’H ’ ;
s c l <= ’H ’ ;
w a i t f o r I2C PERIOD / 2 ;
s d a <= ’ 0 ’ ;
w a i t f o r I2C PERIOD / 2 ;
end ;
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−− CONDIZIONE DI START
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
procedure r e p e a t s t a r t
(
s i g n a l s c l : out s t d l o g i c ;
s i g n a l sda : out s t d l o g i c
)
is
begin
s d a <= ’H ’ ;
s c l <= ’ 0 ’ ;
w a i t f o r I2C PERIOD / 2 ;
s c l <= ’H ’ ;
w a i t f o r I2C PERIOD / 2 ;
s d a <= ’ 0 ’ ;
w a i t f o r I2C PERIOD / 2 ;
end ;
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−− CONDIZIONE DI STOP
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
procedure s t o p c o n d
(
s i g n a l s c l : out s t d l o g i c ;
s i g n a l sda : out s t d l o g i c
)
is
begin
s c l <= ’ 0 ’ ;
s d a <= ’ 0 ’ ;
w a i t f o r I2C PERIOD / 2 ;
s c l <= ’H ’ ;
w a i t f o r I2C PERIOD / 2 ;
s d a <= ’H ’ ;
end ;
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−− INVIO BIT
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
procedure s e n d b i t
(
s i g n a l s c l : out s t d l o g i c ;
s i g n a l sda : out s t d l o g i c ;
b i t : in s t d l o g i c
)
is
begin
s c l <= ’ 0 ’ ;
s d a <= b i t a f t e r 1 n s ;
w a i t f o r I2C PERIOD / 2 ;
s c l <= ’H ’ ;
w a i t f o r I2C PERIOD / 2 ;
end ;
172
173
174
175
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−− INVIO BYTE
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Claudio De Berti
89
APPENDICE A. CODICI HDL
176
177
178
179
180
181
182
183
184
185
186
187
188
procedure s e n d b y t e
(
signal scl
: out s t d l o g i c ;
s i g n a l sda : out s t d l o g i c ;
b y t e : i n BYTE
)
is
v a r i a b l e b i t c n t : i n t e g e r range 0 t o 7 ;
begin
f o r b i t c n t i n 7 downto 0 l o o p
s e n d b i t ( s c l , sda , b y t e ( b i t c n t ) ) ;
end l o o p ;
end ;
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−− LETTURA BIT
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
procedure r e a d b i t
(
s i g n a l s c l : out s t d l o g i c ;
s i g n a l sda : inout s t d l o g i c ;
b i t r x : out s t d l o g i c
)
is
variable bit tmp : std lo gic ;
begin
s c l <= ’ 0 ’ ;
s d a <= ’H ’ ;
w a i t f o r I2C PERIOD / 2 ;
s c l <= ’H ’ ;
wait for 1 ns ;
b i t t m p := t o X 0 1 ( s d a ) ;
w a i t f o r I2C PERIOD / 2 ;
b i t r x := b i t t m p ;
end ;
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−− LETTURA BYTE
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
procedure r e a d b y t e
(
signal scl
: out s t d l o g i c ;
s i g n a l sda : inout s t d l o g i c ;
b y t e t x : o u t BYTE
)
is
v a r i a b l e b i t c n t : i n t e g e r range 0 t o 7 ;
begin
f o r b i t c n t i n 7 downto 0 l o o p
r e a d b i t ( s c l , sda , b y t e t x ( b i t c n t ) ) ;
end l o o p ;
end ;
228
229
230
231
232
233
234
235
236
237
238
239
240
90
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−− ACKNOWLEDGE d a l l o SLAVE
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
procedure c h e c k a c k
(
signal scl
: out
std logic ;
s i g n a l sda : inout s t d l o g i c ;
ack : out
std logic
)
is
variable ack tmp : s t d l o g i c ;
Claudio De Berti
A.1. CODICI VHDL
241
242
243
244
245
246
247
248
249
250
begin
s c l <= ’ 0 ’ ;
s d a <= ’H ’ ;
w a i t f o r I2C PERIOD / 2 ;
s c l <= ’H ’ ;
wait for 1 ns ;
a c k t m p := t o X 0 1 ( s d a ) ;
w a i t f o r I2C PERIOD / 2 ;
a c k := a c k t m p ;
end ;
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−− ACKNOWLEDGE d a l MASTER
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
procedure s e n d a c k
(
signal scl
: out
std logic ;
s i g n a l sda : inout s t d l o g i c
)
is
begin
s c l <= ’ 0 ’ ;
s d a <= ’ 0 ’ a f t e r 1 n s ;
w a i t f o r I2C PERIOD / 2 ;
s c l <= ’H ’ ;
w a i t f o r I2C PERIOD / 2 ;
end ;
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−− NOT−ACKNOWLEDGE d a l MASTER
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
procedure n o t a c k
(
signal scl
: out
std logic ;
s i g n a l sda : inout s t d l o g i c
)
is
begin
s c l <= ’ 0 ’ ;
s d a <= ’H’ a f t e r 1 n s ;
w a i t f o r I2C PERIOD / 2 ;
s c l <= ’H ’ ;
w a i t f o r I2C PERIOD / 2 ;
end ;
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−− I n v i o d e l l ’ i n d i r i z z o d e l l o s l a v e .
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
procedure s e n d s l a v e a d r
(
s i g n a l s c l : out
std logic ;
s i g n a l sda : inout s t d l o g i c ;
a d r : i n SLV ADR TYPE ;
t r x : i n TRX TYPE ;
ack : out
std logic
)
is
v a r i a b l e s l v a d r : BYTE ;
begin
s l v a d r := c o n v s t d l o g i c v e c t o r ( a d r * 2 , BYTE’LENGTH) ;
i f t r x = READ DATA t h e n
s l v a d r := s l v a d r or x ” 01 ” ; −− LSB=1 s e v o g l i o l e g g e r e .
end i f ;
s e n d b y t e ( s c l , sda , s l v a d r ) ;
Claudio De Berti
91
APPENDICE A. CODICI HDL
c h e c k a c k ( s c l , sda , a c k ) ;
end ;
306
307
308
309
end ;
A.2
Codici Verilog
A.2.1
Descrizione della cella master
1
‘ t i m e s c a l e 1 n s / 100 p s
2
3
module m a s t e r ( sda , s c l ) ;
4
5
6
output s c l ;
inout sda ;
7
8
9
wire s c l ;
t r i sda ;
10
11
12
13
reg s d a t ;
reg s c l t ;
reg r e s e t t ;
14
15
16
17
18
reg
reg
reg
reg
ack ;
bit rx ;
[ 7 : 0 ] byte1 ;
[ 7 : 0 ] byte2 ;
19
20
21
22
23
24
a s s i g n s d a = ( s d a t == 1 ’ b0 ) ? 1 ’ b0 : 1 ’ bz ;
a s s i g n s c l = ( s c l t == 1 ’ b0 ) ? 1 ’ b0 : 1 ’ bz ;
pullup ( sda ) ;
pullup ( s c l ) ;
25
26
27
28
29
30
31
parameter I2C FREQ = 1 0 0 . 0 E+03;
parameter I2C PERIOD = ( 1 . 0 / I2C FREQ ) * 1 . 0 E9 ;
r e g [ 6 : 0 ] SLAVE ADR ;
r e g WRITE ;
r e g READ;
reg n u l l ;
32
33
34
35
36
37
38
39
40
41
42
43
44
i n i t i a l begin
a c k =1 ’ b1 ;
SLAVE ADR=7 ’ b1111111 ;
b i t r x =1 ’ b0 ;
WRITE=1 ’ b0 ;
READ=1 ’ b1 ;
n u l l =1 ’ b0 ;
s d a t = 1 ’ b1 ;
s c l t = 1 ’ b1 ;
b y t e 1 =8 ’ b11111111 ;
b y t e 2 =8 ’ b11111111 ;
45
46
92
Claudio De Berti
A.2. CODICI VERILOG
47
48
49
// / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / −− A t t e s a d e l l a d i s p o n i b i l i t à n e i r e g i s t r i
/ / −− d e l l a m i s u r a e f f e t t u a t a d i d e f a u l t :
50
51
w h i l e ( ( b y t e 1 [ 0 ] && b y t e 2 [ 0 ] ) == 1 ) b e g i n
52
53
54
55
start cond ( null ) ;
s e n d s l a v e a d r ( SLAVE ADR , WRITE ) ;
$ d i s p l a y ( ” I n d i r i z z o s l a v e i n v i a t o . Ack r i c e v u t o ? [ 1 => NO] [ 0 => S I ] :
, ack ) ;
”
56
57
58
s e n d b y t e ( 8 ’ b10011000 ) ;
check ack ( ack ) ;
//
i n d i r i z z o CTRL REG1
59
60
repeat start ( null ) ;
61
62
s e n d s l a v e a d r ( SLAVE ADR , READ) ;
63
64
65
66
r e a d b y t e ( b y t e 1 ) ; / / l e t t u r a CTRL REG1
send ack ( null ) ;
$ d i s p l a y ( ” B y t e c o n t e n u t o i n CTRL REG1 : ” , b y t e 1 ) ;
67
68
69
70
r e a d b y t e ( b y t e 2 ) ; / / l e t t u r a CTRL REG2
not ack ( null ) ;
$ d i s p l a y ( ” B y t e c o n t e n u t o i n CTRL REG2 : ” , b y t e 2 ) ;
71
72
stop cond ( null ) ;
73
74
75
end
$display ( ” Misura d i s p o n i b i l e n e i r e g i s t r i di l e t t u r a . ” ) ;
76
77
78
79
// / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / −− L e t t u r a d e l l a m i s u r a e f f e t t u a t a d i d e f a u l t :
80
81
82
83
84
start cond ( null ) ;
s e n d s l a v e a d r ( SLAVE ADR , WRITE ) ;
$ d i s p l a y ( ” I n d i r i z z o s l a v e i n v i a t o . Ack r i c e v u t o ? [ 1 => NO] [ 0 => S I ] :
, ack ) ;
”
85
86
87
s e n d b y t e ( 8 ’ b10110000 ) ;
check ack ( ack ) ;
//
i n d i r i z z o OUT REG1
88
89
repeat start ( null ) ;
90
91
s e n d s l a v e a d r ( SLAVE ADR , READ) ;
92
93
94
95
r e a d b y t e ( b y t e 1 ) ; / / l e t t u r a OUT REG1
send ack ( null ) ;
$ d i s p l a y ( ” B y t e c o n t e n u t o i n OUT REG1 : ” , b y t e 1 ) ;
96
97
98
99
r e a d b y t e ( b y t e 1 ) ; / / l e t t u r a OUT REG2
send ack ( null ) ;
$ d i s p l a y ( ” B y t e c o n t e n u t o i n OUT REG2 : ” , b y t e 1 ) ;
100
101
102
103
r e a d b y t e ( b y t e 1 ) ; / / l e t t u r a OUT REG3
not ack ( null ) ;
$ d i s p l a y ( ” B y t e c o n t e n u t o i n OUT REG3 : ” , b y t e 1 ) ;
104
105
stop cond ( null ) ;
106
107
108
// / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
// / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
109
Claudio De Berti
93
APPENDICE A. CODICI HDL
110
end
111
112
113
// / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
114
115
/ / / / CONDIZIONE DI START
116
117
118
119
120
121
122
123
task s t a r t c o n d ;
input n u l l ;
begin
# ( I2C PERIOD / 2 ) s d a t =0;
# ( I2C PERIOD / 2 ) ;
end
endtask
124
125
126
/ / / / CONDIZIONE DI STOP
127
128
129
130
131
132
133
134
135
136
task stop cond ;
input n u l l ;
begin
s c l t =0;
s d a t =0;
# ( I2C PERIOD / 2 ) s c l t =1;
# ( I2C PERIOD / 2 ) s d a t =1;
end
endtask
137
138
139
/ / / / REPEAT START
140
141
142
143
144
145
146
147
148
149
150
task r e p e a t s t a r t ;
input n u l l ;
begin
sda t = 1;
s c l t = 0;
# ( I2C PERIOD / 2 ) s c l t = 1 ;
# ( I2C PERIOD / 2 ) s d a t = 0 ;
# ( I2C PERIOD / 2 ) ;
end
endtask
151
152
153
/ / / / INVIO BIT
154
155
156
157
158
159
160
161
162
163
task s e n d b i t ;
input b i t ;
begin
s c l t =0;
#1 s d a t <= b i t ;
# ( I2C PERIOD / 2 ) s c l t = 1 ;
# ( I2C PERIOD / 2 ) ;
end
endtask
164
165
166
/ / / / INVIO BYTE
167
168
169
170
171
172
173
174
94
task send byte ;
input [ 7 : 0 ] byte ;
integer i ;
begin
f o r ( i =7; i > −1; i =i −1) b e g i n
send bit ( byte [ i ] ) ;
end
Claudio De Berti
A.2. CODICI VERILOG
175
176
end
endtask
177
178
179
/ / / / ACKNOWLEDGE d a l l o SLAVE
180
181
182
183
184
185
186
187
188
189
190
191
192
task check ack ;
output ack ;
i n t e g e r ack tmp ;
begin
s c l t =0;
s d a t =1;
# ( I2C PERIOD / 2 ) s c l t = 1 ;
#1 a c k t m p <=s d a ;
# ( I2C PERIOD / 2 ) ;
ack = ack tmp ;
end
endtask
193
194
195
/ / / / LETTURA BIT
196
197
198
199
200
201
202
203
204
205
206
task r e a d b i t ;
output b i t r x ;
begin
s c l t = 0;
sda t = 1;
# ( I2C PERIOD / 2 ) s c l t = 1 ;
#1 b i t r x <= s d a ;
# ( I2C PERIOD / 2 ) ;
end
endtask
207
208
209
/ / / / LETTURA BYTE
210
211
212
213
214
215
216
217
218
219
220
task read byte ;
output [ 7 : 0 ] byte ;
integer i ;
begin
f o r ( i =7; i > −1; i =i −1) b e g i n
read bit ( bit rx ) ;
b y t e [ i ]= b i t r x ;
end
end
endtask
221
222
223
/ / / / ACKNOWLEDGE d a l MASTER
224
225
226
227
228
229
230
231
232
233
task send ack ;
input n u l l ;
begin
s c l t =0;
#1 s d a t =0;
# ( I2C PERIOD / 2 ) s c l t = 1 ;
# ( I2C PERIOD / 2 ) ;
end
endtask
234
235
236
/ / / / NOT−ACKNOWLEDGE d a l MASTER
237
238
239
task not ack ;
input n u l l ;
Claudio De Berti
95
APPENDICE A. CODICI HDL
240
241
242
243
244
245
246
begin
s c l t =0;
#1 s d a t =1;
# ( I2C PERIOD / 2 ) s c l t = 1 ;
# ( I2C PERIOD / 2 ) ;
end
endtask
247
248
/ / / / INVIO INDIRIZZO SLAVE
249
250
251
252
253
254
255
256
257
258
259
260
261
task s e n d s l a v e a d r ;
i n p u t [ 6 : 0 ] SLAVE ADR ;
input ReadOrWrite ;
reg [ 7 : 0 ] s a d r ;
begin
s a d r [ 7 : 1 ] = SLAVE ADR [ 6 : 0 ] ;
s a d r [0]= ReadOrWrite ;
send byte ( s adr ) ;
check ack ( ack ) ;
end
endtask
262
263
endmodule
A.2.2
1
Descrizione della cella altri segnali
‘ t i m e s c a l e 1 n s / 100 p s
2
3
module a l t r i s e g n a l i ( d a t a r e a d y , r e s e t ,
OUT TEMP1 , OUT TEMP2 ) ;
OUT REG1 , OUT REG2 , OUT REG3 ,
4
5
6
output d a t a r e a d y , r e s e t ;
o u t p u t [ 7 : 0 ] OUT REG1 , OUT REG2 , OUT REG3 , OUT TEMP1 , OUT TEMP2 ;
7
8
wire d a t a r e a d y , r e s e t ;
9
10
11
reg r e s e t t ;
reg d a t a r e a d y t ;
12
13
14
15
16
17
wire
wire
wire
wire
wire
[7:0]
[7:0]
[7:0]
[7:0]
[7:0]
OUT
OUT
OUT
OUT
OUT
REG1=8 ’ b10000010 ;
REG2=8 ’ b11100110 ;
REG3=8 ’ b11110000 ;
TEMP1=8 ’ b00001111 ;
TEMP2=8 ’ b10110010 ;
18
19
20
21
assign data ready = data ready t ;
assign r e s e t = r e s e t t ;
22
23
24
25
26
27
28
96
i n i t i a l begin
r e s e t t = 1 ’ b0 ;
d a t a r e a d y t =1 ’ b0 ;
#100 r e s e t t = 1 ’ b1 ;
#1100000 d a t a r e a d y t =1 ’ b1 ;
Claudio De Berti
A.2. CODICI VERILOG
29
30
#200 d a t a r e a d y t =1 ’ b0 ;
end
31
32
endmodule
Claudio De Berti
97
Appendice B
Script
B.1
Script per l’esecuzione della sintesi
source . synopsys dc . setup
r e a d h d l −v2001 / home / c o n s o / S y n t h e s i s / c o d i c i / s l a v e . vhd ”
s y n t h e s i z e −t o m a p p e d
s e t c l o c k [ d e f i n e c l o c k −name CK − p e r i o d 1 0 0 0 0 0 0 ]
e x t e r n a l d e l a y − i n p u t 0 − c l o c k CK / n e s i g n / s l a v e / p o r t s i n / *
e x t e r n a l d e l a y − o u t p u t 0 − c l o c k CK / n e s i g n / s l a v e / p o r t s i n / *
w r i t e h d >> s l a v e . v
w r i t e s d f − d e s i g n s l a v e − v e r s i o n 2 . 1 − t i m e s c a l e n s >> s l a v e . s d f
B.2
Script per la realizzazione del layout
########################################################
##
#
## E n c o u n t e r Command F i l e
#
##
#
########################################################
##−−− Load c o n f i g u r a t i o n f i l e
loadConfig c35b4 std . conf 0
commitConfig
##−−− S e t u s e r g r i d s
setPreference ConstraintUserXGrid 0.1
setPreference ConstraintUserXOffset 0.1
setPreference ConstraintUserYGrid 0.1
setPreference ConstraintUserYOffset 0.1
s e t P r e f e r e n c e SnapAllCorners 1
s e t P r e f e r e n c e BlockSnapRule 2
Claudio De Berti
99
APPENDICE B. SCRIPT
##−−− D e f i n e g l o b a l Power n e t s − make g l o b a l c o n n e c t i o n s
clearGlobalNets
g l o b a l N e t C o n n e c t vdd ! − t y p e p g p i n − p i n vdd ! − i n s t * −module { }
g l o b a l N e t C o n n e c t gnd ! − t y p e p g p i n − p i n gnd ! − i n s t * −module { }
g l o b a l N e t C o n n e c t vdd3o ! − t y p e p g p i n − p i n vdd3o ! − i n s t * −module { }
g l o b a l N e t C o n n e c t v d d 3 r 1 ! − t y p e p g p i n − p i n v d d 3 r 1 ! − i n s t * −module { }
g l o b a l N e t C o n n e c t v d d 3 r 2 ! − t y p e p g p i n − p i n v d d 3 r 2 ! − i n s t * −module { }
g l o b a l N e t C o n n e c t gnd3o ! − t y p e p g p i n − p i n gnd3o ! − i n s t * −module { }
g l o b a l N e t C o n n e c t g n d 3 r ! − t y p e p g p i n − p i n g n d 3 r ! − i n s t * −module { }
##−− I n i t i a l i z e f l o o r p l a n
fit
setDrawView f p l a n
setPlaceMode −p l a c e I o P i n s f a l s e
loadIoFile slave pin . io
##−− add CAP c e l l s
addEndCap −p r e C a p ENDCAPL − p o s t C a p ENDCAPR − p r e f i x ENDCAP
##−− R o u t e Power Ring
addRing − s p a c i n g b o t t o m 1 . 0 − s p a c i n g t o p 1 . 0 − s p a c i n g l e f t 1 . 0 −
sp acin g ri ght 1.0 \
− w i d t h t o p 20
− w i d t h l e f t 20
− w i d t h r i g h t 20 \
− w i d t h b o t t o m 20
− l a y e r b o t t o m MET1 − l a y e r t o p MET1 − l a y e r l e f t MET2 − l a y e r r i g h t MET2
\
−offset bottom 0.7 −o f f s e t t o p 0.7 − o f f s e t l e f t 0.7 − o f f s e t r i g h t 0.7
\
− s t a c k e d v i a b o t t o m l a y e r MET1 − s t a c k e d v i a t o p l a y e r MET4 \
−center 1 \
−around core \
−jog distance 0.7 \
−threshold 0.7 \
− n e t s { gnd ! vdd ! }
##−− F o l l o w p i n r o u t i n g
sroute −jogControl { preferWithChanges d i f f e r e n t L a y e r } \
− n e t s { gnd ! vdd ! }
##−− Power S t r i p e s
addStripe −number of sets 2 \
−spacing 1.0 \
− l a y e r MET2 \
− w i d t h 20 \
− x l e f t o f f s e t 500 \
− x r i g h t o f f s e t 500 \
− b l o c k r i n g t o p l a y e r l i m i t MET2 \
− b l o c k r i n g b o t t o m l a y e r l i m i t MET2 \
−max same layer jog length 1.2 \
− p a d c o r e r i n g b o t t o m l a y e r l i m i t MET2 \
− p a d c o r e r i n g t o p l a y e r l i m i t MET2 \
− s t a c k e d v i a t o p l a y e r MET4 \
− s t a c k e d v i a b o t t o m l a y e r MET1 \
−merge stripes value 0.7 \
− n e t s { gnd ! vdd ! }
##−− C o n n e c t Power
s r o u t e − n o S t r i p e s − n o C o r e P i n s −n o P a d R i n g s − n o B l o c k P i n s \
−jogControl { preferWithChanges d i f f e r e n t L a y e r } \
− n e t s { gnd ! vdd ! }
##−− P l a c e m e n t
amoebaPlace
100
Claudio De Berti
B.2. SCRIPT PER LA REALIZZAZIONE DEL LAYOUT
saveDesign s l a v e p l a c e d . enc
##−− S p e c i f y C l o c k t r e e
specifyClockTree − c l k f i l e ctgen . const
##−− Run CTS
ckSynthesis −rguide s l a v e c t s . guide −r e p o r t s l a v e c t s . c t s r p t
saveDesign s l a v e c l k p l a c e d . enc
##−− Add Core F i l l e r c e l l s
source f i l l c o r e . t c l
##−− Run R o u t i n g
wroute
##−− Save D e s i g n
saveDesign s l a v e . enc
##−− W r i t e GDS2
s t r e a m O u t s l a v e f e . g d s 2 − m a p F i l e g d s 2 . map −libName D e s i g n L i b −
structureName slave \
− a t t a c h I n s t a n c e N a m e 1 − a t t a c h N e t N a m e 1 − s t r i p e s 1 − u n i t s 1000 −mode
ALL
s a v e N e t l i s t VERILOG / s l a v e p o s t l a y . v
##−− E x t r a c t d e t a i l p a r a s i t i c s
setExtractRCMode − d e t a i l −rcdb s l a v e . rcdb
setXCapThresholds −totalCThreshold 5.0 −relativeCThreshold 0.01
extractRC
rcOut −spef s l a v e f e . spef
##−− W r i t e SDF F i l e
d e l a y C a l − s d f VERILOG / s l a v e p o s t l a y . s d f − v e r s i o n 2 . 1
##−− End
Claudio De Berti
101
Scarica

Universit`a degli studi di Pavia