Chalmers Tekniska Högskola Institutionen för Data- och Informationsteknik EDA 321 Digitalteknik syntes 2011-2012 Laboration 1 - VHDL 1. EDA-verktyg 2. QuestaSim 3. Kombinatoriska nät 4. Sekvensnät Namn Personnummer Godkänd Handledare Datum Förberedelser: Se sid 16 120105 LABPM1.v9 1
Målsättning - introduktion i till utvecklingsverktyget QuestaSim - repetition av byggblock - konstruktion av kombinatoriska nät i VHDL - simulering - konstruktion av enkel räknare 1. Introduktion till EDA-verktyg Det finns ett stort antal verktyg för elektronikkonstruktion, Electronic Design Automation (EDA). De stora programvaruhusen Cadence, Mentor, Synopsys har verktyg för allt från kisel- till fodonsektronikkonstruktion. Dessutom har många tillverkare av programmerbara kretsar, CPLD, FPGA etc, egna eller inköpta verktyg för att tillgodose behovet hos sina kunder. Alla verktyg är uppbyggda att arbeta med projekt. Ett projekt består av filer för konstruktion av ett system eller av en avgränsad del av ett system. Projektets undermappar och filer hanteras av en project manager som använder ett eget filsystem för detta. Därför: Flytta eller döp aldrig om filer manuellt som tillhör ett projekt utan använd i stället verktygets funktioner för kopiering och arkivering. De flesta verktyg är av gammalt ursprung och har utvecklats sedan årtionden. Det finns kvar delar där filnamn och variabelnamn ej tål svenska tecken, specialtecken, ej får börja/sluta på en siffra etc. Likaså får sökvägar ej vara för långa, det blir svårigheter med mellanslag i namn etc. Använd därför ej för många tecken i filnamn/variabelnamn och begränsa till enbart bokstäverna a-z och siffror. Lägg ej projekt eller filer på skrivbordet utan på C:\temp. 2. QuestaSim Detta är ett verktyg för att simulera en beskrivning av digital elektronik. Beskrivningen är gjord i ett hårdvarubeskrivande språk såsom VHDL (System C, Verilog etc). QuestaSIm är en variant av ModelSim som tillverkas av Modeltech, http://www.model.com. ett dotterbolag till Mentor Graphics. En studentversion av Questa finns på http://www.mentor.com/company/higher_ed/index.cfm. Questa ingår även i ISE WebPac från http://www.xilinx.com/support/download/index.htm 2
Även Altera erbjuder en gratisversion https://www.altera.com/support/software/download/sof-download_center.html På http://www.model.com finns demo om simulering i ModelSim. 2.1 Starta Questa Skapa först en mapp för filerna. Tänk på att ej har för långa sökvägar. Alla EDAprogram använder stora mängder filer och om projektets filer ligger på en server tar alla operationer längre tid. Placera mappen i C:\Temp. Starta Questa från skrivbordet med. Under Help finns omfattande (!) dokumentation i HTML- och pdf-format. Questa öppnar ett enda stort fönster med delfönster: Till vänster ett Workspace, nedan Transcript-fönstret och vid behov en arbetsyta till höger. Varje delfönster kan lyftas ut (undock) med och sedan lyftas in igen med (dock). Detta är mycket användbart när man har tillgång till flera skärmar. 3
2.2 Skapa ett projekt Ange directory och projektnamn, t ex Default library är alltid work. Inställningarana i Modelsim skall kopieras. 2.3 Halvadderare i VHDL Halvadderaren har två ingångar x och y samt två utgångar s för summa och cut för carry ut. Ange booleska uttrycken för s och cut och rita ett schema med grindar. s= cut=.. Skriv s och cut i VHDL. s <= cut <= 4
2.4 Skapa VHDL-fil (halfadd.vhd) Välj File > New source > VHDL I arbetsytan finns nu ett radnummer. Skriv in VHDL-koden samt spara filen som halfadd.vhd. -- halfadd.vhd -- 111220 name of author LIBRARY ieee; USE IEEE.STD_LOGIC_1164.ALL; ENTITY halfadd IS PORT (x: IN STD_LOGIC; y: IN ST_LOGIC; s: OUT STD_LOGIC; cut:out STD_LOGIC); END halfadd; ARCHITECTURE comb OF halfadd IS BEGIN END comb; Här skall egen kod för s och cut läggas till och komplettera koden ovan med uttrycken för cut och s. VHDL är inte casesensitive. Spara filen som halfadd.vhd. 5
För att Questa skall kunna komma åt filen, måste den adderas till projektet med I Workspace-fönstret under Project-fliken finns nu en fil halfadd.vhd. Under Project-fliken i Transcriptfönstret visas de filer som tillhör projektet. Frågetecknet för filen halfadd.vhd anger att den ej är kompilerad. 2.5 Kompilera Högerklicka på filen i Workspace och välj Compile > Compile selected. eller använd i Toolbar. En felskrift finns nu i transcript-fönstret. Dubbelklicka på felraden så kommer en kryptisk ledtråd: 6
Ofta kan enkla syntaxfel generera många följdfel och därmed många felutskrifter. Rätta därför alltid felen i ordning och kompilera om. Korrigera i halfadd.vhd och tänk på att stänga filen med. När kompileringen gått igenom kommer meddelande i Transcriptfönstret: # Compile of halfadd.vhd was successful. 2.6 Simulering I Workspacefönstret under fliken Library finns nu den kompilerade filen i biblioteket work. Där finns en entitet halfadd och en architecture comb. Högerklicka på entiteten halfadd och välj simulate. Anm. Altenativt välj Start simulation. och sedan i biblioteket Work entiteten halfadd i fönstret Välj sedan View Wave för att lägga till wave-fönstret. Kopiera med musen variablerna i Object-fönstret till vänstra delen av Wavefönstret. (Alternativt skriv i Transcriptfönstret add wave x y s cut.) I början är alla signaler odefinierade, och värdet betecknas med U. Simulering styrs med kommandon i Transcript-fönstret. Nedanstående sekvens återstartar simulatorn, sätter x och y till 0 samt kör i 100 ns. Simuleringen startar alltid från nuvarande tidpunkt. Kommandona force x 1 run 100 följt av force y 1 run 100 7
force x 0 run 100 ger följande signalformer i wave-fönstret: Förändringar i utsignalerna sker omedelbart när insignalen ändras. Vänsterklicka för att få fram den gula markören. Det går att förstora/förminska med +/- Halvadderaren förefaller fungera. Anm. När man arbetar med vektorer kan det vara praktiskt att ändra radix på signalerna. Detta gör genom att markera signalnamnen i message-fönstreet och välja radix till något annat än Binary. 2.7 Simulering med do-fil För att automatisera simuleringarna är det lämpligt att lägga simuleringskommandona i en egen fil, en do-fil. Kommandon i filen exekveras när man skriver do dofilnamn i Transcriptfönstret. 8
Skapa en do-fil och skriv in (eller gör copy-paste) nedanstående -- halfadd.do -- datum namn restart -f force x 0 force y 0 run 100 force x 1 run 100 force y 1 run 100 force x 0 run 100 Spara filen som halfadd.do. Välj Wave-fliken samt simulera med kommandot do halfadd.do. Wave-fönstret raderas och simuleringen körs. Observera att filen halfadd.do ej syns under projektfliken i workspace-fönstret. Filen ligger i rätt bibliotek, men tillhör ej projektet. Högerklicka i workspace och välj Add to project Existing file. Filen syns nu under project-fliken. 2.8 Simuleringskommandon Signaler sätts med f o r c e a 1, om a är deklarerad som STD_LOGIC. En STD_LOGIC_VECTOR aa sätts med force aa 0000 om vektorn består av 4 bitar. En bit i en vektor kan sättas med force aa(2) 1. En STD_INTEGER sätts med f o r c e a a a 3 4. 9
En signal kan sättas till olika värden vid olika tidpunkter. Signalen a sätts till 1 efter 200 ns med force a 1 200ns Flera tidpunkter kan anges på samma rad force aa 0000 0, 0001 200ns, 0010 400 ns Repetetiva förlopp, t ex en klocksignal, genereras med force clk 1 50ns, 0 100ns repeat 100ns clk är här odefinierad mellan 0 och 50ns och visas röd i wave-fönstret, sätts till 1 efter 50 ns, till 0 efter 100 ns. Förloppet upprepas var 100:e ns. Mera korrekt är att skriva force clk 0 0, 1 50ns, 0 100ns -repeat 100ns När man skall gå igenom många olika fall, i detta exempel 4 olika kombinationer på x och y, kan man använda repetitiva förlopp för att generera x och y. Modifiera do-filen till -- halfadd.do -- datum namn restart -f force x 0 0, 1 100 -repeat 200 force y 0 0, 1 200 -repeat 400 run 400 och exekvera denna. En ytterligare effektivisering är att i do-filen lägga till signalerna man vill titta på i stället för att göra copy-paste enligt tidigare. -- halfadd.do -- datum namn restart -f -nowave view signals wave add wave x y s cut force x 0 0, 1 100 -repeat 200.. Det är nu tillräckligt att starta simuleringen och enbart köra do-filen 10
3. Laborationsuppgifter kombinatoriska nät 3.1 Att koda kombinatoriska nät i VHDL Ett kombinatoriskt nät kan realiseras med grindar och skrivas i VHDL med AND, OR-operatorer. I språket finns även andra möjligheter som tydligare beskriver funktionen hos nätet. I parallella delen med en WITH-SELECT-sats WITH addata SELECT freq <= "11" WHEN x"ff", "10" WHEN x"7f", "01" WHEN x"3f", "01" WHEN x"03", "10" WHEN x"01", "11" WHEN x"00", "00" WHEN OTHERS; Notationen x FF anger hexadecimala värdet FF I parallella delen med en WHEN-ELSE-sats freq <= "11" WHEN addata = x"ff" ELSE "10" WHEN addata = x"7f" ELSE "01" WHEN addata = x"3f" ELSE "01" WHEN addata = x"03" ELSE "10" WHEN addata = x"01" ELSE "00"; I sekventiella delen med en CASE-sats: process(addata) begin case addata is when X"FF" => freq <= X"3"; when X"7F" => freq <= X"2"; etc when others; end case; end process; 11
I sekventiellla delen med en (flera) if-(then-else)-satser: process(addata) begin freq <= 00 if addata = X FF then freq <= X 3 ; else.. end if; end process; Halvadderaren tidigare kan skrivas som t ex process (x,y) begin xy <= x & y; case xy is when 00 => s <= 0 ; c <= 0 ; when 11 => s <= 0 ; c <= 1 ; when others => s <= 1 ; c <= 0 ; end case; end process; 3.2 Uppgifter kombinatoriska nät Konstruera VHDL-koden för samtliga komponenter nedan. Beskrivningar över komponenterna återfinns i kursboken och på nätet. Använd vektorer där så är angivet i uppgifterna. Låt alltid entitet, filnamn och dofil ha samma namn. Tänk på att ej använda Windows för att byta namn på filer utan använd Questa, gör copy öppna ny fil samt paste för att återanvända delar av gamla filer. Simulera genom att använda en do-fil. Använd samma projekt som tidigare och lägg alla filer i en och samma mapp. Kodningen skall ske utan att använda AND- eller OR-grindar. Respektive komponent skall beskrivas med vad den gör, inte hur den kan vara implementerad. VHDL-kod blir i det närmaste oläslig nar man uttrycker i grindar. 3.3 Heladderare Entiten skall vara ENTITY fulladd IS PORT (a,b,cin: IN STD_LOGIC; s,cut: OUT STD_LOGIC); END fulladd; 12
Heladderarens funktion (uppträdande, behavior) är att addera 3 bitar och bilda en summabit och carrybit ut. Ett exempel på läslig kod är temp <= 0 &a + 0 &b + 0 &c där elementen i vektorn temp anger carry ut och summabit. När man syntetiserar till en CPLD, Complex Progammable Device, så implementeras koden som ett grindnät med AND-OR-grindar. När man syntetiserar till en FPGA, Field Programmble Gate Array, implementeras koden som multiplexrar. För att jämföra VHDL-kod med de booleska uttrycken, ange dessa för s och cut på minimal disjunktiv form. s =.... cut =.... 3.4 1-bits komparator Komponenten skall jämföra två bitar a och b samt sätta en av tre utsignaler till ett, övriga till noll. ENTITY comp1 IS PORT(a,b: IN STD_LOGIC; agtb,altb,aeqb: OUT STD_LOGIC); END comp1; 3.5 Prioritetsavkodare 4 2 Beskrivning finns i kusboken. ENTITY encoder42 IS PORT (a: IN STD_LOGIC_VECTOR(3 DOWNTO 0); f: OUT STD_LOGIC_VECTOR(1 DOWNTO 0); z: OUT STD_LOGIC); END encoder42; z = 0 om samtliga ingångar a(i) = 0. Ledning: Använd when else 3.6 Decoder 3-8 ENTITY decoder38 IS PORT(s: IN STD_LOGIC_VECTOR(2 DOWNTO 0); en: IN STD_LOGIC; sut: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); END decoder38; 13
3.7 Multiplexer 4 1 ENTITY MUX41 is PORT(inp IN: STD_LOGIC_VECTOR(2 DOWNTO 0); val: IN STD_LOGIC_VECTOR(1 DOWNTO 0); f: OUT sdt_logic); END mux41; 3.8 Realisering av logiska funktioner med multiplexer Multiplexrar är det huvudsakliga byggblocket i en FPGA. Med en 8-1 multiplexer kan man uttrycka varje funktion av 4 variabler, en 4-1 alla funktioner med 5 variabler. Koden för en 2-1 multiplexer är f <= inp(1) WHEN val = 1 ELSE inp(0); Uttryck AND, OR och XOR-funktionerna med 2-1 multiplexrer och lämpliga inverteringar. Skriv all kod i samma fil ENTITY mgates is PORT(a,b: IN STD_LOGIC; mand,mor,mxor: OUT std_logic); END gates; 3.9 4-bits adderare (adder4b.vhd) ENTITY adder4b IS PORT(a,b: IN STD_LOGIC_VECTOR(3 DOWNTO 0); cin: IN STD_LOGIC; s: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); END adder4; Bygg upp denna med 4 st 1-bits heladderare (fulladd.vhd) enligt kursboken. Använd COMPONENT. PACKAGE behöver ej användas. 3.10 4-bitars BCD-adderare ENTITY adder4d IS PORT( a,b,cin: IN STD_LOGIC_VECTOR(3 DOWNTO 0); s: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); cut: OUT STD_LOGIC); END adder4d; 3.11 4-bitars comparator Detta är en utvidgning av tidigare uppgift till att arbeta med vektorer om 4 bitar. Ingångar a(3:0) och b(3:0) utgångar agtb, aeqb och altb (agtb = 1 anger att a > b). I std-logic biblioteket finns operatorerna = < och > som kan arbeta på vektorer. Prova med olika bibliotek, unsigned, signed. 14
4. Laborationsuppgifter - sekvensnät 4.1 D-vippa Skriv i VHDL-kod (filnamn fde1.vhd) en D-vippa med synkron reset. Reset skall vara aktiv hög. Vippan skall ha en clock enable -ingång en så att vippans utgång q sätts till d enbart när en är hög. Ingångar är clk, reset, d, en och utgången q. ENTITY fde1 IS PORT (clk,reset,d: IN STD_LOGIC; q: OUT STD_LOGIC); END fde1; Skriv en do-fil fde1.do som testar funktionen. 4.2 Binärräknare En binärräknare består av ett register samt ett kombinoriskt nät som adderar ett till insignalen. Här är d och q av typen std_logic_vector. d <= q + 1; PROCESS (clk) BEGIN IF clk event and clk = 1 then q <= d; END; END process; Q anger här räknarens aktuella värde och d anger värdet räknaren får efter nästa klockpuls Synkron reset innebär att registret sätt till noll vid nästa klockpuls, dvs vi skall lägga nollor på registrets D-ingångar D <= 0 WHEN reset = 1 ELSE Q+1 Count enable, ce, innebär att räknaren skall öka med ett för varje klockpuls D <= 0 WHEN reset = 1 ELSE Q + 1 WHEN ce = 1 ELSE q; Denna rad kan skrivas i en process: PROCESS(reset,ce,q) BEGIN IF reset = 1 THEN d <= (OTHERS => 0 ); ELSE IF ce = 1 THEN q = d + 1; ELSE q <= d; END IF; END IF; END PROCESS; 15
Denna kombinatoriska process, tillsammans med den klockade ovan utgör en 4-bitars binärärknare. Konstruera i VHDL en 4-bitars synkron uppräknare (filnamn count4b.vhd) med synkron reset. Reset är aktiv hög. Räknaren skall vara försedd med en count enable - ingång ce och skall räkna enbart då denna är hög. ENTITY count4b IS PORT (clk,reset,ce: IN STD_LOGIC; count: OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END count4b; Ofta vill man koppla flera räknare i serie så att när en räknare står på 1111 och dess count enable (ce) är ett, så skall utsigalen ceo, som är ansluen till nästa räknares ce-ingång, vara ett. Modifiera koden och lägg till ceo. Simulera. I kursboken skriver man räknare i en enda klockad process. Tag någon av dessa och komplettera med signalen ceo. Simulera. 5. Redovisning Demonstrera simulering av några uppgifter i avsnitt 3 och 4 för en handledare. Kopiera över alla dina.vhdl- och.do-filer till ditt hemmabibliotek och ta bort dem från c:\temp. 6.Förberedelser Kodning och ev schema till alla uppgifterna i avsnitt 3 och 4. I kursboken Brown, Vranesic: Fundamentals of Digital Logic with VHDL Design, finns ledning till hur man löser samtliga uppgifter. Det finns även ett stort antal web-platser som publicerar VHDL-kod för olika tillämpningar. Hela labben kan utföras i förväg och enbart redovisas vid labtillfället. 7. Inlämningsuppgift Glöm ej veckans inlämningsuppgift! 16