# VHDL

VHDL és l'acrònim que representa la combinació de VHSIC i HDL, on VHSIC és l'acrònim de «Very High Speed Integrated Circuit», i HDL és al seu torn l'acrònim de «Hardware Description Language». És un llenguatge fet servir per enginyers definit pel Institute of Electrical and Electronics Engineers (IEEE) ANSI/IEEE 1076-1993 que es fa servir per modelar, simular i sintetitzar, és a dir per dissenyar circuits digitals. Altres mètodes per dissenyar circuits són la captura d'esquemes (amb eines tipus CAD) i els diagrames de blocs, però aquest no són pràctics en dissenys complexos. Altres llenguatges pel mateix propòsit poden ser Verilog i ABEL. Tot i que es pot fer servir de forma general per descriure qualsevol circuit es fa servir principalment per dissenyar circuits integrats a molt gran escala digitals d'alta complexitat i per programar PLD (programable logic device - dispositiu lògic programable) i FPGA (Field Programmable Gate Array).
Una de les característiques més important de VHDL, i probablement un dels aspectes més confusos del llenguatge per a algú nou és la capacitat del llenguatge per descriure un sistema altament concurrent per aprofitar plenament la naturalesa paral·lela de dispositius digitals.

## Història

El desenvolupament de VHDL començà quan el Departament de Defensa dels EUA (DoD, en anglès) va sol·licitar un llenguatge per descriure hardware. Els dos principals requisits foren:
* El llenguatge havia de descriure la lògica del maquinari unívocament amb l'objectiu de poder adaptar els circuits a les noves tecnologies de maquinari sense haver de començar de nou tot el procés de disseny, solucionant així el problema de l'obsolescència tecnològica.
* L'estructura i la sintaxi del llenguatge havia de ser comprensible pels éssers humans, això permetria que el llenguatge VHDL fos fàcil de mantenir i modificar.
El llenguatge original va trigar més de 16 anys des del concepte inicial a la norma final. Quan el document va ésser aprovat pel comitè de IEEE es va acordar que la norma hauria de ser revisada cada 5 anys. La primera fase de revisió va donar lloc a la norma actualitzada el 1993. Independentment d'aquest acord de revisió, es fa un esforç addicional per normalitzar "les extensions" de la referència del llenguatge pur. Aquestes extensions de cobertura per a paquets d'exemples (std_logic_1164, numeric_bit, numeric_std), que conté tipus de dades molt necessaris i subprogrames.

### Evolució temporal de l'estandardització de VHDL

* 1981 – Iniciat pel Departament de Defensa dels EUA per fer front al cicle de vida de hardware crític.
* 1983-85 – Desenvolupament de la base de referència d'idiomes per Intermetrics, IBM i TI
* 1986 – Tots els drets transferits a IEEE
* 1987 – Publicació de la norma IEEE
* 1987 - La norma Mil Std 454 requereix ampliar les descripcions VHDL per a poder descriure ASICs
* 1994 – Estàndard revisat (anomenat VHDL 1076-1993)
* 2000 – Estàndard revisat (anomenat VHDL 1076-2000)
* 2002 – Estàndard revisat (anomenat VHDL 1076-2002)
* 2007 – VHDL Procedural Language Application Interface standard (VHDL 1076c-2007)
* 2009 – Estàndard revisat (anomenat VHDL 1076-2008)

## Seqüència de disseny

