Caso di studio 1: Progetto di un sistema su un chip 1 Caso di studio 1: Progetto di un sistema su un chip In questo caso di studio • • • • Progettazione di un sistema per la realizzazione su un chip FPGA Come usare strumenti CAD Come usare moduli parametrici Cosa considerare tipicamente nella progettazione Nel Capitolo 10 si è discusso l’uso di microcontrollori nei sistemi embedded. In un’applicazione embedded, è desiderabile usare quanti meno chip sia possibile. Idealmente, un singolo chip potrebbe realizzare l’intero sistema. Il termine sistema su un singolo chip (SOC) è in uso per designare questa tecnologia. In applicazioni semplici, alcuni dei microcontrollori disponibili in commercio possono realizzare tutte le funzioni necessarie. Questo è improbabile per applicazioni più complesse. La progettazione di un microcontrollore per un’applicazione embedded complessa e la sua realizzazione sotto forma di un singolo chip specifico è un obiettivo ambizioso e costoso. È anche molto dispendioso in termini di tempo. Eppure, il tempo di sviluppo per la maggior parte dei prodotti di consumo deve essere breve. Un chip che realizzi un intero sistema per una certa applicazione si può sviluppare in un tempo molto più breve se il progettista ha accesso a moduli con circuiti predefiniti che siano disponibili in una forma facile da usare. Il circuito di un processore è uno dei moduli necessari. Tali circuiti sono detti nuclei-processore (processor core) nella letteratura tecnica. Si può ottenere una varietà di nuclei-processore, mediante accordi per le licenze, da un certo numero di aziende. Si possono ottenere altri moduli per realizzare memoria, interfacce di ingresso/uscita, circuiti di conversione A/D e D/A, o circuiti di elaborazione digitale di segnale, DSP (Digital Signal Processing). Lo sviluppatore di un sistema completa quindi il progetto utilizzando i moduli disponibili e progettando il resto dei circuiti specifici per l’applicazione. I fornitori di nuclei-processore e di altri moduli vendono i progetti piuttosto che i chip. Essi forniscono la proprietà intellettuale, IP (Intellectual Property) che altri possono usare per progettare i loro chip. Per facilitare lo sviluppo di prodotti basati su IP, sono disponibili una varietà di strumenti di assistenza alla progettazione, CAD (Computer-Aided Design). Il costo di realizzazione di un chip progettato in modo personalizzato è un fattore importante. La fabbricazione di tali chip è costosa e, sebbene offrano prestazioni migliori e consumi ridotti, il loro costo può essere giustificato solo Hamacher, Vranesic, Zaky, Manjikian, Introduzione all’architettura dei calcolatori 3e © 2013 McGraw-Hill Education Italy S.r.l. Caso di studio 1: Progetto di un sistema su un chip 2 se sono necessari un gran numero di chip per applicazioni specifiche. Una possibilità alternativa è l’uso di tecnologia FPGA (Field Programmable Gate Array), ovvero di matrici di porte logiche programmabili sul campo. C1.1 Realizzazione FPGA Le FPGA forniscono una piattaforma attraente per la realizzazione di sistemi su singolo chip. A differenza dei chip microcontrollori disponibili in commercio, che forniscono al progettista una serie di unità funzionali predefinite, i dispositivi FPGA permettono una completa libertà nel processo di progettazione. Essi permettono l’inclusione di moduli IP adatti e quindi la generazione del resto del sistema come desiderato. Questo si può realizzare con relativa facilità. Una volta che il progetto è completato e collaudato, lo si può realizzare in un dispositivo FPGA immediatamente. La capacità delle FPGA è drammaticamente cresciuta. Un singolo chip FPGA può realizzare un sistema che comprende centinaia di migliaia di porte logiche. Tali chip sono sufficientemente grandi da poter realizzare le funzionalità tipiche di un microcontrollore e altri circuiti necessari per un’applicazione embedded complessa. In questo caso di studio si esaminano le questioni relative all’impiego di FPGA in un ambiente embedded. Per rendere la discussione quanto più pratica possibile, si considera la tecnologia fornita da Altera Corporation, che è uno dei principali fornitori di dispositivi FPGA e software CAD di supporto. C1.1.1 Dispositivi FPGA La struttura di base delle FPGA è spiegata in Appendice A. I dispositivi FPGA contengono un gran numero di elementi logici e risorse di cablaggio versatili che si possono usare per interconnetterli. Di solito contengono anche una notevole quantità di memoria che si può usare per realizzare le parti di RAM e ROM di un sistema embedded se i requisiti di dimensione della memoria non sono troppo grandi. Molte FPGA includono anche circuiti moltiplicatori, che sono particolarmente utili nelle applicazioni DSP. Un dispositivo FPGA va programmato per realizzare un particolare progetto. Gli elementi logici includono interruttori programmabili da impostare per realizzare le funzioni logiche desiderate. Tipicamente, si può programmare un elemento logico per realizzare funzioni logiche di quattro, cinque o sei variabili. L’elemento logico comprende inoltre un flip-flop per rende- Hamacher, Vranesic, Zaky, Manjikian, Introduzione all’architettura dei calcolatori 3e © 2013 McGraw-Hill Education Italy S.r.l. Caso di studio 1: Progetto di un sistema su un chip 3 re possibile la realizzazione di registri e macchine a stati finiti. Le linee di interconnessione contengono anche interruttori programmabili, che si usano per interconnettere gli elementi logici per realizzare il circuito desiderato. Il processo di programmazione per l’impostazione degli interruttori viene detto configurazione del dispositivo FPGA. Nella maggior parte dei dispositivi FPGA, lo stato di ogni interruttore programmabile si trova in una cella SRAM del tipo discusso nel Paragrafo 8.2.2. Poiché le celle SRAM mantengono il loro stato solo finché l’FPGA ha l’alimentazione, tali FPGA sono volatili. Se si toglie l’alimentazione si deve riconfigurare il dispositivo quando la si fornisce nuovamente. Per configurare l’FPGA, si devono caricare le informazioni di configurazione nel dispositivo. Questo viene fatto tipicamente utilizzando un altro chip, detto dispositivo di configurazione, che mantiene le informazioni richieste in una memoria di tipo Flash. Ogni volta che si fornisce l’alimentazione, il dispositivo di configurazione programma automaticamente l’FPGA. Di solito la memoria Flash del dispositivo di configurazione è abbastanza grande da contenere non solo i dati di configurazione per i circuiti da realizzare nell’FPGA, ma anche informazioni aggiuntive che possono includere dati o codice. Se nell’FPGA si realizza un nucleo-processore, allora nel dispositivo di configurazione si può memorizzare del codice che il processore eseguirà. C1.1.2 La scelta del processore La componente significativa di qualsiasi sistema su chip è il nucleo-processore. Esistono due alternative distinte per i sistemi basati su FPGA. Una riguarda un processore che è definito in software e realizzato in una FPGA allo stesso modo di qualsiasi altro circuito. L’altra comporta un chip FPGA specializzato che ha un nucleo realizzato sul chip al momento della fabbricazione. Nucleo-processore software La soluzione più flessibile è quella di realizzare un modulo software scritto in un linguaggio di descrizione dell’hardware, come Verilog o VHDL, che specifica un processore parametrico. Il progettista di un sistema embedded può impostare i parametri per ottenere un processore con le caratteristiche adatte per l’applicazione prevista. Per esempio, un parametro riguarda la configurazione della cache, dove le scelte possono essere: • nessuna cache; • cache per le istruzioni, ma non per i dati; • cache per le istruzioni e per i dati. Hamacher, Vranesic, Zaky, Manjikian, Introduzione all’architettura dei calcolatori 3e © 2013 McGraw-Hill Education Italy S.r.l. Caso di studio 1: Progetto di un sistema su un chip 4 Un altro parametro può riguardare l’inserimento di circuiti moltiplicatori e divisori nel processore. Le operazioni di moltiplicazione e divisione si possono realizzare in hardware, tuttavia si possono anche realizzare in software. Realizzarle in hardware fa uso di più risorse FPGA, ma migliora notevolmente le prestazioni. Nucleo-processore hardware Un’alternativa all’approccio software al nucleo-processore è di realizzare il processore direttamente come un modulo hardware sul chip, creando cosı̀ una FPGA specializzata. Questo produce un sistema con prestazioni più elevate. Il costo di tali FPGA è superiore al costo dei dispositivi FPGA regolari. C1.2 Strumenti per la progettazione assistita dal calcolatore I produttori di dispositivi FPGA forniscono potenti strumenti CAD che rendono il compito di progettare sistemi embedded relativamente facile. Una varietà di moduli predefiniti sono forniti in forma parametrica. Il progettista crea un sistema inserendo questi moduli e specificando i parametri per soddisfare i requisiti dell’applicazione. Esempi di tali moduli sono: • nuclei-processore, • moduli di memoria e interfacce, • interfacce di I/O parallele, • interfacce di I/O seriali, • circuiti temporizzatori/contatori. Tali moduli possono essere sufficienti per realizzare tutte le funzioni necessarie in un sistema embedded desiderato. Se non lo sono, allora si devono progettare e includere nel sistema ulteriori circuiti specializzati. Tipicamente, prima si specifica un sottosistema che comprende un nucleoprocessore e altri moduli parametrici. Si usa uno strumento CAD per generare un modulo che realizza il sottosistema. Questo modulo è definito in un linguaggio di descrizione dell’hardware. Se ne crea quindi un’istanza nel progetto complessivo, insieme ad altri eventuali circuiti specifici per l’applicazione che siano stati creati. Infine, si usa un altro strumento CAD per sintetizzare e realizzare il progetto complessivo in una forma utilizzabile per configurare il dispositivo FPGA. Oltre al dispositivo FPGA, è necessario includere i componenti esterni necessari per completare il sistema, come interruttori, schermi e chip di memoria Hamacher, Vranesic, Zaky, Manjikian, Introduzione all’architettura dei calcolatori 3e © 2013 McGraw-Hill Education Italy S.r.l. Caso di studio 1: Progetto di un sistema su un chip 5 aggiuntiva. Tali componenti vanno collegati ai piedini appropriati sulla FPGA. Si discuteranno questi aspetti nel contesto di un esempio di progettazione nel Paragrafo C.3. Per dare al lettore un esempio specifico di strumenti CAD e moduli per dispositivi FPGA, si considerano brevemente gli strumenti forniti da Altera Corporation. Tutte le informazioni sulla sua tecnologia e sugli strumenti sono disponibili sul sito web di Altera: www.altera.com. C1.2.1 Strumenti CAD Altera I principali strumenti CAD Altera sono noti come software Quartus II. Essi comprendono una gamma completa di strumenti necessari per progettare e realizzare un sistema digitale in un dispositivo FPGA. Si può usare uno di questi strumenti, il SOPC Builder (generatore SOPC), per progettare sistemi che comprendono un nucleo-processore. Questo strumento fornisce un certo numero di moduli parametrici che si possono usare nel sistema progettato. Per illustrare la loro natura, si considereranno quattro di questi moduli. Processore Nios II Il processore Nios II è descritto negli approfondimenti applicativi dei capitoli 2 e 3. Per la realizzazione su FPGA, è fornito in tre versioni: economica, standard e veloce. La versione economica è la più semplice e meno costosa da realizzare (in termini di risorse FPGA). Essa ha anche le prestazioni più basse. Non incorpora alcuna cache, non è in pipeline e non usa predizioni di salto. Si ottengono prestazioni migliori con la versione standard, che è dotata di una cache per le istruzioni, è in pipeline e usa la predizione statica di salto. Si ottengono le migliori prestazioni con la versione veloce, che include entrambe le cache per istruzioni e dati e usa la predizione dinamica di salto. Vi sono diversi parametri che un progettista può specificare, comprese le dimensioni delle cache per istruzioni e dati. I nuclei-processore Nios II sono sufficientemente piccoli da occupare solo una piccola parte di un dispositivo FPGA. È possibile realizzare fino a dieci nuclei Nios II su una FPGA relativamente piccola. Memoria Si possono usare blocchi di memoria in un dispositivo FPGA per realizzare le cache e una porzione della memoria principale. La porzione della memoria principale realizzata in questo modo viene detta memoria su chip. Si può configurare questa memoria in vari modi: la si può realizzare come memoria Hamacher, Vranesic, Zaky, Manjikian, Introduzione all’architettura dei calcolatori 3e © 2013 McGraw-Hill Education Italy S.r.l. 6 Caso di studio 1: Progetto di un sistema su un chip Spiazzamento dell’indirizzo (n – 1) (in byte) 0 0 Dati di ingresso/uscita 4 Controllo della direzione di ciascuna linea di ingresso 8 Abilitazione delle interruzioni di ciascuna linea di ingresso 12 Direzione del fronte in ciascuna linea di ingresso Dati Direzione Maschera-interruzioni Cattura-fronte Figura C1.1: Registri nell’interfaccia PIO. di tipo RAM o ROM e se ne possono specificare le dimensioni e la lunghezza di parola in fase di progettazione. Se la memoria su chip non è abbastanza grande da contenere il software necessario in un’applicazione embedded, allora occorre fornire memoria aggiuntiva utilizzando chip di memoria esterni. Il SOPC Builder facilita la generazione di controllori e interfacce necessarie per collegare un sistema realizzato nella FPGA a una varietà di componenti di memoria esterni, quali SRAM, SDRAM e dispositivi Flash. Interfaccia di I/O parallela Un’interfaccia parallela, detta PIO, è un modulo parametrico che si può usare sia per funzioni di ingresso che di uscita. In fase di progettazione si può selezionare la porta dati per servire come: • porta di ingresso, • porta di uscita, • porta bidirezionale. Se si sceglie l’opzione bidirezionale, allora le linee di dati PIO si devono collegare a piedini di tipo tristate della FPGA. Il processore accede a una PIO come a un’interfaccia con unificazione degli spazi di indirizzamento di memoria e I/O e comunica con essa nel modo descritto nel Capitolo 3. I registri della PIO sono mostrati in Figura C1.1. La dimensione n del registro è un parametro specificato in fase di progettazione nell’intervallo da 1 a 32. I registri vengono utilizzati come segue. • Il registro Dati contiene n bit di dati che sono trasferiti fra il processore e l’interfaccia PIO. Hamacher, Vranesic, Zaky, Manjikian, Introduzione all’architettura dei calcolatori 3e © 2013 McGraw-Hill Education Italy S.r.l. Caso di studio 1: Progetto di un sistema su un chip 7 • Il registro Direzione determina la direzione di trasferimento (ingresso o uscita) per ciascuna delle n linee di dati quando si realizza una porta bidirezionale. • Il registro Maschera-interruzioni è utilizzato per abilitare le interruzioni dalle linee di ingresso collegate alla PIO. Si possono sollevare richieste di interruzioni individuali su ciascuna delle n linee di ingresso possibili. • Il registro Cattura-fronte indica variazioni di valori logici rilevate nei segnali sulle linee di ingresso collegate alla PIO. Il tipo di fronte (ascendente o discendente) che viene rilevato è specificato in fase di progettazione. Le linee che collegano la PIO a un dispositivo I/O si possono configurare individualmente. Se la PIO serve solo come porta di ingresso, tutte le n linee sono configurate come ingressi in fase di progettazione. Analogamente, per una porta di uscita, tutte le linee sono configurate come uscite. In questi casi, il registro Direzione non è necessario, e non è realizzato nel circuito generato. Per una porta bidirezionale il registro Direzione è incluso; quando il valore del suo bit k è uguale a 1 (0), la linea k della porta funziona come uscita al (ingresso dal) dispositivo di I/O collegato. Quando la PIO è usata come porta di ingresso, il registro Dati contiene i valori logici attualmente presenti sulle linee di ingresso. Si possono rilevare variazioni nei valori logici sulle linee di ingresso mediante il registro Catturafronte. In fase di progettazione, è possibile specificare che i bit di questo registro siano impostati a 1 quando si ha un fronte nel segnale di ingresso. Il fronte si può specificare come: ascendente, discendente, o qualsiasi dei due. I bit del registro Cattura-fronte sono azzerati da un’istruzione di programma che scrive uno zero nel registro. Il registro Maschera-interruzioni consente di abilitare e disabilitare le interruzioni. Scrivendo 1 nella posizione del bit k del registro si abilitano le interruzioni causate dall’attività sulla linea di ingresso k. Le interruzioni possono essere: • sensibili al livello, nel qual caso viene sollevata una richiesta di interruzione quando il segnale su una qualsiasi linea di ingresso abilitata ha valore 1; • sensibili al fronte, nel qual caso viene sollevata una richiesta di interruzione quando un qualsiasi bit abilitato nel registro Cattura-fronte è uguale a 1. Si noti che gli indirizzi dei registri PIO in Figura C1.1 sono distanziati di quattro, indipendentemente dalla lunghezza n. Cosı̀, gli indirizzi dei registri sono allineati alla parola. Hamacher, Vranesic, Zaky, Manjikian, Introduzione all’architettura dei calcolatori 3e © 2013 McGraw-Hill Education Italy S.r.l. 8 Caso di studio 1: Progetto di un sistema su un chip Temporizzatore di intervallo Il modulo temporizzatore fornisce una funzionalità simile a quella del cronometro descritto nel Problema risolto 3.2 dell’Eserciziario. Il suo componente principale è un contatore il cui contenuto è decrementato di uno a ogni ciclo del clock. Si può specificare che il contatore sia a 32 o 64 bit. In questa discussione si assumerà che il contatore abbia 32 bit. L’interfaccia del temporizzatore di intervallo ha i registri rappresentati in Figura C1.2. Ogni registro ha 16 bit. Nel registro di stato si usano solo due bit: • ESEGUI è uguale a 1 quando il contatore è in esecuzione, altrimenti è uguale a 0; questo bit non è interessato se il processore scrive nel registro di stato; • TO è il bit di timeout; è impostato a 1 quando il contatore raggiunge lo 0 e resta impostato a 1 fino a quando il processore lo annulla scrivendo uno 0 in esso. Nel registro di controllo, si usano quattro bit: Spiazzamento dell’indirizzo 15 (in byte) 0 4 4 3 2 1 0 RUN TO STOP START CONT ITO 8 Valore iniziale del contatore (16 bit inferiori) 12 Valore iniziale del contatore (16 bit superiori) 16 Valore istantaneo del contatore (16 bit inferiori) 20 Valore istantaneo del contatore (16 bit superiori) Registro di stato Registro di controllo Figura C1.2: Registri nell’interfaccia del temporizzatore di intervallo. • ARRESTO è impostato a 1 per fermare il contatore; • AVVIO è impostato a 1 per far sı̀ che il contatore si avvii; • CONT determina il comportamento del contatore quando raggiunge 0: se CONT=0, il contatore si ferma quando raggiunge 0; se CONT=1, il contatore ricarica il valore di conteggio iniziale e continua a contare; Hamacher, Vranesic, Zaky, Manjikian, Introduzione all’architettura dei calcolatori 3e © 2013 McGraw-Hill Education Italy S.r.l. Caso di studio 1: Progetto di un sistema su un chip 9 • ITO abilita le interruzioni quando è impostato a 1. Si deve caricare il valore di conteggio iniziale in due operazioni di scrittura a 16 bit. Si usano i registri di valore istantaneo del contatore per ottenere un’istantanea del contenuto del contatore mentre è in esecuzione. Un’operazione di scrittura su uno qualsiasi dei due registri fa scattare l’istantanea, il che significa che il contenuto corrente del contatore è caricato nei registri di valore istantaneo. Questi registri si possono poi leggere in modo usuale. Oltre alla possibilità di utilizzare il valore iniziale di conteggio per definire un periodo di timeout, si può specificare un periodo di timeout predefinito in fase di progettazione. Il periodo di tempo predefinito è usato se il valore di conteggio iniziale è zero. Si genera una richiesta di interruzione quando TO=1 e ITO è impostato a 1. Per cancellare questa richiesta, il processore deve scrivere uno 0 in TO. Nel prossimo paragrafo, si utilizzeranno i moduli di cui sopra in un esempio di progettazione completo. C1.3 Esempio di orologio sveglia In questo paragrafo si presenta un esempio dettagliato di sistema embedded. Si mostra come si può realizzare una sveglia utilizzando la tecnologia FPGA. La sveglia, mostrata in Figura C1.3, ha le seguenti caratteristiche: • vi sono quattro schermi a 7 segmenti che indicano l’orario in ore e minuti, • si usa un interruttore scorrevole on/off per attivare la funzione di allarme, • si usano due interruttori scorrevoli per abilitare l’impostazione dell’orario attuale e dell’ora di sveglia, • si usano due interruttori a pulsante per impostare le ore e i minuti, • un LED indica che l’allarme è attivato, • due LED, disposti verticalmente, creano i due punti che separano ore e minuti, • si emette un ronzio quando l’interruttore scorrevole dell’allarme è attivato e si raggiunge l’ora di sveglia. C1.3.1 Vista di utente del sistema La Figura C1.3 mostra la sveglia come è vista dall’utente. Gli schermi a sette segmenti, del tipo illustrato in Figura P3.3a dell’Eserciziario, indicano l’orario, mostrato nell’intervallo da 00:00 fino a 23:59. Il funzionamento dell’orologio è il seguente: Hamacher, Vranesic, Zaky, Manjikian, Introduzione all’architettura dei calcolatori 3e © 2013 McGraw-Hill Education Italy S.r.l. Caso di studio 1: Progetto di un sistema su un chip Ora Minuto 10 Imposta Imposta orario orario Allarme attuale allarme on/off Allarme ON Figura C1.3: Vista di utente della sveglia. • quando si fornisce l’alimentazione, l’orario del giorno e l’orario di allarme sono azzerati; • si imposta l’orario del giorno attivando l’interruttore scorrevole Imposta orario attuale e quindi impostando il tempo mediante i pulsanti Ora e Minuto: ogni volta che si preme un pulsante, l’orario visualizzato viene incrementato di uno; • l’orario di sveglia è impostato allo stesso modo quando si attiva l’interruttore Imposta orario allarme; • si attiva l’allarme mediante l’interruttore Allarme on/off ; ciò fa sı̀ che il corrispondente LED si accenda; • l’altoparlante emette un ronzio quando si raggiunge l’orario di sveglia con l’interruttore di allarme attivato. C1.3.2 Definizione del sistema e generazione L’obiettivo qui è di realizzare la sveglia con un chip FPGA e componenti esterni che comprendono: interruttori scorrevoli, pulsanti, schermi a 7 segmenti, LED e un altoparlante. La Figura C1.4 illustra il sistema desiderato. Il processore è il Nios II. La memoria su chip è sufficientemente grande per soddisfare le esigenze della presente applicazione, persino in chip FPGA molto piccoli. I componenti esterni sono collegati tramite interfacce PIO. Vi sono due cronometri. Uno è progettato per fornire intervalli di un minuto, da utilizzare per aggiornare l’orario attuale. L’altro serve a generare un’onda quadra che produce un ronzio. Si realizzano i cronometri usando il modulo Temporizzatore di intervallo descritto nel Paragrafo C1.2.1. Si assume che gli interruttori scorrevoli generino un segnale logico 1 quando attivati. Gli interruttori a pulsante sono antirimbalzo e generano un segnale logico 0 quando vengono pigiati. Hamacher, Vranesic, Zaky, Manjikian, Introduzione all’architettura dei calcolatori 3e © 2013 McGraw-Hill Education Italy S.r.l. 11 Caso di studio 1: Progetto di un sistema su un chip Memoria sul chip Processore Temporizzatore dei minuti Temporizzatore del segnale acustico Chip FPGA Rete di interconnessione PIO1 PIO2 PIO3 PIO4 PIO5 Interruttori scorrevoli Interruttori a pulsante Schermi a 7 segmenti LED Altoparlante Figura C1.4: Diagramma a blocchi della sveglia. Il sistema è realizzato nel dispositivo FPGA usando il software Quartus II. Si usa il Generatore SOPC per realizzare i blocchi nella zona ombreggiata della Figura C1.4. I blocchi PIO sono configurati come segue: • PIO1 è una porta di ingresso a tre bit; i suoi ingressi sono sensibili al livello; • PIO2 è una porta di ingresso a due bit; i suoi ingressi sono sensibili al fronte di discesa, in modo che un bit nel registro Cattura-fronte sia impostato a 1 quando il pulsante corrispondente viene premuto; • PIO3 è un porta di uscita a 32 bit; ogni byte sarà collegato a uno schermo a 7 segmenti, sı̀ che ciascuno dei bit da 0 a 6 di un byte azioni un segmento, mentre non si usa il bit 7; il byte di ordine inferiore sarà collegato alla cifra più bassa dei minuti, quello di ordine superiore alla cifra più alta delle ore; • PIO4 è una porta di uscita a tre bit; • PIO5 è una porta di uscita a un bit. Usando il Generatore SOPC, questo sistema viene specificato come mostrato in Figura C1.5. Si noti che le PIO hanno nomi che indicano le loro funzioni. Il Generatore SOPC assegna gli indirizzi ai vari componenti nel sistema. La memoria su chip occupa l’intervallo da 0 a 0x3FFF, mentre le interfacce di cronometri e PIO hanno indirizzi a partire da 0x5000. Il progettista, se lo desidera, può specificare indirizzi diversi. Si noti inoltre che Hamacher, Vranesic, Zaky, Manjikian, Introduzione all’architettura dei calcolatori 3e © 2013 McGraw-Hill Education Italy S.r.l. Caso di studio 1: Progetto di un sistema su un chip 12 Figura C1.5: Sistema su chip FPGA progettato con SOPC Builder. i cronometri e gli interruttori a pulsante possono sollevare richieste di interruzioni (IRQ). L’ultima colonna nella figura indica le posizioni dei bit dei registri di controllo Nios II ctl3 e ctl4 che sono associati con le interruzioni provenienti da queste sorgenti. Il Generatore SOPC crea il sistema specificato producendo un modulo che descrive il sistema in uno dei linguaggi di descrizione dell’hardware Verilog o VHDL. C1.3.3 Realizzazione del circuito Il sistema software Quartus II include un compilatore che accetta una specifica di un sistema digitale in un linguaggio di descrizione dell’hardware. Il compilatore sintetizza un circuito che realizza il sistema, e determina come questo circuito deve essere realizzato sul chip FPGA. Poiché i dispositivi esterni devono essere collegati ai piedini della FPGA, il progettista deve specificare le connessioni desiderate. Questa operazione è detta assegnazione dei piedini. Il compilatore genera la realizzazione finale sotto forma di un file di configurazione usato per scaricare le informazioni di configurazione nel dispositivo FPGA. La Figura C1.4 non mostra tutti i componenti necessari per realizzare l’orologio sveglia completo. Mancano l’alimentazione, il generatore di segnale di clock e il dispositivo di configurazione necessario a programmare la FPGA. Hamacher, Vranesic, Zaky, Manjikian, Introduzione all’architettura dei calcolatori 3e © 2013 McGraw-Hill Education Italy S.r.l. Caso di studio 1: Progetto di un sistema su un chip 13 Si assume che sia fornito un segnale di clock esterno a 100 MHz. I piedini della FPGA in genere non si possono collegare direttamente a dispositivi esterni quali interruttori, schermi a sette segmenti e LED. Ciascun dispositivo ha le proprie caratteristiche elettriche, il che significa che solitamente si devono usare componenti quali resistori, come in Figura 10.13. Nel nostro progetto, i pulsanti per l’impostazione di ore e minuti sono connessi ai corrispondenti bit b1 e b0 della PIO, rispettivamente. Gli interruttori scorrevoli imposta orario attuale, imposta orario allarme, e allarme on/off sono rispettivamente collegati ai corrispondenti bit b2 , b1 , e b0 . Il cronometro dei minuti ha un periodo di timeout di 60 secondi. Il cronometro del segnale acustico ha un periodo di timeout di 1 ms. C1.3.4 Software applicativo Occorre realizzare un programma da eseguire sull’hardware progettato per realizzare le funzioni dell’orologio sveglia. Realizzeremo due programmi, uno in linguaggio C e un altro nel linguaggio assemblativo Nios II, per illustrare come si possono scrivere questi programmi. Il programma sviluppato deve essere compilato in codice macchina Nios II. All’avvio, tale codice sarebbe caricato nella memoria sul chip dal dispositivo di configurazione. Qui si adotta il seguente approccio per realizzare i programmi. L’orario attuale e l’orario di sveglia sono mantenuti sotto forma di interi binari a 32 bit che rappresentano il tempo in minuti. L’orario attuale è incrementato di uno ogni volta che il cronometro dei minuti raggiunge lo zero, il che è indicato dal valore 1 del bit TO nel suo registro di stato. Quando l’orario attuale viene incrementato, occorre verificare se ha raggiunto 1440, che è il numero di minuti in un giorno. In tal caso, si deve azzerare l’orario in modo da corrispondere alla transizione da 23:59 a 00:00. Un controllo analogo è necessario quando si imposta l’orario premendo i pulsanti. Per visualizzare l’ora, le quattro cifre decimali che rappresentano ore e minuti sono calcolate dividendo il tempo per 600 per ottenere la cifra di ordine alto delle ore, quindi dividendo il resto per 60 per ottenere la cifra di ordine basso delle ore, e cosı̀ via. Si usa una tabella per ottenere le corrispondenti sequenze binarie che sono inviate agli schermi a 7 segmenti. Si usa il cronometro del segnale acustico per creare un segnale a onda quadra di 500 Hz, che produce un ronzio quando è collegato a un altoparlante. Questo cronometro è eseguito in modalità continua. Dal momento che ha un periodo predefinito di timeout di 1 ms, si potrebbe generare direttamente il segnale a 500 Hz invertendo il valore logico del segnale alla fine di ogni periodo Hamacher, Vranesic, Zaky, Manjikian, Introduzione all’architettura dei calcolatori 3e © 2013 McGraw-Hill Education Italy S.r.l. Caso di studio 1: Progetto di un sistema su un chip 14 del cronometro. Tuttavia, per illustrare come si può definire un periodo diverso in un programma, si userà il registro del valore iniziale del contatore per specificare il periodo desiderato. In questo caso, occorre il valore 0x30D40 per il segnale a 500 Hz se il contatore è pilotato da un clock a 100 MHz. Quando si usa la scansione per il segnale di timeout di un cronometro, è necessario controllare il bit TO nel suo registro di stato. Poiché il bit RUN è sempre uguale a 1 quando il contatore gira, si può effettuare la scansione controllando se il contenuto del registro di stato è uguale a 3. Il bit TO si può portare a 0 semplicemente scrivendo uno zero nel registro di stato, perché lo stato del bit RUN non è influenzato da un’operazione di scrittura. Programma C La Figura C1.6 mostra un possibile programma in linguaggio C. La presente applicazione non è impegnativa in termini di prestazioni, quindi si usa il metodo della scansione per accedere a tutte le PIO e ai cronometri. I commenti nel programma spiegano il significato delle varie istruzioni. Si osservi che la macro AGGIUSTA definisce un’espressione che incrementa l’orario in modo opportuno in diverse situazioni. Programma in linguaggio assemblativo La Figura C1.7 presenta un programma Nios II. Per illustrare l’uso delle interruzioni, il programma usa le interruzioni per gestire il cronometro dei minuti. Si usa la scansione per il cronometro del segnale acustico. In fase di progettazione, il Generatore SOPC ha assegnato 0x20 quale indirizzo dove inizia il gestore delle interruzioni quando il processore accetta una richiesta di interruzione. Il gestore di interruzioni verifica che vi sia un’interruzione causata da un dispositivo esterno al processore Nios II e aggiusta di conseguenza l’indirizzo di rientro (si veda l’Approfondimento applicativo 3.2 per una spiegazione dettagliata del meccanismo delle interruzioni del Nios II); quindi azzera il bit TO nel cronometro dei minuti e chiama la routine di servizio delle interruzioni. Si noti che il gestore delle interruzioni salva, e poi ripristina, il contenuto dei registri r2 e ra. Salva il contenuto di ra, che è il registro di collegamento che contiene l’indirizzo di rientro da sottoprogramma, poiché un’interruzione da cronometro può aversi durante l’esecuzione di un sottoprogramma; anche il gestore delle interruzioni usa il registro ra per una chiamata alla routine di servizio delle interruzioni, AGGIORNA ORA, che incrementa l’orario attuale (e a mezzanotte lo azzera). Il programma principale inizia impostando la pila del processore e azzerando le locazioni di memoria che contengono l’orario. Come parte del Hamacher, Vranesic, Zaky, Manjikian, Introduzione all’architettura dei calcolatori 3e © 2013 McGraw-Hill Education Italy S.r.l. Caso di studio 1: Progetto di un sistema su un chip 15 processo di inizializzazione, imposta il periodo di timeout per il cronometro del segnale acustico; quindi fa partire entrambi i cronometri e abilita le interruzioni dal cronometro dei minuti. Il ciclo principale, CICLO, controlla lo stato degli interruttori scorrevoli e prende i provvedimenti necessari. Il sottoprogramma DISP visualizza l’orario attuale o l’orario di sveglia, mantenuti alle locazioni di memoria 0x1000 o 0x1010, sugli schermi a sette segmenti. Si usa il sottoprogramma SETSUB per impostare i valori di minuti e ore quando si pigiano i corrispondenti pulsanti. Ogni volta che si pigia un pulsante si incrementa il valore di uno. Si usa la tabella alla fine del programma per convertire una cifra decimale nella corrispondente sequenza di sette bit per visualizzarla. I commenti nel programma spiegano il significato delle varie istruzioni. I registri di controllo e ctl3 ctl4 si possono anche indicare mediante i nomi ienable e ipending, rispettivamente. Questi sono i nomi usati nel programma. # define # define # define # define # define # define # define # define int ora t e m p m i n u t i ( v o l a t i l e i n t * ) 0 x5000 t e m p t o n o ( v o l a t i l e i n t * ) 0 x5020 c u r s o r i ( v o l a t i l e i n t * ) 0 x5040 p u l s a n t i ( v o l a t i l e i n t * ) 0 x5050 d i s p l a y ( i n t * ) 0 x5060 LED ( i n t * ) 0 x5070 a l t o p a r l a n t e ( i n t * ) 0 x5080 AGGIUSTA( t , x ) ( ( t +x ) >=1440)?( t +x − 1 4 4 0 ) : ( t +x ) attuale , ora sveglia , sveglia attiva , orario ; / * T a b e l l a d i c o n v e r s i o n e da e s a d e c i m a l e a 7 s e g m e n t i * / u n s i g n e d c h a r t a b e l l a [ 1 6 ] = {0 x40 , 0 x79 , 0 x24 , 0 x30 , 0 x19 , 0 x12 , 0 x02 , 0 x78 , 0 x00 , 0 x18 , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0 x3F } ; void impostaTemporizzatoreTono ( ) { * ( t e m p t o n o + 2 ) = 0x0D40 ; / * I m p o s t a i l p e r i o d o d i t i m e o u t * / /* per funzionamento continuo . */ * ( t e m p t o n o + 3 ) = 0 x03 ; / * Avvia i n m o d a l i t a ' c o n t i n u a . * / * ( t e m p t o n o + 1 ) = 0 x6 ; } v o i d DISP ( o r a r i o ) /* O t t i e n i la sequenza dei 7 segmenti . */ { * d i s p l a y = t a b e l l a [ o r a r i o / 6 0 0 ] << 24 | t a b e l l a [ ( o r a r i o % 6 0 0 ) / 6 0 ] << 16 | t a b e l l a [ ( o r a r i o % 6 0 ) / 1 0 ] << 8 | tabella [( orario % 10)]; } . . . continua nella Parte b Figura C1.6: Programma C per la sveglia (Parte a). Hamacher, Vranesic, Zaky, Manjikian, Introduzione all’architettura dei calcolatori 3e © 2013 McGraw-Hill Education Italy S.r.l. 16 Caso di studio 1: Progetto di un sistema su un chip main ( ) { o r a a t t u a l e = ora sveglia = s v e g l i a a t t i v a = 0; impostaTemporizzatoreTono ( ) ; /* Esegui in modalita ' continua . */ * ( t e m p m i n u t i + 1 ) = 0 x6 ; while (1) { / * Un m i n u t o e ' t r a s c o r s o . * / i f ( * t e m p m i n u t i == 3 ) { / * A z z e r a i l b i t TO . * / * temp minuti = 0; o r a a t t u a l e = AGGIUSTA( o r a a t t u a l e , 1 ) ; } i f ( ( * c u r s o r i & 1) != 0) / * C o n t r o l l a se l ' i n t e r r u t t o r e * / { /* sveglia e ' a t t i v o . */ / * A c c e n d i i l LED s v e g l i a . * / *LED = 7 ; i f ( o r a a t t u a l e == o r a s v e g l i a ) s v e g l i a a t t i v a = 1 ; / * Avvia i l s u o n o d e l l a s v e g l i a . * / else s v e g l i a a t t i v a = s v e g l i a a t t i v a & (* c u r s o r i & 1 ) ; i f ( * t e m p t o n o == 3 ) / * G e n e r a l ' onda q u a d r a . * / { * a l t o p a r l a n t e = (* a l t o p a r l a n t e ˆ 1) & s v e g l i a a t t i v a ; / * A z z e r a i l b i t TO . * / * temp tono = 0; } } else { / * S p e g n i i l LED s v e g l i a . * / *LED = 6 ; s v e g l i a a t t i v a = 0; } i f ( ( * c u r s o r i & 4) != 0) / * C o n t r o l l a l ' i n t e r r u t t o r e imposta { DISP ( o r a a t t u a l e ) ; /* Mostra l ' o r a r i o d e l gio rno . */ i f ( ( * ( p u l s a n t i + 3) & 1) != 0) / * Imposta i m i n u t i ? * / o r a a t t u a l e = AGGIUSTA( o r a a t t u a l e , 1 ) ; e l s e i f ( ( * ( p u l s a n t i + 3) & 2) != 0) / * Imposta l e ore ? * / o r a a t t u a l e = AGGIUSTA( o r a a t t u a l e , 6 0 ) ; * ( p u l s a n t i + 3 ) = 0 ; / * A z z e r a i l r e g i s t r o C a t t u r a −f r o n t e } else i f ( ( * c u r s o r i & 2) != 0) / * C o n t r o l l a l ' i n t e r r u t t o r e imposta { DISP ( o r a s v e g l i a ) ; /* Mostra l ' o r a r i o di s v e g l i a . */ i f ( ( * ( p u l s a n t i + 3) & 1) != 0) / * Imposta i m i n u t i ? * / o r a s v e g l i a = AGGIUSTA( o r a s v e g l i a , 1 ) ; e l s e i f ( ( * ( p u l s a n t i + 3) & 2) != 0) / * Imposta l e ore ? * / o r a s v e g l i a = AGGIUSTA( o r a s v e g l i a , 6 0 ) ; * ( p u l s a n t i + 3 ) = 0 ; / * A z z e r a i l r e g i s t r o C a t t u r a −f r o n t e } else DISP ( o r a a t t u a l e ) ; /* Mostra l ' o r a r i o d e l gio rno . */ } } orario . */ . */ sveglia . */ . */ Figura C1.6: Programma C per la sveglia (Parte b). Hamacher, Vranesic, Zaky, Manjikian, Introduzione all’architettura dei calcolatori 3e © 2013 McGraw-Hill Education Italy S.r.l. 17 Caso di studio 1: Progetto di un sistema su un chip .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ br start: temp minuti, 0x05000 temp tono, 0x5020 cursori, 0x5040 pulsanti, 0x5050 display, 0x5060 LED, 0x5070 altoparlante, 0x5080 ORA ATTUALE, 0x1000 ORA SVEGLIA, 0x1010 PILA, 0x2000 MAIN Gestore interruzione .org 0x20 subi sp, sp, 8 stw r2, 0(sp) stw ra, 4(sp) rdctl et, ipending beq et, r0, MAIN /* /* MAIN: subi ea, ea, 4 movia sthio call r2, temp minuti r0, (r2) AGGIORNA ORA ldw ldw addi eret r2, 0(sp) ra, 4(sp) sp, sp, 8 Programma principale movia sp, PILA movia r2, ORA SVEGLIA stw r0, (r2) movia r2, ORA ATTUALE stw r0, (r2) movia r2, cursori movia r3, LED movia r4, display movia r5, pulsanti */ /* Salva registri. */ /* Errore se non è un’interruzione /* esterna, trattarlo come riavvio. /* Decrementa ea per eseguire /* l’istruzione interrotta quando /* ritorna al programma principale. /* Azzera il bit TO nel /* temporizzatore dei minuti. /* Chiama routine di servizio /* dell’interruzione. /* Ripristina i registri. */ */ */ */ */ */ */ */ */ */ /* Inizializza puntatore alla pila. /* Azzera buffer dell’orario sveglia. */ */ */ /* Azzera buffer dell’orario attuale. */ /* Indirizzo interruttori a cursore. /* Indirizzo dei LED. /* Indirizzo schermi a 7 segmenti. /* Indirizzo dei pulsanti. */ */ */ */ . . . continua nella Parte b Figura C1.7: Programma Nios II per la sveglia (Parte a). Hamacher, Vranesic, Zaky, Manjikian, Introduzione all’architettura dei calcolatori 3e © 2013 McGraw-Hill Education Italy S.r.l. Caso di studio 1: Progetto di un sistema su un chip movi stbio movia ori sthio ori sthio movi sthio movia addi sthio movi wrctl wrctl movia call ldbio andi beq movi stbio movia ldw ldw bne movia movi CICLO SVEGLIA: call ldbio andi beq ldhio sthio andi xor movia stbio br CICLO: r6, 6 r6, (r3) r6, temp tono r7, r0, 0x0D40 r7, 8(r6) r7, r0, 0x03 r7, 12(r6) r7, 6 r7, 4(r6) r6, temp minuti r7, r0, 7 r7, 4(r6) r7, 1 ienable, r7 status, r7 r10, ORA ATTUALE DISP r7, (r2) r11, r7, 1 r11, r0, PROSSIMO r11, 7 r11, (r3) r9, ORA SVEGLIA r11, (r9) r12, (r10) r11, r12, PROSSIMO r8, temp tono r12, 1 DISP r7, (r2) r13, r7, 1 r13, r0, PROSSIMO r9, (r8) r0, (r8) r9, r9, 1 r12, r9, r12 r11, altoparlante r12, (r11) CICLO SVEGLIA 18 /* Accendi i due LED /* verticali. */ */ /* Inizializza il periodo /* del temporizzatore del tono. */ */ /* Avvia temporizzatore del tono. */ /* Indirizzo temporizzatore minuti. /* Avvia il temporizzatore. */ */ /* Abilita interruzioni /* dal temporizzatore. /* Abilita interruzioni esterne. /* Visualizza orario del giorno. */ */ */ */ /* Interruttore sveglia attivo? */ /* Se sı̀, allora accendi il /* LED sveglia. */ */ /* Confronta l’orario di sveglia /* con l’orario attuale. /* La sveglia dovrebbe suonare? */ */ */ /* Interruttore sveglia attivo? */ /* Leggi stato temporizzatore tono. /* Azzera il bit TO. /* Controlla se il contatore è a 0. /* Genera successivo semiciclo /* dell’onda quadra; invia /* il segnale all’altoparlante. */ */ */ */ */ */ . . . continua nella Parte c Figura C1.7: Programma Nios II per la sveglia (Parte b). Hamacher, Vranesic, Zaky, Manjikian, Introduzione all’architettura dei calcolatori 3e © 2013 McGraw-Hill Education Italy S.r.l. Caso di studio 1: Progetto di un sistema su un chip PROSSIMO: movi stbio TEST CURSORI: ldbio andi beq movia br ATTIVA: andi beq movia ORARIO: call call br /* DISP: 19 r11, 6 r11, (r3) /* Spegni LED che indica che la /* sveglia è attiva. */ */ r7, (r2) r11, r7, 2 r11, r0, ATTIVA r10, ORA SVEGLIA ORARIO /* Interruttore imposta sveglia attivo? /* Se no, controlla orario corrente. /* Va impostata l’ora di sveglia. */ */ */ /* Interruttore imposta orario attivo? /* Tutti i cursori sono disattivati. */ */ r11, r7, 4 r11, r0, CICLO r10, ORA ATTUALE DISP SETSUB TEST CURSORI Visualizza l’orario sugli schermi a 7 segmenti. subi sp, sp, 24 /* Salva registri. stw r11, 0(sp) stw r12, 4(sp) stw r13, 8(sp) stw r14, 12(sp) stw r15, 16(sp) stw r16, 20(sp) ldw r11, (r10) /* Carica l’orario da mostrare. movi r12, 600 /* Per determinare la prima cifra divu r13, r11, r12 /* delle ore, dividi per 600. ldb r15, TABELLA(r13) /* Ottieni serie dei 7 segmenti. slli r15, r15, 8 /* Fai spazio alla prossima cifra. mul r14, r13, r12 /* Calcola il resto della sub r11, r11, r14 /* divisione. movi r12, 60 /* Dividi il resto per 60 per avere divu r13, r11, r12 /* la seconda cifra delle ore. ldb r16, TABELLA(r13) /* Ottieni serie dei 7 segmenti, or r15, r15, r16 /* concatenala alla prima cifra slli r15, r15, 8 /* e falla scorrere. mul r14, r13, r12 /* Determina i minuti che sub r11, r11, r14 /* devono essere mostrati. . . . continua nella Parte d Figura C1.7: Programma Nios II per la sveglia (Parte c). Hamacher, Vranesic, Zaky, Manjikian, Introduzione all’architettura dei calcolatori 3e © 2013 McGraw-Hill Education Italy S.r.l. */ */ */ */ */ */ */ */ */ */ */ */ */ */ */ */ 20 Caso di studio 1: Progetto di un sistema su un chip movi divu ldb or slli mul sub ldb or movia stw ldw ldw ldw ldw ldw ldw addi ret r12, 10 r13, r11, r12 r16, TABELLA(r13) r15, r15, r16 r15, r15, 8 r14, r13, r12 r11, r11, r14 r16, TABELLA(r11) r15, r15, r16 r11, display r15, (r11) r11, 0(sp) r12, 4(sp) r13, 8(sp) r14, 12(sp) r15, 16(sp) r16, 20(sp) sp, sp, 24 /* Imposta l’orario desiderato. SETSUB: subi sp, sp, 16 stw r11, 0(sp) stw r12, 4(sp) stw r13, 8(sp) stw r14, 12(sp) ldbio r12, 12(r5) stbio r0, 12(r5) andi r13, r12, 1 beq r13, r0, ORE ldw r11, (r10) movi r12, 60 divu r13, r11, r12 mul r14, r13, r12 sub r11, r11, r14 addi r11, r11, 1 blt r11, r12, SALVAM mov r11, r0 /* Per determinare la prima cifra dei /* minuti, dividi per 10. /* Ottieni la serie dei 7 segmenti, /* concatenala alle prime due cifre /* e falla scorrere. /* Calcola il resto, che /* è l’ultima cifra. /* Concatena l’ultima cifra alle /* 3 cifre precedenti. */ */ */ */ */ */ */ */ */ /* Visualizza la serie ottenuta. /* Ripristina registri. */ */ */ /* Salva registri. */ /* Controlla i pulsanti. /* Azzera registro Cattura-fronte. /* Il pulsante dei minuti è pigiato? /* Se no, controlla le ore. /* Carica l’orario corrente. /* Dividi per 60 per determinare /* il numero di ore. /* Il resto della divisione /* è il numero di minuti. /* Incrementa i minuti. /* Salva se minore di 60, /* altrimenti poni i minuti a 00. */ */ */ */ */ */ */ */ */ */ */ */ . . . continua nella Parte e Figura C1.7: Programma Nios II per la sveglia (Parte d). Hamacher, Vranesic, Zaky, Manjikian, Introduzione all’architettura dei calcolatori 3e © 2013 McGraw-Hill Education Italy S.r.l. Caso di studio 1: Progetto di un sistema su un chip SALVAM: ORE: SALVAO: FATTO: add stw br andi beq ldw addi movi blt sub stw r11, r14, r11 r11, (r10) FATTO r13, r12, 2 r13, r0, FATTO r11, (r10) r12, r11, 60 r13, 1440 r12, r13, SALVAO r12, r12, r13 r12, (r10) ldw ldw ldw ldw addi ret r11, 0(sp) r12, 4(sp) r13, 8(sp) r14, 12(sp) sp, sp, 16 /* (ore x 60) + (minuti aggiornati). /* Salva il nuovo orario. */ */ /* Il pulsante delle ore è pigiato? /* Se no, allora rientra. /* Carica l’orario corrente in minuti. /* Aggiungi 60 minuti. /* Controlla se l’orario aggiornato /* è minore di 24:00. /* Reimposta l’orario a 00:00. /* Salva il nuovo orario. */ */ */ */ */ */ */ */ /* Ripristina registri. */ /* Routine di servizio interruzioni che aggiorna orario corrente AGGIORNA ORA: subi sp, sp, 12 /* Salva registri. stw r2, 0(sp) stw r3, 4(sp) stw r4, 8(sp) movia r2, ORA ATTUALE ldw r3, (r2) /* Carica l’orario attuale del giorno. addi r3, r3, 1 /* Incrementa di uno i minuti. movi r4, 1440 /* Fatto se l’orario aggiornato è blt r3, r4, SALVAT /* minore di 24:00. mov r3, r0 /* Altrimenti, ponilo a 00:00. SALVAT: stw r3, (r2) /* Salva l’orario aggiornato. ldw r2, 0(sp) /* Ripristina registri. ldw r3, 4(sp) ldw r4, 8(sp) addi sp, sp, 12 ret /* TABELLA: 21 Tabella di conversione da cifre esadecimali a 7 segmenti .org 0x1050 .byte 0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78 .byte 0x00, 0x18, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F .end Figura C1.7: Programma Nios II per la sveglia (Parte e). Hamacher, Vranesic, Zaky, Manjikian, Introduzione all’architettura dei calcolatori 3e © 2013 McGraw-Hill Education Italy S.r.l. */ */ */ */ */ */ */ */ */ */ Caso di studio 1: Progetto di un sistema su un chip C1.4 22 Osservazioni conclusive Il progettista di un sistema embedded cerca inevitabilmente l’approccio più semplice e più conveniente. Un chip microcontrollore che possiede le risorse per realizzare un intero sistema può essere la scelta migliore. La situazione è diversa se sono necessari chip aggiuntivi per realizzare il sistema. In tal caso le soluzioni FPGA sono molto interessanti poiché hanno probabilmente bisogno di un minor numero di chip per realizzare il sistema. Un’altra considerazione è la disponibilità di moduli predefiniti. Un chip microcontrollore contiene un certo numero di moduli differenti. Qualsiasi caratteristica che non si possa realizzare usando questi moduli deve essere realizzata utilizzando chip aggiuntivi. Un dispositivo FPGA consente al progettista di progettare qualsiasi tipo di circuito digitale. Si possono realizzare circuiti molto grandi e complessi nei dispositivi FPGA moderni. Progetti pratici spesso coinvolgono circuiti che eseguono operazioni di uso comune. Tali circuiti sono di solito disponibili come moduli di libreria, come illustrato dalle interfacce di I/O e dai circuiti dei cronometri utilizzati nel paragrafo precedente. Per le applicazioni di elaborazione di segnali, la libreria comprende tipici circuiti di filtraggio. Se un sistema si deve collegare a un altro calcolatore utilizzando uno schema standard di interconnessione, come per esempio PCI Express, il compito del progettista è molto più semplice se è disponibile un’interfaccia PCI Express come modulo predefinito. C1.5 Problemi C1.1 [F] Nel Paragrafo C1.3.4, si è detto che il segnale a 500 Hz a onda quadra si può generare semplicemente invertendo il valore logico del segnale al termine di ciascun periodo di timeout del cronometro del segnale acustico, progettato per aver luogo ogni millisecondo. Modificare il programma in Figura C1.6 per sfruttare questo fatto. C1.2 [F] Ripetere il Problema C1.1 per il programma in Figura C1.7. C1.3 [M] Si consideri il formato di visualizzazione per la sveglia nel Paragrafo C1.3. Invece di visualizzare l’orario da 00:00 a 23:59, si desidera visualizzarlo come da 12:00 a 11:59 AM o PM. Si supponga che un quarto LED sia disponibile e collegato al bit b3 di una PIO larga quattro bit invece della PIO larga tre bit usata nel Paragrafo C1.3. Questo LED indica PM quando è Hamacher, Vranesic, Zaky, Manjikian, Introduzione all’architettura dei calcolatori 3e © 2013 McGraw-Hill Education Italy S.r.l. Caso di studio 1: Progetto di un sistema su un chip 23 acceso. Modificare il programma in Figura C1.6 per visualizzare l’orario in questo modo. C1.4 [M] Ripetere il Problema C1.3 per il programma in Figura C1.7. C1.5 [F] Si supponga che un solo cronometro, con un periodo predefinito di timeout di 1 ms, sia usato nella sveglia del Paragrafo C1.3. Apportare le appropriate modifiche al programma in Figura C1.6 per fornire il comportamento richiesto. C1.6 [F] Ripetere il Problema C1.5 per il programma in Figura C1.7. C1.7 [F] In Figura C1.7 si sono usate le interruzioni per gestire il cronometro dei minuti e la scansione per il cronometro del segnale acustico. Modificare il programma per usare le interruzioni per entrambi i cronometri. C1.8 [M] Nella sveglia del Paragrafo C1.3, si imposta l’orario incrementando il valore corrente ogni volta che si preme un pulsante. Questo potrebbe essere noioso se si deve premere molte volte un pulsante. Un’alternativa migliore sarebbe quella di incrementare l’ora automaticamente ogni 0,5 secondi mentre un pulsante viene tenuto premuto. Quali cambiamenti si dovrebbero fare all’hardware per fornire questa funzionalità, se è il caso di farne? Modificare il programma in Figura C1.6 per realizzare la funzionalità. C1.9 [M] Ripetere il Problema C1.8 per il programma in Figura C1.7. C1.10 [M] Si desidera rendere intermittenti a intervalli di un secondo i due LED disposti verticalmente nella sveglia quando si fornisce l’alimentazione. Essi dovrebbero cessare di lampeggiare non appena l’utente inizia a impostare l’orario. Modificare il programma in Figura C1.6 per realizzare questo comportamento. C1.11 [M] Ripetere il Problema C1.10 per il programma in Figura C1.7. Hamacher, Vranesic, Zaky, Manjikian, Introduzione all’architettura dei calcolatori 3e © 2013 McGraw-Hill Education Italy S.r.l.