Kombinatorisk og synkron logikk Kapittel 4
Eksempel; FIFO First-In-First-Out Eksempelet i boka er en noe redusert fifo (mangler empty flag, full flag osv.), men har de viktigste elementene Denne FIFOen har plass til 8 ord med en bredde på 9 bit
FIFO (I) library ieee; use ieee.std_logic_1164.all; use work.std_arith.all; For å kunne bruke std_logic og std_logic_vector For å kunne addere integer til std_logic_vector (fra Warp) entity fifo8x9 is port( clk, rst: in std_logic; rd, wr, rdinc, wrinc: in std_logic; rdptrclr, wrptrclr: in std_logic; data_in: in std_logic_vector(8 downto 0); data_out: out std_logic_vector(8 downto 0)); end fifo8x9;
architecture archfifo8x9 of fifo8x9 is type fifo_array is array(7 downto 0) of std_logic_vector(8 downto 0); signal fifo: fifo_array; signal wrptr, rdptr: std_logic_vector(2 downto 0); signal en: std_logic_vector(7 downto 0); signal dmuxout: std_logic_vector(8 downto 0); Deklarasjoner begin -- fifo register array: reg_array: process (rst, clk) begin if rst = '1' then for i in 7 downto 0 loop fifo(i) <= (others => '0'); end loop; elsif (clk'event and clk = '1') then if wr = '1' then for i in 7 downto 0 loop if en(i) = '1' then fifo(i) <= data_in; else fifo(i) <= fifo(i); end if; end loop; end if; end if; Setter alle bit til logisk verdi 0 Beholder verdien; ikke nødvendig å ha med! end process; Fifo(II)
-- read pointer read_count: process (rst, clk) begin if rst = '1' then rdptr <= (others => '0'); elsif (clk'event and clk='1') then if rdptrclr = '1' then rdptr <= (others => '0'); elsif rdinc = '1' then rdptr <= rdptr + 1; end if; end if; end process; -- write pointer write_count: process (rst, clk) begin if rst = '1' then wrptr <= (others => '0'); elsif (clk'event and clk='1') then if wrptrclr = '1' then wrptr <= (others => '0'); elsif wrinc = '1' then wrptr <= wrptr + 1; end if; end if; end process; Øker read-pointer med én Fifo (III) Øker write-pointer med én
-- FIFO register selector decoder with wrptr select en <= "00000001" when "000", "00000010" when "001", "00000100" when "010", "00001000" when "011", "00010000" when "100", "00100000" when "101", "01000000" when "110", "10000000" when others; -- 8:1 output data mux with rdptr select dmuxout <= fifo(0) when "000", fifo(1) when "001", fifo(2) when "010", fifo(3) when "011", fifo(4) when "100", fifo(5) when "101", fifo(6) when "110", fifo(7) when others; Dataflow Fifo (IV) For alle andre mulige kombinasjoner (husk at std_logic har 9 mulige verdier!) Behavioral -- three-state control of outputs three_state: process (rd, dmuxout) begin if rd = '1' then data_out <= dmuxout; else data_out <= (others => 'Z'); end if; end process; end archfifo8x9;
Kombinatorisk logikk Kombinatorisk logikk lages av logiske porter (f.eks. nand), hvor output kun bestemmes av nåværende input (ikke hukommelse!) Beskrives i behavioral, dataflow og structural statements I eksemplet med fifo finner vi behavioral beskrivelse med sekvensiell if-then-else i en process. dataflow beskrivelse med concurrent with-select-when uten process-beskrivelse.
Structural description Dataflow Dataflow Behavioral
Bruk av concurrent statements concurrent statements brukes utenfor process Utføres concurrently = samtidig Rekkefølgen på concurrent statements vilkårlig Brukes i dataflow og structural descriptions 3 hovedtyper concurrent statements i dataflow beskrivelser boolske ligninger with-select-when when-else
Bruk av boolske ligninger Multiplekser
Bruk av boolske ligninger (II) Passer bra å bruke boolske likninger her!
Logiske operatorer and, or, not, nand, nor, xor og xnor er predefinert for typene bit og boolean IEEE 1164 bruker disse operatorene i std_ulogic og std_logic Logiske operatorer har IKKE presedens i VHDL, derfor kreves det parenteser i multilevel logikk A + B C ok i boolsk algebra p.g.a presedens X <= A or B and C gir feilmelding i VHDL kompilatoren A + (B C) Rett skrivemåte i VHDL (A + B) C Presedens i boolsk algebra: () not and or +
with-select-when NB! Alle verdier av selection_signal må listes opp med when, og de må være mutually exclusive Eksempel 4 til 1 multiplekser s er av type std_logic, som har 9 mulige verdier. Gir totalt 81 mulige verdier ved simulering. (for syntese er 11 eneste meningsfulle verdi)
when-else NB! signal_name tilordnes verdien til første condition som er sann. Dvs. innebygd prioritet. Eksempel 4 til 1 multiplekser
j tilordnes verdien w når a er satt høy, selv om b, c og/eller d også er satt høy(e). Dvs. a har prioritet over b, c og d
Relasjonsoperatorer Likhet : = Ulikhet : /= Størrelsesoperatore: < <= > >= Arrayer bare like hvis de har lik lengde og hvert element i begge arrayer er like Resultatet av relasjonsoperatore er boolsk (true/false) Eksempel: signal a : std_logic_vector(7 downto 0). if a = 3 then Vil gi feilmelding, fordi a er std_logic, mens 3 er en integer
Overloaded operators Operator overloading vil si å definere samme operator for forskjellige datatyper eller blanding av datatyper. Pakken numeric_std i IEEE1076.3 definerer overloading av = operatoren for typene signed og integer, og unsigned og natural Pakken std_arith i Cypress biblioteket inneholder for oss de viktigste overload operatorene mellom std_logic og integer. ( +, -, >, <, = operatorene) Bruk pakkene for operator overloading gitt av leverandøren av synteseverktøyet Må bruke use for å gjøre pakkene synlige use work.numeric_std.all; use work.std_arith.all;
Overloaded operators, eksempel Overload tillater deg å bruke flere typer i et uttrykk
Bruk av komponenter i et hierarkisk design Spesifiserer koblingen av komponenter og signaler i designet Gjøres med port map(), som kan koble på to ulike måter navn posisjon Når output fra en komponent skal kobles til input på en annen komponent, må det skje via en intern signallinje!
Sekvensielle statements if-then-else Brukes i prosesser, funksjoner og prosedyrer NB! Rekkefølgen på signaltilordninger har betydning for hvordan logikken syntetiseres Funksjonelt identiske prosesser
Sekvensielle statements & prosesser Kombinatorisk logikk krever at alle signaler/ signalnavn må være med i sensitivitetslista! Hvis et design har flere prosesser, utføres disse i parallell (samtidig) og samtidig med andre concurrent statements i arkitekturen! Inne i prosessen derimot, er signaltilordningen sekvensiell
Generell syntaks med flere conditions Eksempel - multiplekser
Adressedekoder 0001 0001 0100 0010 0100 0100 1000 1000 0000 0000 Hexadesimal verdi case-when Binær verdi