El flux de disseny d'un sistema podria ser:
* Divisió del disseny principal en mòduls separats. La modularitat és un dels conceptes principals de tot disseny. Normalment es diferencia entre dues metodologies de disseny: top-down i botton-up. La metodologia top-down consisteix que un disseny complex es divideix en dissenys més senzills que es puguin dissenyar (o descriure) més fàcilment. La metodologia botton-up consisteix a construir un disseny complex a partir de mòduls, ja dissenyats, més simples. A la pràctica, un disseny usa generalment ambdues metodologies.
* Entrada de dissenys, poden usar-se diversos mètodes tal com es va veure anteriorment.
* Simulació funcional, és a dir, comprovarem que l'escrit en el punt anterior realment funciona com volem, si no ho fa haurem de modificar. En aquest tipus de simulació es comprova que el codi VHDL o Verilog (o un altre tipus de llenguatge HDL) executa correctament el que es pretén.
* Síntesi. En aquest pas s'adapta el disseny anterior (que sabem que funciona) a un maquinari en concret, ja sigui una FPGA o un ASIC. Hi ha sentències del llenguatge que no són sintetitzables, com per exemple divisions o exponenciaciones amb nombres no constants. El fet que no totes les expressions en VHDL siguin sintetitzables és que el VHDL és un llenguatge genèric per modelat de sistemes (no només per disseny de circuits digitals), per la qual cosa hi ha expressions que no poden ser transformades a circuits digitals. Durant la síntesi es té en compte l'estructura interna del dispositiu, i es defineixen restriccions, com l'assignació de pins. El sintetitzador optimitza les expressions lògiques per tal que ocupin menor àrea, o bé són eliminades les expressions lògiques que no són usades pel circuit.
* Simulació post-síntesi. En aquest tipus de simulació es comprova que el sintetitzador ha realitzat correctament la síntesi del circuit, en transformar el codi HDL en blocs lògics connectats entre si. Aquest pas és necessari, ja que, de vegades, els sintetitzadors produeixen resultats de síntesi incorrectes, o bé realitza simplificacions del circuit en optimitzar-lo.
* Ubicació i encaminament. El procés d'ubicació consisteix a situar els blocs digitals obtinguts en la síntesi de forma òptima, de manera que aquells blocs que es troben molt interconnectats entre si se situïn pròximament. El procés d'encaminament consisteix a interconnectar adequadament els blocs entre si, intentant minimitzar retards de propagació per maximitzar la freqüència màxima de funcionament del dispositiu.
* Anotació final. Un cop ha estat completat el procés d'ubicació i encaminament, s'extreuen els retards dels blocs i les seves interconnexions, a fi de poder realitzar una simulació temporal (també anomenada simulació post-layout). Aquests retards són anotats en un fitxer SDF (Standard Delay Format) que associa a cada bloc o interconnexió un retard mínim / típic / màxim.
* Simulació temporal. Malgrat la simulació anterior potser el disseny no funcioni quan es programa, una de les causes pot ser pels retards interns del xip. Amb aquesta simulació es pot comprovar, i si hi ha errors s'ha de tornar a un dels anteriors passos.
* Programació en el dispositiu. S'implementa el disseny en el dispositiu final i es comprova el resultat.

## Procediment de disseny

El primer pas del disseny consisteix en la construcció del diagrama en bloc del sistema. En dissenys complexos com en programari els programes són generalment jeràrquics i VHDL ofereix un bon marc de treball per definir els mòduls que integren el sistema i les seves interfícies, deixant els detalls per a passos posteriors.
El segon pas és l'elaboració del codi en VHDL per a cada mòdul, per les seves interfícies i els seus detalls interns. Com el VHDL és un llenguatge basat en text, es pot utilitzar qualsevol editor per aquesta tasca, encara que l'entorn dels programes de VHDL inclou el seu propi editor de text. Després que s'ha escrit algun codi es fa necessari compilar-lo. El compilador de VHDL analitza aquest codi i determina els errors de sintaxi i comprova la compatibilitat entre mòduls. Crea tota la informació necessària per a la simulació. El proper pas és la simulació, la qual li permet establir els estímuls a cada mòdul i observar la seva resposta. El VHDL dona la possibilitat de crear bancs de prova que automàticament aplica entrades i compara les sortides amb les respostes desitjades. La simulació és un pas dins del procés de verificació. El propòsit de la simulació és verificar que el circuit treballa com es desitja, és a dir és més que comparar entrades i sortides. En projectes complexos es fa necessari invertir un gran temps a generar proves que permetin avaluar el circuit en un ampli rang d'operacions de treball. Trobar errors en aquest pas del disseny és millor que al final, on cal repetir llavors una gran quantitat de passos del disseny. Hi ha dues dimensions a verificar:
* El seu comportament funcional, on s'estudia el seu comportament lògic independent de consideracions de temps, com les demores en les comportes.
* La seva verificació en el temps, on s'inclouen les demores de les comportes i altres consideracions de temps, com els temps d'establiment (set-up time) i els temps de manteniment (hold time).
Després de la verificació s'està llest per entrar a la fase final del disseny. La naturalesa i eines en aquesta fase depenen de la tecnologia, però hi ha tres passos bàsics. El primer és la síntesi, que converteix la descripció en VHDL en un conjunt de components que es poden fer en la tecnologia seleccionada. Per exemple, amb PLD es generen les equacions en suma de productes. En ASIC genera una llista de comportes i un netlist que especifica com aquestes comportes són interconnectades. El dissenyador pot ajudar a l'eina de síntesi especificant requeriments a la tecnologia emprada, com el màxim nombre de nivells lògics o la capacitat de sortida que cal. En el següent pas d'ajust (Fiting) els components s'ajusten a la capacitat del dispositiu que s'utilitza. Per PLD això significa que acobla les equacions obtingudes amb els elements AND - OR que disposa el circuit. Per al cas d'ASIC es dibuixarien les comportes i es definiria com connectar. En l'últim pas es realitza la verificació temporal, ja que a aquesta altura és que es poden calcular els elements paràsits, com les capacitats de les connexions. Com en qualsevol altre procés creatiu, pot ser que ocasionalment s'avanci dos passos endavant i un cap enrere (o pitjor).

