1 / 113

VHDL per FPGA

VHDL per FPGA. Courtesy of S. Mattoccia. Introduzione HDL. VHDL (progetto DoD ) e Verilog (iniziativa privata ) Linguaggi ad alto livello finalizzati alla simulazione di circuiti digitali ma sempre più utilizzate (anche) per la sintesi

mason
Download Presentation

VHDL per FPGA

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. VHDL per FPGA Courtesyof S. Mattoccia

  2. Introduzione HDL • VHDL (progetto DoD) e Verilog (iniziativa privata) • Linguaggi ad alto livello finalizzati alla simulazione di circuiti digitali ma sempre più utilizzate (anche) per la sintesi • L’obiettivo è rendere la progettazione dei sistemi digitali più efficace (riducendo i tempi e i costi di sviluppo, consentendo la gestione di progetti di grandi dimensioni, etc) • I linguaggi di tipo HDL consentono di gestire il comportamento dell’hardware • intrinseco parallelismo e ritardi • Tipicamente utilizzati per programmare gli FPGA • Utilizzati anche per realizzare ASIC, processori, etc • VHDL - VeryHigh-level Design Language • Nel prosieguo comunque verrà presentata una parte del linguaggio, anche con alcune volute imprecisioni se utile per una semplice progettazione FPGA

  3. Introduzione VHDL • Il VHDL è un linguaggio che ha mutuato i costruttitipici del C ma con tutte le modifiche necessarie al contesto cui fa riferimento • Come nel caso Altera è disponibile un ambiente di sviluppo software e simulazione • Per motivi di semplicità nell’uso del simulatore e di completezza della panoramica verrà utilizzato il sistema di sviluppo Xilinx (concorrente di Altera) • Per l’uso consultare il file • Xilinx 11 tutorial.PDF • inserito sul sito in radice dei files di Reti logiche

  4. Hardware • Personal computer con SO Windows o Linux* • Possibilmente una connessione a banda larga (non strettamente necessaria) Software • Sistema di sviluppo Xilinx liberamente disponibile (per SO Windows e Linux*)

  5. Software Xilinx • Scaricare dal sito del corso di Calcolatori M (cartella Software) il software di progetto. Vi sono sia le versioni complete (.TAR) che quelle scompattate (ricompattabili con il software Free-File-Splitter-v5.0.1189.exe disponibile sul sito). Il software 11.1 è comune a Windows (32 bit) e Linux (32 bit) metre l’uodate 11.5 è differenziato. • Installare il software 11.1 eseguendo il programma di installazione xsetup.exee selezionando l’opzione WebPack • Installare in seguito il software 11.5 differenziato fra Windows e Linux (sempre a 32 bit) • Nelle pagine successive sono mostrati gli screenshots relativi alle fasi di installazione • N.B. Le installazioni possono prendere anche più di un’ora !!! Effettuarle con la connessione a Internet attiva. A breve sarà inserito sul sito la nuova versione 12.1 (tempi incerti ancora) • N.B. FAT32 non supporta files > 4 GB. Il programma ISE nella sua versione attuale permette anche la realizzazione di schematici come in Altera ma è uno strumento meno sofisticato e che sarà abbandonato nelle versioni successive in favore della sola realizzazione VHDL . Anche Altera permette la sintesi con VHDL ma la simulazione NON è embedded nel sistema e obbliga a utilizzare un altro programma (ModelSim). NON è possibile installare il software sotto “ProgramFiles” ma solo in radice

  6. 1/9

  7. 2/9

  8. 3/9

  9. 4/9

  10. 5/9

  11. 6/9

  12. 7/9

  13. 8/9

  14. 9/9

  15. FPGA vs progetto hardware tradizionale Le moderne metodologie di progettazione basate su FPGA e HDL consentono di ridurre notevolmente il timeto market rispetto ad un progetto hardware tradizionale. Infatti, l’INTERO sviluppo del prototipo è eseguito al calcolatore. Il costo di produzione di un progetto basato su FPGA potrebbe essere più oneroso, ad esempio, rispetto ad una realizzazione ASIC (ApplicationSpecificIntegrated Circuit). Nonostante questo, essendo il VHDL uno standard è possibile realizzare ASIC a partire dal codice VHDL utilizzato per lo sviluppo del prototipo su FPGA. Un FPGA può essere riconfigurato (nuova programmazione) sul campo in caso di bachi o per inserire nuove funzionalità

  16. Progettazione con VHDL e FPGA entitymy_ANDis Port (A : inBIT; B : inBIT;Z : outBIT);. . . endmy_AND Design Entry A Z B Simulazione A t Primo elemento: entity definisce i pins di ingresso e uscita del sistema come una black-box B t Z t Mappingsu FPGA

  17. Caratteristiche del linguaggio VHDL (HDL in generale) Il VHDL, essendo un linguaggio di programmazione finalizzati a modellare l’HARDWARE, presenta delle sostanziali differenze logiche rispetto al C. Qui infatti in generale (come meglio spiegato nel prosieguo) gli statements (laddove ne ricorrano le condizioni) sono eseguiti tutti in parallelo come avviene nella realtà fisica che descrivono (tutti gli elementi di una rete operano in parallelo e non in serie) La capacità “eseguire” più operazioni contemporanee, tipica dei dispositivi hardware Concorrenza La capacità di modellare i tempi di propagazione dei segnali all’interno dei circuiti digitali Timing

  18. Timing e Concorrenza La propagazione dei segnali avviene attraverso fili o bus. Nella realtà la propagazione dei segnali NON avviene istantaneamente perché ritardata dalle caratteristiche fisiche delle connessioni/componenti (fenomeni parassiti, ritardi dei gates, etc). Si consideri ad esempio la seguente rete logica: C Z Rete ideale Volendo descrivere come si propaga il segnale con un linguaggio di programmazione ad alto livello (ad esempio con il C) si potrebbe pensare di scrivere a<=x; --assegna x a a z<=a and c; --assegna z Con questi due statements NON è vero che allo stesso istante x=a e z=ac !!!! Z cambierà in seguito, dopo il ritardo del NAND

  19. PROBLEMA DICONCORRENZA: I linguaggi di programmazione tradizionali prevedono che due istruzioni di assegnazione vengano eseguite nella sequenza in cui compaiono nel programma. Nella realtà il segnale elettrico parte da x e si propaga contemporaneamente verso a e b (non prima su a e poi su b come avverrebbe con il codice della pagina precedente scritto in C). PROBLEMA DI TIMING: Le due assegnazioni del lucido precedente non contemplano i ritardi di propagazione del segnale (nel caso di figura 3 e 4 ns) e il ritardo introdotto dai gates tipici di una rete reale. Rete reale: percorsi diversi impongono la variazione dei segnali a e b in ritardo e in istanti diversi rispetto alla variazione del segnale x. Nei sistemi per la progettazione FPGA i ritardi sono quelli dati dalla tecnologia del circuito 4 3

  20. x t a     t b    t Considerando la rete dell’esempio precedente. Se ogni tratto del circuito introduce un ritardo pari a 1 unit_delay () il codice VHDL che descriveil funzionamento reale della rete potrebbe essere : a<=xafter 4*unit_delay b<=xafter 3*unit_delay Le due istruzioni in VHDL sono eseguite contemporaneamente (esecuzione concorrente) N.B. il comando after così come il comando wait nel sistema Xilinx può essere utilizzato SOLO nei testbenches (v. dopo) in quanto nel nostro caso il VHDL è usato per progettare e non per descrivere

  21. Quando un programmatore scrive del codice con un linguaggio ad alto livello (C/C++, Java, etc) immagina di scomporre il problema in una serie di istruzioni che saranno eseguite in modo sequenziale (paradigma di programmazione sequenziale). • Al contrario, un progettista hardware decompone il progetto in blocchi interconnessi che reagiscono ad eventi e a loro volta generano eventi. Gli eventi sono le transizioni dei segnali: un ingresso, un’uscita o il clock sono possibili eventi. Questo impone che tutti i blocchi “dipendenti” da tali eventi siano valutati in base ai nuovi valore dei segnali. • L’ordine con il quale vengono valutati i blocchi deve essere ininfluente sul risultato finale (ovvero, qualunque sia l’ordine di valutazione dei singoli blocchi, lo stato complessivo raggiunto dalla rete quando tutti gli eventi sono stati gestiti deve essere sempre il medesimo). • Il tipo di programmazione che consente di modellare questo tipo di funzionamento e’ il paradigma di programmazione parallela.Poiché il risultato dell’elaborazione deve essere indipendente dalla sequenza in cui le istruzioni sono state eseguite tutte le elaborazioni debbono essere eseguite in parallelo senza che mai una istruzione, per essere eseguita, debba attendere il completamento di un’altra.

  22. Consideriamo la rete seguente e ipotizziamo che i ritardi (gates, percorsi, etc) siano identici. Il codice che descrive il funzionamento di questa rete deve generare un risultato (uscita di ciascun gate) che dipende solo dal valore degli ingressi e non dall’ordine con il quale vengono valutati gli AND e l’OR nel codice. Le istruzioni che descrivono i blocchi possono essere codificate secondo il paradigma della programmazione parallela tipico del VHDL nel modo seguente (<= sta a indicare la modifica del segnale): T1 <= A and B;T2 <= C and D;TN <= E and F;U <= T1 or T2 or T3; U <= T1 or T2 or T3;T1 <= A and B;T2 <= C and D;TN <= E and F; Equivalenti

  23. Entità definite in VHDL In VHDL sono disponibili entità (oggetti) alle quali è associato un tipo di dato ed un valore. • Costanti • Variabili • Segnali Vediamo ora come è possibile dichiarare e assegnare valori a Costanti, Variabili e Segnali.

  24. Costanti Entità che non possono cambiare il loro valore durante la simulazione. Utili per aumentare la leggibilità del codice constant nome: tipo := valore; Esempio di dichiarazione/assegnamento (attenzione sempre al ;alla fine dello statement) constantritardo: time := 3 ms;

  25. (NON segnali !!!) Oggetti che possono cambiare il loro valore durante la simulazione. Possono essere dichiarate solo all’interno di un process (vedi lucidi successivi) e sono locali al process (il valore iniziale è opzionale) variable nome: tipo [:= valore_iniziale]; Esempio di dichiarazione variablestato_iniziale: boolean:= true; variable IJK: integer; Esempio di uso (IJK è la variabile) for IJK in 7 downto 3 loop –esegui5 volte (da 7 a 3 compresi) !!! a(IJK) <= b(IJK) ; end loop; -- tutti gli statements nel loop sono eseguiti contemporaneamente NB una variabile non ha significato hardware serve solo a definire la modalità di esecuzione del programma e NON e’ un segnale Variabili Le variabili possono essere dichiarate, o avere valori assegnati, solo all’interno di blocchi sequenziali (ovvero, all’interno di process – v. dopo) e sono locali a tali blocchi. L’assegnamento è eseguito mediante l’operatore := ed è immediato Esempio z:= y; --z e y variabili

  26. Entità fisiche (segnali, in effetti…) che possono cambiare il loro valore durante la simulazione (il valore iniziale è opzionale) con un ritardo intrinseco alla tecnologia o a un segnale di sincronismo signalnome: tipo [:= valore_iniziale]; Esempi signal A: bit := ‘1’; signal B: bit := ‘0’; signal C: bit := ‘1’; C <= A and B; N. B. L ’assegnamento è eseguito mediante l’operatore <= e NONè immediato (ovvero, avviene dopo un tempo prestabilito, ad esempio in presenza del fronte positivo del clock ); torneremo più avanti su questo argomento Segnali

  27. Tipi di dato predefiniti in VHDL • Nel linguaggio VHDL (Standard Package) sono predefiniti i seguenti tipi di dato: • bit (‘0’,’1’) -- tipico per i segnali • boolean (‘TRUE’,’FALSE’) • integer • natural • positive • time • Oltre ai tipi predefiniti e’ possibile utilizzarne altri includendo specifiche librerie (esempio: LIBRARY IEEE). • Ad esempio, molto importante, std_logic(standard logic - megliospecificato in seguito). Ad esempio • wr : in std_logic; -- signal write nelladichiarazione entity • oveinsta a indicareche è un segnaledi input al sistema (potevaessereout oinout) • L’usodistd_logical postodi bit è indispensabile in Xilinx se sivuoleeseguireancheunasimulazione timing (post-route). Con I segnali “bit” è comunquepossibile la simulazionefunzionale (behavioural)

  28. Il tipo bit Un oggetto di tipo bit può assumere i valori ‘0’ e ‘1’Esempio signala: bit; E’ possibile anche definire dei vettori di bit mediante bit_vector Esempio signalesempio_vettore: bit_vector (7 downto 0); Per valori binari di un singolo bit si utilizza come simbolo ‘ mentre per configurazioni binarie composte da 2 o più bit si utilizza il simbolo “ Esempio a <= ‘1’; esempio_vettore<= “10011100”; Come già indicato al tipo “bit” è opportuno sostituire il tipo “std_logic” che ne è una estensione

  29. Il tipo integer Il range degli integer è dipendente dalla piattaforma ma è almeno pari a [-2^31-1,2^31-1]. Esempio constantdata_bus: integer:=32; Il tipo natural I natural sono numeri interi compresi tra 0 e (almeno) 2^31-1. Il tipo positive I positive sono numeri interi compresi tra 1 e (almeno) 2^31-1.

  30. Il tipo real Il rangerealè dipendente dalla piattaforma Esempio constantpi_greco: real:= 3.14; Non verrà usato Il tipo time Al tipo time è associato un attributo (ms, us, ps, etc) ed è utilizzato quando è necessari specificare dei tempi.Esempio constantritardo: time:= 5 ns;

  31. Formalismo scalare a3 ENTITY y1 a2 a1 y0 a0 port( a3,a2,a1,a0 : in bit; y1,y0 : out bit); port( a3,a2,a1,a0 : in std_logic; y1,y0 : out std_logic); Notare la posizione del simbolo ; e delle parentesi Formalismo vettoriale (bus) - downto MSB LSB ENTITY A[3..0] Y[1..0] port( a : inbit_vector(3 downto 0); y : out bit_vector(1 downto 0)); port( a : instd_logic_vector(3 downto 0); y : out std_logic_vector(1 downto 0));

  32. vettore - 1 0 1 - - E’ possibile accedere agli elementi di un vettore mediante indici Esempio: y(2) <= a(1) E’ inoltre possibile assegnare una sequenza di cifreEsempio: y <= “01”; E’ anche possibile effettuare assegnazioni ad un numero limitato di bit del vettore (bit-slicing) Esempio: y(4 downto 2) <= “101”

  33. Operatore di concatenazione & L’operatore & consente di concatenare più bit o stringhe di bit Esempio: y <= “101” & “011” & ‘1’; --1010111 A:=“101”; -- variabile B:= “011”; C:= ‘1’; y <= A&B&C; -- avrebbe dato lo stesso risultato Si osservi che l’operazione di concatenazione NON è una azione logica con significato fisico ma solo un mezzo per esprimere in modo più chiaro una espressione individuandone le singole componenti Operatori logici in VHDL (segnali e variabili) • And: andOr: orNot: notNand: nandNor: norXor:xorXnor:xnor • Gli operatori logici agiscono sui tipi bit, boolean e std_logic • L’operatore not è prioritario rispetto agli altri (equamente prioritari come nelle espressioni logiche). Ovviamente la precedenza è alterabile con l’uso di parentesi (come nelle espressioni logiche) • Se sono usati vettori il numero di bit dei due operandi deve essere il medesimo. • Esempi: y <= not a; z <= a and b;

  34. Modellazione dei ritardi (segnali) Il VHDL consente di modellare i ritardi (TIMING) presenti nei testbenches. Questo è possibile mediante mediante il comando after. z<= y after 6 ns;

  35. I passi della progettazione Schema logico Design Entry Strutturale “Structural” (Blocchi interconnessi) Descrizione Testuale (VHDL) Comportamentale “Behavioural” Compilazione Simulazione Funzionamento previsto? NO SI Mapping su FPGA

  36. Hello VHDL -- primo esempio di codice VHDL-- un semplice AND -- interface specification entityHello_vhdlisPort ( X in bit; Y : in bit; Z : out bit);endHello_vhdl;-- descrizione della struttura architecture Behavioral ofHello_vhdlisbegin Z <= X and Y; -- effettoimmediato !!! end Behavioral; -- indica commenti Interface specification (black box) Hello_vhdl x z y In blu le “reservedwords” Architettura:descrizione della struttura (e del comportamento)

  37. I commenti sono preceduti da - - • Il VHDL non è case sensitive • Non è possibile usare spazi nei nomi dei segnali etc • Non è possibile utilizzare nomi che iniziano o terminano con “_” • Non è possibile utilizzare nomi che iniziano un numero • Due “_” consecutivi non sono consentiti • Non è possibile assegnare parole riservate per i nomi dei segnali etc (es. segnali denominati BIT, AND etc. non sono consentiti) • E’ buona norma usare l’estensione .vhd per i file VHDL • Contrariamente al C/C++ non è possibile inserire commenti multi linea (necessario un - - per ogni linea) • Le istruzioni terminano con “;”

  38. Testbench Un testbench è un particolare codice VHDL (un programma per la simulazione specifica per il progetto da testare) mediante il quale è possibile analizzare la risposta di una rete a determinati stimoli di ingresso. E’ normalmente utilizzato per il test dei progetti VHDL. E’ riconducibile alla seguente architettura hardware: Testbench E N T I T Y E N T I T Y Risultati Stimoli Viene identificato come “component” Simulazione N.B. nel testbench il riferimento al dispositivo da testare si istanzia con il comando “component”. In effetti il dispositivo diventa un componente del sistema di test. Nei sistemi di progettazione FPGA il comando “after” e “wait” è utilizzabile solo per gli stimoli del testbench mentre i ritardi del sistema (Entity) dipendono dal tipo di FPGA scelto. In Xilinx nel momento i cui si inizia la redazione di un file VHDL (new source) bisogna specificare se è un sorgente o un testbench

  39. Esempio di Testbench entity Testbench_di_Hello_VHDL is end Testbench_di_Hello_VHDL; architecturebehaviorof Testbench_di_Hello_VHDL is --ComponentDeclarationfor the Unit Under Test (UUT) componentHello_vhdl Port(X : in bit; -- dichiarazione dei bit di input e output Y : in bit; -- del sistema (entity) sotto test indicato Z : out bit ); -- come “component” end component; --Inputs signalX_test: bit := '0'; -- dichiarazione dei segnai interi al testbench signalY_test: bit := '0'; -- facenti parte dell’architecture. Non vi è -- dichiarazione di port di input o output nella entity-- del testbench --Outputs signalZ_test: bit; Component Segnali interni al testbench

  40. begin --Instantiate the Unit Under Test (UUT) uut: Hello_vhdl PORT MAP ( X_test=> X, -- corrispondenza fra i segnali Y_test=> Y, -- interni al testbench e i segnali Z _test=> Z ); -- del “component” --Stimulusprocess stim_proc: process begin -- reset for 100ms. waitfor 100ms; -- aspetta 100 ms. --wait ammesso nel testbench -- inserzione degli stimoli -- NB in presenza di wait (o after) gli stimoli sono eseguiti in sequenza --Wait e After permessi solo nei testbenches X_test<='1'; Y_test<='0'; waitfor 10 ms; X_test<='1'; Y_test<='1'; waitfor 10 ms; X_test<='1'; Y_test<='0'; waitfor 10 ms; wait; --forever. La simulazione qui si ferma end process; end; Corrispondenza (collegamento”) fra i segnali del dispositivo e quelli del Testbench I segnali interni possono avere lo stesso nome di quelli del dispositivo (come nel caso della simulazione riportata)

  41. Tipica struttura del codice VHDL (progetto - non testbench) library IEEE; use IEEE.std_logic_1164.all; -- necessario per l’uso di std_logic --Entitydeclaration entitynome_entityis Port(signal_name : direction type); endnome_entity; --Architecturedescription architecturearchitettura_entityofnome_entityis<architecturedeclarations> begin <processing statements> endarchitettura_entity ; Inclusione librerie Interface specification A z B S Architectural specification

  42. Interface specification (Entity) • entitynome_entityis • Port(signal_name: direction type); • endnome_entity; • Portconsente di specificare: • signal_names: quali sono i segnali della rete • direction: quali segnali sono di input (in), output (out) , bidirezionali (inout), utilizzabili internamente • type: il tipo di segnale (bit, std_logic, bit vector, std_logic_vector…)

  43. Architecturalspecification (Architecture) architecturearchitettura_entityofnome_entityis<architecturedeclarations> begin <processing statements> endarchitettura_entity ; All’interno della sezione architecture è specificata la logica della rete. All’interno della sezione architecture (in <architecturedeclarations>) è possibile definire degli oggetti. Tali oggetti sono tipicamente dei segnali e possono essere utilizzati (scope) solo all’interno della architecturedescription I segnali interni a una architettura sono da inserire dopo begine prima di process Le variabili sono invece locali a un processo (se esiste) E’ possibile utilizzare sia data types definiti in VHDL sia data types presenti in librerie aggiuntive. Ad esempio: signalT1,T0 : bit; signalT3,T4 : std_logic; Si noti che la dichiarazione signal è diversa da quella implicita in Port (v. esempio a pagg. 39 e 40) ove è indispensabile indicare la direzione. La parte nella quale viene specificata la logica della rete è compresa tra begine end.

  44. Assegnamento dei segnali e “Delta delay” • In VHDL è necessario prestare molta attenzione al fatto che l’aggiornamento di un segnale NONè istantaneo • Nel caso non siano esplicitamente inseriti dei ritardi, (clock - oppure statement after, waitnei testbenches), durante la simulazione i nuovi valori dei segnali sono aggiornati con un ritardo denominato delta delay che per i sistemi FPGA è determinato intrinsecamente dalla loro tecnologia • Il meccanismo di aggiornamento mediante delta delay è il medesimo sia con statements concorrenti che sequenziali • Le variabili non i segnali possono essere aggiornate immediatamente. Le variabili NON hanno significato fisico. Ad esempio a e b siano segnali e I una variabile • I := I+1 --immediato • a <= b --dopo il ritardo intrinseco della rete • Se la rete è sincrona rispetto a un segnale di clock (o altro segnale di sincronismo, ad esempio il cambiamento di una segnale (NON di una variabile) la variazione di a sia ha solo in occasione dell’evento (se clock – ad esempio - al fronte positivo o negativo selezionabile) • Un errore tipico è quello di assegnare un valore ad un segnale e poi testare una condizione sul valore del medesimo segnale. Il test fornisce un risultato erroneo in quanto avviene contemporaneamente allo statement di assegnazione. Il segnale non verrà aggiornato prima di un delta delay (in mancanza di altri ritardi come after) o di un periodo di clock e insieme a tutti gli altri segnali !

  45. Statement when-else <signal_name> <= <signal/value>when<condition1>else <signal/value>when<condition2>else. . . . . . . . <signal/value>when<conditionN>else<signal/value>; • Nel caso siano verificate più condizioni al segnale è signal_nameassegnato il primo valore che soddisfa la condizione (in ordine di apparizione nel codice – analisi sequenziale ….) when • Attenzione all’ultimo else: se omesso, nel caso di reti combinatore, potrebbe involontariamente dare luogo ad un comportamento non combinatorio (quando nessuna delle condizioni è verificata, per il segnale per cui si esegue <=, viene mantenuto il valore precedente per cui si avrebbe un effetto memoria)

  46. Esempio di codice VHDL per modellare un AND a 2 ingressi utilizzando il costrutto when-else ENTITY and2 IS PORT (a, b : IN BIT; y : OUTBIT); END and2; ARCHITECTURE arch_and2 OF and2 IS BEGIN y<='1' WHEN (A='1' AND B='1') ELSE'0'; END arch_and2; Esempio (and2)

  47. Codice VHDL alternativo per modellare un AND a 2 ingressi utilizzando il costrutto when-else ENTITY and2whenelse1 IS PORT (a : INBIT_VECTOR(1 DOWNTO 0); y : OUTBIT); END and2whenelse1; ARCHITECTURE arch_and2whenelse1 OF and2whenelse1 IS BEGIN y <= ‘0' WHEN a(0)=‘0’ ELSE ‘0' WHEN a(1)=‘0’ ELSE ‘1’; END arch_and2whenelse1; Esempio (and2)

  48. Un’alternativa, sempre utilizzando when-else, potrebbe essere la seguente.. • ENTITY and2whenelse2 IS • PORT (a : INBIT_VECTOR(1 DOWNTO 0); • y : OUT BIT); • END and2whenelse2; • ARCHITECTURE arch_and2whenelse2 OF and2whenelse2 IS • BEGIN • y <= ‘0' WHEN a(0)=‘0’ ELSE • ‘ 1' WHEN a(1)=‘1’ ELSE -- a(0) è già stato verificato non 0 • ‘0’; • END arch_and2whenelse2; Esempio (and2)

  49. Oppure... ENTITY and2whenelse3 IS PORT (a : INBIT_VECTOR (1 DOWNTO 0); y : OUT BIT); END and2whenelse3; ARCHITECTURE arch_and2whenelse3 OF and2whenelse3 IS BEGIN y <= ‘1' WHEN a=“11” -- notare “ e non ‘: a è un vettore cui si assegnano ELSE ‘0’; --due valori in questo caso END arch_and2whenelse3; Esempio (and2)

  50. Statementwith-select-when with<expression>select <signal_name> <= <signal/value>when<condition1>, <signal/value>when<condition2>, . . . . . . . . <signal/value>whenothers; Tipicamente un segnale o un vettore • Tutte le condizioni sono verificate contemporaneamente(diverso comportamento rispetto a when-else) se vi è SELECT • Nel caso più condizioni siano verificate, queste debbono essere raggruppate (altrimenti si avrebbe un (illecito) assegnamento multiplo al segnale con risultato impredicibile) • l’opzione whenothersconsente di gestire i casi di nessuna condizione verificata

More Related