Entities and architectures Kapittel 3
VHDL program Én fil
Entities and architectures Entity declaration og architecture body Analogi til en IC: Entiteten beskriver interfacet til omgivelsen (pakkens tilkoblingspinner) Arkitekturen beskriver entitetens funksjonalitet (kretsens interne logikk)
Template - Entitet/Arkitektur entity model_name is port ( list of inputs and outputs ); end model_name; Samme navn som fila, f.eks test.vhd architecture architecture_name of model_name is begin... VHDL concurrent statements... end architecture_name ; concurrent = samtidig
Et enkelt eksempel; komparator -- eqcomp4 is a four bit equality comparator entity eqcomp4 is port (a, b : in std_logic_vector(3 downto 0); equals: out std_logic); end eqcomp4; MSB [a(3) a(2) a(1) a(0)] [b(3) b(2) b(1) b(0)] architecture dataflow of eqcomp4 is begin equals <= '1' when (a = b) else '0'; end dataflow; <= settes lik
Entitet deklarasjon; 4 bits adder
Ports Hvert I/O-signal i en entity declaration blir referert til som port, analogt til en pinne i et skjema eller en pinne på en IC (integrert krets) Sett av porter definert for en entity er referert til som port declaration Hver port som deklareres må ha navn, retning (mode) og data type navn mode type
Navn Første del av deklarasjonen er navnet Lovlige navn kan settes sammen av a b c.z 0 1..9 _ (underscore) med følgende begrensing alltid start med bokstav siste karakter bokstav eller tall 2 underscore etter hverandre ikke tillatt ingen forskjell på små og store bokstaver TcK = tck
Retning (mode) In - flyt inn i entity Out - flyt ut av entity, ikke feedback Buffer - flyt ut av entity, feedback tillatt Inout - for bidireksjonale signaler
Data typer boolean, bit, bit_vector og integer er typer for syntese fra IEEE 1076/93 IEEE std_logic_1164 med blant annet std_logic, std_logic_vector, std_ulogic, std_ulogic_vector Må gjøres synlig med library og use
Architecture bodies Hver architecture body er assosiert til en entity declaration architecture body viser hvordan konstruksjonen virker VHDL tillater å skrive i forskjellige stiler: Behavioral (oppførselsbeskrivelse) Dataflow Structural description Kombinasjon av disse
Kode-stiler: Structural description Dataflow Dataflow Behavioral (Bruke den kodestilen som passer best!)
NB! Forskjeller HW og SW I software utføres operasjoner i sekvens I hardware utføres operasjoner i parallell (samtidig) Derfor kan vi IKKE kode hardware som vi koder software!
Behavioral (I) Høy-nivå beskrivelse 1 library ieee; 2 use ieee.std_logic_1164.all; 3 entity eqcomp4 is port( 4 a, b: in std_logic_vector(3 downto 0); 5 equals: out std_logic); 6 end eqcomp4; 7 8 architecture behavioral of eqcomp4 is 9 begin 10 comp: process (a, b) 11 begin 12 if a = b then 13 equals <= '1'; 14 else 15 equals <= '0'; 16 end if; 17 end process comp; 18 end behavioral; Sensitivitetsliste Sekvensielle statements
Behavioral (II), annen skrivemåte 1 architecture behavioral of eqcomp4 is 2 begin 3 comp: process (a, b) 4 begin 5 equals <= '0'; Default verdi 6 if a = b then 7 equals <= '1'; 8 end if; 9 end process comp; 10 end behavioral; NB! Signalene settes rett før prosessen terminerer Rekkefølgen på statement er viktig! Bare siste tilordning av samme signal har virkning!
Dataflow (I) Bruker ikke process! 1 -- eqcomp4 is a four bit equality comparator 2 library ieee; 3 use ieee.std_logic_1164.all; 4 entity eqcomp4 is port( 5 a, b: in std_logic_vector(3 downto 0); 6 equals: out std_logic); 7 end eqcomp4; 8 9 architecture dataflow of eqcomp4 is 8 begin 9 equals <= '1' when (a = b) else '0'; 10 end dataflow when - else
Dataflow (II) library ieee; use ieee.std_logic_1164.all; entity eqcomp4 is port( a, b: in std_logic_vector(3 downto 0); equals: out std_logic); end eqcomp4; architecture bool of eqcomp4 is begin equals <= not(a(0) xor b(0)) and not(a(1) xor b(1)) and not(a(2) xor b(2)) and not(a(3) xor b(3)); end bool; Boolske likninger Unødvendig tungvinn måte å beskrive en komparator på!
Structural descriptions - Hierarkisk beskrivelse Består av en VHDL nettliste, som sier hvordan komponentene skal kobles sammen. Når en entitet brukes inne i en annen entitet, kalles den er komponent; eksempler her er xnor2 og and4 Entitet deklarasjonen og arkitetkur body for xnor2 og and4 finnes i en egen fil Sier hvordan komponentene skal kobles sammen
Structural descriptions Tungvinn måte å lage en komparatoren på! Store design derimot må man dele opp i håndterbare delkomponenter! Gjør at hver delkomponent kan simuleres og verifiseres individuellt Skjematisk representasjon av VHDL koden på forrige side
Sammenligning av architectural beskrivelser Hvordan avviker resultatet etter syntese og fitting for en designbeskrivelse fra en annen? Ulike designbeskrivelser (spesielt for komplekse design) kan resultere i ulik resursbruk i den programmerbare logikken fordi: Hvordan koden optimaliseres avhenger av synteseverktøyet (se fig. 3.6) Noen synteseverktøy utnytter kretsen interne arkitektur bedre enn andre Fitting / place and route verktøyet gjør kanskje ikke optimale valg med tanke på å utnytte kretsens ressurser. Ulike designbeskrivelser kan altså produsere forskjellige, men funksjonelt ekvivalente, kretsimplementasjoner!
Fremgangsmåte for å tifredsstille desingkravene Behavioral og dataflow (med when-else eller with-select-when) den enkleste og raskeste måte å beskrive et design på. Hvis du etter syntese av behavioral koden tilfredsstiller ytelseskravene, er du ferdig! Hvis ikke, prøv med direktiver til synteseverktøyet for å optimalisere koden. Hjelper ikke dette heller, ta i bruk kretsprodusent-spesifikke bibliotekkomponenter for å optimalisere kritiske deler av designet. Men, dette gjør at VHDL-koden ikke lenger er teknologiuavhengig!
Utførsel av process Prosessen utføres når et av signalene i sensitivitetslista har en endring i verdi (en event). Da utføres de sekvensielle signaltilordningene suksessivt. Prosessen fortsetter til siste signaltilordning er utført, og terminerer seg selv. Signalene oppdateres rett før prosessen terminerer! Prosessen utføres ikke igjen før et av signalene i sensitivitetslista på nytt har en event. process (sensitivitetsliste) < deklarasjoner> begin <signal tilordning1>.. <signal tilordning n> end process;
Modeller for syntese versus modeller for simulering; utførelse av process Ingen sensitivitetsliste Syntese Simulering Ignoreres vanligvis av synteseverktøyet
Ufullstendige sensitivitetslister Riktig skrivemåte! Simulering av proc4 og proc5 gir forskjelling resultat! Ved simulering av proc5 utføres ikke prosessen selv om c endrer verdi Synteseverktøyet vil gjøre et av to: Alltid bruke en sensitivitetsliste som inneholder alle signaler til høyre for signaltilordningen (<=). Det gir samme implementasjon av proc4 og proc5 Gi en feilmelding om at syntese ikke er mulig p.g.a mangler i sensitivitetslista Sørg for å skrive koden slik at simulering og syntese gir samme resultat!
Timing av signaler
Simuleringssyklus feil oppførsel Initialverdi: x <= 0 og a_bus <= 00000000 Et signal oppdateres rett før prosessen terminerer! Det er bare siste signaltilordning som har effekt!
Flere drivere av samme signal For å beregne en verdi av y kreves en resolution funksjon. Mer om dette senere X = ubestemt
Busser Resolution funksjoner brukes på simulering av busser Nyttig at simulatoren kan indikere en ubestem verdi X hvis to/flere entiteter driver bussen samtidig med motsatte logiske nivåer. To entiteter kan ikke drive bussen samtidig! Mens en entitet driver bussen, må de andre entiteten være i en three-state (høy impedans) tilstand! Ingen mening med udefinert verdi X i syntese! y <= X
Metalogiske verdier i brukt i syntese Don t care : - High impedanse value: Z Don t care brukt for å redusere logikken: Gir redusert logikk NB! Simulatoren tolker - som en verdi, mens synteseverktøyet tolker - som et wild card som kan representere 0 eller 1 Bruk av høy-impedans verdi:
Identifiers (Navn) Identifiers settes sammen av a b c.z 0 1..9 _ (underscore) med følgende begrensing kan ikke bruke VHDL reserverte ord alltid start med bokstav siste karakter bokstav eller tall 2 underscore etter hverandre ikke tillatt ingen forskjell på små og store bokstaver
Eksempler Identiske skrivemåter Eksempler på tillate Identifiers Ulovelige navn:
Data objects Constants - øker lesbarheten til koden constant width: integer := 8; Signals en forbindelseslinje eller et minneelement signal count: std_logic_vector (3 downto 0); Variables syntese av variable ikke veldefinert variable result: std_logic := 0 ; Files Aliases ikke et nytt objekt
Mer om signaler og variable Signaler: Signaltilordning: <= Initialverdier tilordnet signaler har ikke mening for syntese (vil ikke nødvendigvis matche power-on tilstanden til minneelementet) signal count: std_logic_vector (3 downto 0) : = 0101 ; Variable: Kan brukes i prosesser, funksjoner og prosedyrer I simulering brukes de for høy-nivå modellering I syntese brukes de som indeksvariable og midlertidig lagring av data. Variabeltilordning: : = Variabletilordning er øyeblikkelig ( i motsetning til signaltilordning i en process) FY!
Signal
Eksempel på bruk av Variable
scalar og composite 4 kategorier scalar Data typer Enumeration - mye brukt i tilstandsmaskiner type states is (idle, preamble, data, jam, nosfd, error); integer variable a: integer range 0 to 255 Physical - tid eneste predefinerte type, ikke brukt i syntese ns, us, ms osv Floating - som regel ikke støttet i syntese 2 kategorier composite array types - flere elemeter av samme type record types - flere elementer av ulik type
Array 2-dimensjonale arrayer nyttig til å lage tabeller
Datatypen std_logic 1164 Ikke støttet i syntese Three-state Subtypen std_logic er resolved std_ulogic (verdier på drivere som er koblet sammen bestemt av en resolution table
Types og subtypes Subtype kan brukes for å lage deltyper (undertyper) av allerede definerte typer Eksempel: subtype std_logic is resolved std_ulogic;
Attributes event attribute: clk'event and clk = '1 range attribut variable a: integer range 0 to 255
Kode med noen vanlige feil entity many_errors is port --line 1 a: bit_vector(3 to 0); --line 2 b: out std_logic_vector(3 downto 0); --line 3 c: in bit_vector(5 downto 0);) --line 4 end many_errors --line 5 line 6 architecture not_so_good of many_errors --line 7 begin --line 8 my_label: process --line 9 begin --line 10 if c = x"f" then --line 11 b <= a --line 12 else --line 13 b <= '0101'; --line 14 end if --line 15 end process; --line 16 end not_so_good --line 17
Uten feil library ieee; use ieee.std_logic_1164.all; entity many_errors is port ( --line 1 a: in std_logic_ vector(3downto 0); --line 2 b: out std_logic_vector(3 downto 0); --line 3 c: in bit_vector(5 downto 0)); --line 4 end many_errors; --line 5 --line 6 architecture not_so_good of many_errors is --line 7 begin --line 8 my_label: process(c, a) --line 9 begin --line 10 if c = 001111 then --line 11 b <= a; --line 12 else --line 13 b <= 0101 ; --line 14 end if; --line 15 end process; --line 16 end not_so_good; --line 17