## Estructura de programa

VHDL va ser dissenyat sobre la base dels principis de la programació estructurada. La idea és definir la interfície d'un mòdul de maquinari mentre deixa invisible els seus detalls interns. L'entitat (ENTITY) en VHDL és simplement la declaració de les entrades i sortides d'un mòdul mentre que l'arquitectura (ARCHITECTURE) és la descripció detallada de l'estructura interna del mòdul o del seu comportament. A la següent figura s'il·lustra el concepte anterior. Molts dissenyadors conceben la Entity com una funda de l'arquitectura deixant invisible els detalls del que hi ha dins (architecture). Això forma la base d'un sistema de disseny jeràrquic, l'arquitectura de l'entitat de més nivell (top level) pot usar altres entitats, deixant invisible els detalls de l'arquitectura de la identitat de menys nivell. A la figura les entitats B, E i F no utilitzen altres entitats. Mentre que l'entitat A utilitza totes les altres. A la parella entitat-arquitectura és la flama model. En un fitxer text VHDL l'entitat i l'arquitectura s'escriuen separades, per exemple a continuació es mostra un programa molt simple en VHDL d'una comporta de 2 entrades. Com altres programes, VHDL ignora els espais i salts de línies. Els comentaris s'escriuen amb 2 guions (-) i acaben al final de la línia. A la figura següent es mostra l'estructura d'un model en VHDL.

### Sintaxi per la declaració de l'entitat

VHDL defineix molts caràcters especials anomenats "paraules reservades". Encara que les paraules reservades no són sensibles a les majúscules o minúscules, en l'exemple que segueix les utilitzarem en majúscules i negreta per identificar-les.
A més de donar-li nom a l'entitat el propòsit de la declaració és definir els seus senyals (o ports) d'interfície externa en la declaració de ports. A més de les paraules reservades o claus ENTITY,IS, PORT i END, una ENTITY té els següents elements.
* Nom_entitat, és un identificador seleccionat per l'usuari per seleccionar l'entitat.
* Nom de senyal, és una llista d'un o més identificadors separats per una coma i seleccionats per l'usuari per identificar els senyals externes de la interfície.
* MODE és una de les 4 següents paraules reservades per indicar la direcció del senyal:
| Mode | Descripció |
| IN | En aquesta manera els senyals només entren a l'entitat |
| OUT | Els senyals surten de l'entitat |
| BUFFER | Aquesta manera s'utilitza per als senyals que a més de sortir de l'entitat poden usar-se com entrades realimentades |
| INOUT | Aquesta manera s'utilitza per a senyals bidireccionals. S'empra en sortida amb tres estats. Es pot assignar com a substitut de les tres maneres anteriors, però no s'aconsella doncs dificulta la comprensió del programa. |
Quan s'omet la manera d'un senyal en la declaració de l'entitat se sobreentén que és d'entrada.
* Tipus de senyal, en VHDL, hi ha diversos tipus de senyals predefinides pel llenguatge, com ara:
| TIPUS | Característiques |
| BIT | En aquest tipus els senyals solament prenen els valors de "1" i "0" |
| Booleana | En aquest tipus els senyals solament prenen els valors de True i False |
| Std_logic | En aquest tipus els senyals prenen 9 valors, entre ells tenim: "1", "0", "Z" (pel 3r estat), "-" (per als opcionals). |
| Integer | En aquest tipus els senyals prenen valors sencers. Els 1 i els 0 s'escriuen sense " |
| Bit_Vector | En aquest tipus els valors dels senyals són una cadena d'uns i zeros. Exemple: "1000" |
| Std_Logic_Vector | En aquest tipus els valors dels senyals són una cadena dels nou valors permissibles per al tipus std_logic. |
| Character | Conté tots els caràcters ISO de 8 bits, on els primers 128 són els caràcters ASCII. |
Exemple: "1-0z" -231 + 1 231-1 Integer -2 147 483 647 2 147 483 647
Bit Character Severity_level Bit_vector Integer String Boolean Real time
| Operadors |
| Tipus | Std_logic |
| U | Uninitialized |
| X | Forcing Unknown |
| 0 | Forcing 0 |
| 1 | Forcing 1 |
| Z | High Impedance |
| W | Weak Unknown |
| L | Weak 0 |
| H | Weak 1 |
| - | Don't care (qualsevol valor) |
Aquest tipus és part del paquet IEEE 1164
A més l'usuari pot definir altres tipus de senyals, el que resulta molt convenient en alguns casos, com en el disseny de màquines d'estats. El llenguatge VHDL concedeix màxima importància als tipus de senyals, no s'admet realitzar una assignació barrejant tipus diferents. Un PORT d'una entitat i les seves maneres i tipus poden ser vistos per altres mòduls que la utilitzin. L'operació interna de l'entitat està definida a la architecture la sintaxi general es mostra a continuació.
Exemple, escrigui la declaració de l'entitat per un circuit digital amb dues entrades aibi una sortida F segons es mostra en la següent figura.

