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