VHDL és l'acrònim que representa la combinació deVHSIC iHDL, 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 unllenguatge usat perenginyers definit pelInstitute of Electrical and Electronics Engineers (IEEE) ANSI/IEEE 1076-1993[1] que es fa servir per a modelar, simular i sintetitzar, és a dir per a dissenyar,circuits digitals. Altres mètodes per a dissenyar circuits són la captura d'esquemes (amb eines tipusCAD) i els diagrames de blocs, però aquest no són pràctics en dissenys complexos. Altres llenguatges per al mateix propòsit poden serVerilog iABEL. Tot i que es pot fer servir de manera general per a descriure qualsevol circuit s'usa principalment per a dissenyarcircuits integrats a molt gran escala digitals d'alta complexitat i per programarPLD (programable logic device - dispositiu lògic programable) iFPGA (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.
El desenvolupament de VHDL començà quan elDepartament de Defensa dels EUA (DoD, en anglès) va sol·licitar un llenguatge per descriure hardware. Els dos principals requisits foren:
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.
El flux de disseny d'un sistema podria ser:
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:
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).
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.
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.
ENTITYNom_entitatISPORT(Nomdesenyal:MODEtipusdesenyal;...Nomdesenyal:maneratipusdesenyal);ENDnom_entitat;
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 clausENTITY,IS,PORT i END, una ENTITY té els següents elements.
| 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 | 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-1Integer -2 147 483 647 2 147 483 647
Bit Character Severity_levelBit_vector Integer StringBoolean 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.
ENTITYExemple1ISPORT(a,b:INbit;F:OUTbit);ENDExemple1;
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):
ARCHITECTUREnom_arquitecturaOFnom_entitatISDeclaraciódetipusDeclaraciódesenyals.DeclaraciódeconstantsDeclaraciódecomponentsDefiniciódefuncionsDefiniciódeprocedimentsBEGINEnunciatconcurrent...EnunciatconcurrentENDnom_arquitectura;
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-typeVariables 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.
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 booleansDe relació =, / =, <,>,> =, <= Integer, Bit i Bit_VectorConcatenació & Bit, Bit_Vector i per les cadenesAritmètics +, -, *, /,Mod, Rem, Abs, ** Integer *Mod: Mòdul de la divisió.Rem: Resta de la divisióAbs: valor absolut.
El WARP només suporta multiplicar i dividir per 2.Exemple: Escriviu la definició d'arquitectura per a l'entitat de l'exemple anterior.
ARCHITECTUREand_2entOFExemple1ISBEGINF<=aANDb;ENDand_2ent;
Una altra forma d'escriure el mateix exemple anterior és:
ARCHITECTUREand_2entOFExemple1ISBEGINF<='1'WHENa='1'ANDb='1'ELSE'0';ENDand_2ent;
Una altra forma d'escriure el mateix exemple anterior és:
ARCHITECTUREand_2entOFExemple1ISBEGINF<='1'WHENa='1'ANDb='1'ELSE'0'WHENa='0'ANDb='0'ELSE'0'WHENa='0'ANDb='1'ELSE'0'WHENa='1'ANDb='0'ELSE'-';ENDand_2ent;
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).
ENTITYexemp2_3IS-- Només es canvia el nom de l'entitatPORT(a,b:INbit;F:OUTbit);ENDexemp2_3;ARCHITECTUREdos_entOFexemp2_3ISBEGINf<='1'WHENa/=bELSE'0';ENDdos_ent;
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 ..... OthersWHEN ..... 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 .....
ENTITYBoole_4ISPORT(a,b:INBoolean;I:OUTBolean);ENDBoole_4;ARCHITECTUREBoole4_aOFBoole_4ISBEGINI<=trueWHENa=falseandb=falseELSEFalse;ENDBole4_a;
Exemple: repeteixi el disseny anterior, però utilitzi assignacions condicionals de la formaWITH .. SELECT .. WHEN .. Others
ENTITYBoole_5ISPORT(a,b:INBoolean;I:OUTBolean);ENDBoole_5;ARCHITECTUREBoole5_aOFBoole_5ISBEGINWITHaSELECTI<=falseWHENtrue,SensebWHENothers;ENDBole5_a;
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).
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.
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:
PACKAGEnom_del_paquetISDeclaraciódetipusDeclaraciódesenyals.DeclaraciódeconstantsDeclaraciódecomponentsDefiniciódefuncionsDefiniciódeprocedimentsENDnom_del_paquetPACKAGEBODYnom_del_paquetISDeclaraciódetipusDeclaraciódeconstantsDefiniciódefuncionsDefiniciódeprocedimentsENDnom_del_paquet
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
COMPONENTnombre_componentePORT(Nomdesenyal:maneratipusdesenyal;...Nomdesenyal:maneratipusdesenyal);ENDCOMPONENT;
Extensió (Overload) dels operadors en VHDLLa 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 VHDLEn 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 Sortidaa b c T0 0 - 00 1 0 00 1 1 11 0 0 11 1 0 0
ENTITYTISPORT(a,b,c:INBIT;T:OUTBIT);ENDT;ARCHITECTURETOFTISBEGINT<='1'WHENa='0'ANDb='1'ANDc='1'ELSE'1'WHENa='1'ANDb='0'ANDc='0'ELSE'0';ENDT;
Ara ho empaquetem per poder utilitzar-lo en un altre disseny:
PACKAGETPKGISCOMPONENTT-Elnomdelcomponenthadeserigualal'entitatques'empaquetaPORT(a,b,c:INBIT;T:OUTBIT);ENDCOMPONENT;ENDTPKG;
Aquest exemple simula unmultiplexor de dues entrades. És un exemple senzill que mostra com descriure un element a partir del seu funcionament.
entityMUX2a1isport(a:instd_logic;b:instd_logic;sel:instd_logic;z:outstd_logic);endentityarchitectureDataflowofMUX2a1isbeginz<=awhensel='0'elseb;endDataflow;
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.
entityMUX4a1isport(a:instd_logic;b:instd_logic;c:instd_logic;d:instd_logic;z:outstd_logic;sel:instd_logic_vector(1downto0));endentity;architectureDataflowofMUX4a1isbeginprocess(a,b,c,d,sel)begincaseseliswhen"00"=>z<=a;when"01"=>z<=b;when"10"=>z<=c;when"11"=>z<=d;endcase;endprocess;endDataflow;
usestd.textio.all;-- bibliotequesentityholaisendentityhola;architectureWikiofholaisconstantmissatge:string:="hola mon";-- el missatgebeginprocessis-- procés → seqüencialvariableL:line;beginwrite(L,missatge);writeline(output,L);-- escriu tot l'anteriorwait;endprocess;endarchitectureWiki;
LIBRARYieee;USEieee.std_logic_1164.all;USEIEEE.numeric_std.all;ENTITYEdgeDetectorISPORT(--Definició dels senyals de entrada i sortida, interfícieclock:INSTD_LOGIC;-- Rellotge del sistemaInSignal:INSTD_LOGIC;-- Senyal dentradaRisingEdge:OUTSTD_LOGIC;-- Flanc de pujadaFallingEdge:OUTSTD_LOGIC);-- Flanc de baixadaENDEdgeDetector;ARCHITECTURElogicOFEdgeDetectorISSIGNALinp:STD_LOGIC;SIGNALinp_dly:STD_LOGIC;BEGINFallingEdge<=inp_dlyAND(NOT(inp));-- input rising edge detectionRisingEdge<=inpAND(NOT(inp_dly));-- input falling edge detectionedge_detector:PROCESS(clock)-- Inici del procés síncronBEGINIF(clock'EVENTANDclock='1')THEN-- A cada flanc de pujada del rellotge del sistemainp_dly<=inp;inp<=InSignal;ENDIF;ENDPROCESS;ENDlogic;