#### Sintaxi per a la definició de l'arquitectura

La sintaxi per a la declaració de l'arquitectura és la següent (apareixen en majúscula les paraules reservades del llenguatge VHDL, però això no és necessari):
Les declaracions i definicions que precedeixen el BEGIN, poden estar presents totes, algunes o cap. Això depèn del tipus de disseny que s'estigui realitzant. No obstant la declaració de senyals s'utilitza molt, perquè contribueix entre altres coses a la claredat del disseny.
nom_entitat és el nom de la seva entitat. nom_arquitectura és el nom donat per l'usuari a l'arquitectura. Els senyals externes de l'arquitectura són les declarades al port de l'entitat, però una arquitectura pot contenir senyals i altres declaracions que solament existeixen localment en aquesta arquitectura. Declaracions comunes a diverses entitats poden ser posades en un "paquet" separat utilitzat per totes les entitats. Les declaracions en l'arquitectura poden aparèixer en diferent ordre, però el més usual és començar per la declaració dels senyals. Signal signal-name: signal-type Variables en VHDL són similars als senyals excepte que elles no tenen significat físic en el circuit. En l'exemple anterior no es va posar declaració de variables, elles són usades en funcions, procediments i processos. Tots els senyals, variables i constants en VHDL tenen associades un tipus, aquest especifica el conjunt de valors que l'objecte pot prendre. També hi ha un conjunt d'operadors com ara add, and, etc., associats amb un tipus donat.

#### Operadors en VHDL

En VHDL existeixen diferents operadors entre els quals tenim:
Operadors Definits en VHDL per als tipus: Lògics AND, OR, XOR, NOT, NAND, NOR, XNOR Bit i booleans De relació =, / =, <,>,> =, <= Integer, Bit i Bit_Vector Concatenació & Bit, Bit_Vector i per les cadenes Aritmètics +, -, *, /, Mod, Rem, Abs, ** Integer * Mod: Mòdul de la divisió. Rem: Resta de la divisió Abs: valor absolut.
    Exponentiation.
El WARP només suporta multiplicar i dividir per 2. Exemple: Escriviu la definició d'arquitectura per a l'entitat de l'exemple anterior.
Una altra forma d'escriure el mateix exemple anterior és:
Una altra forma d'escriure el mateix exemple anterior és:
Exemple;un circuit amb dues entrades i una sortida f. L'entitat és la mateixa anterior, però suposant que la funció que realitza el circuit és tal que la sortida serà 0 només si les entrades són iguals (operació XOR).
En VHDL el que s'escriu després de -- és un comentari.
Assignacions condicionals en VHDL. En VHDL hi ha diverses assignacions que es realitzen en forma condicionada. Analitzarem dues. WITH ...... SELECT .... WHEN ..... Others WHEN ..... ELSE
Exemple: Escriviu a VHDL un fitxer per obtenir una comporta NOR de dues entrades. Utilitzeu senyals tipus boleana i assignacions condicionals de la forma WHEN ... ELSE .....
Exemple: repeteixi el disseny anterior, però utilitzi assignacions condicionals de la forma WITH .. SELECT .. WHEN .. Others
Sintaxi per al treball amb vectors. Els vectors es descriuen com: a (3), a (2), a (1), a (0), sempre començant per 0.Cuando un vector es declara en ordre descendent utilitzant la paraula clau downto per exemple (3 downto 0), hem d'interpretar que el MSB és a (3) i el LSB és a (0). Quan apareixen (0 to 3), llavors el LSB és a (3) i el MSB és a (0).

