Digitalteknik Programmerbara kretsar och VHDL

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