Chalmers ekniska Högskola Institutionen för Data- och Informationsteknik EDA 321 Digitalteknik syntes 2011-2012 Laboration 2 - VHDL 1. Enkelt sekvensnät 2. Trafikräknare i VHDL 3. Syntes av VHDL-kod Namn Personnummer Godkänd Handledare Datum Förberedelser: Se sid 13 120102 LABPM2.v8 1
1 Enkelt sekvensnät Ofta arbetar man med pulser som är ett klockpulsintervall långa. Dessa används t ex för att starta en aktivitet eller t ex för att styra en räknares enable-ingång så att räknaren ökas med ett enbart när pulsen finns. Konstruera i VHDL en krets som lägger ut en etta på utgången under ett klockpulsintervall efter insignalen gått hög och en annan utsignal under ett klockpulsintervall när insignalen gått låg. Insignalen kallas levin och utsignalerna kallas pulson respektive pulsoff.. S0 S1 S2 S3 S0. Tidsdiagrammet kan delas in i 4 tillstånd, S0 S3. och en tillståndsgraf blir då Denna kan kodas i VHDL på många olika sätt. Man göra konstruktionen i en enda process eller, t ex en process som sköter övergång till nästa tillstånd och en annan process som bestämmer utsignaler och nästa tillstånd. Aktuellt tillstånd är state och nextstate anger nästa tillstånd. Processen P0 är klockad och används för att byta tillstånd. Vid varje positiv klockpulsflank tilldelas state ett nytt värde. 2
P0: PROCESS (CLK) BEGIN IF CLK='1' AND CLK'event THEN IF Reset='1' THEN state <= s0; ELSE state <= nextstate; END IF; END IF; END PROCESS; Processen P1 är kombinatorisk och aktiveras i simulering när någon av state eller levin ändras. Den genererar utsignalerna pulson och pulsoff. En template för processen är: P1: PROCESS (state,levin) BEGIN CASE state IS WHEN S0 => Komplettera här >>>>>>>>> WHEN OTHERS => END CASE; END PROCESS; Ett blockschema blir: 3
1.1 Kodning verifiering Komplettera med deklarationer, case-sats och skriv in hela VHDL-koden i filen lev2puls.vhd. Simulera med do-filen -- lev2puls.do -- 111223 restart f nowave view signals wave add wave clk levin reset pulsoff pulson state nextstate force clk 0 0, 1 50ns -repeat 100ns force reset 1 0, 0 80ns force levin 0 0, 1 325, 0 800 run 1000 och verifiera tidsdiagrammet. Notera att nextstate sätts i processen P1 när insignalen levin ändras eller när man byter tillstånd i processen P0. I processen P0 tilldelas state nytt värde från nextstate vid varje positiv flank på clk. Eftersom state har förändrats, ger processen P1 pulson och pulsoff nya värden. 2 Konstruktion av trafikräknare Trafikräknaren skall räkna antalet personbilar, lastbilar och lastbilar med släp som passerar en fotocell fc. Gående, cyklister etc påverkar ej fotocellen. Alla fordon har samma hastighet och man kan bestämma typen av fordon genom att räkna klockpulser under den tid fotocellen är skymd. Personbil Lastbil Lastbil med släp 3 4 klockpulser 7 12 klockpulser 7 12 klockpulser, en puls mellan bil och släp, samt därefter 3 5 pulser. Mellan varje fordon är det minst 2 klockpulser. Insignalerna är klocka, fotocell och reset för initiering. Signalen från fotocellen är 1 om fotocellen är skymd. Utgångarna från räknaren är antalet personbilar, lastbilar samt lastbilar med släp. 4
Konstruktionen skall kunna räkna ett mindre antal foron, max 15 st av varje. Do-fil för testning finns nedan. I do-filen används följande signalnamn: clk, reset, fc, (pb, lb och lbs). Reset är aktiv hög. 2.1 Tillvägagångssätt Uppgiften kan delas upp i två delar: - En detektor som känner igen mönstret från personbil, lastbil och lastbil med släp - Räknare som lagrar antalet fordon av olika typ. Dessa skall kunna ökas med ett när ingången count enable är hög. Den funktionella specifikationen ovan anger att de enda typer av fordon som förekommer är personbil, lastbil och lastbil med skäp och de har de angivna pulstågen. Konstruktionen anses uppfylla specifikationen om angivna fordonstyper detekteras och räknas korrekt. 2.2 Personbilsdetektor En tillståndsgraf för att detektera 3-4 förekomster av fc=1 följt av fc=0, dvs en personbilsdetektor, visas nedan. Vid reset ligger man i tillståndet start. Vid första förekomsten av fc=1 går man till tillstånd fc1 o s v. Konstruktionen förutsätter att indata alltid är korrekta, dvs enstaka pulser på fc förekommer ej. I tillståndet pbfound har man detekterat pulståget från en personbil och då skall utsignalen pbs vara hög. I alla övriga tillstånd är pbs låg. 5
I tillståndet pbfound sätts signalen pbs till 1 för att markera förekomsten av personbil. I alla övriga tillstånd är pbs 0. Koda tillståndsgrafen i VHDL i filen trafik0.vhd, simulera med följande do-fil och verifiera funktionen. -- trafik0.do -- 111223 restart f nowave view signals wave add wave clk reset fc pbs force clk 0 0, 1 50ns -repeat 100ns force reset 1 0, 0 80ns force fc 0 0, 1 110, 0 410, 1 610, 0 1010 run 1200 2.3 Komplettering för lastbil och lastbil med släp Utgå från tillståndsgrafen ovan och komplettera för lastbil och lastbil med släp. Förutsätt att indata alltid är korrekta, dvs fc uppfyller alltid specifikationerna för de olika fordonen, d v s ett släp är ALLTID 3, 4 eller 5 klockpulser långt. Denna förutsättning förenklar tillståndsgrafen avsevärt. 6
2.4 Tillståndsgraf för fordonsdetektor Detektorn skall ha 3 utsignaler för de olika fordonstyperna. Signalerna kallas pbs,lbs och lbss. Koda i VHDL i filen detektor.vhd 2.5 Simulering Simulera koden med nedanstående do-fil Studera signalerna i Wave-fönstret. # trafik.do # Do-file for vehicle detector # restart -f nowave view signals wave add wave clk reset fc pbs,lbs,lbss force clk 0 0, 1 50ns -repeat 100 force reset 1 0, 0 125ns force fc 0 0 run 205ns run 1200ns force fc 1, 0 800ns, 1 900ns, 0 1400ns +släp run 1700ns force fc 1, 0 400ns run 800ns run 1200ns 7
run 1500ns run 600ns force fc 1, 0 800ns, 1 900ns, 0 1400ns +släp run 1700ns force fc 1, 0 400ns run 700ns run 1200ns force fc 1, 0 800ns, 1 900ns, 0 1400ns +släp run 1700ns run 600ns run 1200ns run 1200ns run 600ns force fc 1, 0 800ns, 1 900ns, 0 1400ns +släp run 1700ns run 1200ns run 1500ns Kontrollera att detektorn fungerar på avsett sätt 2.6 Komplettering med räknare Konstruera en binärräknare utgående från tidigare uppgifter. Använd 3 st räknare för de olika fordonstyperna. En komplett trafikräknare kan nu byggas med en detektor och tre räknare. Koda trafikräknaren i VHDL med användande av komponenterna ovan. Filnamn skall vara trafik.vhd och entiteten skall se ut enligt ENTITY trafik IS PORT(clk,reset,fc:IN STD_LOGIC; pbc,lbc,lbsc:out STD_LOGIC_VECTOR(3 DOWNTO 0)); END trafik; Simulera med do-filen trafik.do och kontrollera funktionen. 2.7 Blockschema Ett blockschema för en liknande trafikräknare med samma funktion visas nedan. Schemat har genererats från VHDL-kod av ett syntesprogram. I schemat ser 8
man tydligt tre räknare, återkopplade med ett nät som ökar räknarna med ett, samt sekvensnätet som styr funktionen. 3. Syntes med Synplify Pro Programmet SynplifyPro kan syntetisera VHDL-kod till olika typer av FPGA:er (Field Progammable Gate Array) och CPLD:er. (Complex Programmable Logic Device). 3.1 Starta programmet Starta med symbolen på desktopen licenser, så välj den som är mest tillgänglig och sedan nytt projekt: välj Open Project > New Project.. När det kommer en fråga om.skapa ett Syntes sker alltid till en viss typ av krets eftersom alla FPGA:er och CPLD:er är uppbyggda på olika sätt. Ange typ av målkrets genom att klicka på Implementation Options, välj fliken Device och ange följande för Xilinx CPLD 9
eller för Xilinx FPGA Lägg till filen lev2puls.vhd med Add File. (Om det är flera filer, skall top-filen läggas in sist. ) Markera filen och kör run > Resynthesize all Anm. Även om koden tidigare har gått bra att simulera, är det inte säkert att den går att syntetisera. Vanligtvis är koden syntetiserbar, men man kan stöta på problem här. Om det kommer varningar, titta i log-filen. Klicka på i toolbaren. Då visas ett syntesresultat. Det kan se ut så här: Det går att gå lite djupare med knappen i toolbaren: 10
För en CPLD får man Dvs huvudsakligen grindar, AND, OR, och XOR. Vid implementering i kretsen kopplas AND-OR grindnäten så att logiska funktionen erhålles. I slutet av logfilen I Resource Usage Report anges använda resurser: Mapping to part: xc9572xlpc44-5 Simple gate primitives: AND2 6 uses AND2B1 1 use FD 2 uses OR2 1 use XOR2 2 uses För FPGA:n Spartan6 får man FPGA:n består av LUT:ar (Lookup Tables) innehållande multiplexrar. Dessa konfigureras till önskad funktion. I slutet av log-filen står använda LUT:ar Mapping to part: xc6slx16csg225-2 Cell usage: FD 2 uses GND 1 use VCC 1 use LUT3 2 uses LUT4 2 uses 11
3.2 Exempel fulladder.vhd Använd filen fulladder.vhd från tidigare lab. Skapa ett nytt projekt och addera filen. Titta på syntesen till CPLD och FPGA. 3.3 Exempel count4b.vhd Skapa nytt projekt och addera count4b.vhd från lab 1. Symbolen innehåll. Använd i FPGA. är en krets som adderar värdet av count enable till registrets för att undersöka hur denna implementeras i en CPLD och CPLD:. FPGA:. 3.4 Syntes av trafikräknaren Skapa nytt projekt och lägg till filerna för trafikräknaren. Syntetisera. Titta i log-filen. Det mest intressanta står i slutet på logfilen, nämligen olika typer av vippor etc som använts, samt den plats som konstruktionen tar upp uttryckt i antalet LUT:ar (Look Up Table). Dessa uppgifter återfinnes under Resource Usage Report. 12
4. Redovisning Demonstrera trafikräknaren för handledaren. Inlämning av VHDL-kod för trafikräknaren. Skriv namn och personnummer som kommentarer överst i vhdl-filen. Lägg denna och slutet av log-filen (Resource Usage Report) i ett email och skicka till syntes.cse@chalmers.se. Ange LAB2 som subject i mailet. 5. Förberedelser Alla labuppgifter kan utföras i förväg och enbart redovisas vid labtillfället. Programmet Questa finns på Chalmers Linuxsystem och startas med vsim. Programmet SynplifyPro finns på linux i datasalar och även på remote.chalmers.se Skriv tcsh s ource /chalmer s/sw/sup/mgcdvt/synplify/setup och starta sedan med synplify_pro 6. Inlämningsuppgift Glöm ej veckans inlämäningsuppgift. 13