{"id":597,"date":"2017-02-02T20:29:36","date_gmt":"2017-02-02T19:29:36","guid":{"rendered":"http:\/\/www.gtronic.it\/test\/?page_id=597"},"modified":"2017-02-27T18:13:39","modified_gmt":"2017-02-27T17:13:39","slug":"concetti-base-e-glossario","status":"publish","type":"page","link":"https:\/\/www.gtronic.it\/test\/index.php\/concetti-base-e-glossario\/","title":{"rendered":"Concetti base e glossario"},"content":{"rendered":"<p><strong>VHDL: Concetto di entity.<\/strong><\/p>\n<p>Un entity \u00e8 un\u2019astrazione di un dispositivo che pu\u00f2\u00a0rappresentare un sistema completo, una scheda, un chip, una funzione o una porta logica. Una dichiarazione di entity descrive l\u2019I\/O di un progetto e pu\u00f2 includere anche parametri utilizzati per customizzare l\u2019entity stessa.<br \/>\nUn\u2019architettura descrive le funzioni di un\u2019entity. Un\u2019architettura pu\u00f2 contenere qualunque combinazione dei seguenti tipi di descrizione:<br \/>\n\u2022Behavioural;<br \/>\n\u2022Structural;<br \/>\n\u2022Dataflow.<\/p>\n<p>Nell&#8217;immagine un esempio di listato che mostra\u00a0l&#8217;implementazione di un behavioral.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-598\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/listato-behavioral.png\" alt=\"listato behavioral\" width=\"507\" height=\"391\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/listato-behavioral.png 507w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/listato-behavioral-300x231.png 300w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/listato-behavioral-389x300.png 389w\" sizes=\"(max-width: 507px) 100vw, 507px\" \/><\/p>\n<p>Viene chiamata descrizione comportamentale per il modo algoritmico in cui viene descritta l\u2019architettura. La descrizione comportamentale viene indicata, a volte, come descrizione ad alto livello a causa dell\u2019assomiglianza con i linguaggi di programmazione ad alto livello. Piuttosto che specificare la struttura o la netlist di un circuito, \u00e8 possibile specificare un insieme di istruzioni che, quando eseguite in sequenza, descrivono il funzionamento, o il comportamento, dell\u2019entit\u00e0, o di parte di essa. Il vantaggio di una descrizione ad alto livello \u00e8 che non \u00e8 necessario focalizzarsi sull\u2019implementazione a livello di gate.<\/p>\n<p>Il listato riportato sotto \u00e8 un esempio di descrizione di tipo dataflow di un comparatore a quattro bit.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-620\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/dataflow.png\" alt=\"dataflow\" width=\"959\" height=\"348\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/dataflow.png 959w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/dataflow-300x109.png 300w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/dataflow-768x279.png 768w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/dataflow-500x181.png 500w\" sizes=\"(max-width: 959px) 100vw, 959px\" \/><\/p>\n<p>Questa \u00e8 un\u2019architettura di tipo dataflow perch\u00e9 specifica come i dati vengono trasferiti da segnale a segnale e da ingresso a uscita senza ricorrere all\u2019utilizzo di istruzioni sequenziali. La differenza principale con la descrizione di tipo behavioral \u00e8 che una utilizza i processi e l\u2019altra no. Per\u00f2 entrambe le descrizioni non sono di tipo strutturale. Conviene utilizzare le descrizioni di tipo dataflow nel caso in cui \u00e8 possibile scrivere semplici equazioni, istruzioni di assegnamento condizionato (WHEN-ELSE), o istruzioni di assegnamento selettivo (WITH-SELECT-WHEN), piuttosto che algoritmi completi. D\u2019altra parte, quando \u00e8 necessario utilizzare strutture annidate, sono preferibili le istruzioni sequenziali.<\/p>\n<p><strong>Descrizione strutturale.<\/strong><\/p>\n<p>nel listato sottostante\u00a0c&#8217;\u00e8 la descrizione strutturale di un comparatore a 4 bit.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-622\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/structural.png\" alt=\"structural\" width=\"719\" height=\"490\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/structural.png 719w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/structural-300x204.png 300w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/structural-440x300.png 440w\" sizes=\"(max-width: 719px) 100vw, 719px\" \/><\/p>\n<p>La descrizione strutturale consiste di una netlist VHDL. Questa netlist \u00e8 molto simile alla netlist di uno schematico: I componenti sono elencati e connessi insieme mediante segnali. I progetti strutturali sono di tipo gerarchico. Nella figura (1) \u00e8 riportato lo schematico del comparatore a quattro bit descritto nel listato precedente.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-623\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/netlist.png\" alt=\"netlist\" width=\"783\" height=\"484\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/netlist.png 783w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/netlist-300x185.png 300w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/netlist-768x475.png 768w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/netlist-485x300.png 485w\" sizes=\"(max-width: 783px) 100vw, 783px\" \/><\/p>\n<p><span style=\"font-size: xx-large;\">Dichiarazione di Entity <\/span><\/p>\n<p><span style=\"font-size: medium;\">Una dichiarazione di entity descrive gli ingressi e le uscite del progetto. Pu\u00f2 anche descrivere parametri costanti. La dichiarazione di entity \u00e8 analoga al simbolo di uno schematico che descrive le connessioni di un componente con il resto del progetto. <\/span><\/p>\n<p>La struttura ho questo incapsulamento. \u00e8 messa in evidenza la relazione tra un progetto, la dichiarazione di entit\u00e0 e l&#8217;architeture body.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-625\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/entity-struct.png\" alt=\"entity struct\" width=\"345\" height=\"462\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/entity-struct.png 345w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/entity-struct-224x300.png 224w\" sizes=\"(max-width: 345px) 100vw, 345px\" \/><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-626\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/entity-struct-source.png\" alt=\"entity struct source\" width=\"664\" height=\"168\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/entity-struct-source.png 664w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/entity-struct-source-300x76.png 300w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/entity-struct-source-500x127.png 500w\" sizes=\"(max-width: 664px) 100vw, 664px\" \/><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-627\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/simbolo-equivalente-del-sommatore-a-4-bit.png\" alt=\"simbolo equivalente del sommatore a 4 bit\" width=\"854\" height=\"250\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/simbolo-equivalente-del-sommatore-a-4-bit.png 854w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/simbolo-equivalente-del-sommatore-a-4-bit-300x88.png 300w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/simbolo-equivalente-del-sommatore-a-4-bit-768x225.png 768w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/simbolo-equivalente-del-sommatore-a-4-bit-500x146.png 500w\" sizes=\"(max-width: 854px) 100vw, 854px\" \/><\/p>\n<p><span style=\"font-size: xx-large;\">Porte <\/span><\/p>\n<p><span style=\"font-size: medium;\">Ogni segnale di I\/O in una dichiarazione di entity \u00e8 chiamato <\/span><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\"><strong>porta, <\/strong><\/span><span style=\"font-size: medium;\">ed \u00e8 analogo ad un pin nel simbolo di uno schematico. Ad una porta possono essere assegnati valori o essere usata all\u2019interno delle espressioni. L\u2019insieme delle porte definite in una entity \u00e8 chiamato dichiarazione delle porte. Ogni porta che viene dichiarata deve avere un nome, una direzione (<\/span><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\"><strong>modo<\/strong><\/span><span style=\"font-size: medium;\">) e un data type.<\/span><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\"><strong>MODI<\/strong><\/span><span style=\"font-size: medium;\">: i modi descrivono la direzione in cui un dato \u00e8 trasferito attraverso la porta. Il modo pu\u00f2 assumere uno dei quattro valori: IN, OUT, INOUT e BUFFER. Se il modo non viene specificato allora la porta di default \u00e8 in modo IN.L\u2019utilizzo dei modi \u00e8 il seguente: <\/span><\/p>\n<p><span style=\"font-size: medium;\">\u2022<\/span><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\"><strong>IN<\/strong><\/span><span style=\"font-size: medium;\">. I dati fluiscono solo dentro l\u2019entit\u00e0. Il driver per una portadi modo IN \u00e8 al di fuori dell\u2019entit\u00e0. Il modo IN viene utilizzato principalmente per gli ingressi di clock, gli ingressi di controllo (come load, reset e enable) e per gli ingressi unidirezionali dei dati. <\/span><\/p>\n<p><span style=\"font-size: medium;\">\u2022<\/span><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\"><strong>OUT<\/strong><\/span><span style=\"font-size: medium;\">. I dati fluiscono solo verso le porte di uscita dell\u2019entit\u00e0. Ildriver per una porta di modo OUT \u00e8 contenuto all\u2019interno dell\u2019entit\u00e0. Il modo OUT non permette la retroazione perch\u00e9 tale porta non \u00e8 considerata leggibile dall\u2019interno dell\u2019entit\u00e0. Il modo OUT \u00e8 utilizzato per le uscite.<\/span><\/p>\n<p><span style=\"font-size: medium;\">\u2022<\/span><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\"><strong>BUFFER<\/strong><\/span><span style=\"font-size: medium;\">. Per utilizzare internamente la retroazione (cio\u00e8 per utilizzare una porta come driver all\u2019interno dell\u2019architettura), \u00e8 necessario dichiarare la porta in modalit\u00e0 BUFFER, o dichiarare un segnale separato da utilizzare all\u2019interno dell\u2019architettura come segnale interno. Una porta che viene dichiarata in modalit\u00e0 BUFFER \u00e8 simile ad una porta che \u00e8 dichiarata come OUT, eccetto che permette di effettuare internamente una retroazione. La modalit\u00e0 BUFFER non consente ad una porta di essere bidirezionale perch\u00e9 non consente alla porta di essere pilotata dall\u2019esterno dell\u2019entit\u00e0. Vanno fatte due considerazioni addizionali sull\u2019utilizzo della modalit\u00e0 BUFFER: (1) una porta in modalit\u00e0 BUFFER non consente di essere pilotata da pi\u00f9 driver; (2) una porta in modalit\u00e0 BUFFER pu\u00f2 essere connessa solo ad un segnale interno o ad un\u2019altra porta di modalit\u00e0 BUFFER di un\u2019altra entit\u00e0. Non pu\u00f2 essere connessa a nessun altra porta in nodalit\u00e0OUT o INOUT di un\u2019altra entit\u00e0, eccetto che passando attraverso un segnale interno. La modalit\u00e0 BUFFER \u00e8 utilizzata per porte che devono essere leggibili all\u2019interno dell\u2019entit\u00e0. <\/span><\/p>\n<p><span style=\"font-size: medium;\">\u2022<\/span><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\"><strong>INOUT<\/strong><\/span><span style=\"font-size: medium;\">. Per segnali bidirezionali \u00e8 necessario dichiarare le porte di modo INOUT, questa modalit\u00e0 permette ai dati di fluire dentro o fuori dall\u2019entit\u00e0. In altre parole, il driver del segnale pu\u00f2 essere all\u2019interno o all\u2019esterno dell\u2019entit\u00e0. Ilmodo INOUT permette anche le retroazioni interne. Il modo INOUT \u00e8 in grado di sostituire tutti gli altri modi. Cio\u00e8, IN, OUT e BUFFER possono essere sostituiti dal modo INOUT (questa opzione \u00e8 sconsigliabile in quanto riduce molto la leggibilit\u00e0 del codice del progetto).<\/span><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-629\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/Buffer.png\" alt=\"Buffer\" width=\"492\" height=\"264\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/Buffer.png 492w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/Buffer-300x161.png 300w\" sizes=\"(max-width: 492px) 100vw, 492px\" \/><\/p>\n<p>modalit\u00e0 delle porte e le loro possibilit\u00e0 di collegamento con l\u2019interno e l\u2019esterno dell\u2019entit\u00e0.<\/p>\n<p><strong>Tipi\u00a0associati alle porte.<\/strong><\/p>\n<p><span style=\"font-size: medium;\">Oltre a specificare i nomi e i modi delle porte \u00e8 necessario anche dichiarare il tipo delle porte. I tipi pi\u00f9 utili e meglio supportati per la sintesi forniti dal package IEEE std_logic_1164 sono i tipi STD_LOGIC e gli array derivati da questi. Come implica il nome, <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">standard logic<\/span><\/i><span style=\"font-size: medium;\">v uole essere un tipo standard utilizzato per descrivere i circuiti. La dichiarazione dei tipi deve essere resa visibile all\u2019entit\u00e0 per mezzo delle istruzioni LIBRARY e USE, come riportato del listato sotto:<\/span><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-630\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/definizione-delle-porte.png\" alt=\"definizione delle porte\" width=\"337\" height=\"114\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/definizione-delle-porte.png 337w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/definizione-delle-porte-300x101.png 300w\" sizes=\"(max-width: 337px) 100vw, 337px\" \/><\/p>\n<p><span style=\"font-size: medium;\">Il VHDL \u00e8 un linguaggio fortemente tipizzato, cio\u00e8 i dati di differenti tipi base non possono essere assegnati gli uni agli altri senza utilizzare una funzione di conversione di tipo. Di seguito \u00e8 riportata una descrizione di alcuni dei tipi che pi\u00f9 comunemente si possono incontrare.<\/span><\/p>\n<p><span style=\"font-family: Times New Roman,Times New Roman; font-size: large;\"><strong>Tipi scalari<\/strong><\/span><span style=\"font-size: medium;\">. I tipi scalari possiedono un ordine che permette l\u2019applicazione di operatori relazionali tra loro. Ci sono tre principali categorie di operatori scalari: enumerativi, interi, floating.<\/span><\/p>\n<p><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\"><strong>Tipi enumerativi<\/strong><\/span><span style=\"font-size: medium;\">. Un tipo enumerativo \u00e8 una lista di valori che un oggetto di un dato tipo pu\u00f2 assumere. E\u2019 possibile definire la lista dei valori. I tipi enumerativi sono utilizzati spesso per definire lo stato delle macchine sequenziali:<\/span><\/p>\n<p><em><span style=\"font-size: medium;\">TYPE states IS (idle, preamble, data, jam, nofsd, error);<\/span><\/em><\/p>\n<p><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">Un segnale pu\u00f2 essere definito del tipo enumerativo appena dichiarato:<\/span><\/p>\n<p><em><span style=\"font-size: medium;\">SIGNAL current_state: states;<\/span><\/em><\/p>\n<p><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">Come tipo scalare, il tipo enumerativo \u00e8 ordinato. L\u2019ordine in cui i valori sono elencati nella dichiarazione del tipo, definiscono la loro relazione. Il valore a sinistra \u00e8 il pi\u00f9 piccolo di tutti gli altri valori. Ogni valore \u00e8 pi\u00f9 grande di quello a sinistra e pi\u00f9 piccolo di quello a destra. <\/span><\/p>\n<p><span style=\"font-size: medium;\">Ci sono altri due tipi enumerativi, predefiniti dallo standard IEEE 1076, che sono particolarmente utili per la sintesi: BIT e BOOLEAN. Essi sono definiti come segue: <\/span><\/p>\n<p><em><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">TYPE boolean IS (FALSE, TRUE); <\/span><\/em><\/p>\n<p><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\"><em>TYPE bit IS (\u20180\u2019,\u20191\u2019);<\/em> <\/span><\/p>\n<p><span style=\"font-size: medium;\">Lo standard IEEE 1164 definisce un tipo addizionale e diversi sottotipi che sono utilizzati consistentemente come standard sia per la simulazione che per la sintesi. Il tipo STD_LOGIC \u00e8 definito come segue: <\/span><\/p>\n<p>TYPE std_logicIS ( \u2018U\u2019, &#8211;Uninitialized<br \/>\n\u2018X\u2019, &#8211;Forcing Unknown<br \/>\n\u20180\u2019, &#8211;Forcing 0<br \/>\n\u20181\u2019, &#8211;Forcing 1<br \/>\n\u2018Z\u2019, &#8211;High impedance<br \/>\n\u2018W\u2019, &#8211;Weak Unknown<br \/>\n\u2018L\u2019, &#8211;Weak 0<br \/>\n\u2018H\u2019, &#8211;Weak 1<br \/>\n\u2018-\u2019, &#8211;Don\u2019tcare );<\/p>\n<p><span style=\"font-size: medium;\">I valori \u20180\u2019, \u20191\u2019, \u2018L\u2019 e \u2018H\u2019 sono valori logici che sono supportati dalla sintesi. I valori \u2018Z\u2019 e \u2018-\u2019 sono anch\u2019essi supportati dalla sintesi per i driver three state e per i valori don\u2019t care. I valori \u2018U\u2019, \u2018X\u2019 e \u2018W\u2019 non sono supportati dalla sintesi.<\/span><span style=\"font-size: medium;\"><br \/>\nNella maggior parte dei progetti viene utilizzato il tipo STD_LOGIC. E\u2019 pi\u00f9 versatile del tipo BIT perch\u00e9 fornisce il valore di alta impedenza \u2018Z\u2019 e il valore don\u2019t care \u2018-\u2019. Lo standard IEEE 1164 definisce array di STD_LOGIC come STD_LOGIC_VECTOR.<br \/>\nUna nota finale sul tipo STD_LOGIC: sebbene gli identificatori non sono case-sensitive, l\u2019interpretazione dei valori letterali come \u2018Z\u2019 e \u2018L\u2019 \u00e8 case-sensitive. Questo significa che \u2018z\u2019 non \u00e8 equivalente a \u2018Z\u2019.<br \/>\n\u2022<strong>Tipi interi.<\/strong> Nel VHDL sono predefiniti gli interi e gli operatori relazionali ed aritmetici sugli interi. Gli strumenti software che processano il VHDL devono supportare gli interi nel range da \u20132.147.483.647, -(231-1) a 2.147.483.647, (231-1). Un segnale o una variabile che \u00e8 di tipo intero e che deve essere sintetizzata nel circuitologico deve essere limitata in valore cio\u00e8:<br \/>\n<em>VARIABLE a: INTEGER RANGE \u2013255 TO 255;<\/em><br \/>\nNon tutti i sistemi di sintesi per logiche programmabili sono ingrado di trattare valori con segno.<\/span><\/p>\n<p>\u2022<strong>Tipo floating<\/strong>. I valori del tipo floating sono utilizzati per approssimare i numeri reali. Il solo tipo floating point predefinito e il REAL, che include al minimo il range tra \u20131.0E38 e +1.0E38. I tipi floating spesso non sono supportati dai programmi di sintesi (in particolare quelli per logiche programmabili) a causa della grande quantit\u00e0 di risorse richieste per l\u2019implementazione delle operazioni aritmetiche tra loro.<br \/>\n<strong>Tipi composti<\/strong>. Ai tipi scalari pu\u00f2 essere assegnato solo un valore. I tipi composti possono invece assumere pi\u00f9 valori contemporaneamente. I tipi composti sono i tipi ARRAY e i tipi RECORD.<br \/>\n\u2022<strong>Tipi array<\/strong>. Un oggetto di tipo array consiste di elementi multipli dello stesso tipo. I tipi di array pi\u00f9 comunemente usati sono quelli predefiniti dagli standard IEEE 1076 e 1164:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-634\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/type.png\" alt=\"type\" width=\"457\" height=\"52\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/type.png 457w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/type-300x34.png 300w\" sizes=\"(max-width: 457px) 100vw, 457px\" \/><\/p>\n<p>Questi tipi sono comunemente utilizzati per indicare i bus.<br \/>\nQuando si utilizzano le stringhe di bit, \u00e8 possibile utilizzare una notazione opportuna per indicare se i bit delle stringhe sono specificati in binario, in ottale o in esadecimale. Se tuttavia la stringa \u00e8 specificata in binario pu\u00f2 essere assegnata solo ad un oggetto di tipo BIT_VECTOR e non ad un oggetto di tipo STD_LOGIC_VECTOR. Per i formati ottale ed esadecimale occorre trasformare la stringa binaria nel formato desiderato ad esempio:<\/p>\n<p><em>a &lt;= X&#8221;7A&#8221;;<\/em><\/p>\n<p>Richiede che asia di 8 bit, dove a pu\u00f2 essere un BIT_VECTOR o uno STD_LOGIC_VECTOR il cui valore diventa \u201c01111010\u201d. La notazione per indicare le cifre esadecimali \u00e8 Xseguita dalla cifra esadecimale tra virgolette, per le ottalil\u2019indicatore \u00e8 Omentre per quelle binarie \u00e8 B.<br \/>\n\u2022Tipi record. Un oggetto di tipo record ha elementi multipli di tipi differenti. I singoli campi possono essere referenziati con il nome dell\u2019elemento, come nell\u2019esempio riportato sotto.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-636\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/typeiocell.png\" alt=\"typeiocell\" width=\"462\" height=\"210\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/typeiocell.png 462w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/typeiocell-300x136.png 300w\" sizes=\"(max-width: 462px) 100vw, 462px\" \/><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-638\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/operatori.png\" alt=\"operatori\" width=\"490\" height=\"188\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/operatori.png 490w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/operatori-300x115.png 300w\" sizes=\"(max-width: 490px) 100vw, 490px\" \/><\/p>\n<p><strong>Operatori Logici.<\/strong><\/p>\n<p>Gli operatori logici fondamentali in ambito booleano in VHDL sono i classici: AND,OR,NAND,XOR,XNOR,NOT<\/p>\n<p>In linea di massimo i compilatori li accettano sia se scritti in maiuscolo che in minuscolo. Sono operatori predefiniti per i tipi BIT e BOOLEAN o per i vettori di BIT o BOOLEAN. Lo standard IEEE 1164 estende questi operatori per il tipo STD_LOGIC e i suo vettore STD_LOGIC_VECTOR.<br \/>\nQuesti operatori non hanno un ordine di precedenza: <strong>sono richieste le parentesi<\/strong>.<\/p>\n<p style=\"text-align: center;\">X &lt;= (a OR b) AND c<\/p>\n<p style=\"text-align: left;\">Se eliminiamo le parentesi la sintassi viene accettata ma la valutazione dell&#8217;espressione potrebbe risultare errata. Questo \u00e8 errato -&gt;\u00a0 X &lt;= a OR b AND c<\/p>\n<p style=\"text-align: left;\">risulta valutata correttamente l&#8217;espressione:\u00a0 X &lt;= a OR (b AND c)<\/p>\n<p style=\"text-align: left;\">Si deve quindi prestare particolare attenzione.<\/p>\n<p style=\"text-align: left;\"><strong>Operatori Relazionali.<\/strong><\/p>\n<p style=\"text-align: left;\">Gli operatori relazionali sono utilizzati per testare l&#8217;uguaglianza, la disuguaglianza e l&#8217;ordinamento.<\/p>\n<p style=\"text-align: left;\"><strong>=\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Operatore di uguaglianza<br \/>\n\/=\u00a0\u00a0\u00a0\u00a0\u00a0 Operatore di disuguaglianza<br \/>\n&lt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Minore<br \/>\n&gt;,&gt;=\u00a0 Maggiore e maggiore uguale<br \/>\n&lt;,&lt;=\u00a0 Minore e minore uguale<\/strong><\/p>\n<p style=\"text-align: left;\">Gli operatori = e \/= sono definiti per tutti i tipi di dati finora incontrati,<br \/>\nGli operatori &gt;,&gt;=, &lt; e &lt;= sono definiti per i tipi scalari o gli array con un range di valori discreto.<br \/>\nGli array sono uguali solo se le loro lunghezze sono equivalenti e tutti gli elementi corrispondenti sono uguali.<br \/>\nIl risultato degli operatori relazionali \u00e8 booleano (cio\u00e8, \u00e8 vero o falso).<br \/>\nI tipi di operandi in un\u2019operazione relazionale devono essere uguali.<\/p>\n<p style=\"text-align: left;\"><strong>with &#8211; select -when<\/strong><\/p>\n<p style=\"text-align: left;\">Sono<strong>\u00a0 <\/strong>operatori di assegnamento selettivo dei segnali.<\/p>\n<p style=\"text-align: left;\">WITH selection_signal SELECT<br \/>\nsignal_name &lt;= value_a WHEN value_1_of_selection_signal,<br \/>\nvalue_b WHEN value_2_of_selection_signal,<br \/>\nvalue_c WHEN value_3_of_selection_signal,<br \/>\nvalue_x WHEN ultimo_valore_della_selezione_signali;<\/p>\n<p style=\"text-align: left;\">Al segnale signal_name viene assegnato un valore in base al valore corrente del segnale selection_signal. T utti i valori di selection_signal devono essere elencati nell\u2019istruzione WHEN e tali valori sono mutuamente esclusivi.<\/p>\n<p style=\"text-align: left;\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-660\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/esempio-selec.png\" alt=\"esempio selec\" width=\"545\" height=\"298\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/esempio-selec.png 545w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/esempio-selec-300x164.png 300w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/esempio-selec-500x273.png 500w\" sizes=\"(max-width: 545px) 100vw, 545px\" \/><\/p>\n<p style=\"text-align: left;\">Mentre la condizione WHEN nell\u2019istruzione WITH-SELECT-WHEN deve specificare valori mutuamente esclusivi del segnale di selezione, la condizione WHEN in un\u2019istruzione WHEN-ELSE pu\u00f2 specificare qualunque semplice espressione.<br \/>\nSe le condizioni in un\u2019istruzione WHEN-ELSE non sono mutuamente esclusive, la priorit\u00e0 pi\u00f9 alta viene assegnata alla prima condizione WHEN elencata. Le priorit\u00e0 delle successive condizioni WHEN sono assegnate in base all\u2019ordine di apparizione.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-662\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/mux.png\" alt=\"mux\" width=\"535\" height=\"409\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/mux.png 535w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/mux-300x229.png 300w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/mux-392x300.png 392w\" sizes=\"(max-width: 535px) 100vw, 535px\" \/><\/p>\n<p>Nell&#8217;immagine la rete di selezione dei segnali w,x,y e z in base ai segnali mutuamente esclusivi a,b,c e d.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-664\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/mux-selettivo.png\" alt=\"mux selettivo\" width=\"599\" height=\"454\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/mux-selettivo.png 599w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/mux-selettivo-300x227.png 300w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/mux-selettivo-396x300.png 396w\" sizes=\"(max-width: 599px) 100vw, 599px\" \/><\/p>\n<p>Nell&#8217;immagine sopra la selezione dei segnali w,x,y e z in base ai segnali non mutuamente esclusivi a,b,c e d.<\/p>\n<p><strong>IF &#8211; THEN &#8211; ELSE<\/strong><\/p>\n<p>L\u2019istruzione IF-THEN-ELSE \u00e8 utilizzata per selezionare un insieme di istruzioni da<br \/>\neseguire in base alla valutazione di una condizione o un\u2019insieme di condizioni.<\/p>\n<p>IF (condition) THEN<br \/>\ndo something;<br \/>\nELSE<br \/>\ndo something different;<br \/>\nEND IF;<\/p>\n<p>Se la condizione specificata viene trovata vera, vengono eseguite le istruzioni che<br \/>\nseguono la parola chiave THEN. Se la condizione viene trovata falsa, vengono eseguite<br \/>\nle istruzioni dopo ELSE. L\u2019insieme di istruzioni viene chiuso da END IF.<br \/>\nDato che le istruzioni sequenziali vengono eseguite nell\u2019ordine di apparizione, i seguenti<br \/>\nprocessi sono funzionalmente equivalenti<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-665\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/12.png\" alt=\"12\" width=\"296\" height=\"316\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/12.png 296w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/12-281x300.png 281w\" sizes=\"(max-width: 296px) 100vw, 296px\" \/><\/p>\n<p>Con entrambi i processi, step assume il valore \u20181\u2019 se addr \u00e8 maggiore di 0F hex, e \u20180\u2019 se \u00e8 minore o uguale al valore indicato.<\/p>\n<p>il processo:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-690\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/process.png\" alt=\"process\" width=\"169\" height=\"78\" \/><\/p>\n<p>non descrive la stessa logica perch\u00e9 non \u00e8 assegnato n\u00e9 un valore di default n\u00e9 un valore di ELSE al segnale step. Il processo not_similar implica che step deve mantenere il suo valore se addr \u00e8 minore o uguale a 0F hex. Questa viene chiamata memoria implicita. Cos\u00ec, una volta che \u00e8 stato asserito, step rimarr\u00e0 sempre al valore asserito come mostrato nella\u00a0prossima figura\u00a0e definito dalla seguente equazione:<\/p>\n<p>step=addr(3)*addr(2)*addr(1)*addr(0) + step<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-691\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/process1.png\" alt=\"process1\" width=\"229\" height=\"72\" \/><\/p>\n<p>nella figura un esempio di memoria implicita.<\/p>\n<p>Se non si vuole che il valore di step venga memorizzato \u00e8 necessario includere un valore di default o completare l\u2019istruzione IF-THEN con un ELSE.<br \/>\nL\u2019istruzione IF-THEN_ELSE pu\u00f2 essere ulteriormente espansa includendo ELSIF per specificare ulteriori condizioni.<br \/>\nLa sintassi di questa operazione \u00e8<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-692\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/process2.png\" alt=\"process2\" width=\"309\" height=\"117\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/process2.png 309w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/process2-300x114.png 300w\" sizes=\"(max-width: 309px) 100vw, 309px\" \/><\/p>\n<p><strong>Costrutto Case &#8211; When<\/strong><\/p>\n<p>L\u2019istruzione CASE-WHEN viene utilizzata per specificare un insieme di istruzioni da eseguire in base al valore di un segnale selezione. L\u2019istruzione CASE-WHEN pu\u00f2 essere utilizzata, per esempio, in modo equivalente all\u2019istruzione WITH-SELECT-WHEN.<br \/>\nLa sintassi \u00e8:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-693\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/process3.png\" alt=\"process3\" width=\"399\" height=\"191\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/process3.png 399w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/process3-300x144.png 300w\" sizes=\"(max-width: 399px) 100vw, 399px\" \/><\/p>\n<p>Di seguito viene riportato un esempio di applicazione dell\u2019istruzione CASE-WHEN alla<br \/>\ncreazione di un decodificatore di indirizzi.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-666\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/13.png\" alt=\"13\" width=\"421\" height=\"307\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/13.png 421w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/13-300x219.png 300w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/13-411x300.png 411w\" sizes=\"(max-width: 421px) 100vw, 421px\" \/><\/p>\n<p><strong>Logica sincrona Flip-Flop\u00a0 e Registri<\/strong><\/p>\n<p>implementazione VHDL di un <strong>FLIP FLOP tipo D<\/strong>.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-667\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/14.png\" alt=\"14\" width=\"472\" height=\"202\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/14.png 472w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/14-300x128.png 300w\" sizes=\"(max-width: 472px) 100vw, 472px\" \/><\/p>\n<p>descrizione e simbolo di un flip flip di tipo D che memorizza sul fronte positivo del clock<\/p>\n<p><em>implementazione in VHDL di un <strong>FLIP FLOP dipo T.<\/strong><\/em><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-668\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/FF-tipo-T-VHDL.png\" alt=\"FF tipo T VHDL\" width=\"519\" height=\"249\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/FF-tipo-T-VHDL.png 519w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/FF-tipo-T-VHDL-300x144.png 300w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/FF-tipo-T-VHDL-500x240.png 500w\" sizes=\"(max-width: 519px) 100vw, 519px\" \/><\/p>\n<p>descrizione e simbolo di un flip flip di tipo T (toggle) che memorizza sul fronte positivo del clock<\/p>\n<p>implementazione di un <strong>REGISTRO a 8 bit in VHDL<\/strong>.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-669\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/registro-8-bit-VHDL.png\" alt=\"registro 8 bit VHDL\" width=\"268\" height=\"217\" \/><\/p>\n<p>Il registro di 8 bit con memorizzazione del dato sul fronte positivo del clock.<\/p>\n<p><strong>WAIT &#8211; UNTIL<\/strong><\/p>\n<p>E\u2019 possibile descrivere il comportamento di un filp flop di tipo D anche mediante l\u2019istruzione WAIT-UNTIL invece di IF (clk\u2019 ENVENT AND clk=1):<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-671\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/wait-until.png\" alt=\"wait until\" width=\"249\" height=\"92\" \/><\/p>\n<p>Questo processo non utilizza una sensitivity list, ma inizia con l\u2019istruzione WAIT. Un processo che utilizza un\u2019istruzione WAIT non pu\u00f2 avere una sesitivity list (l\u2019istruzione WAIT definisce implicitamente la sensitivity list). Per i circuiti che devono essere sintetizzati, l\u2019istruzione WAIT-UNTIL deve essere la prima del processo. A causa di questo, la logica sincrona descritta utilizzando l\u2019istruzione WAIT non pu\u00f2 essere resettata in modo asincrono.<\/p>\n<p><strong>Sensibilit\u00e0 ai fronti dei segnali.<\/strong><\/p>\n<p>Le funzioni <strong>rising_edge<\/strong> e <strong>falling_edge <\/strong>rendono il sistema reattivo ai rispettivi fronti dei segnali.<br \/>\nIl package STD_LOGIC_1164 definisce le funzioni RISING_EDGE e FALLING_EDGE per rilevare i fronti di salita e di discesa dei segnali.<br \/>\nUna di queste funzioni pu\u00f2 essere utilizzata per sostituire l\u2019espressione (clk\u2019EVENT AND clk=\u20181\u2019) se il segnale clk \u00e8 di tipo STD_LOGIC.<br \/>\nQueste funzioni a volte sono preferite dai progettisti perch\u00e9 nelle simulazioni la funzione RISING_EDGE assicura che la transizione avviene tra \u20180\u2019 e \u20181\u2019 enon qualche altra transizione come ad esempio tra \u2018U\u2019 e \u20181\u2019.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-674\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/fronti.png\" alt=\"fronti\" width=\"243\" height=\"196\" \/><\/p>\n<p>Descrizione di un FLIP FLOP tipo D utilizzando la funzione RISING_EDGE.<\/p>\n<p><strong>Reset e preset nella logica sincrona<\/strong><br \/>\nLo standard VHDL non richiede che un circuito venga inizializzato o resettato. Lo standard specifica che per la simulazione, a meno che un segnale non sia esplicitamente inizializzato, un segnale viene inizializzato al valore \u2018left del suo tipo. Cos\u00ec, il tipo STD_LOGIC verr\u00e0 inizializzato a \u2018U\u2019, e un bit verr\u00e0 inizializzato a \u20180\u2019.<br \/>\nNell\u2019hardware, questo non \u00e8 sempre vero, non tutti i dispositivi si inizializzano nello stato di reset, ma in uno stato privo di significato.<br \/>\nE\u2019 possibile descrivere il reset e il preset di un dispositivo mediante una semplice modifica del codice VHDL come segue in cui nel flip flop di tipo D \u00e8 presente un reset di tipo asincrono:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-676\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/reset-asincrono.png\" alt=\"reset asincrono\" width=\"420\" height=\"138\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/reset-asincrono.png 420w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/reset-asincrono-300x99.png 300w\" sizes=\"(max-width: 420px) 100vw, 420px\" \/><\/p>\n<p>La sensitivity list indica che questo processo \u00e8 sensibile ai cambiamenti di clke reset. Se il segnale di resetviene messo a \u20181\u2019, al segnale qviene assegnato il valore \u20180\u2019 qualunque sia il valore di clk.<br \/>\nPer descrivere un preset al posto di un reset, \u00e8 possibile modificare la sensitivity list e scrivere.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-677\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/preset.png\" alt=\"preset\" width=\"202\" height=\"46\" \/><\/p>\n<p>invece che:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-678\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/presetok.png\" alt=\"presetok\" width=\"207\" height=\"49\" \/><\/p>\n<p>E\u2019 possibile anche resettare(o presettare) un flip flop in modo sincrono ponendo la condizione di reset (o preset) all\u2019interno della porzione del processo che descrive la logica che \u00e8 sincrona con il clock, come segue in un esempio che riguarda un FLIP FLOP D (con reset sincrono)<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-680\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/architet.png\" alt=\"architet\" width=\"481\" height=\"158\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/architet.png 481w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/architet-300x99.png 300w\" sizes=\"(max-width: 481px) 100vw, 481px\" \/><\/p>\n<p>Generalmente la logica sincrona richiede risorse hardware addizionali rispetto a reset e presetasincrono.<br \/>\nIn VHDL \u00e8 possibile anche descrivere una combinazione di reset e\/o preset sincroni\/asincroni. Per esempio, un registro a 8 bit pu\u00f2 essere resettato a 0 ogni volta che il segnale resetva a \u20181\u2019, e pu\u00f2 essere inizializzato con tutti 1 e caricato dal fronte di salita del clock, come riportato nel listato che segueper un <strong>registro a 8 bit con reset asincrono e inizializzazione sincrona<\/strong>:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-681\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/preset-D-sincrono.png\" alt=\"preset D sincrono\" width=\"360\" height=\"291\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/preset-D-sincrono.png 360w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/preset-D-sincrono-300x243.png 300w\" sizes=\"(max-width: 360px) 100vw, 360px\" \/><\/p>\n<p><strong>Buffer three-state e segnali bidirezionali.<\/strong><\/p>\n<p>Descrizione comportamentale di un buffer tree-state.<br \/>\nI valori che un segnale three-state pu\u00f2 assumere sono \u20180\u2019, \u20181\u2019 e \u2018Z\u2019, e sono supportati tutti dal tipo STD_LOGIC.<br \/>\nL\u2019utilizzo dei buffer three-state viene illustrato mediante l\u2019esempio di un contatore a 8 bit caricabile:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-682\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/buffer-three-state.png\" alt=\"buffer three state\" width=\"434\" height=\"441\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/buffer-three-state.png 434w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/buffer-three-state-295x300.png 295w\" sizes=\"(max-width: 434px) 100vw, 434px\" \/><\/p>\n<p>Il processo chiamato <strong>oes<\/strong> \u00e8 utilizzato per descrivere l\u2019uscita three-state del contatore. Questo processo indica semplicemente che se oeviene messo a \u20181\u2019, il valore di cnt viene assegnato a cnt-oute se oeviene messo a \u20180\u2019, l\u2019uscita di questo dispositivi viene posta in alta impedenza. Il processo \u00e8 sensibile al cambiamento di entrambe le variabili oe e cnt, perch\u00e9 un cambiamento in entrambi i segnali provoca un cambiamento nell\u2019uscita cnt_out. Il processo <strong>oes<\/strong> descrive il comportamento di un buffer three-state.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-683\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/buffer-three-state-1.png\" alt=\"buffer three state 1\" width=\"168\" height=\"41\" \/><\/p>\n<p>Il controllo dei buffer three-state pu\u00f2 essere descritto anche con l\u2019istruzione WHEN-ELSE. Nel listato che segue, che \u00e8 una versione modificata del contatore a 8 bit, \u00e8 stata aggiunta un\u2019uscita addizionale, collision, che viene messa a \u20191\u2019 quando i segnali load e enable sono contemporaneamente posti a \u20181\u2019.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-684\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/buffer-three-state-2.png\" alt=\"buffer three state 2\" width=\"416\" height=\"408\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/buffer-three-state-2.png 416w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/buffer-three-state-2-300x294.png 300w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/buffer-three-state-2-306x300.png 306w\" sizes=\"(max-width: 416px) 100vw, 416px\" \/><\/p>\n<p><strong>Segnali bidirezionali.<\/strong><\/p>\n<p>I segnali bidirezionali possono essere descritti con una piccola modifica dei listati del contatore visti in precedenza.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-686\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/buffer-three-state-3.png\" alt=\"buffer three state 3\" width=\"483\" height=\"479\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/buffer-three-state-3.png 483w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/buffer-three-state-3-150x150.png 150w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/buffer-three-state-3-300x298.png 300w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/buffer-three-state-3-303x300.png 303w\" sizes=\"(max-width: 483px) 100vw, 483px\" \/><\/p>\n<p>In questo caso il contatore viene caricato con il valore corrente sui pin associati con l\u2019uscita del contatore, questo significa che il valore caricato quando loadviene posto a \u20181\u2019 potrebbe essere il valore precedente del contatore oppure un valore posto sui pin da un altro dispositivo, a seconda dello stato di oe.<\/p>\n<p><strong>for&#8211;generate<\/strong><\/p>\n<p><span style=\"font-size: medium;\">Se si volesse utilizzare un componente chiamato <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">threestate, <\/span><\/i><span style=\"font-size: medium;\">precedentemente creato, per implementare un buffer three-state per un bus di 32 bit, al posto di istanziare 32 buffer \u00e8 possibile utilizzare l\u2019istruzione FOR-GENERATE come segue: <\/span><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-900\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/for-generate.png\" alt=\"for-generate\" width=\"1001\" height=\"117\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/for-generate.png 1001w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/for-generate-300x35.png 300w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/for-generate-768x90.png 768w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/for-generate-1000x117.png 1000w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/for-generate-500x58.png 500w\" sizes=\"(max-width: 1001px) 100vw, 1001px\" \/><\/p>\n<p><span style=\"font-size: medium;\">Questo tipo di istruzione viene implementato nella parte delle istruzioni concorrenti di un\u2019architettura, <strong>non all\u2019interno di un <\/strong><\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\"><strong>process<\/strong>. L<\/span><\/i><span style=\"font-size: medium;\">\u2018istruzione FOR-GENERATE richiede una label; in questo caso <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">gen_label.<\/span><\/i><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-901\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/for-generate-threestate.png\" alt=\"for-generate threestate\" width=\"986\" height=\"698\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/for-generate-threestate.png 986w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/for-generate-threestate-300x212.png 300w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/for-generate-threestate-768x544.png 768w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/for-generate-threestate-424x300.png 424w\" sizes=\"(max-width: 986px) 100vw, 986px\" \/><\/p>\n<p>E\u2019 possibile utilizzare schemi pi\u00f9 complicati dell\u2019istruzione FOR-GENERATE in cui sono presenti assegnamenti di tipo condizionato, come ad esempio:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-903\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/for-generate-threestate-1.png\" alt=\"for-generate threestate 1\" width=\"1033\" height=\"478\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/for-generate-threestate-1.png 1033w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/for-generate-threestate-1-300x139.png 300w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/for-generate-threestate-1-768x355.png 768w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/for-generate-threestate-1-1024x474.png 1024w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/for-generate-threestate-1-500x231.png 500w\" sizes=\"(max-width: 1033px) 100vw, 1033px\" \/><\/p>\n<p>Il\u00a0listato\u00a0 include l\u2019istruzione IF-THEN. Quando viene utilizzata insieme all\u2019istruzione FOR-GENERATE, l\u2019istruzione IF-THEN non pu\u00f2 includere un ELSE o un ELSIF.<\/p>\n<p><strong>Convertire i buffer three-state in multiplexer<\/strong><\/p>\n<p>Alcune FPGA contengono al loro interno dei buffer three-state, altre no. Tuttavia, i progetti che utilizzano bus three-state possono essere convertiti in progetti che utilizzano i multiplexer. Alcuni strumenti di sintesi possono fare questo automaticamente. La conversione dei buffer three-state in multiplexer \u00e8 illustrata nella figura che segue:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-904\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/multiplexer.png\" alt=\"multiplexer\" width=\"476\" height=\"698\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/multiplexer.png 476w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/multiplexer-205x300.png 205w\" sizes=\"(max-width: 476px) 100vw, 476px\" \/><\/p>\n<p><strong>I Cicli<\/strong><\/p>\n<p>I cicli sono utilizzati per implementare operazioni ripetitive, e possono essere sia cicli FOR che cicli WHILE. Il ciclo FOR esegue un numero predeterminato di iterazioni in base ad un valore di controllo. Il ciclo WHILE continua l\u2019esecuzione di un\u2019operazione finch\u00e9 non si verifica una condizione logica di controllo. Si consideri per esempio il ciclo che esegue il reset asincrono della FIFO<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-905\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/for.png\" alt=\"for\" width=\"296\" height=\"55\" \/><\/p>\n<p>Questo ciclo che scandisce tutti gli 8 STD_LOGIC_VECTOR che compongono la FIFO, inizializza ogni elemento del vettore a \u20180\u2019. In un ciclo FOR, la variabile del ciclo viene dichiarata automaticamente. Al posto del ciclo FOR potrebbe essere utilizzato anche un ciclo WHILE, ma questo richiede delle dichiarazioni, delle inizializzazioni e un incremento della variabile di ciclo addizionali, come mostrato nell\u2019esempio sotto:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-906\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/loop.png\" alt=\"loop\" width=\"457\" height=\"158\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/loop.png 457w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/loop-300x104.png 300w\" sizes=\"(max-width: 457px) 100vw, 457px\" \/><\/p>\n<p><span style=\"font-size: medium;\"><strong>Iterazioni condizionate.<\/strong><\/span><\/p>\n<p><span style=\"font-size: medium;\">L\u2019istruzione NEXT viene utilizzata per saltare un operazione in base al verificarsi di una determinata condizione. Si supponga per esempio che quando il segnale <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">rst <\/span><\/i><span style=\"font-size: medium;\">viene posto ad \u20181\u2019, tutti i registri della FIFO siano resettati eccetto che per il registro FIFO(4):<\/span><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-907\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/next.png\" alt=\"next\" width=\"446\" height=\"173\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/next.png 446w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/next-300x116.png 300w\" sizes=\"(max-width: 446px) 100vw, 446px\" \/><\/p>\n<p>Oppure pu\u00f2 essere scritto utilizzando un ciclo WHILE:<\/p>\n<p><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-908\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/while.png\" alt=\"while\" width=\"418\" height=\"229\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/while.png 418w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/while-300x164.png 300w\" sizes=\"(max-width: 418px) 100vw, 418px\" \/><\/span><\/p>\n<p><strong>Uscita dai cicli.<\/strong><\/p>\n<p>L\u2019istruzione EXIT viene utilizzata per uscire dai cicli, e pu\u00f2 essere utilizzata per testare una condizione illegale. La condizione deve essere verificata all\u2019istante della compilazione. Si supponga, per esempio, che la FIFO sia un componente che viene istanziato in un progetto gerarchico. Si supponga inoltre che la profondit\u00e0 della FIFO venga definita per mezzo di un parametro di tipo GENERIC. Si vuole uscire dal ciclo quando la profondit\u00e0 della FIFO diventa pi\u00f9 grande di un valore predeterminato. Ad esempio:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-909\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/exit.png\" alt=\"exit\" width=\"452\" height=\"159\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/exit.png 452w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/exit-300x106.png 300w\" sizes=\"(max-width: 452px) 100vw, 452px\" \/><\/p>\n<p>Il frammento di codice riportato sopra pu\u00f2 essere riscritto come:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-910\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/exit1.png\" alt=\"exit1\" width=\"403\" height=\"121\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/exit1.png 403w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/exit1-300x90.png 300w\" sizes=\"(max-width: 403px) 100vw, 403px\" \/><\/p>\n<p><strong>Progetto di una FIFO<\/strong><\/p>\n<p><span style=\"font-size: medium;\">Si vuole progettare una FIFO con profondit\u00e0 di 8 parole di 9 bit. Descrizione dei segnali: <\/span><\/p>\n<p><span style=\"font-size: medium;\">Quando il segnale <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">rd <\/span><\/i><span style=\"font-size: medium;\">viene posto a \u20181\u2019, l\u2019uscita della FIFO, <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">data_out<\/span><\/i><span style=\"font-size: medium;\">, deve essere abilitata.\u00a0<\/span><\/p>\n<p><span style=\"font-size: medium;\">Quando <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">rd <\/span><\/i><span style=\"font-size: medium;\">\u00e8 a \u20180\u2019, l\u2019uscita deve essere posta in alta impedenza. <\/span><\/p>\n<p><span style=\"font-size: medium;\">Quando il segnale di write <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">wr<\/span><\/i><span style=\"font-size: medium;\">viene posto a \u20181\u2019 si vuole scrivere in uno dei registri di 9 bit. <\/span><\/p>\n<p><span style=\"font-size: medium;\">I segnali <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">rdinc <\/span><\/i><span style=\"font-size: medium;\">e <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">wrinc<\/span><\/i><span style=\"font-size: medium;\">sono utilizzati per incrementare i puntatori di lettura e scrittura che indicano quale registro leggere e scrivere. <\/span><\/p>\n<p><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">Rdptrclr <\/span><\/i><span style=\"font-size: medium;\">e <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">wrptrclr <\/span><\/i><span style=\"font-size: medium;\">resettano i puntatori di lettura e scrittura e li indirizzano al primo registro della FIFO. <\/span><\/p>\n<p><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">Data_in <\/span><\/i><span style=\"font-size: medium;\">\u00e8 il dato che deve essere caricato in uno dei registri.La figura\u00a0mostra uno schema a blocchi della FIFO a 9 bit. <\/span><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-911\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/FIFO.png\" alt=\"FIFO\" width=\"628\" height=\"623\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/FIFO.png 628w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/FIFO-150x150.png 150w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/FIFO-300x298.png 300w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/FIFO-302x300.png 302w\" sizes=\"(max-width: 628px) 100vw, 628px\" \/><\/p>\n<p>Il listato riportato di seguito illustra un modo di implementare la FIFO che utilizza la progettazione gerarchica e strutturale.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-912\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/FIFO-listato.png\" alt=\"FIFO listato\" width=\"628\" height=\"662\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/FIFO-listato.png 628w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/FIFO-listato-285x300.png 285w\" sizes=\"(max-width: 628px) 100vw, 628px\" \/><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-913\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/FIFO-listato-1.png\" alt=\"FIFO listato 1\" width=\"337\" height=\"736\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/FIFO-listato-1.png 337w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/FIFO-listato-1-137x300.png 137w\" sizes=\"(max-width: 337px) 100vw, 337px\" \/><\/p>\n<p><strong>Progetto di macchine a stati finiti<\/strong><\/p>\n<p><span style=\"font-size: medium;\">In VHDL descrivere il comportamento di una macchina a stati finiti \u00e8 solo un problema di tradurre il diagramma a stati in una serie di istruzioni CASE-WHEN e IF-THEN-ELSE, come verr\u00e0 mostrato nell\u2019esempio illustrato di seguito. <\/span><\/p>\n<p><span style=\"font-size: medium;\">Si vuole descrivere un controller che viene utilizzato per abilitare e disabilitare i segnali di write enable (<\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">we<\/span><\/i><span style=\"font-size: medium;\">) e output enable (<\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">oe<\/span><\/i><span style=\"font-size: medium;\">) di un buffer di memoria durante la fase di lettura e scrittura. <\/span><\/p>\n<p><span style=\"font-size: medium;\">I segnali <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">ready <\/span><\/i><span style=\"font-size: medium;\">e <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">read_write <\/span><\/i><span style=\"font-size: medium;\">sono le uscite di un microprocessore e gli ingressi del controller. Una nuova transizione inizia quando il segnale <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">ready <\/span><\/i><span style=\"font-size: medium;\">viene posto a \u20181\u2019. Un ciclo di clock dopo l\u2019inizio della transizione il valore del segnale <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">read_write <\/span><\/i><span style=\"font-size: medium;\">determina se effettuare una transizione di lettura o scrittura. <\/span><\/p>\n<p><span style=\"font-size: medium;\">Se <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">read_write <\/span><\/i><span style=\"font-size: medium;\">viene posto uguale a \u20181\u2019, allora si esegue un ciclo di lettura, altrimenti si esegue un ciclo di scrittura.\u00a0 <\/span><\/p>\n<p><span style=\"font-size: medium;\">Un ciclo viene completato quando ready viene posto a \u20181\u2019, dopo di che pu\u00f2 iniziare una nuova transizione. <\/span><\/p>\n<p><span style=\"font-size: medium;\">Write enableviene posto a \u20181\u2019 durante il ciclo di scrittura e output enable viene posto a \u20181\u2019 durante un ciclo di lettura.Nella figura che segue viene riportato il diagramma a bolle del controller. <\/span><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-915\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/stati-finiti.png\" alt=\"stati finiti\" width=\"560\" height=\"444\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/stati-finiti.png 560w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/stati-finiti-300x238.png 300w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/stati-finiti-378x300.png 378w\" sizes=\"(max-width: 560px) 100vw, 560px\" \/><\/p>\n<p><strong>Metodologia di progetto tradizionale.<\/strong><\/p>\n<p>Con il metodo di progetto tradizionale, il primo passo \u00e8 quello di disegnare il diagramma dal quale ricavare la tabella degli stati.<\/p>\n<p>E\u2019 possibile quindi fare l\u2019assegnamento degli stati e creare una tabella di transizione degli stati da cui si possono determinare le equazioni che determinano lo stato successivo e le uscite in base ai tipi di flip flop utilizzati per l\u2019implementazione.<\/p>\n<p>La figura del diagramma a bolle (o diagramma degli stati) \u00e8 mostrata sopra. In questa macchina non ci sono degli stati equivalenti.<\/p>\n<p>E\u2019 possibile combinare la tabella di assegnamento degli stati con la tabella di transizione degli stati, come \u00e8 riportato nella figura sotto.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-916\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/stati-finiti-tabella.png\" alt=\"stati finiti tabella\" width=\"582\" height=\"302\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/stati-finiti-tabella.png 582w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/stati-finiti-tabella-300x156.png 300w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/stati-finiti-tabella-500x259.png 500w\" sizes=\"(max-width: 582px) 100vw, 582px\" \/><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-917\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/stati-finiti-tabella2.png\" alt=\"stati finiti tabella2\" width=\"553\" height=\"310\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/stati-finiti-tabella2.png 553w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/stati-finiti-tabella2-300x168.png 300w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/stati-finiti-tabella2-500x280.png 500w\" sizes=\"(max-width: 553px) 100vw, 553px\" \/><\/p>\n<p><span style=\"font-size: medium;\">L\u2019assegnamento degli stati \u00e8 elencato nella colonna present state (PS). Si vuole utilizzare il minor numero possibile di registri per gli stati, cio\u00e8 due. <\/span><\/p>\n<p><span style=\"font-size: medium;\">La colonna next state (NS) mostra la transizione dallo stato presente verso lo stato successivo in base al valore dei due ingressi <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">read_write<\/span><\/i><span style=\"font-size: medium;\">e <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">ready<\/span><\/i><span style=\"font-size: medium;\">. <\/span><\/p>\n<p><span style=\"font-size: medium;\">Le uscite sono riportate nella colonna pi\u00f9 a destra.E\u2019 possibile determinare ora l\u2019equazione dello stato successivo per ognuno dei due bit di stato. <\/span><\/p>\n<p><span style=\"font-size: medium;\">Nelle equazioni mostrate, Q1 e Q0 rappresentano i valori dello stato successivo, e <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">q1<\/span><\/i><span style=\"font-size: medium;\">e <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">q0<\/span><\/i><span style=\"font-size: medium;\">rappresentano i valori dello stato presente. <\/span><\/p>\n<p><span style=\"font-size: medium;\">Le mappe di Karnaugh possono essere generate facilmente dalla tabella delle transizioni: ogni riga corrisponde ad uno stato, ogni colonna corrisponde ad una combinazione degli ingressi, e gli ingressi nella mappa di Karnaugh corrispondono ai valori di Q1 e Q0 trovati nella tabella delle transizioni. <\/span><\/p>\n<p><span style=\"font-size: medium;\">Le mappe di Karnaugh vengono poi utilizzate per trovar le equazioni minime assumendo che si utilizzino flip flop di tipo D. <\/span><\/p>\n<p><span style=\"font-size: medium;\">Le uscite sono funzioni solo dello stato presente (macchina di Moore). <\/span><\/p>\n<p><strong>Le macchine a stati finiti in VHDL.<\/strong><\/p>\n<p>Il diagramma degli stati mostrato precedentemente pu\u00f2 essere facilmente tradotto in VHDL senza dover effettuare l\u2019assegnamento degli stati, generare la tabella di transizione degli stati, o determinare le equazioni che individuano lo stato successivo in base al tipo di flip flop disponibile.<\/p>\n<p>In VHDL ogni stato pu\u00f2 essere tradotto in un caso mediante una istruzione CASE WHEN.<\/p>\n<p>La transizione degli stati pu\u00f2 essere specificata mediante una serie di istruzioni IF-THEN-ELSE. Per esempio, per tradurre in VHDL un diagramma degli stati si inizia definendo un tipo enumerativo, formato dal nome degli stati, e dichiarando due segnali del tipo:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-919\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/tipo-enumerato.png\" alt=\"tipo enumerato\" width=\"430\" height=\"43\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/tipo-enumerato.png 430w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/tipo-enumerato-300x30.png 300w\" sizes=\"(max-width: 430px) 100vw, 430px\" \/><\/p>\n<p><span style=\"font-size: medium;\">L\u2019operazione successiva da fare \u00e8 quella di creare un processo. <\/span><\/p>\n<p><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">Next_state <\/span><\/i><span style=\"font-size: medium;\">viene determinato tramite una funzione di <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">present_state <\/span><\/i><span style=\"font-size: medium;\">e degli ingressi (<\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">ready<\/span><\/i><span style=\"font-size: medium;\">e <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">read_write<\/span><\/i><span style=\"font-size: medium;\">). Cos\u00ec il processo deve essere sensibile a questi segnali:<\/span><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-920\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/state.png\" alt=\"state\" width=\"474\" height=\"82\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/state.png 474w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/state-300x52.png 300w\" sizes=\"(max-width: 474px) 100vw, 474px\" \/><\/p>\n<p><span style=\"font-size: medium;\">All\u2019interno del processo vengono descritte le transizioni della macchina a stati finiti. <\/span><\/p>\n<p><span style=\"font-size: medium;\">Viene aperta una istruzione CASE-WHEN e specificato il primo caso (condizione WHEN), cio\u00e8 lo stato di <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">idle<\/span><\/i><span style=\"font-size: medium;\">. Per questo caso, si specificano le uscite definite nello stato di <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">idle <\/span><\/i><span style=\"font-size: medium;\">e le transizioni che partono da esso.<\/span><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-921\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/state1.png\" alt=\"state1\" width=\"563\" height=\"170\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/state1.png 563w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/state1-300x91.png 300w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/state1-500x151.png 500w\" sizes=\"(max-width: 563px) 100vw, 563px\" \/><\/p>\n<p><span style=\"font-size: medium;\">Ci sono due opzioni in questo caso (cio\u00e8, quando <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">present_state<\/span><\/i><span style=\"font-size: medium;\">\u00e8 <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">idle<\/span><\/i><span style=\"font-size: medium;\">): (1) la transizione allo stato <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">decision<\/span><\/i><span style=\"font-size: medium;\">se <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">ready <\/span><\/i><span style=\"font-size: medium;\">e uguale a \u20181\u2019 oppure (2) rimanere nello stato di <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">idle<\/span><\/i><span style=\"font-size: medium;\">. In questo caso la condizione di ELSE non \u00e8 richiesta perch\u00e9 viene utilizzata la memoria implicita e lo stato <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">next_state <\/span><\/i><span style=\"font-size: medium;\">rimane lo stesso. La codifica degli altri stati viene effettuata nello stesso modo: per ogni stato viene creato un ramo nell\u2019istruzione CASE (WHEN <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">state_name<\/span><\/i><span style=\"font-size: medium;\">=&gt;), si specifica quali sono le uscite dello stato, e si definisce la transizione agli altri stati con un\u2019istruzione IF -THEN-ELSE. <\/span><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-922\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/state2.png\" alt=\"state2\" width=\"521\" height=\"473\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/state2.png 521w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/state2-300x272.png 300w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/state2-330x300.png 330w\" sizes=\"(max-width: 521px) 100vw, 521px\" \/><\/p>\n<p><span style=\"font-size: medium;\">Il processo mostrato sopra indica che l\u2019assegnamento di <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">next_state <\/span><\/i><span style=\"font-size: medium;\">\u00e8 basato su <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">present_state <\/span><\/i><span style=\"font-size: medium;\">e sugli ingressi correnti, ma non indica quando <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">next_state <\/span><\/i><span style=\"font-size: medium;\">diventa <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">present_state<\/span><\/i><span style=\"font-size: medium;\">. <\/span><\/p>\n<p><span style=\"font-size: medium;\">Questo avviene in modo sincrono, sul fronte di salita del clock, come indicato in un secondo processo:<\/span><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-923\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/state3.png\" alt=\"state3\" width=\"309\" height=\"88\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/state3.png 309w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/state3-300x85.png 300w\" sizes=\"(max-width: 309px) 100vw, 309px\" \/><\/p>\n<p>Il codice completo della macchina a stati finiti \u00e8 il seguente:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-924\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/state4.png\" alt=\"state4\" width=\"567\" height=\"816\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/state4.png 567w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/state4-208x300.png 208w\" sizes=\"(max-width: 567px) 100vw, 567px\" \/><\/p>\n<p><strong>Memory controller.<\/strong><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-926\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/memory-controller.png\" alt=\"memory controller\" width=\"639\" height=\"420\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/memory-controller.png 639w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/memory-controller-300x197.png 300w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/memory-controller-456x300.png 456w\" sizes=\"(max-width: 639px) 100vw, 639px\" \/><\/p>\n<p><span style=\"font-size: medium;\">Il memory controller mostrato nella figura sopra, ha il seguente funzionamento: altri dispositivi sul bus iniziano un accesso al buffer di memoria identificandolo sul bus con il suo indirizzo, F3 in esadecimale. Un ciclo di clock dopo, il segnale di <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">read_write <\/span><\/i><span style=\"font-size: medium;\">viene messo a \u20181\u2019 per indicare una lettura dal buffer di memoria; oppure viene messo a \u20180\u2019 per indicare una scrittura sul buffer di memoria. Se l\u2019accesso alla memoria \u00e8 una lettura, la lettura potrebbe essere di una sola parola o di un <strong>burst<\/strong> di quattro parole. La lettura di un burst \u00e8 indicata mettendo a \u20181\u2019 il segnale <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">burst <\/span><\/i><span style=\"font-size: medium;\">durante il primo ciclo di lettura, dopo di che il controller accede a quattro locazioni di memoria dal buffer. Le locazioni consecutive sono accedute mettendo il segnale <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">ready <\/span><\/i><span style=\"font-size: medium;\">a \u20181\u2019. Il controller mette <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">oe<\/span><\/i><span style=\"font-size: medium;\">(output enable) a \u20181\u2019 al buffer di memoria durante una lettura, e incrementa i due bit pi\u00f9 bassi dell\u2019indirizzo durante una lettura a burst. La scrittura nel buffer di memoria \u00e8 sempre una scrittura di una singola parola, mai di un burst. Durante una scrittura, <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">we <\/span><\/i><span style=\"font-size: medium;\">viene messo a \u20181\u2019, permettendo a <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">data <\/span><\/i><span style=\"font-size: medium;\">di essere scritto nella locazione di memoria specificata da <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">address<\/span><\/i><span style=\"font-size: medium;\">. Gli accessi in lettura e scrittura sono completati quando il segnale <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">ready <\/span><\/i><span style=\"font-size: medium;\">viene messo a \u20181\u2019.<\/span><\/p>\n<p>La figura successiva mostra il diagramma degli stati del memory controller.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-927\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/diagramma-a-stati2.png\" alt=\"diagramma a stati2\" width=\"570\" height=\"795\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/diagramma-a-stati2.png 570w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/diagramma-a-stati2-215x300.png 215w\" sizes=\"(max-width: 570px) 100vw, 570px\" \/><\/p>\n<p>Il diagramma degli stati pu\u00f2 essere facilmente tradotto in una serie di istruzioni CASE-WHEN come segue (per ora non viene considerato un reset sincrono):<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-929\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/case.png\" alt=\"case\" width=\"523\" height=\"811\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/case.png 523w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/case-193x300.png 193w\" sizes=\"(max-width: 523px) 100vw, 523px\" \/><\/p>\n<p><strong>Reset sincrono un una macchina a stati finiti con due processi.<\/strong><\/p>\n<p><span style=\"font-size: medium;\">Questa macchina a stati finiti richiede un reset sincrono. Al posto di specificare la transizione di reset nello stato di <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">idle <\/span><\/i><span style=\"font-size: medium;\">in ogni ramo dell\u2019istruzione CASE, \u00e8 possibile includere un\u2019istruzione IF-THEN-ELSE all\u2019inizio del process per fare in modo che la macchina entri nello stato di <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">idle <\/span><\/i><span style=\"font-size: medium;\">se il segnale di <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">reset <\/span><\/i><span style=\"font-size: medium;\">viene messo a \u20181\u2019. Se il segnale di <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">reset <\/span><\/i><span style=\"font-size: medium;\">\u00e8 a \u20180\u2019, allora avvengono le transizioni di stato normali della macchina, come specificato nell\u2019istruzione CASE. Nell\u2019istruzione IF-THEN-ELSE \u00e8 necessario specificare anche come si vuole che siano le uscite (<\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">oe<\/span><\/i><span style=\"font-size: medium;\">, <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">we<\/span><\/i><span style=\"font-size: medium;\">e <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">addr<\/span><\/i><span style=\"font-size: medium;\">) se il segnale di <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">reset <\/span><\/i><span style=\"font-size: medium;\">viene messo a \u20181\u2019. Se non vengono specificate le uscite in questa condizione, allora si ottiene l\u2019effetto di memoria implicita: verranno creati dei latch per assicurare che quando il <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">reset <\/span><\/i><span style=\"font-size: medium;\">viene messo a \u20181\u2019, le uscite mantengano il loro valore. Dato che, in questo caso, non si vuole che siano creati dei latch, viene specificato il valore <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">don\u2019t care <\/span><\/i><span style=\"font-size: medium;\">quando il segnale di reset viene messo a \u20181\u2019.<\/span><\/p>\n<p>Il codice richiesto per il reset \u00e8 il seguente:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-931\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/state-reset.png\" alt=\"state reset\" width=\"585\" height=\"198\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/state-reset.png 585w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/state-reset-300x102.png 300w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/state-reset-500x169.png 500w\" sizes=\"(max-width: 585px) 100vw, 585px\" \/><\/p>\n<p><span style=\"font-size: medium;\">Diversamente, la condizione di reset potrebbe essere messa dopo l\u2019istruzione CASE, come ultima istruzione nel process <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">state_comb<\/span><\/i><span style=\"font-size: medium;\">. In questo modo, potrebbe essere una semplice istruzione IF-THEN e sarebbe necessaria solo la transizione dello stato. Non \u00e8 pi\u00f9 richiesta la definizione del valore delle uscite. Il codice richiesto in questo caso \u00e8: <\/span><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-932\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/state-reset1.png\" alt=\"state reset1\" width=\"579\" height=\"168\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/state-reset1.png 579w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/state-reset1-300x87.png 300w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/state-reset1-500x145.png 500w\" sizes=\"(max-width: 579px) 100vw, 579px\" \/><\/p>\n<p>Il codice completo del memory controller \u00e8 mostrato nel listato sotto:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-933\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/state-reset1code.png\" alt=\"state reset1code\" width=\"429\" height=\"855\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/state-reset1code.png 429w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/state-reset1code-151x300.png 151w\" sizes=\"(max-width: 429px) 100vw, 429px\" \/><\/p>\n<p>Il listato riportato nella pagina precedente descrive una macchina a stati finiti con due processi. Un processo che descrive la logica combinatoria, e un altro che descrive la sincronizzazione delle transizioni di stato con il clock, come illustrato nella figura seguente.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-935\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/case-when-diagram-ram.png\" alt=\"case-when-diagram ram\" width=\"742\" height=\"317\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/case-when-diagram-ram.png 742w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/case-when-diagram-ram-300x128.png 300w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/case-when-diagram-ram-500x214.png 500w\" sizes=\"(max-width: 742px) 100vw, 742px\" \/><\/p>\n<p><span style=\"font-size: medium;\"><strong>Reset asincrono<\/strong><\/span><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">. <\/span><\/p>\n<p>Se \u00e8 necessario utilizzare un reset asincrono invece che uno sincrono, allora \u00e8 possibile utilizzare uno schema di reset come quello riportato nel seguente listato:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-936\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/reset_asincrono.png\" alt=\"reset_asincrono\" width=\"429\" height=\"135\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/reset_asincrono.png 429w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/reset_asincrono-300x94.png 300w\" sizes=\"(max-width: 429px) 100vw, 429px\" \/><\/p>\n<p>Se il segnale di reset \u00e8 utilizzato solo durante l\u2019inizializzazione o i malfunzionamenti del sistema, allora \u00e8 preferibile utilizzare un reset di tipo asincrono. Questo principalmente perch\u00e9 un reset sincrono richiede risorse del dispositivo addizionali, inoltre elimina la possibilit\u00e0 di introdurre accidentalmente la memoria implicita.<\/p>\n<p>Il codice nel listato riportato sotto \u00e8 funzionalmente equivalente a quello riportato nel listato precedente, per\u00f2 utilizza solamente un processo per descrivere la transizione tra gli stati e la sincronizzazione delle transizioni con il clock. Una serie di istruzioni concorrenti addizionali sono utilizzate per descrivere il comportamento delle uscite.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-937\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/reset_asincrono_single-process.png\" alt=\"reset_asincrono_single process\" width=\"490\" height=\"834\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/reset_asincrono_single-process.png 490w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/reset_asincrono_single-process-176x300.png 176w\" sizes=\"(max-width: 490px) 100vw, 490px\" \/><\/p>\n<p><strong>Area, velocit\u00e0 e utilizzazione delle risorse del dispositivo.<\/strong><\/p>\n<p><span style=\"font-size: medium;\">Di seguito vengono illustrate quattro tecniche per generare l\u2019uscita delle macchine a stati finiti per le macchine di Moore:<\/span><\/p>\n<ol>\n<li><span style=\"font-size: medium;\">decodifica dell\u2019uscita dai bit di stato in modo combinatorio\u2022decodifica dell\u2019uscita in registri di uscita paralleli<\/span><\/li>\n<li><span style=\"font-size: medium;\">codifica dell\u2019uscita all\u2019interno dei bit di stato<\/span><\/li>\n<li><span style=\"font-size: medium;\">codifica <\/span><strong><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">one hot <\/span><\/i><\/strong><span style=\"font-size: medium;\">Ognuna di queste tecniche produce un\u2019implementazione logica con differenti caratteristiche di temporizzazione.<\/span><\/li>\n<\/ol>\n<p><span style=\"font-size: medium;\"><strong>Decodifica dell\u2019uscita dai bit di stato in modo combinatorio.<\/strong><\/span><\/p>\n<p>I listati precedenti descrivono le uscite che devono essere decodificate dallo stato presente dei bit di stato come riportato nella figura sotto. Questa decodifica combinatoria pu\u00f2 richiedere livelli di logica addizionali, rendendo cos\u00ec pi\u00f9 lenta la propagazione dall\u2019uscita dei bit di stato ai segnali di uscita del dispositivo.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-940\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/stati-veloci-1.png\" alt=\"stati veloci 1\" width=\"569\" height=\"145\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/stati-veloci-1.png 569w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/stati-veloci-1-300x76.png 300w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/stati-veloci-1-500x127.png 500w\" sizes=\"(max-width: 569px) 100vw, 569px\" \/><\/p>\n<p><strong>Decodifica dell\u2019uscita in registri di uscita paralleli<\/strong><\/p>\n<p>Un modo per assicurare che le uscite della macchina a stati finiti arrivino ai pin del dispositivo pi\u00f9 rapidamente \u00e8 decodificare le uscite dai bit di stato prima che i bit di stato vengano memorizzati, e quindi immagazzinare l\u2019informazione decodificata in alcuni registri. Questo pu\u00f2 essere fatto sia con la descrizione della macchia a stati finiti con un processo che con due processi.<\/p>\n<p><span style=\"font-size: medium;\">In entrambi i casi, l\u2019assegnamento a <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">addr <\/span><\/i><span style=\"font-size: medium;\">deve essere descritto fuori dal processo in cui sono definite le transizioni di stato. Invece di utilizzare le informazioni del <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">present_state <\/span><\/i><span style=\"font-size: medium;\">per determinare il valore di <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">addr<\/span><\/i><span style=\"font-size: medium;\">, viene utilizzata l\u2019informazione di <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">next_state <\/span><\/i><span style=\"font-size: medium;\">per determinare come dovrebbe essere il valore di <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">addr <\/span><\/i><span style=\"font-size: medium;\">durante il successivo ciclo di clock. Il concetto di immagazzinare il valore delle uscite in base al valore di <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">next_state <\/span><\/i><span style=\"font-size: medium;\">\u00e8 illustrato nella figura sotto.<\/span><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-941\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/stati-veloci-2.png\" alt=\"stati veloci 2\" width=\"571\" height=\"257\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/stati-veloci-2.png 571w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/stati-veloci-2-300x135.png 300w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/stati-veloci-2-500x225.png 500w\" sizes=\"(max-width: 571px) 100vw, 571px\" \/><\/p>\n<p>Per modificare il progetto del memory controller per includere la decodifica delle uscite in registri di uscita paralleli, il listato precedente viene modificato come riportato di seguito. I commenti sono utilizzati per indicare dove ci sono differenze nel codice.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-943\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/stati-veloci-3.png\" alt=\"stati veloci 3\" width=\"568\" height=\"383\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/stati-veloci-3.png 568w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/stati-veloci-3-300x202.png 300w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/stati-veloci-3-445x300.png 445w\" sizes=\"(max-width: 568px) 100vw, 568px\" \/><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-944\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/stati-veloci-4.png\" alt=\"stati veloci 4\" width=\"499\" height=\"848\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/stati-veloci-4.png 499w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/stati-veloci-4-177x300.png 177w\" sizes=\"(max-width: 499px) 100vw, 499px\" \/><\/p>\n<p><span style=\"font-size: medium;\">In questo progetto \u00e8 stato dichiarato un segnale addizionale: <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">addr_d. <\/span><\/i><span style=\"font-size: medium;\">Questo viene utilizzato per decodificare in modo combinatorio come dovrebbe essere il valore di <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">addr <\/span><\/i><span style=\"font-size: medium;\">il ciclo di clock successivo. Questo viene fatto rimuovendo l\u2019istruzione di assegnamento del segnale <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">addr <\/span><\/i><span style=\"font-size: medium;\">dal istruzione CASE, e inserendo un\u2019istruzione di assegnamento dei segnali WITH-SELECT-WHEN, in cui il segnale di selezione \u00e8 <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">next_state<\/span><\/i><span style=\"font-size: medium;\">. Poi, il segnale <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">addr_d <\/span><\/i><span style=\"font-size: medium;\">viene memorizzato nel segnale <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">addr <\/span><\/i><span style=\"font-size: medium;\">sul fronte di salita del clock. Tutto questo viene descritto nel processo <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">state_clocked<\/span><\/i><span style=\"font-size: medium;\">. L\u2019istruzione WITH-SELECT-WHEN non \u00e8 necessario che sia posta tra i due processi potrebbe essere messa prima o dopo di loro.<\/span><\/p>\n<p><strong>Codifica dell\u2019uscita con i bit di stato<\/strong><\/p>\n<p>Un contatore \u00e8 un esempio di una macchina a stati finiti nella quale le uscite sono i bit di stato. Questo metodo potrebbe funzionare meglio dei precedenti in alcuni casi particolari, ma richiede una scelta accurata della codifica degli stati: l\u2019uscita deve corrispondere al valore memorizzato nel registro degli stati, come mostrato nella figura sotto.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-946\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/stati-veloci-5.png\" alt=\"stati veloci 5\" width=\"574\" height=\"156\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/stati-veloci-5.png 574w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/stati-veloci-5-300x82.png 300w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/stati-veloci-5-500x136.png 500w\" sizes=\"(max-width: 574px) 100vw, 574px\" \/><\/p>\n<p>Questo approccio rende la progettazione pi\u00f9 complicata da comprendere e cambiare, cos\u00ec \u00e8 raccomandata solo per i casi che richiedono ottimizzazioni di area e prestazioni non fornite dagli strumenti di sintesi, o automaticamente dalle direttive di implementazione.<\/p>\n<p><strong>Codifica one-hot<\/strong><\/p>\n<p><span style=\"font-size: medium;\">Questa \u00e8 una tecnica che utilizza <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">n <\/span><\/i><span style=\"font-size: medium;\">flip flop per rappresentare una macchina a stati finiti con <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">n <\/span><\/i><span style=\"font-size: medium;\">stati. Ogni stato ha un suo proprio flip flop, e solo un flip flop \u00e8 &#8220;hot&#8221; (cio\u00e8 ha memorizzato un \u20181\u2019) ogni intervallo di tempo. Uno dei vantaggi della codifica &#8220;one hot&#8221; \u00e8 che il numero di porte richieste per decodificare l\u2019informazione degli stati per le uscite e per la transizione allo stato successivo e molto minore del numero di porte richiesto a questo scopo dagli altri metodi di codifica. Questa differenza nella complessit\u00e0 diventa pi\u00f9 evidente al crescere del numero degli stati. A seconda dell\u2019architettura del dispositivo utilizzato, una macchina a stati finiti con codifica <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">one hot <\/span><\/i><span style=\"font-size: medium;\">potrebbe richiedere meno risorse del dispositivo per l\u2019implementazione del progetto. Una logica per determinare lo stato successivo pi\u00f9 semplice richiede meno livelli di logica tra i registri di stato, permettendo cos\u00ec frequenze di funzionamento pi\u00f9 alte. La codifica <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">one hot <\/span><\/i><span style=\"font-size: medium;\">non \u00e8 sempre la miglior soluzione, principalmente perch\u00e9 richiede pi\u00f9 flip flop che una macchina a stati finiti codificata in modo sequenziale. In generale, la codifica <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">one hot <\/span><\/i><span style=\"font-size: medium;\">\u00e8 pi\u00f9 utile quando l\u2019architettura del dispositivo programmabile che si vuole utilizzare contiene un numero relativamente elevato di registri e poca logica combinatoria tra ogni registro. Per esempio, la codifica <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">one hot <\/span><\/i><span style=\"font-size: medium;\">risulta pi\u00f9 utile per le macchine a stati finiti implementate dentro alle FPGA, che generalmente hanno una densit\u00e0 di flip flop pi\u00f9 elevata che le CPLD ma un minor numero di porte logiche per flip flop. Finora si \u00e8 discusso di che cosa \u00e8 la codifica <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">one hot <\/span><\/i><span style=\"font-size: medium;\">e quando conviene utilizzarla, vediamo ora come descrivere una macchina a stati finiti con la codifica <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">one hot<\/span><\/i><span style=\"font-size: medium;\">. Fortunatamente, la codifica <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">one hot <\/span><\/i><span style=\"font-size: medium;\">richiede pochi o nessun cambiamento al codice sorgente, ma dipende dal software di sintesi che viene utilizzato. Molti software per la sintesi permettono di utilizzare alcune direttive di sintesi nella forma di istruzioni VHDL, o di opzioni GUI (come avviene nel software Foundation Express). Generare le uscite per una macchina a stati finiti con codifica <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">one hot <\/span><\/i><span style=\"font-size: medium;\">\u00e8 analogo a generare le uscite per macchine in cui le uscite sono decodificate dai registri di stato. La decodifica \u00e8 abbastanza semplice perch\u00e9 gli stati sono solo dei bit singoli e non un intero vettore. La logica di uscita consiste di una porta OR perch\u00e9 le macchine di Moore hanno le uscite che sono funzioni solo dello stato, e tutti gli stati in una macchina a stati finiti con codifica <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">one hot <\/span><\/i><span style=\"font-size: medium;\">sono rappresentati da un bit. In una FPGA, il ritardo associato ad una porta OR \u00e8 tipicamente accettabile ed \u00e8 un miglioramento rispetto alle decodifiche dell\u2019uscita che utilizzano un intero vettore di stato.<\/span><\/p>\n<p><strong>Macchine di Mealy<\/strong><\/p>\n<p>Finora sono state trattate solo le macchine di Moore (figura sotto a) in cui le uscite sono funzioni solamente dello stato corrente. Le macchine di Mealy (figura sotto b) possono avere uscite che sono funzioni dello stato presente e dei segnali presenti in ingresso, come illustrato nella figura sotto.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-948\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/macchine-di-mealy.png\" alt=\"macchine di mealy\" width=\"647\" height=\"477\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/macchine-di-mealy.png 647w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/macchine-di-mealy-300x221.png 300w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/macchine-di-mealy-407x300.png 407w\" sizes=\"(max-width: 647px) 100vw, 647px\" \/><\/p>\n<p><span style=\"font-size: medium;\">Il lavoro addizionale che \u00e8 19necessario per descrivere le macchine di Mealy rispetto alle macchine di Moore \u00e8 minimo. Per implementare una macchina di Mealy occorre semplicemente descrivere un\u2019uscita come funzione sia dei bit di stato che degli ingressi. Per esempio, se vi \u00e8 un ingresso addizionale al memory controller chiamato <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">write_mask <\/span><\/i><span style=\"font-size: medium;\">che quando vale \u20181\u2019 non consente a <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">we <\/span><\/i><span style=\"font-size: medium;\">di essere abilitato, \u00e8 possibile descrivere la logica per <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">we <\/span><\/i><span style=\"font-size: medium;\">come <\/span><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-949\" src=\"http:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/macchine-di-mealy-code1.png\" alt=\"macchine di mealy-code1\" width=\"459\" height=\"94\" srcset=\"https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/macchine-di-mealy-code1.png 459w, https:\/\/www.gtronic.it\/test\/wp-content\/uploads\/2017\/02\/macchine-di-mealy-code1-300x61.png 300w\" sizes=\"(max-width: 459px) 100vw, 459px\" \/><\/p>\n<p><span style=\"font-size: medium;\">Questo rende <\/span><i><span style=\"font-family: Times New Roman,Times New Roman; font-size: medium;\">we <\/span><\/i><span style=\"font-size: medium;\">un\u2019uscita di Mealy.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>VHDL: Concetto di entity. Un entity \u00e8 un\u2019astrazione di un dispositivo che pu\u00f2\u00a0rappresentare un sistema completo, una scheda, un chip, una funzione o una porta logica. Una dichiarazione di entity descrive l\u2019I\/O di un progetto e pu\u00f2 includere anche parametri &hellip; <a href=\"https:\/\/www.gtronic.it\/test\/index.php\/concetti-base-e-glossario\/\">Continua a leggere<span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"_links":{"self":[{"href":"https:\/\/www.gtronic.it\/test\/index.php\/wp-json\/wp\/v2\/pages\/597"}],"collection":[{"href":"https:\/\/www.gtronic.it\/test\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.gtronic.it\/test\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.gtronic.it\/test\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gtronic.it\/test\/index.php\/wp-json\/wp\/v2\/comments?post=597"}],"version-history":[{"count":36,"href":"https:\/\/www.gtronic.it\/test\/index.php\/wp-json\/wp\/v2\/pages\/597\/revisions"}],"predecessor-version":[{"id":950,"href":"https:\/\/www.gtronic.it\/test\/index.php\/wp-json\/wp\/v2\/pages\/597\/revisions\/950"}],"wp:attachment":[{"href":"https:\/\/www.gtronic.it\/test\/index.php\/wp-json\/wp\/v2\/media?parent=597"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}