CAPITOLO 3 Questo capitolo presenta l’architettura del processore fuzzy HEPE96 progettato all’interno del gruppo di ricerca dal dottor Gabrielli e realizzato alla fine del ’96, con particolare attenzione alle caratteristiche di funzionamento ed ai motivi che ne hanno portato alla realizzazione. Di questo progetto ho personalmente assistito alla fase finale di modellazione del layout e alla fase di collaudo del chip con un ASIC Tester LV500 di proprietà dell’Università di Bologna. Vengono anche date alcune informazioni preliminari sul chip HEPE97 con particolare riguardo alle differenze strutturali e funzionali rispetto al processore precedente. Una descrizione più dettagliata di ogni blocco che compone il chip e di tutti i passi seguiti durante la fase di progettazione é riportata nel prossimo capitolo. 3.1 Perché un processore fuzzy Un algoritmo fuzzy progettato per risolvere un particolare problema può essere implementato su una piattaforma software o hardware. E’ ovvio che l’implementazione più semplice di un algoritmo é via software attraverso la stesura di codice in un qualsiasi linguaggio di programmazione che viene fatto girare su un processore tradizionale. Sebbene questa sia la soluzione più economica e semplice da implementare può non essere adatta per molti tipi di applicazioni dove la velocità é un fattore determinante. Per questo motivo un passo ulteriore consiste nel fare girare questi programmi su coprocessori progettati esplicitamente per eseguire velocemente le operazioni di un algoritmo fuzzy, i quali interagiscono con un processore tradizionale che provvede al salvataggio dei dati prodotti su una memoria esterna. Un esempio famoso di questo tipo di applicazione é il coprocessore fuzzy WARP 2.0 della SGSThomson. Se la velocità non é ancora sufficiente occorre utilizzare un processore dedicato che sia l’effettiva implementazione di tutto l’algoritmo fuzzy in hardware. Dati gli ingressi da analizzare il chip deve essere in grado di portare avanti tutta l’elaborazione in base al sistema fuzzy memorizzato in una RAM o ROM interna. Nel caso di una ROM il sistema fuzzy memorizzato rimane fisso mentre nel caso di una RAM o di una ROM programmabile (PROM) qualsiasi sistema fuzzy desiderato dall’utente può essere caricato all’interno. Una soluzione del genere presenta caratteristiche di maggiore compattezza e velocità, ma il problema vero sta nel fatto che sul mercato non si trovano processori di questo tipo. Le applicazioni industriali dei processori fuzzy sono molto sviluppate e tuttora in continua crescita soprattutto nel campo del controllo e del riconoscimento di immagini dove il vincolo principale non é la velocità ma il risparmio. Per applicazioni in cui la velocità é l’obiettivo primario come negli 65 esperimenti di fisica delle alte energie per il riconoscimento on-line di tracce l’unica soluzione possibile é quella di progettare interamente un chip fuzzy che possieda tutte le caratteristiche richieste in relazione all’applicazione finale. Sin dalla prima implementazione di un chip fuzzy veloce che risale al 1986 (Togai e Watanabe) molti ricercatori hanno migliorato le prestazioni hardware adottando soluzioni di tipo analogico, digitale e misto analogico - digitale. Tutte queste considerazioni hanno portato il gruppo di ricerca ad iniziare la progettazione di una famiglia di processori fuzzy molto veloci in grado di prendere delle decisioni in meno di 1 microsecondo. I prossimi paragrafi contengono una descrizione dell’architettura del chip HEPE96 e di quali scelte sono state necessarie per renderlo il più veloce possibile. 3.2 Caratteristiche generali del processore fuzzy La caratteristica innovativa del chip HEPE96, di cui é riportato uno schema a blocchi in fig. 3.1, é quella di avere una velocità di elaborazione indipendente dal sistema fuzzy : infatti poiché nella soluzione adottata ogni sistema fuzzy é sempre composto da tutte le possibili combinazioni dei fuzzy set degli ingressi, il numero totale di regole da memorizzare in una memoria interna al processore (Ramrule) è fisso e dipende dal numero di ingressi e dal numero di fuzzy set per ogni ingresso. L’architettura del chip é di tipo pipeline / parallela per incrementare al massimo le prestazioni : la velocità di elaborazione é di 320 ns quando vengono processati tutti e quattro gli ingressi qualunque sia il sistema fuzzy memorizzato all’interno, mentre si possono incrementare ulteriormente le prestazioni utilizzando un numero minore di ingressi. Il chip é stato realizzato con la tecnologia ES2 0.7 µm CMOS di tipo SPDM (Single Poly Double Metal) : il numero 0.7 µm indica la larghezza minima del canale di un transistor CMOS che può essere realizzata, mentre la sigla SPDM indica che i collegamenti fra le celle vengono realizzati con un singolo strato di polisilicio e con due strati metallici che si trovano a profondità diverse. L’area del chip é di circa 60 mm2, il numero di piedini usati é 82 ed il package utilizzato é del tipo JLCC a 84 piedini. Ecco le caratteristiche più importanti del processore fuzzy : • da 2 a 4 ingressi codificati come numeri di 7 bit ; • una uscita a 7 bit ; • fino a 7 membership function (MF) trapezoidali per ogni ingresso ; • sovrapposizione consentita, al massimo, di due MF adiacenti ; • fino a 2401 regole fuzzy ; • 128 funzioni di appartenenza crisp Zi per l’uscita zeta_out; • 4 bit per il grado di verità di un antecedente e della premessa di una regola, chiamati rispettivamente α e θ ; • metodo di defuzzificazione di Sugeno di ordine 0 ; • operazione T-norm implementata con il minimo o il prodotto per ottenere il valore θ ; 66 • velocità di 50 MFLIPS (Mega Fuzzy Logic Inferences Per Second) quando il processore é pilotato con un clock della frequenza di 50 MHz. Gli ingressi e l’uscita del processore sono codificati come numeri di 7 bit, cioè i dati in ingresso al chip sono già digitalizzati : l’opera di conversione del segnale analogico da portare in ingresso al processore viene effettuata esternamente da un convertitore A/D molto veloce che si trova sulla scheda madre. Dire che la risoluzione di un ingresso é di 7 bit significa che l’intervallo di tensioni in cui può variare il segnale in input viene scomposto in 128 (27=128) parti. Oltre agli ingressi e all’uscita tutti i segnali interni al processore sono di tipo digitale, cioè ogni valore numerico calcolato all’interno é espresso come un numero di più bit X0 X1 X2 X3 M em o ria delle S elettore di reg ole indirizzo delle reg ole rego le attive attiv e R am ru le indirizzo di R am m f F R P C (4 bit) R am m f 0 M F gen . 0 α0 D ec 0 R am m f 1 M F gen . 1 α1 D ec 1 R am m f 2 M F gen . 2 α2 D ec 2 R am m f 3 M F gen . 3 α3 D ec 3 R egola (11 bit) CRC (7 b it) M inim o D efu zzificatore Z out o P rodotto Fig. 3.1: Schema a blocchi del processore fuzzy. a seconda della risoluzione desiderata. Così il grado di appartenenza α ad una funzione di appartenenza ed il grado di verità della premessa di una regola θ sono espressi come variabili di 4 bit. Inoltre così come la velocità di un processore tradizionale si misura in MIPS (Mega Instruction Per Second, cioè il numero di milioni di istruzioni elaborate in un secondo) la velocità di un processore fuzzy si misura in MFLIPS cioè il numero di milioni di processi di inferenza fuzzy effettuati ogni secondo. Poiché HEPE96, nella fase di elaborazione vera e propria, esegue un’inferenza fuzzy in un periodo di clock e quindi in 20 ns, in un secondo vengono effettuate 50 milioni di inferenze logiche. L’architettura del chip può essere suddivisa logicamente nei seguenti blocchi : 1) il blocco della premessa : contiene le parti di un algoritmo fuzzy che riguardano la fuzzificazione degli ingressi e l’inferenza. Quattro generatori di funzioni di appartenenza trapezoidali MF Gen compiono il calcolo di α in base alla geometria trapezoidale di ogni fuzzy set (contenuta all’interno delle memorie Rammf) ; quindi in base ai valori assunti gli operatori di minimo e di 67 prodotto producono il valore di θ che viene poi inviato al blocco successivo. Tutti i calcoli che avvengono all’interno di questo blocco richiedono 10 fasi di pipeline. 2) la memoria delle regole Ramrule : contiene al suo interno tutte le regole fuzzy usate per descrivere e risolvere qualsiasi tipo di problema. Come già menzionato questa memoria è composta da 2401 parole per tenere in considerazione il caso in cui 4 ingressi contemporaneamente siano elaborati. 3) il blocco della defuzzificazione : esegue le due addizioni Σ(Zi*Θi) e ΣΘi tramite due sommatori pipelinizzati che lavorano in parallelo. Una volta che tutte le regole attive, cioè quelle che danno un contributo non nullo, sono state processate le somme finali sono date in ingresso al divisore che calcola il valore finale di zeta_out in base alla seguente formula di Sugeno di ordine 0 : zeta _ out = (3.1) ∑ Zi * Θi ∑ Θi La divisione fra le due somme qui sopra é eseguita da un circuito combinatorio in meno di 80 ns mentre il processore comincia a elaborare un nuovo insieme di dati. Visto che ogni regola é processata in un periodo di clock e visto che con 4 variabili in ingresso si hanno solo 16 regole attive (come spiegato più sotto) si ottiene che il tempo totale di elaborazione si compone nel seguente modo : • il numero di regole attive : 16 x 20 ns = 320 ns • il numero di fasi di pipeline : 12 x 20 ns = 240 ns ; • il tempo che occorre per la divisione : 90 ns per un tempo totale di 650 ns dall’ingresso all’uscita. 3.3 Fase di fuzzificazione : i fuzzy set Il processo di fuzzificazione consiste nel calcolo del grado di appartenenza α per ogni variabile di ingresso. Questo valore indica quanto un ingresso appartiene ad un dato insieme fuzzy mediante un numero compreso fra 0 e 1 : nel nostro caso la variabile α è rappresentata come un numero di 4 bit. I quattro ingressi X0, X1, X2, X3, codificati come numeri di 7 bit, entrano nello stesso istante all’interno del processore. Il blocco Selettore di Regole Attive seleziona, ingresso per ingresso, gli insiemi fuzzy coinvolti dai valori in ingresso. Più in particolare nell’ipotesi che la massima sovrapposizione consentita fra insiemi fuzzy adiacenti sia 2, si ha una situazione quale quella illustrata in fig. 3.2 dove si suppone di avere 7 insiemi fuzzy per ogni variabile. Come si vede in figura l’ingresso X0 coinvolge i due insiemi Molto Piccolo e Piccolo mentre l’ingresso X1 coinvolge gli insiemi Piccolo e Quasi Medio : il grado di appartenenza di X0 e X1 a tutti gli altri gli insiemi è 0. Per questo motivo le regole che includono gli insiemi fuzzy coinvolti si dicono regole attive ; tutte le altre regole danno un contributo nullo e perciò possono essere trascurate. Quindi 68 si è dedicata molta attenzione alla progettazione di un circuito per la selezione delle sole regole attive e cioè il selettore di regole attive : per opera di una serie di confronti successivi fra i punti d’inizio e di fine di ogni fuzzy set questo blocco fornisce in uscita i codici dei 2 insiemi fuzzy coinvolti. In base a questi codici ed ai quattro parametri che caratterizzano ogni insieme trapezoidale i generatori di membership function devono poi calcolare i due valori di α corrispondenti ad ogni ingresso. Questi 4 parametri (vedi fig. 3.3) sono il punto di partenza e di arrivo dei lati obliqui del trapezio e le rispettive pendenze. Nel prossimo paragrafo viene spiegato dettagliatamente come funzionano i quattro generatori dei gradi di appartenenza α che si trovano nel processore. 3.4 Generatori di funzioni di appartenenza trapezoidali I due modi più usati per fuzzificare gli ingressi, cioè per associare un α ad ogni ingresso X, sono la look-up table ed il generatore di membership function. P ic c o lo M ed io A b b a sta n z a G ra n d e G ra n d iss im o M o lto P ic c o lo G ra n d e Q u a si M e d io A b b as tan z a G ran d e P ic c o lo M ed io M o lto P ic c o lo Q u asi M e d io G ran d iss im o G ra n d e X1 Fig. 3.2: Insiemi fuzzy. Una look-up table è costituita da uno o più blocchi di memoria indirizzabile in base al valore assunto dalla variabile di ingresso. In questo modo qualunque valore assuma l’ingresso X i sette bit che lo codificano vengono messi sul bus di indirizzi della look-up table e ciò che esce dal bus di dati della memoria sono proprio i due valori di α corrispondenti. I vantaggi che presenta questo tipo di soluzione sono la semplicità logica e circuitale, la possibilità di avere insiemi fuzzy di qualsiasi forma e la velocità totale del processo di fuzzificazione che si riduce ad un accesso in memoria e quindi ad un solo periodo clock. Per contro una look-up table di questo tipo occupa un’area molto estesa : nel caso del fuzzy 69 chip con 4 variabili d’ingresso che hanno una risoluzione di 7 bit occorrono 4 blocchi di memoria contenenti ciascuno 128 parole di 8 bit (4 bit + 4 bit per i due valori di α), il che corrisponde ad una memoria totale di 512 byte. Inoltre volendo aumentare la risoluzione degli ingressi o degli α le dimensioni della memoria esploderebbero : occorre quindi trovare una soluzione alternativa. La soluzione adottata in HEPE96 é un generatore di membership function trapezoidali : questo circuito approssima una generica funzione di forma trapezoidale con due linee oblique e tre zone in cui α è fissato o al valore minimo o massimo (zona alta e zona bassa). E’ ovvio che per definire una forma trapezoidale sono necessari quattro parametri : come si vede in fig. 3.3 sono stati scelti il punto di salita A e il punto di discesa B e i due coefficienti angolari dei lati obliqui K1 e K2. Vediamo più da vicino come Z o n a alta 15 α Z o na b a ssa 0 A K1 K2 A1 B Z o n a b a ssa B1 12 7 X Fig.3.3: Funzione di appartenenza trapezoidale. funziona il generatore nel caso di variabili d’ingresso di 7 bit e gradi di verità α di 4 bit. Le due zone denominate zona alta e zona bassa possono essere generate con dei comparatori digitali. Ogni comparatore verifica se la variabile X appartiene ad una di queste zone: in caso affermativo il grado di verità α é posto o a 0 o a 15. Il resto della funzione di appartenenza deve essere generato in un’altra maniera. Per calcolare α lungo i lati obliqui in base a X deve essere implementata in hardware una semplice formula di trigonometria piana. Definiamo le seguenti grandezze in base alla fig. 3.3: Salita = X - A; Discesa = X - B; K1 = 128 / (A1 - A); K2 = 128 / (B1 - B) (A1-A) e (B1-B) sono gli intervalli di salita e discesa dei lati obliqui del trapezio: in base al loro valore sono calcolati i valori K1 e K2 che sono numeri interi compresi fra 0 e 127. Anche le variabili Salita e Discesa possono variare in tutto l’universo del discorso di X e quindi sono codificate come variabili a 7 bit. Usando queste notazioni valgono le seguenti formule: 70 α=(∆Y/(A1-A))*Salita; 8*α=8*(∆Y/(A1-A))*Salita; 8*α=(128/(A1-A))*Salita; α = (K1 * Salita)/8 8*α=K1*Salita (3.3) Î In queste formule ∆Y é stato posto uguale a 16 anche se il suo valore corretto sarebbe 15 ma, poiché 15 / (A1-A) non é un numero intero e dovrebbe quindi essere arrotondato, l’approssimazione fatta é ragionevole. Stesso discorso va fatto per il numero 127 che é stato rimpiazzato con 128. Tutte le formule sopra possono essere applicate anche per il lato discendente sostituendo le opportune variabili ma si può notare che i valori di α relativi al lato discendente sono uguali al complemento a 1 degli α corrispondenti ad una retta dalla pendenza opposta. Grazie a questa osservazione le due rette possono essere generate con lo stesso hardware riducendo di molto l’area globale effettivamente necessaria. In questo modo, con la scelta operata dei 4 parametri che definiscono la forma trapezoidale, il calcolo di α si riduce ad una moltiplicazione fra due numeri di 7 bit e ad una divisione per il numero 8 che viene effettuata tramite un semplice troncamento delle ultime 3 cifre. Tutto questo ragionamento é stato ideato appositamente per evitare un’operazione di divisione fra numeri diversi da potenze di 2 in quanto una divisione in hardware é un processo che impiega molto tempo rispetto alle altre operazioni. Il generatore di membership function che si trova sul processore ha un’area di circa 2 mm2 e funziona correttamente con un clock di 50 MHz grazie ad una struttura di tipo pipeline. 3.5 Organizzazione della memoria delle regole Oltre alla codifica in hardware degli insieme fuzzy occorre porre particolare attenzione alla gestione delle regole del sistema fuzzy. Appare evidente fin dall’inizio che occorre un altro blocco di memoria RAM (che d’ora in poi sarà chiamata memoria delle regole) per memorizzare tutte le regole fuzzy, il problema che si pone ora sta nel come organizzare la memoria. Se ad esempio una regola fuzzy é strutturata nel seguente modo : se (X0 é Piccolo) e (X1 é Medio) allora (Z é Grande) e gli insiemi fuzzy Piccolo, Medio e Grande sono codificati rispettivamente con i bit 00, 01 e 10 un modo per esprimere la regola può essere il seguente : 00-01-10. Inoltre può succedere che una variabile d’ingresso non sia presente in una regola, é perciò necessario utilizzare un codice adatto che tenga conto della sua esclusione, in questo caso é naturale scegliere 00. Il numero totale di regole di un sistema fuzzy dipende dal numero di ingressi N e dal numero K di fuzzy set associati ad ogni ingresso. Poiché gli ingressi possono variare ovunque nei rispettivi domini si possono avere tante regole quante sono le possibili combinazioni di N gruppi di K elementi a N a N. In questo modo il numero totale di regole é dato da KN che, a seconda dei valori di K e di N, può 71 essere un numero decisamente alto. Nel nostro caso avendo 4 ingressi con 7 membership function ciascuno il numero complessivo di regole é 74=2401. Quindi il numero totale di regole che devono essere memorizzate internamente al chip é di 2401 in modo da tenere conto di un sistema fuzzy completo, cioè un sistema fuzzy dove tutte le regole possibili sono presenti. Ciononostante dato l’insieme dei valori d’ingresso X0, X1, X2, X3 il numero di regole attive, cioè le regole che danno un contributo non nullo in uscita, é una frazione molto piccola rispetto al totale. Sotto la condizione di una sovrapposizione massima fra fuzzy set adiacenti di due il numero di regole che possono dare una uscita non nulla si riduce da KN a 2N. Nel nostro caso quindi la selezione delle regole attive riduce il peso computazionale del processore dal dovere analizzare 2401 regole fino a sole 16 (=24). Il tempo dovuto all’inferenza fuzzy di ogni insieme di valori in ingresso si riduce quindi a 320 ns, cioè a 16 cicli di 20 ns ciascuno. Il modo più efficace per riempire la memoria delle regole é quello di inserire le regole negli indirizzi successivi di memoria in maniera ordinata : per esempio la prima regola fuzzy (che si trova all’indirizzo 1) é quella riguardante tutti i primi insiemi fuzzy mentre l’ultima riguarda tutti gli ultimi insiemi fuzzy. La memoria delle regole potrebbe quindi essere ordinata in questo modo : PRIMA REGOLA (indirizzo 1): se(X0 é MF0) e (X1 é MF 0) e (X2 é MF0) e (X3 é MF0) allora (Z é MF1) SECONDA REGOLA (indirizzo 2): se(X0 é MF1) e (X1 é MF 0) e (X2 é MF0) e (X3 é MF0) allora (Z é MF2) ............... ULTIMA REGOLA (indirizzo 2401): se(X0 é MF6) e (X1 é MF 6) e (X2 é MF6) e (X3 é MF6) allora (Z é MF2401) In questo modo dato l’indirizzo é già noto a priori, a parte l’uscita Z, quale regola fuzzy si stia considerando : così il codice con cui si individua una regola fuzzy non deve essere memorizzato in quanto é già compreso nell’indirizzo. L’indirizzo di ogni regola attiva viene generato dal selettore di regole attive che mette insieme i 3 bit dei fuzzy set coinvolti per ogni variabile dando luogo ad un α 15 0 127 I II III 72 IV V Fig. 3.4: I cinque punti necessari al selettore di regole attive. indirizzo a 12 bit che definisce in maniera univoca quale fra le 2401 regole andare a leggere. Nella parola di memoria vanno quindi memorizzati solamente il CRC (il Consequent Rule Code, cioé il valore Z della MF di uscita) ed il codice FRPC (il Fuzzy Rule Premise Code) il quale tiene conto della presenza o meno della regola fuzzy nel sistema fuzzy iniziale (prima di essere convertito via software in un sistema fuzzy completo). Il seguente esempio può chiarire le idee : se l’FRPC vale 0110 ciò significa che la regola fuzzy deriva da una regola originale dove solo gli ingressi X1 e X2 erano presenti e cioè i valori di X0 e X3 erano ininfluenti. Se l’FRPC vale 0000 ciò vuole dire che non esiste nessuna regola corrispondente nel sistema fuzzy originario e quindi il suo contributo deve essere nullo. In questo modo la memoria delle regole del processore risulta composta di 2401 parole da 11 bit. Infatti quattro bit sono usati per il codice FRPC, un bit per ognuno degli ingressi, ed i rimanenti sette bit sono usati per il conseguente Z della regola (CRC) che individua uno fra i 128 fuzzy set della variabile d’uscita zeta_out. La memoria che ne risulta é molto grande e per questo motivo, soprattutto per diminuire il tempo di accesso e la dissipazione, é stata divisa in 5 blocchi di memoria separati, 4 blocchi contenenti 512 parole da 11 bit ciascuno ed un blocco di 353 parole. 3.6 Funzionamento del processore Vediamo come scorre il flusso di dati all’interno del processore durante la fase di running vera e propria, cioè una volta che il sistema fuzzy é stato memorizzato all’interno. Non appena l’insieme di ingressi X0, X1, X2, X3 entra nel processore il primo blocco interessato é il selettore di regole attive, che identifica i fuzzy set interessati per ognuna delle 4 variabili. Per poter svolgere questo compito il selettore contiene al suo interno una serie di registri dove sono stati memorizzati 5 punti per ogni ingresso. Come si vede in fig. 3.4 5 punti sono sufficienti a distinguere quali siano i due insiemi fuzzy interessati mantenendo sempre l’ipotesi che al massimo due insiemi adiacenti possano sovrapporsi. Quindi se il valore reale del dato in ingresso é compreso fra il primo ed il secondo punto i due insiemi coinvolti sono il secondo ed il terzo, e così via. Questo blocco esegue tutti i confronti fra il valore dell’ingresso ed i cinque punti memorizzati fino a trovare il codice del primo dei due insiemi coinvolti : il secondo codice viene generato banalmente sommando una unità al precedente. Individuati gli insiemi fuzzy due processi partono in parallelo : il primo é volto a comporre l’indirizzo di ognuna delle 16 regole attive, il secondo dà il via alla fase di calcolo degli α attraverso i generatori di membership function. Il primo processo avviene mettendo insieme i 3 bit di codice di ogni fuzzy set coinvolto per ogni ingresso fino a formare i 16 indirizzi di 12 bit delle regole attive facendo tutte le possibili combinazioni; il secondo processo avviene come segue : una volta determinato il codice di un fuzzy set viene indirizzata la memoria degli 73 insiemi fuzzy Rammf per ricavare i dati della forma dell’insieme (A, K1, B, K2) in base ai quali il generatore produce il grado di appartenenza α dell’ingresso al corrispondente insieme. Per ragioni di velocità la natura di questo processo é di tipo parallelo : per ognuno dei 4 ingressi l’accesso alla memoria Rammf avviene contemporaneamente, uno per ciascuno dei 4 blocchi in cui é stata suddivisa ; in più quattro generatori di membership function lavorano in parallelo fino a fornire in uscita, ad ogni colpo di clock, i valori dei quattro α di ogni regola. Il passo logico successivo é il processo di inferenza degli α tramite minimo o prodotto dei 4 valori ottenuti : come visibile sempre in fig. 3.1 questo passo é vincolato al valore degli FRPC ottenuti dalla lettura delle regole nella Ramrule. Grazie ai 4 blocchi circuitali Dec se una variabile non é presente in una regola fuzzy il corrispondente grado di verità α viene settato al valore logico ‘1’ cioè 1111 in binario, in modo tale da non dare alcun contributo alle operazioni di minimo e di prodotto. In questo modo grazie ad una architettura Z ( 7 b it) M o ltip licaz io ne Θ* Z 11 b it S o m m a de i prodo tti ΣΘΖ N U M 15 b it Θ ( 4 b it) S o m m a de i Θ ΣΘ DEN 8 b it D iv iso re Z eta_ o u t ( 7 bit) Fig. 3.5: Suddivisione interna del blocco di defuzzificazione. fortemente parallelizzata e pipelinizzata in uscita dal blocco di inferenza si avrà, per ogni colpo di clock e per 16 periodi successivi, il grado di verità θ della premessa di ogni regola attiva e, contemporaneamente, dalla Ramrule il valore Z dell’uscita di ogni regola. I valori Z e θ che escono in maniera sincrona da questo blocco del processore vengono poi mandati in ingresso al terzo blocco fondamentale del chip : il Defuzzificatore. Questo blocco (vedi fig. 3.5) prende in ingresso i valori Z e θ e ne esegue la moltiplicazione per ottenere il prodotto Z * θ di 11 bit. Due sommatori che lavorano in parallelo eseguono poi le sommatorie da 1 a 16 di tutti i prodotti Z * θ (per ottenere il numeratore della formula di Sugeno) e di tutti i θ (per ottenere il denominatore). Quando anche l’ultima addizione é stata eseguita può partire in maniera asincrona il processo di divisione del numeratore e denominatore così ottenuti, mentre quattro nuovi 74 ingressi possono già essere introdotti all’interno del processore. In questo modo l’inferenza di tutte le regole attive é realizzata attraverso blocchi di tipo pipeline mentre la divisione finale che dà in uscita il risultato é eseguita in parallelo al processo di inferenza di un nuovo set di dati : tutto questo é fatto per incrementare il throughput totale del chip. Le prestazioni ottenute soddisfano infatti gli obiettivi proposti : ogni 320 ns si può presentare un nuovo set di ingressi al chip ed ogni 320 ns si ha in uscita un valore utile. 3.7 Fasi di pipeline L’architettura generale del processore fuzzy é di tipo pipeline come mostrato in fig. 3.6 dove é visualizzato il flusso di dati all’interno del chip per ogni fase di pipeline. Come già detto però vi sono varie strutture di tipo pipeline che lavorano in parallelo: questo perché diversi calcoli devono essere effettuati contemporaneamente. Ne sono un esempio i due sommatori che si trovano nel blocco di defuzzificazione. Le 20 fasi di pipeline mostrate in figura sono costituite da 12 fasi di pipeline vere e proprie e da 8 fasi dovute al numero di regole attive. Infatti la figura riporta il caso di soli 3 ingressi usati che danno luogo a 23=8 regole attive. Nel caso di 4 ingressi alle 12 fasi standard vanno aggiunte 16 fasi dovute alle 16 regole attive per un totale di 28 passi totali. Dall’istante in cui un nuovo insieme di dati entra nel chip sono necessarie 12 fasi di pipeline per i processi di fuzzificazione e di inferenza. Più in dettaglio al primo periodo di clock gli ingressi sono sincronizzati con il segnale di clock interno, quindi il selettore di regole attive comincia ad esaminare gli insiemi fuzzy coinvolti. Durante la seconda fase di pipeline é generato il primo indirizzo di memoria (l’indirizzo della prima regola attiva) mentre durante la terza i 4 parametri degli insiemi trapezoidali sono già pronti per i generatori di membership function. Questi circuiti impiegano ciascuno 3 fasi di pipeline per il calcolo di α, dal quarto al sesto periodo di clock. Questo processo avviene mentre la memoria delle regole Ramrule viene indirizzata e letta ad ogni colpo di clock. Una volta che i tre α sono pronti devono essere selezionati in base all’FRPC della regola corrispondente e ciò avviene nella settima fase di pipeline. Quindi i quattro α (i tre selezionati più un quarto posto ad 1111 per non influenzare il minimo o il prodotto) sono processati due alla volta fino ad ottenere il valore di Θ. Il primo Θ é prodotto nella decima fase di pipeline poiché durante l’ottava e la nona fase sono eseguiti il minimo ed il prodotto mentre nella decima viene scelto fra i due valori quello desiderato. Il primo prodotto Θ*Z é valido due periodi successivi durante la dodicesima fase di pipeline. Dopodiché é necessario aspettare gli 8 periodi di clock dovuti alle 8 regole attive e finalmente sia la somma ΣΘ*Z che ΣΘ sono completate : a questo punto parte la divisione. Quello che é realmente interessante in una struttura pipeline di questo tipo é che il processore a questo punto é in grado di ricevere un nuovo set di dati mentre sta ancora eseguendo la divisione dei dati precedenti. La fig. 3.6 riporta quanto ora esposto periodo clock dopo periodo. 75 In un caso come questo il ritardo globale dalla fase di carica degli ingressi al risultato finale corrispondente é di 480 ns se si usa un clock di 50 MHz : 12 x 20 ns = 240 ns é il tempo dovuto alle vere e proprie fasi di pipeline; 8 x 20 ns = 160 ns é il ritardo dovuto al numero di regole attive; 80 ns é il tempo dovuto alla divisione. Ciononostante il valore veramente interessante non é questo ma é la distanza di tempo con cui si possono mandare nuovi ingressi al processore (input data set rate) che in questo caso é di 160 ns. C lo c k L o a d _ In p u t In g re ssi a sin cro n i In g re ssi sin c ro n i In p u t_ R ea d y In d . d i R a m m f In d . d i R am ru le U scita R a m ru le F RPC e CR C v a lo ri d i α αse le zio n ati v a lo ri d i Θ ΣΘ ΣΖ∗Θ O u tp u t_ R ea d y Fig. 3.6: Fasi di pipeline 3.8 Generazione del layout del processore Per raggiungere gli scopi proposti di velocità e basso consumo oltre allo studio di una architettura logica ottimizzata per l’elaborazione di algoritmi fuzzy occorre studiare varie soluzioni hardware che permettano di raggiungere il miglior compromesso fra gli obiettivi da raggiungere. Perciò prima di tutto la memoria 76 Ramrule é stata divisa in cinque blocchi più piccoli, come già descritto, per ridurre sia il tempo d’accesso sia il consumo. Infatti sapendo quale parte di memoria dovrà essere letta é possibile abilitare soltanto il blocco di memoria corrispondente invece che abilitarli tutti. Questa soluzione riduce il consumo delle memorie ad un quinto del loro valore globale. In altre parole abilitando solo un blocco di memoria alla volta e lasciando gli altri blocchi in modalità stand-by la potenza dissipata é molto ridotta in confronto a quella di un unico blocco di memoria equivalente. Inoltre generalmente più piccolo é il blocco di memoria e minore risulta il tempo di accesso. Tutte queste considerazioni danno luogo ad una maggiore area del chip ma ciò può essere accettato in virtù di una maggiore velocità. In secondo luogo tutte le standard cell che sono state implementate nel resto del processore fuzzy, dal generatore di membership function al selettore di regole attive, dal blocco dell’inferenza a quello di defuzzificazione, sono state divise in quattro blocchi principali in base alla funzione logica per la quale erano stati progettati. Più in dettaglio i blocchi sono i seguenti : 1) il blocco degli indirizzi che contiene tutti i circuiti per la selezione degli indirizzi delle memorie compreso pure il selettore degli intervalli ; 2) il blocco dei generatori di α che contiene i 4 generatori MF Gen; 3) il blocco di defuzzificazione che contiene i due sommatori paralleli, il moltiplicatore 7 x 4 bit ed il divisore finale ; 4) il blocco della logica di controllo che gestisce la sincronizzazione di tutti i segnali all’interno del processore. C o ntrollo M F G en Indirizzi D efuzz. Divise in questo modo tutte le celle e megacelle del processore R am m f possono essere disposte in maniera razionale all’interno del chip come si vede in fig. 3.7. R am rule Una disposizione di questo tipo permette poi di tracciare in R am rule maniera semplice una struttura R am rule ad albero per la pista del clock e una struttura tipo dita della R am rule mano per le piste di alimentazione e di massa. Prima R am rule però di passare ad una descrizione delle piste interne conviene fare alcune osservazioni sull’area occupata F ig . 3 .7 : G eo m etria d el lay o u t d el ch ip . da ciascuno dei blocchi ora descritti. L’area di un blocco circuitale prevista teoricamente in base alla somma delle aree di tutte le porte logiche e l’area vera e propria del blocco nel layout hanno due valori molto diversi : ad esempio l’area teorica di un singolo generatore di membership function é 0.55 mm2, mentre quella effettiva sul layout é di circa 2 mm2. Questo é un fattore di cui é necessario tenere conto 77 quando si passa dallo schematic al layout : l’area prevista a priori può diventare due o tre volte più grande. Ad esempio l’area prevista a priori per il chip HEPE96 era di circa 40 mm2 mentre in realtà si é oltrepassato questo valore di un fattore 2/3 fino all’area finale di 60 mm2. Le memorie RAM occupano tutta la parte sinistra del processore : più in dettaglio ogni memoria Rammf occupa 0.17 mm2 per un totale di 0.68 mm2. Lo spazio necessario a queste RAM però é molto maggiore visto che, avendo bus di dati di ingresso e uscita di 28 bit ciascuno, c’é bisogno di molto spazio per tutte le piste che si dipartono dalle memorie e vanno alle standard cell. Per quanto riguarda la memoria delle regole ogni blocco da 512 parole occupa 1.94 mm2 mentre il blocco di 313 occupa 1.59 mm2 per un totale di 9.35 mm2. In confronto alla Rammf lo spazio fra due blocchi della Ramrule sembra molto minore in quanto i bus di dati sono più piccoli e la regione su cui si estendono é molto più vasta. In ogni caso le memorie RAM portano via più spazio di tutte le altre strutture poste sul chip, ma la loro presenza é necessaria se si vogliono mantenere i tempi di elaborazione raggiunti. L’altro blocco molto grande del chip é dato dai 4 generatori di membership function i quali, insieme, occupano 5.5 mm2. Il blocco degli indirizzi compreso il selettore delle regole attive occupa 4.55 mm2, il blocco di defuzzificazione occupa 3.46 mm2. La logica di controllo che presiede al corretto funzionamento del processore occupa infine circa 4 mm2. Facendo la somma dei blocchi ora delineati si ottiene un’area di circa 28 mm2. I rimanenti 32 mm2 sono spartiti nel seguente modo : 12.50 mm2 é l’area dovuta ai pad mentre i rimanenti 19 mm2 sono riservati ai canali per i bus di alimentazione, massa, clock, ecc. Questa é la conclusione abbastanza sorprendente che si deduce da un’analisi quantitativa del layout : circa un terzo dell’area totale é spesa per i collegamenti mentre un quinto é riservato ai soli pad di I/O. 78 Fig. 3.8: Layout finale del processore fuzzy HEPE96. La figura 3.8 mostra i dettagli il layout finale del processore come visualizzato da Cadence mentre la successiva figura 3.9 mostra alcuni particolari molto interessanti del layout e cioè la disposizione delle piste di alimentazione, della massa e del clock. Come si vede tutti i cinque piedini di alimentazione sono posti sulla parte alta del chip e le piste di alimentazione si dipartono dall’alto in basso con quattro piste diverse come le dita di una mano; nello stesso modo i cinque piedini di massa sono posti in basso e quattro piste si dipartono verso l’alto interdigitate rispetto a quelle di VDD. Poiché il clock deve pilotare solo le standard cell e non anche le memorie vi é un’unica pista del clock larga 15 µm che parte dall’alto e va in ingresso a tutti i flip-flop tipo D. La fig. 3.10 é una microfotografia in bianco e nero che mostra l’interno del chip e le microsaldature che collegano i pad del nucleo ai piedini esterni dell’integrato. 79 Fig. 3.9: Le piste di alimentazione, di massa e del clock nel layout del chip. Fig. 3.10: Microfotografia del processore fuzzy HEPE96. 80 3.9 Trattamento dei segnali di I/O Come già spiegato varie volte la velocità del processore in termini di tempo computazionale é un obiettivo primario : per questo oltre ad ottimizzare l’architettura e l’hardware é molto importante rendere il chip facile da usare per quanto riguarda il trattamento dei segnali di ingresso - uscita. Il processore fuzzy verrà posto su una scheda madre e sincronizzato con un clock esterno che si trova sulla scheda. La gestione della sincronizzazione dei segnali di ingresso e uscita non é delegata a device esterni quali controllori o processori dedicati ma viene gestita interamente dal chip fuzzy tramite alcuni segnali di controllo appositamente progettati. Ecco una breve descrizione di questi segnali : • il segnale Input_Ready, sincrono con il clock esterno, viene usato per abilitare il ciclo di scrittura sul chip da parte di un device esterno che lo pilota. Questo segnale é un bit di uscita del processore fuzzy che si porta al livello logico 1 quando il chip é in grado di accettare un nuovo insieme di dati in ingresso. Quindi Input_Ready si porta a livello logico 0 una volta avvenuto il fetch degli ingressi, rimane a tale livello per 320 ns finché non é terminato il processo di inferenza di tutte le 16 regole e poi si porta al livello logico 1. In questo modo il device esterno può scrivere all’interno del processore fuzzy, per mezzo di un segnale pilotato dall’esterno Load_Input, solo quando l’uscita Input_Ready é attivata. Inoltre il device esterno deve mantenere il nuovo set di dati ed il segnale di Load_Input per almeno due periodi clock. Grazie a questo artificio il processore fuzzy può riconoscere il ciclo di scrittura del device esterno e sincronizzare i dati in ingresso con il clock che pilota tutta la scheda. • Altri due segnali di uscita chiamati rispettivamente Output_Ready1 e Output_Ready2 sono stati implementati per abilitare il device esterno a salvare l’uscita una volta che questa é pronta. Poiché il processore fuzzy può essere sincronizzato con un clock di 50 MHz e poiché il processo di divisione può durare fino ad 80 ns questi due segnali sono sincronizzati rispettivamente tre e cinque periodi dopo l’inizio della divisione. In questo modo se il clock con cui viene pilotato il chip é di 50 MHz solo l’uscita Output_Ready2 ha senso in quanto Output_Ready1 é attivato prima che il dato in uscita sia valido. Se invece la frequenza di clock é inferiore può essere usata anche l’uscita Output_Ready1. Inoltre questi due segnali possono essere considerati sia nella fase di salita sia nella fase di discesa in quanto quando sono a livello logico 0 non sono attivi mentre hanno una transizione di stato quando diventano attivi. Con tutti questi accorgimenti si é tentato di raggiungere la gestione della sincronizzazione dei segnali di I/O più flessibile possibile. Nella fig. 3.11 é mostrata una possibile applicazione del processore fuzzy : il chip può essere montato su una scheda pilotata direttamente dalla porta parallela di un qualsiasi PC dal quale chiunque può caricare all’interno del processore un sistema fuzzy (tramite opportuno software) e farlo lavorare. Il PC carica il primo 81 device esterno 1 con i dati desiderati dall’utente e, fatto ciò, il processore fuzzy può cominciare a lavorare alla propria velocità. Fig. 3.11: Implementazione del processore fuzzy su scheda. 3.10 Test del chip HEPE96 Una volta che il chip é stato realizzato dalla fonderia in numero di 20 pezzi rimane solo una cosa da fare : il test di ogni chip su una scheda apposita. In pratica grazie ad una apparecchiatura progettata appositamente per testare i circuiti integrati, un ASIC Tester LV500 della Tektronics, vengono forniti agli ingressi i valori voluti e vengono studiate le uscite per verificare l’accordo con i risultati delle simulazioni software. Il lavoro di test di un chip si compone di due parti : la prima, che é di tipo pratico, richiede l’allestimento della scheda su cui verrà inserito il chip. Il processore, che si trova all’interno di un package di tipo JLCC a 84 piedini, viene inserito all’interno di uno zoccolo a 84 pin. Ognuno di questi pin risulta collegato attraverso la scheda ad una serie di contatti esterni contraddistinti da una lettera e un numero. I contatti corrispondenti all’alimentazione e alla massa del chip vengono collegati esternamente all’alimentazione e alla massa della scheda mentre il segnale in ingresso a tutti gli altri contatti viene fornito direttamente dall’ASIC Tester. La seconda parte consiste nella programmazione del software della macchina in modo da fornire in ingresso i dati desiderati con i relativi giusti template. Purtroppo il software che gestisce l’ASIC Tester non é direttamente interfacciabile con Cadence e quindi occorre scrivere tutti gli ingressi voluti a mano e ciò può richiedere molto tempo visto che per un efficace test i vettori d’ingresso sono molti. Ciononostante il Tester é una macchina molto potente che permette di testare qualsiasi chip fino alla frequenza massima di lavoro di 50 MHz e permette di fornire gli ingressi con il template esatto pensato dal progettista. Questo vuole dire che se il clock funziona a 50 MHz e cioé con un 82 periodo di 20 ns l’ASIC Tester é in grado di variare gli ingressi all’interno di questo periodo con una risoluzione di 2 ns. Per ora sono state effettuate due simulazioni sul processore HEPE96: nella prima per cominciare con un numero basso di vettori d’ingresso si é usato il chip nella configurazione a due ingressi mentre nella seconda si é passati alla configurazione vera e propria di lavoro con 4 ingressi utilizzati. I template utilizzati sono stati esattamente quelli pensati a priori con Verilog e Veritime ed é stato interessante iniziare la simulazione del chip partendo da una frequenza di lavoro bassa (qualche MHz) per poi arrivare un pò alla volta fino alla frequenza vera e propria di 50 MHz. Con l’ASIC Tester si potrebbe provare anche ad aumentare la frequenza di lavoro oltre il valore stimato dai simulatori software per verificare se, nella realtà (e quindi non nel caso peggiore possibile come sempre stimato da Verilog e Veritime) il chip possa andare ancora più veloce. Rimane però il problema che il Tester non riesce a fornire gli ingressi con una frequenza superiore a 50 MHz. Se però si osserva che l’unico ingresso che deve variare alla frequenza massima é il clock mentre tutti gli altri variano con una frequenza inferiore (ad esempio gli ingressi X0, X1, X2, X3 variano solo ogni 16 periodi di clock) basta fornire a parte un clock esterno ad una frequenza superiore per potere testare il funzionamento del chip a questa velocità. Una volta effettuati i primi test con successo occorre ripetere le stesse operazioni per tutti i 20 pezzi forniti dalla ES2 per verificare l’assenza di errori di fabbricazione e fare lavorare ogni singolo chip per diverse ore consecutivamente per vedere se si surriscalda eccessivamente o no. I risultati di test del chip HEPE96 sono stati ottimi : tutti e 20 i chip hanno dimostrato di funzionare correttamente anche dopo ore di lavoro prolungato. Da questi test sono stati poi desunti i template finali per tutti gli ingressi in ognuna della fasi di lavoro del chip (carica delle varie memorie, carica dei punti intervallo, fase di running vera e propria) che saranno poi riportati nel datasheet funzionale del processore . La fig 3.12 riporta le temporizzazioni degli ingressi nella fase di carica delle memorie, nella fase di clear e nella fase di running vera e propria. Il progettista che comincerà la fase di progettazione della scheda madre su cui dovrà poi lavorare permanentemente il chip non avrà bisogno di sapere esattamente tutti i dettagli interni ma si accontenterà di conoscere l’esatta temporizzazione esterna del chip per poi programmare accuratamente la temporizzazione della scheda che lo pilota. 3.11 Il processore fuzzy HEPE97 Il processore fuzzy HEPE97 ha un’architettura simile a quella di HEPE96 ma si distingue perché é dotato di 2 ingressi invece che 4 e risulta quindi molto più piccolo e veloce. Le caratteristiche generali del chip sono riportate in fig. 3.14 insieme ad una vista del layout finale in fig. 3.13. Poiché si hanno due soli ingressi con al massimo 8 insiemi fuzzy ciascuno le regole fuzzy che dovranno essere memorizzate in una memoria interna sono soltanto 82 = 64 mentre il numero di regole attive, con la solita ipotesi di una massima sovrapposizione 83 consentita fra insiemi fuzzy adiacenti di 2, si riduce a 22 = 4. Da questi primi numeri si possono trarre due considerazioni : poiché devono essere memorizzate CK 2ns WE RE SET CLOCK S E T _ R A M [2 :0 ] 12n s R ESE T 12ns 20ns X 0 [6 :0 ] X 1 [6 :0 ] X 2 [6 :0 ] X 3 [6 :0 ] c y cle = 4 0 n s M E_LO A D 2 8 ns c y c le = 4 0 n s C LO C K 1ns 10ns O U TPU T_R EA D Y _0 O U TPU T_R EA D Y _1 IN P U T _ R E A D Y Z E TA O U T [6 :0 ] O U T P U T D ATA X 0 [6 :0 ] X 1 [6 :0 ] X 2 [6 :0 ] X 3 [6 :0 ] L O A D _ IN P U T a lm en o 2 p e rio d i d i c lo c k cy c le = 2 0 n s Fig. 3.12: Temporizzazione degli ingressi del processore in tutte le fasi. solo 64 regole la superficie occupata dalla Ramrule sarà molto piccola e di conseguenza lo sarà anche l’area totale del chip che infatti risulta essere di soli 14 mm2; inoltre poiché si hanno solo 4 regole attive la frequenza con cui si possono presentare nuovi valori in ingresso scende a soli 4 periodi di clock. Considerando poi che il chip può essere pilotato con una frequenza massima di 84 62.5 MHz (periodo clock di 16 ns) anche in considerazione del fatto che essendo molto piccolo le capacità parassite ed i relativi ritardi sono molto ridotti, un nuovo set di dati può essere preso in ingresso ogni 64 ns e quindi con una frequenza di 15.6 MHz. Inoltre alla frequenza di lavoro di 62.5 MHz il processore fuzzy é capace di processare i dati alla notevole velocità di 62.5 MFLIPS, cioé 62.5 milioni di inferenze fuzzy al secondo. Viste queste caratteristiche innovative di HEPE97 rispetto al processore precedente si é pensato che fosse importante realizzare a parte anche questo chip nonostante le sue funzionalità di base fossero già incluse nel precedente. 3.12 Caratteristiche principali di HEPE97 Le carattersitiche principali di HEPE97 sono le seguenti: • 2 variabili in ingresso X0 e X1 codificate come numeri di 7 bit; • 8 insiemi fuzzy per ogni ingresso; • 64 regole totali di cui solo 4 attive; • 4 bit per i gradi di verità di un antecedente e di una premessa, chiamati rispettivamente α e θ; • 2 metodi di inferenza : minimo e prodotto; • 44 piedini di I/O. Lo schema a blocchi del processore é riportato in fig. 3.13 : come si vede la struttura generale é molto simile a quella del processore a 4 ingressi. Infatti la si può dividere logicamente nelle solite tre parti : 1) blocco di fuzzificazione ed inferenza; 2) blocco della memoria delle regole Ramrule; 3) blocco di defuzzificazione. La differenza sostanziale rispetto ad HEPE96 sta nella generazione dei valori di α: in questo progetto infatti il calcolo degli α é affidato ad una doppia look-up table indirizzata dal contenuto degli ingressi X0 e X1. I questo caso infatti la memoria mantiene delle dimensioni accettabili, anzi di molto inferiori a quelle di un generatore aritmetico di membership function: le dimensioni delle look-up table Rammf_X0 e Rammf_X1 sono di circa 0.5 mm2 ciascuna contro i 2 mm2 di un generatore aritmetico. Inoltre l’uso di una memoria possiede anche i pregi di richiedere un unico periodo di clock per la generazione di α e di essere più flessibile : infatti una look-up table può memorizzare funzioni di appartenenza di forma qualsiasi (con il limite dato dalla risoluzione di α che é di 4 bit). Per il resto il funzionamento logico di HEPE97 é molto simile al processore precedente ed é qui di seguito riassunto. I due ingressi X0 e X1 entrano contemporaneamente in ingresso al Selettore degli intervalli e alle memorie Rammf_X0 e Rammf_X1. Il Selettore degli intervalli seleziona i codici di 3 bit x e x+1 dei due insiemi fuzzy coinvolti da X0 ed i codici y e y+1 per X1. Combinando a due a due questi codici con le combinazioni (x,y), (x,y+1), (x+1,y) e (x+1,y+1) si ottengono gli 85 indirizzi a 6 bit delle 4 regole attive che si trovano nella memoria Ramrule. Una parola di questa memoria é costituita da 9 bit di cui 2 individuano l’FRPC, cioé la X0 X1 S eletto re d i in te rva lli 7 R a m m f_ X 0 7 R am m f_ X 1 x 6 b it x+ 1 y y+ 1 2 α0 α1 α2 α3 R am ru le M inim o o P ro d otto b loc c o di d e fu zz ific az ion e ed in fe re nz a Z FR PC Θ∗Ζ ΣΘ∗Ζ ΣΘ D iv iso re blo c co d i d efuz zifica zion e ze ta_ o ut Fig. 3.13: Schema a blocchi del processore HEPE97. presenza o meno di entrambe le variabili nella regola originale, e gli altri 7 individuano la funzione di appartenenza Z dell’uscita zeta_out. Contemporaneamente dalla memoria Rammf_X0 vengono estratti i due valori α0 e α1 corrispondenti ai valori di appartenenza di X0 ai due insiemi fuzzy interessati e così i valori α2 e α3 per l’ingresso X1. Questi α vengono processati due alla volta con le combinazioni (α0, α2), (α0, α3), (α1, α2) e (α1, α3) nello stesso ordine con cui sono stati generati gli indirizzi delle regole corrispondenti in base al valore del corrispondente FRPC: così se nella prima regola questo codice vale 01 α0 viene posto ad 1111 per non influenzare le operazioni di minimo e di prodotto. Così facendo in quattro periodi di clock si avranno il valore θ e l’uscita corrispondente Z pronti per entrare in ingresso al blocco di defuzzificazione dove verrà eseguita la solita formula di Sugeno di ordine 0 fino ad ottenere il valore in uscita zeta_out. Nel prossimo capitolo viene data una descrizione dettagliata del procedimento da seguire per passare da una descrizione logica come quella data in questo capitolo ad una descrizione accurata di ogni blocco fisico che compone il chip fino alla progettazione del layout finale. 86 Fig. 3.13: Vista del layout finale di HEPE97 (la scala é in µm). CARATTERISTICHE DI PROGETTO Numero di ingressi 2 Fuzzy set per ingresso <= 8 Numero di uscite 1 ro N di fuzzy set per uscita 128 ro N di bit per ingresso 7 ro N di bit per grado di verità 4 ro N totale di regole 64 ro N di regole attive 4 Metodo di inferenza 1 MIN Metodo di inferenza 2 PROD Frequenza di clock (MHz) <= 62.5 Input set rate (ns) >= 64 CARATTERISTICHE DEL LAYOUT Tecnologia usata 0.7 µm 2 Area totale (mm ) 14 ro N di transistor 38000 ro N di standard cell 3500 ro N di macrocelle 3 ro N di pad di I/O 44 Larghezza della pista clock 3 µm Larghezza della pista VDD 80 µm Consumo in mA <= 100 Consumo in mW <= 430 Package JLCC <= 100 Temperatura di lavoro (°C) Fig. 3.14: Tabella delle caratteristiche del processore a 2 ingressi. 87 88