Høgskolen i Østfold Avd. for Ingeniørfag Elektronikk
Digitalteknikk og mikroelektronikk
Grunnleggende FPGA utvikling med
VHDL BRUK AV REGISTRE 1. Introduksjon I denne oppgaven skal du konstruere t system der et 8-bits ord leses av fra 8 skyvebrytere og lastes inn i et parallell-inn/serie-ut register. Det 8-bits ordet kan skiftes ut fra dette registeret og inn i et nytt register – et serie-inn/parallell-ut register. Herfra kan ordet lastes over i et parallell-inn/parallell-ut register. Utgangene fra dette registeret er koblet til 8 lysdioder. Et blokkskjema for systemet er vist nedenfor.
24.11.2008
1
Høgskolen i Østfold Avd. for Ingeniørfag Elektronikk
Digitalteknikk og mikroelektronikk
Konstruksjonen skal baseres på VHDL-beskrivelse og Spartan-3 Starter Board. Teorien for oppgaven finnes i kapittel 9 i Floyd (10. ed.) I denne oppgaven eksisterer de 3 skiftregistrene som ferdig konstruerte komponenter. Din oppgave blir å konstruere toppnivåbeskrivelsen register.vhd. Et skall for denne filen finner du som vedlegg til oppgaven. I blokkskjemaet er det ikke vist at utgangene på de to registrene til høyre også er koblet til 7-segment-displayet slik: serie-inn / parallell-ut (bit 7-4) hex-siffer 3 serie-inn / parallell-ut (bit 3-0) hex-siffer 2 parallell-inn / parallell-ut (bit 7-4) hex-siffer 1 parallell-inn / parallell-ut (bit 3-0) hex-siffer 0 Blokkskjemaet viser heller ikke at 50M-klokken skal kobles til klokkeinngangene på alle registre. Som i tidligere oppgaver, må vi jukse litt og simulere klokkesignalet med ce (clock enable) inngangene. Grunnen til dette er at bryterne på Spartankortet gir prell, og derfor ikke kan benyttes som klokkesignaler direkte. Komponentdeklarasjonene for de 3 registrene er gitt som følger: component PISO8 is Port ( clk50 : in STD_LOGIC; ce : in STD_LOGIC; load : in STD_LOGIC; shift : in STD_LOGIC; D7, D6, D5, D4, D3, D2, D1, D0 : in STD_LOGIC; Sout : out STD_LOGIC); end component; component SIPO8 is Port ( clk50 : in STD_LOGIC; ce : in STD_LOGIC; shift : in STD_LOGIC; Sin : in STD_LOGIC; Q7, Q6, Q5, Q4, Q3, Q2, Q1, Q0: out STD_LOGIC); end component; component PIPO8 is Port ( clk50 : in STD_LOGIC; ce : in STD_LOGIC; load : in STD_LOGIC; D7, D6, D5, D4, D3, D2, D1, D0 : in STD_LOGIC; Q7, Q6, Q5, Q4, Q3, Q2, Q1, Q0: out STD_LOGIC); end component;
24.11.2008
2
Høgskolen i Østfold Avd. for Ingeniørfag Elektronikk
Digitalteknikk og mikroelektronikk
Load-inngangene må aktiveres sammen med ce for at parallelle data skal lastes inn i registeret. Shift-inngangene må aktiveres sammen med ce for at registrene skal skifte serielt. I denne oppgaven skiftes innholdet i registrene mot høyre – dvs. mot mindre signifikante bitposisjoner.
2. Bygg prosjektet Prosjektet settes opp som du kjenner til fra tidligere oppgaver; Opprett først en prosjektmappe på PC-en der du kan bygge konstruksjonen din. Det forutsettes videre i denne teksten at denne plasseringen er C:\XLX\register. Pakk ut alle filene fra den vedlagte ZIP-filen til denne mappen. En ny mappe build opprettes også. Mappestrukturen skal nå være: C:\XLX\register: Inneholder VHDL-filene, UCF-filen og TCL-filen for dette prosjektet. C:\XLX\register\build\: Inneholder bare en dummy-fil. Filene som opprettes når prosjektet bygges, vil plasseres i denne mappen. Start programmet ”Project Navigator”. Velg først FILE > CLOSE PROJECT hvis et prosjekt allerede er aktivt ved oppstart. Klikk på fanen Tcl Shell i Transcript-vinduet. Gå først til mappen der du har pakket ut VHDL-filene: % cd /XLS/register Her står XLS for mappen med VHDL-filene. Sett inn navnet på den aktuelle mappen for ditt oppsett. Gå deretter til mappen build for dette prosjektet: % cd build … og skriv inn kommandoen: % source ../create_register.tcl Prosjektet bygges nå opp med nødvendige filer, slik at du får en grei start på oppgaven.
24.11.2008
3
Høgskolen i Østfold Avd. for Ingeniørfag Elektronikk
Digitalteknikk og mikroelektronikk
3. Konstruksjon Konstruer registersystemet som forklart ovenfor. Alle komponentene du trenger er inkludert i prosjektet. Det er bare å starte å skrive VHDL-kode. Det er i første rekke strukturell VHDL-kode som du vil benytte. Sjekk syntaks. Bygg nå prosjektet, last det ned til SPARTAN-3 Starter Board og start uttestingen av systemet i følge oppgavene nedenfor.
4. Uttesting I uttestingen av systemet skal du: laste inn et 8-bits dataord fra skyvebryterne til PISO-register overføre dataordet serielt fra PISO til SIPO. overføre dataordet fra SIPO til PIPO, slik at det kan leses av op lysdiodene. For å kunne observere hva som skjer har du også tilgjengelig statusinformasjon på 7-segment displayet, som forklart tidligere.
4.1.
Oppgave 1
Lag en punktvis skriftlig beskrivelse av hvordan systemet skal opereres for å få til det ønskede resultatet. Vær så konsis som mulig, men få med de nødvendige detaljer. Dvs. hvor mange pulser skal genereres, hvilke knapper skal opereres, skal noen av knappene opereres samtidig - etc.
4.2.
Oppgave 2
Sett opp en plan for å teste ut systemet. Angi for eksempel hvilke tabeller du vil sette opp. Test ut systemet og fyll inn i tabellene. Sjekk samsvar med oppgave 1 og kommenter dette.
24.11.2008
4
Høgskolen i Østfold Avd. for Ingeniørfag Elektronikk
Digitalteknikk og mikroelektronikk
register.vhd (ufullstendig) library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity reg is Port ( clk50 : in STD_LOGIC; BTN0, BTN1, BTN2, BTN3 : STD_LOGIC; SW0, SW1, SW2, SW3, SW4, SW5, SW6, SW7: in std_logic; LD0, LD1, LD2, LD3, LD4, LD5, LD6, LD7: out std_logic; AN0, AN1, AN2, AN3: out STD_LOGIC; -- Driver anodene i display segA, segB, segC, segD, segE, segF, segG, segDP: out STD_LOGIC); end reg; architecture Behavioral of reg is component SIPO8 is Port ( clk50 : in STD_LOGIC; ce : in STD_LOGIC; shift : in STD_LOGIC; Sin : in STD_LOGIC; Q7, Q6, Q5, Q4, Q3, Q2, Q1, Q0: out end component; component PISO8 is Port ( clk50 : in STD_LOGIC; ce : in STD_LOGIC; load : in STD_LOGIC; shift : in STD_LOGIC; D7, D6, D5, D4, D3, D2, D1, D0 : in Sout : out STD_LOGIC); end component;
STD_LOGIC);
STD_LOGIC;
component PIPO8 is Port ( clk50 : in STD_LOGIC; ce : in STD_LOGIC; load : in STD_LOGIC; D7, D6, D5, D4, D3, D2, D1, D0 : in STD_LOGIC; Q7, Q6, Q5, Q4, Q3, Q2, Q1, Q0 : out STD_LOGIC); end component; component in_block is port ( clk: in std_logic; rst: in std_logic; en_h :out std_logic; en_t :out std_logic; en_s: out std_logic; en_k: out std_logic;
24.11.2008
5
Høgskolen i Østfold Avd. for Ingeniørfag Elektronikk
Digitalteknikk og mikroelektronikk
as0, as1, as2, as3: in std_logic; pu0, pu1, pu2, pu3: out std_logic); end component; component disp7seg is Port ( SysClk : in std_logic; input0 : in std_logic_vector(3 downto 0); input1 : in std_logic_vector(3 downto 0); input2 : in std_logic_vector(3 downto 0); input3 : in std_logic_vector(3 downto 0); AN0 : out std_logic; AN1 : out std_logic; AN2 : out std_logic; AN3 : out std_logic; output : out std_logic_vector(7 downto 0)); end component disp7seg; signal ce, load1, load2, shift: STD_LOGIC; signal PIPO7, PIPO6, PIPO5, PIPO4, PIPO3, PIPO2, PIPO1, PIPO0: STD_LOGIC; signal SIPO7, SIPO6, SIPO5, SIPO4, SIPO3, SIPO2, SIPO1, SIPO0: STD_LOGIC; signal D0, D1, D2, D3, D4, D5, D6, D7: STD_LOGIC; signal digit0, digit1, digit2, digit3: std_logic_vector(3 downto 0); signal seven_seg: std_logic_vector(7 downto 0); -- --------------------------------------------------------------------- Deklarer interne signaler du vil trenge her: -- -------------------------------------------------------------------begin -- --------------------------------------------------------------------- Skriv VHDL-kode her: -- --------------------------------------------------------------------
-- --------------------------------------------------------------------- Synkronisering av inputsignaler -- -------------------------------------------------------------------synk: in_block port map (clk50, '0', open, open, open, open, BTN3, BTN2, BTN1, BTN0, load1, shift, load2, ce);
etc …
24.11.2008
6
Høgskolen i Østfold Avd. for Ingeniørfag Elektronikk
Digitalteknikk og mikroelektronikk
register.ucf #Hovedklokke NET "clk50" TNM_NET = "clk"; TIMESPEC "TS_clk" = PERIOD "clk" 20 ns HIGH 50 %; NET "clk50" LOC = "T9"; #Skyvebrytere NET "SW0" LOC NET "SW1" LOC NET "SW2" LOC NET "SW3" LOC NET "SW4" LOC NET "SW5" LOC NET "SW6" LOC NET "SW7" LOC
= = = = = = = =
"F12"; "G12"; "H14"; "H13"; "J14"; "J13"; "K14"; "K13";
#Trykkbrytere NET "BTN0" LOC NET "BTN1" LOC NET "BTN2" LOC NET "BTN3" LOC
= = = =
#Utganger NET "LD7" NET "LD6" NET "LD5" NET "LD4" NET "LD3" NET "LD2" NET "LD1" NET "LD0"
"P11"; "P12"; "N12"; "P13"; "N14"; "L12"; "P14"; "K12";
LOC LOC LOC LOC LOC LOC LOC LOC
= = = = = = = =
#SW0 #SW1 #SW2 #SW3 #SW4 #SW5 #SW6 #SW7
"M13"; "M14"; "L13"; "L14";
#BTN0 #BTN1 #BTN2 #BTN3
#LD7 #LD6 #LD5 #LD4 #LD3 #LD2 #LD1 #LD0
#Anode for 7-seg display NET "AN0" LOC = "D14"; # NET "AN1" LOC = "G14"; # NET "AN2" LOC = "F14"; # NET "AN3" LOC = "E13"; # #Data for 7-seg NET "segA" LOC NET "segB" LOC NET "segC" LOC NET "segD" LOC NET "segE" LOC NET "segF" LOC NET "segG" LOC NET "segDP" LOC
24.11.2008
display = "E14"; = "G13"; = "N15"; = "P15"; = "R16"; = "F13"; = "N16"; = "P16";
7