Digitalteknik Programmerbara kretsar och VHDL Oscar Gustafsson Institutionen för systemteknik 2 Dagens föreläsning • Programmerbar logik – CPLD – FPGA • Hårdvarubeskrivande språk – VHDL • Syntesflödet 3 Programmerbar logik • Istället för att koppla ihop grindar alternativt konstruera egna integrerade kretsar så finns det kretsar vars funktion kan programmeras • Programmable logic device (PLD) • Olika tekniker har använts genom åren – Vi har sett att PROM kan användas för godtycklig funktion – Idag används primärt CPLD eller FPGA 2015-10-02 PROM-baserad PLD • En godtycklig funktion med N insignaler kan realiseras med ett PROM + Enkelt då det bara är att fylla funktionstabellen + Flera utsignaler kan genereras från samma insignaler – Storleken växer snabbt med antal insignaler (2𝑁 ord) – Ingen möjlighet att dela resurser eller anpassa om en utsignal beror på färre insignaler 4 2015-10-02 CPLD - Complex Programmable Logic Device • Grundblocket i en CPLD är oftast en uppsättning av ORgrindar vars ingångar är kopplade till AND-grindar • Ingångarna till ANDgrindarna är programmerbara • Kallas Programmable Logic Array (PLA) 5 2015-10-02 CPLD - Complex Programmable Logic Device • PLA-blocken kan sedan kopplas samman med in- och utgångar och varandra • Kan realisera SP-funktioner med ett begränsat antal ingångar 6 Titel/föreläsare CPLDn på labben (Xilinx XC9536) • Två 36V18-block – 18 utsignaler från 36 insignaler – Switchmatris för att koppla ihop in- och utgångar samt in- och utsignaler till/från blocken – Bild från datablad 2015-10-02 7 Titel/föreläsare CPLDn på labben (Xilinx XC9536) 2015-10-02 8 2015-10-02 FPGA - Field-Programmable Gate Array • En FPGA liknar en CPLD, men det grundläggande byggblocket är ett annat • FPGAn använder ROM (Look-Up Table, LUT) • Ofta 4, 5 eller 6 ingångar 9 2015-10-02 FPGA - Field-Programmable Gate Array • En FPGA har ofta andra byggblock som kan kopplas in – Stora minnen – Multiplikatorer – Logik för att snabba på minnessiffra (carry) vid addition 10 2015-10-02 Hårdvarubeskrivande språk • För att programmera kretsar så används hårdvarubeskrivande språk – Dvs vi ska beskriva hårdvaran, inte skriva ett program • Vanligast språken är VHDL och Verilog – Vi kommer att använda VHDL 11 2015-10-02 VHDL • Ett byggblock i VHDL består av två delar: entity och architecture • Entity beskriver in- och utgångar • Architecture beskriver funktionen – Man kan vilja ha olika architecture för samma entity, t ex, prova olika varianter att lösa samma problem 12 2015-10-02 VHDL – entity • Entityn beskriver in- och utgångar till blocket • Exempel på entity för en tvåingångars NAND-grind entity mynandgate is port ( a, b: in std_logic; c: out std_logic); end mynandgate; 13 2015-10-02 VHDL – entity entity mynandgate is port ( a, b: in std_logic; c: out std_logic); end mynandgate; • a, b och c är signalnamn • in/out definierar om det är en in- eller utsignal • std_logic är signaltypen • mynandgate är namnet på byggblocket 14 2015-10-02 VHDL – signaltyper • Från vår entity a, b: in std_logic; • Typen std_logic definieras i ett paket som måste importeras för att kunna användas (det finns nästan inga typer definierade i VHDL) • Detta anges först i filen med raderna library ieee; use ieee.std_logic_1164.all; 15 2015-10-02 VHDL – architecture • Architecture beskriver funktionen för en entity • Enligt vårt tidigare exempel: architecture firsttry of mynandgate is begin c <= not(a and b); end firsttry; • firsttry är namnet på vår architecture 16 2015-10-02 VHDL – komplett exempel: mynandgate.vhdl -- så här kan vi skriva kommentarer library ieee; use ieee.std_logic_1164.all; entity mynandgate is port ( a, b: in std_logic; c: out std_logic); end mynandgate; architecture firsttry of mynandgate is begin c <= not(a and b); end firsttry; 17 2015-10-02 VHDL – signaler • Om vi vill kan vi definiera upp andra signaler som bara används inom en architecture architecture secondtry of mynandgate is signal ab: std_logic; begin c <= not(ab); ab <= a and b; end secondtry; • VHDL beskriver hårdvara, så alla tilldelningar sker parallellt, alltså fungerar ovanstående 18 2015-10-02 VHDL – signaltyper • Vi kan även skapa vektorer av värden, t ex fyra bitar enligt a, b: in std_logic_vector(3 downto 0); • Enstaka värden kan accessas/tilldelas som c <= a(2); d(3) <= b(1) or e; • Man kan göra operationer på hela vektorn (f måste också vara en std_logic_vector med fyra bitar) f <= a and b; 19 2015-10-02 VHDL – processer • Ibland vill vi dock göra saker i ordning och vid specifika tillfällen, t ex en d-vippa går inte att skriva som en logisk funktion • För detta använder VHDL processer process(clk) begin if rising_edge(clk) then q <= d; end if; end process; 20 2015-10-02 VHDL – processer Den här processen ska köras om signalen clk ändras process(clk) begin • Om vi får en stigande flank på signalen clk så if rising_edge(clk) then • Tilldela q värdet på d q <= d; end if; end process; • 21 2015-10-02 VHDL – komplett exempel: mydflipflop.vhdl library ieee; use ieee.std_logic_1164.all; entity mydflipflop is Port( d, clk: in std_logic; q: out std_logic); end mydflipflop; architecture perfect of mydflipflop is begin process(clk) begin if rising_edge(clk) then q <= d; end if; end process; end perfect; 22 2015-10-02 VHDL – mer om processer • Det finns ett antal konsekvenser av processer som kan vara överraskande • Själva signaltilldelningen sker när processen är färdig och använder sista värdet som tilldelades q <= ’1’; q <= d; • Fungerar utmärkt i en process (men är dålig kod) medan det utanför en process skulle ge fel då vi försöker driva samma signal från två källor q <= d; qprim <= not(q); • Kommer inte ge det resultat som man förväntar sig om det står i en process då q inte uppdateras förrän processen är färdig 23 2015-10-02 VHDL – bra rutiner • För att undvika problem så rekommenderas i dagsläget: – Använd bara processer för att generera d-vippor process(clk) ... q1 <= q1plus; ... end process; – Skapa all logik utanför processer q1plus <= xin and (q2 or q1); q2plus <= xin when q1 = ’1’ else q2; yout <= q1 nor q2; 24 2015-10-02 Från kod till krets • Instruktioner för hur man syntetiserar koden för att det ska gå att programmera kretsen finns i labbkompendiet • Grovt sett är det tre steg som sker, där principerna är desamma oavsett vilken typ av krets man använder – Översätt koden till logiska uttryck – Realisera de logiska uttrycken med byggblocken som finns – Placera ut byggblocken och lista ut hur de ska kopplas ihop 25 2015-10-02 Översätt kod till logiska uttryck • Koden tolkas och sanningstabeller skapas • Logiska ekvationer skapas och minimeras • Karnaughdiagram fungerar bra för människor, men för datorer finns det andra algoritmer – Quine-McCluskey är en variant av Karnaughdiagram, men i algoritmform – Espresso används av i princip alla verktyg • Grinddelning kan tas hänsyn till • Svårt problem om man har många in- och utgångar 26 2015-10-02 27 Översätt kod till logiska uttryck • Resultatet beskrivs ofta vara RTL-nivå (register transfer level), dvs, det beskriver de logiska uttrycken som funktion av registervärden • Går att se hur vektyget tolkat din kod, dvs, vilka grindar/uttryck den använt 2015-10-02 28 Realisera logiska uttryck • Beroende på krets vill vi dela upp uttrycken på olika sätt – För en CPLD vill vi ha uttryck på SP-form, men har ett begränsat antal termer till AND- repsektive OR-grindarna – För en FPGA vill vi ha uttryck med t ex fyra insignaler – I labbarna vill vi ha uttryck med de grindar vi får använda 2015-10-02 Realisera logiska uttryck • Dessa vill vi dela upp så att så få resurser används och att det samtidigt inte blir för många byggblock efter varandra • Kallas technology mapping • För CPLD-fallet i labben är det relativt enkelt så länge vi inte har fler produkttermer än maximalt • Efter detta steg har vi en viss idé om det går att realisera vår funktion på den krets vi tänkt och hur fort det kan tänkas gå 29 2015-10-02 Realisera logiska uttryck – FPGA-exempel • Hur ska man dela? 30 2015-10-02 Realisera logiska uttryck – FPGA-exempel • Alternativt 31 2015-10-02 Placera ut och koppla ihop • Sedan tidigare har vi ett nät med byggblock • I detta steg (place-and-route) placeras byggblocken ut och kopplas ihop • Det är mycket möjligt att det inte finns en möjlig ihopkoppling (routing) även om vi inte använder alla byggblock • Hastigheten påverkas av ihopkopplingen • In- och utpinnar tilldelas (eller bestäms av oss själva) 32 2015-10-02 33 Programmera kretsen • Olika teknologier använder olika typer av minne för att spara konfigurationen • Den CPLD ni använder i labben har ett flashminne som avgör vilka termer som används av AND-grindarna, hur switchen är kopplad samt vilka pinnar som är in- och utgångar • FPGA är oftast baserade på SRAM så dessa måste programmeras vid uppstart • Finns även kretsar med ”säkringar” som bränns av vid programmering och kan bara programmeras en gång 2015-10-02 Programmera kretsen • På labben kommer ni att använda en specifik dator för att programmera kretsarna • Se till att kretsen är rättvänd i sockeln! – Annars bränner ni er när ni plockar ut den och behöver be assistenten om en ny hel... 34 Ett komplett VHDL-exempel till: enpulsare 2015-10-02 library ieee; use ieee.std_logic_1164.all; entity enpulsare is port(clk, x : in std_logic; u : out std_logic); end enpulsare; architecture ekvationer of enpulsare is signal q, q_plus : std_logic; begin process(clk) begin if rising_edge(clk) then q <= q_plus; end if; end process; q_plus <= x; -- q+ = f(q,x) u <= (not q) and x; -- u = g(q,x) end ekvationer; 35 2015-10-02 VHDL – with ... select • Lite av poängen med VHDL är ju trots allt att slippa göra Karnaugh-diagram själv och skriva in de Booleska ekvationerna • Ett sätt att beskriva sanningstabeller är med with ... select där vi tilldelar en signal ett givet värde beroende på en annan signal 36 2015-10-02 VHDL – with ... select signal a: std_logic_vector(1 downto 0); signal b: std_logic_vector(3 downto 0); begin ... with a select b <= "1000" when "00", "0100" when "01", "0010" when "10", "0001" when others; ... end ...; 37
© Copyright 2024