#### Biblioteques

Una biblioteca en VHDL és un lloc on es guarda la informació relacionada amb un disseny determinat. Al començament de cada disseny el compilador crea automàticament una biblioteca anomenada WORK amb aquest objectiu. A més d'aquesta biblioteca particular existeixen altres biblioteques de tipus general que contenen un conjunt de definicions que es poden utilitzar en qualsevol disseny. Un exemple de biblioteca general és l'anomenada Library IEEE, que conté definicions estàndard per VHDL. Per utilitzar una biblioteca general cal escriure el seu nom a l'inici del programa, per això és molt comú que en la primera línia d'un disseny en VHDL aparegui escrit "Library IEEE", d'aquesta manera la biblioteca es fa visible per al disseny.

#### Paquets

En els paquets es guarden definicions de tipus i objectes que poden ser utilitzats en els diferents dissenys que invoquin la seva utilització. Un paquet molt utilitzat és el paquet estàndard IEEE_STD_LOGIC_1164.ALL; La utilització d'un paquet en un disseny es realitza invocant la seva ocupació mitjançant la clàusula USE i el nom del paquet. Per exemple USE IEEE_STD_LOGIC_1164.ALL;
La terminació ALL, permet utilitzar totes les definicions i objectes que conté aquest paquet. A més de l'estàndard, existeixen altres paquets d'utilització general i també els dissenyadors que treballen amb VHDL poden definir els seus propis paquets, el que els permet reutilitzar dissenys realitzats anteriorment com a part de nous dissenys.
Sintaxi per a la definició de paquets.
La sintaxi per a la definició d'un paquet és la següent:
Aquesta última part que apareix entre els dos END, la relacionada amb el cos del paquet pot o no existir i en el cas d'existir les declaracions i definicions continguts en la mateixa són locals, visibles només dins del paquet, mentre que les declaracions i definicions contingudes a la primera part del paquet són visibles per a tots els dissenys que els utilitzin.
Sintaxi per a la declaració d'una component en VHDL
Extensió (Overload) dels operadors en VHDL La validesa dels operadors donats anteriorment s'ha estès a altres tipus per als quals no estaven originalment definits. Per exemple el paquet estàndard IEEE.Std_Logic_1164 defineix l'extensió dels operadors lògics per als tipus std_logic i Std_logic_Vector. No obstant això l'extensió dels operadors de relació i aritmètics per als tipus std_logic i std_logic_vector no estan definits al paquet estàndard sinó en un altre paquet anomenat Work_Std_arith. DISSENY jeràrquic en VHDL En VHDL un disseny pot utilitzar components que són al seu torn altres circuits o sistemes més senzills prèviament dissenyats. Això constitueix un gran avantatge, ja que facilita el treball en equip i la distribució de tasques entre diferents grups de dissenyadors. A mesura que es puja cap al nivell de jerarquia màxima l'arquitectura es fa més general mentre que en els nivells inferiors el grau de detalls és major. A la següent figura es mostra un esquema que il·lustra els diferents nivells jeràrquics. Dissenyeu un CLC amb tres entrades a, bici una sortida T, que realitzi la funció mostrada a la taula següent:
Entrades Sortida a b c T 0 0 - 0 0 1 0 0 0 1 1 1 1 0 0 1 1 1 0 0
Ara ho empaquetem per poder utilitzar-lo en un altre disseny:

## Exemples codis en VHDL
### Multiplexor

Aquest exemple simula un multiplexor de dues entrades. És un exemple senzill que mostra com descriure un element a partir del seu funcionament.
Un exemple una mica més complex és el d'un multiplexor de quatre entrades. Aquest exemple treballa amb vectors per controlar l'entrada activa a través de l'entrada sel.

### Programa detector de flancs de pujada i de baixada d'un senyal digital
## Vegeu també

* Processador de senyals digitals, dispositiu substitutiu i complementari a les FPGA
* FPGA, dispositiu que es programa usant el llenguatge VHDL
* Verilog, llenguatge de descripció de hardware, equivalent a VHDL

## Referències

* ↑ IEEE Standard VHDL Language Reference Manual
* ↑ Ashenden, Peter J. Morgan Kaufmann. The Designer's Guide to VHDL, Third Edition (Systems on Silicon) (en anglès), 2008. ISBN 9780120887859 [Consulta: 19 juny 2014].

## Enllaços externs

* VHDL Analysis and Standardization Group (VASG) (anglès)
* Dissenys VHDL de codi lliure (anglès)