Fys 3270/4270 høsten 2004 Laboppgave 2: Grunnleggende VHDL programmering. Styring av testkortets IO enheter.
Innledning. Målet med denne laboppgaven er at dere skal lære å lage enkle hardware beskrivelser i VHDL, samt å lage testbencher for å simulere disse. Øvingen er delt opp i ett antall deloppgaver med stigende vanskelighetsgrad. For hver deloppgave skal du følge samme design flyt som i laboppgave 1, med to viktige tillegg: 1. Du skal selv lage VHDL kode. 2. Du skal selv lage VHDL testbench for VHDL simulering. Framgangsmåte ved VHDL koding. Arbeidet med å lage en hardware beskrivelse i VHDL, kan deles inn i tre hovedmomenter: Danne seg en korrekt bilde av problemstillingen. Les oppgave teksten nøye. Studer kretsskjemaet til testkortet og databladene til inngående komponenter. Tegn et forenklet blokkskjema over testkortet hvor bare de elementene som skal benyttes er tatt med Strukturere en løsning. Den konstruksjonen du skal implementere i CPLD en har et ytre grensesnitt mot de andre komponentene på testkortet, og en indre struktur. Det ytre grensesnittet, i form av innsignaler og utsignaler, tilsvarer entity deklarasjonen i en VHDL beskrivelse. Den indre strukturen tilsvarer VHDL beskrivelsens architecture del. Det er ofte hensiktsmessig å dele opp den indre strukturen i en dataveistruktur og en kontrollstruktur. Dataveistrukturen inneholder elementer som registre, addere, multipleksere som er sammenkoblet med databusser. Denne strukturen er velegnet til å beskrives i blokkskjema. Hvis strukturen er kompleks, lønner det seg å dele den opp i mindre blokker Kontrollogikkens innsignaler og utsignaler kan beskrives i blokkskjema sammen med dataveistrukturen. Den indre oppbyggingen beskrives bedre i form av: sannhetstabeller, boolske ligninger og tilstandsdiagrammer. Deler av arbeidet med å strukturere konstruksjonen kan med fordel utføres ved å bruke muligheten å skrive kommentarer i VHDL kildefilen. Kode den strukturerte løsningen i VHDL Med utgangspunkt i en veldokumentert struktur skal det normalt være en grei jobb å lage en fungerende kode. Testbench for VHDL simulering., Det sentrale spørsmålet ved utformingen av testbench'en er hvilke testvektorer man må generere for å få en fullstendig simulering av kretsens oppførsel. Avhengig av kretsens kompleksitet kan dette vare en meget enkel eller meget vanskelig oppgave. 2
I mange tilfeller er det lurt å ta utgangspunkt i en tabell med alle relevante innsignal kombinasjoner og forventede utsignal verdier. Rapport. For deloppgave skal dere levere : VHDL kildefil. VHDL testbench Plot fra Post-Jedec timing simulering der dette er mulig, ellers plot fra funksjonell simulering. Kortfattede kommentarer til simuleringsresultatene. 3
Oppgave 1. f e a g d b c dec a b c d e f g dec Alle segmentene i hvert 7- segment har felles anode. Et enables ved å åpne PMOS transistor ved en lav gatespenning, Seg7en(i) <= 0 ;. Da får den felles anoden positiv (5V) spenning. Et enkelt segment vil da lyse dersom katoden får en lav spenning. Seg7en(i) i=3,2,1,0 Vcc(5V) Lag en simuleringsmodell av displayene. ene er en såpass sentral modul på testkortet at det kan være hensiktsmessig å ha en egen simuleringsmodell for disse. Tallene skal vises hexadesimalt, og når et segment er slukket skal modellen vise Z (høyimpedant tilstand) for dette segmentet. Dersom flere segmenter er enablet samtidig skal modellen vise X (unknown). Modellen kan legges inn som en komponent i testbencher i senere oppgaver. ene kan modelleres enklest ved å kombinere alle segmentene og transistorer som styrer hvert enkelt segment i et entitet/arkitektur par. Modellen skal være rent funksjonell uten noen tidsforsinkelser. Innsignaler: a,b,c,d,e,f,g, (som kan være samlet i en vektor), og seg7en(3 downto 0). Vi ser bort fra dioden som kan vise desimalpunktum. Utsignaler: seg3(3 downto 0), seg2(3 downto 0), seg1(3 downto 0), seg0(3 downto 0). Veiledning: Lag en sannhetstabell for et segment. La tabellen være utgangspunkt for din VHDL-kode. Oppgave 2. Lag et lite VHDL program, som implementerer en kombinatorisk funksjon mellom Hex rotary switch S1 og 7_segment_0, slik at displayet viser verdien til S1 hexadesimalt. 4
Veiledning: Lag en tabell som viser tilstanden til hvert enkelt segment for samtlige verdier til S1 switchen. NB! Husk å enable (disable de andre segmentene) ved å styre SEG7EN signalene. Oppgave 3. Lag et VHDL program, som implementerer en kombinatorisk funksjon mellom følgende delar av testkortet: Hex rotary switcher S1 og S2. Trykknappene S3, S4 og S5. To av displayene. Den kombinatoriske funksjonen skal implementeres etter følgende sannhetstabell: Inputs Outputs S3 S5 S4 7-seg 1 7-seg 0 Reset Inp2 Inp1 0 X X Av Av 1 0 0 Av Av 1 0 1 S2* Av 1 1 0 Av S1* 1 1 1 Av Av *Det er den hexadesimale verdien av S2 og S1 som skal vises på ene. Veiledning: Lag et blokkskjema som viser dataveiene fra trykknapper og rotary switcher til displayene. Bruk dette blokkskjemaet for å lage VHDL koden. Oppgave 4. I denne oppgaven skal dere modifisere kontrollen av displayene fra oppgave 3, slik at to av ene er aktive samtidig. Dette er mulig få til ved å lage en løkke konstruksjon som aktiverer de 2 displayene i sekvens, og der frekvensen til løkken er tilstrekkelig høy til at de 2 displayene lyser samtidig. En slik løkke kan implementeres ved hjelp av en teller. De forskjellige displayene skal vise følgende verdier: _1: Verdien av rotary switch S2. _0: Verdien av rotary switch S1. Veiledning: Lag et blokkskjema som viser dataveiene fra S1 og S2 til displayene. Hvordan skal telleren brukes? Hvor mange bits må telleren ha? 5
Oppgave 5. Utvid oppgave 4 til å bli en entitet med fire s datakilder: Data0, Data1, Data2 og Data3, og der verdien fra kildene skal vises samtidig på de fire ene. Inputs: Clk, Reset, Data0(3 downto 0), Data1(3 downto 0), Data2(3 downto 0), Data3(3 downto 0) Outputs: a,b,c,d,e,f og g og Seg7en(3 downto 0) Denne entiten skal kun simuleres, men skal gjenbrukes i oppgaver senere der den skal inngå som en byggekloss. Oppgave 6 1 (Frivillig). Benytt entiteten fra deloppgave 5 der vi henter datakildene fra: 1. Data0: Register med samplet verdi av S1. Skal vises på 7-seg 3 2. Data1: Register med samplet verdi av S2. Skal vises på 7-seg 2 3. Data2: Register med samplet verdi av en s teller (tellera). Skal vises på 7-seg 1 4. Data3: Register med samplet verdi av en s teller (teller B). Skal vises på 7-seg 0 Teller A og teller B skal være free running og klokkes av 10 MHz oscillatoren. Samplingen skal utføres hver gang trykknapp S4 blir trykket inn. Observer at det skal bare samples en gang uansett hvor lenge knappen holdes nedtrykt! Samplingen skal implementeres ved hjelp av en enkel tilstandsmaskin (state machine). Veiledning: Lag et blokkskjema som viser dataveiene Samplingen skal utføres ved å generere en clock enable puls til de fire sample registerene Hvor lang skal sample pulsen være? Hvor mange tilstander må tilstandsmaskinen ha? 1 Dersom man får problemer i oppgave 6 les kommentarer bakerst i oppgave teksten. 6
Kommentar til laboppgave 2: Multiplexing av displayene kan realiseres på mange måter. Det viser seg å være problematisk å få implementert en fornuftig løsning i CPLD en. Dette henger sammen med to ting: 1. Låste pinnenummer 2. Delte produktermer mellom makroceller. Dette er avhengig av arkitekturen til CPLD en. Figuren under viser en implementasjon som er maskimal sløsing av ressurer i CPLD en, ja, i hvilken som helst arkitektur. s kilder 4-1 mux () Vi har fire sett med binær til funksjoner. Hver og en av disse tar enormt mye plass. (Prøv å se på ligningene i rapportfil og tell opp antall produkttermer som skal til for å dekode hvert segment så får dere en idè om dette) Videre så multiplekses disse mot segmentene og da må dere benytte en 7-bits 4-1 multiplexer. Dette er også unødvendig ressurskrevende. En mye mere effektiv løsning er å først multiplekse s kildene for deretter å dekode utgangene fra multipleksereren. 7
4 bit 4-1 mux (4 bit) s kilder Resultat: En binær til funksjon og en enklere multplexer og identisk funksjonalitet. Men vi får også problemer med å implementere denne i kretsen, og spørsmålet er hva som eksakt er problemet: Problemet her henger sammen at både multiplekseren og funksjonen er kombinatoriske funksjoner. Optimaliseringsalgoritmene i Warp2 forsøker å optimalisere disse funksjonene til en felles funksjon. Det betyr at vi sitter igjen med en veldig bred (mange produkttermer) kombinatorisk funksjon som gjør at vi ikke får plass. Vi kan si at det er en svakhet i disse optimaliseringsalgoritene som gjør at løsningen blir for dårlig optimaliserert i forhold til arkitekturen i kretsen (og i forhold til at pinner er løst). Vanskeligheten henger sammen med at CY7C374 har produktermer som er delt mellom flere macroceller, slik at hver macrocelle effektivt ikke har så mange til egen rådighet. Merk at enhver arkitektur vil på et eller annet punkt ha en begrensning på dette punktet. Løsning på problemet er å på en eller annen måte få skilt logikken til multiplekseren fra logikken til en. Dette kan vi gjøre ved hjelp av registre som vist i figuren under. Dette er en vanlig benyttet teknikk og kalles pipelining, og er meget benyttet for å ikke få for bred logikk. I FPGA arkitekturer er pipelining helt essensielt for å ikke få for lange forsinkelser og dermed nedsatt klokkefrekvens og ytelse (se side 502-> i læreboka). 8
4 bit muxout CLk s register s kilder 4-1 mux (4 bit) En annen måte, som er Warp2 spesifikk, er å benytte et Warp2 syntesedirektivet synthesis_off: 4 bit muxout Attribute synthesis_off of muxout:signal is true; Legges inn kontrollfilen s kilder 4-1 mux (4 bit) La oss si at utgangen av multiplekseren har navnet muxout. Ved å legge inn følgende linje i kontrolfilen for kretsen: Attribute synthesis_off of Muxout:signal is true; vil Warp2 la være å optimalisere logikken for multiplexeren sammen med logikken for 7- segment en, og er dermed fri til å benytte forskjellige deler av kretsen til de to logiske blokkene. Alle disse tingene skal vi snakke mere om på forelesningene som omhandler syntese og design implementasjon. 9