TELE2010A Digital Systemkonstruksjon Øving 3/2015 Del 1, Teller: Husk å arbeide i det lokale arbeidsområdet på disken. Kopier filene til serveren når dere er ferdig for å kunne bruke dem neste gang. max_tall CE Teller_gen tiere enere Start et nytt design i A-HDL, som du kaller oving_3. Åpne zip-fila som er lagt ut. Velg new-file i A-HDL, marker at det er vhdl-kode, gå til mappa med filene og marker dem. Huk av for «Make local copy.». Telleren til høyre skal lages. Vi skal til slutt ende opp med et sett med tellere som kan brukes for å registrere tiden i en stoppeklokke. Clk R Figur 1: En generisk teller For å lage klokken trenger vi tellere som teller 0-9, 0-59 og 0-99. Tellerne skal ha en synkron reset som setter tellerverdien til 0 når den er lav. Tellerne bruker den samme klokke og resetsignal. Klokken har en frekvens på 100 Hz. For å kunne synkronisere tellerne med hverandre er det nødvendig med et count_enable-signal. Tellerne skal derfor også ha en inngang count_enable (ce) som er aktivt når det er '1'. Reset (R) har prioritet. Telleren skal telle på positiv klokkeflanke. Vis R er '0' skal den gå til 0. Hvis R er '1' og CE er 1 skal den telle. Når den kommer til maksimalverdien, skal den skifte til 0, ellers øker den verdien med 1. Dersom CE er '0' skal den ikke telle. Symbol for telleren er vist i Figur 1. Det er lagt ut en prosjektfil på itslearning. Entity for telleren er gitt her: library ieee; use ieee.std_logic_1164.all; entity teller_gen is generic (max_tall : integer := 59); port (clk, ce, R : in std_logic; tiere : out integer range 0 to max_tall/10; enere : out integer range 0 to 9); end entity; Vi skal først lage en oppførselsbeskriv for telleren. Denne arkitekturbeskrivn er komplett, med eventuelle skrivefeil og word-hjelp. ;-) 1 eller '1'. architecture oppforsel of teller_gen is Øving 3/2015 TELE201A Digital systemkonstruksjon Side 1 av 5
-- Ingen signal. -- Vi trenger en prosess som våkner og evaluerer når -- klokkesignalet skifter verdi fra 0 til 1. T: process (clk) is - må ha en lokal tellerverdi: variable teller : integer range 0 to 59; -- Telleren resettes dersom R er 0. -- Når ce er 1 settes den til 0 dersom teller -- er max_tall, ellers teller den en opp. -- Det er brukt synkron reset. if rising_edge(clk) then -- teller på positiv -- klokkeflanke. if r = '0' then teller := 0; elsif ce = '1' then if teller = max_tall then teller := 0; teller := teller + 1; -- Tellerverdien er bestemt, legger den inn i -- de to utgangssignalene. -- Tierverdien finnes ved å ta en -- heltallsdivisjon med 10. -- Enerne finnes ved å ta en modulo-divisjon -- med 10. Resten fra divisjonen er svaret. -- NB! Dette kan bare brukes for simulering! tiere <= teller/10; enere <= teller mod 10; end architecture; Kompiler denne koden og simuler ved hjelp av bølgeformvinduet i A-HDL. Bruk Stimulators for å angi signalverdier. 1. Åpne et bølgeformvindu (New waveform). 2. Velg teller_gen(oppforsel) som aktiv krets 3. Simulate > initialize 4. Trekk signalene du vil se på over i bølgeformvinduet. 5. Høyreklikk på clk, r og ce og sett opp pådrag for simuleringen ved hjelp av valget Stimulators. Bruk Kokke for clk og keyboard for de to andre. Bruk R for r og C for ce. Klikk på Apply for hvert enkelt pådrag. Bruk gjerne 10 MHz for clk. Øving 3/2015 TELE201A Digital systemkonstruksjon Side 2 av 5
6. Kjør simuleringen lenge nok til at telleren teller rundt. Dette vil være avhengig av hvor lang klokkeperioden er. Prøv med ce = '0' og '1' og sjekk at den fungerer som tenkt, ved å se om telleren stopper eller fortsetter. Kjør simulatoren i noen klokkeperioder for de forskjellige innstillingene. Husk å gi r = '0' mens du teller, for å sjekke at kretsen lar seg nullstille. Del 2, Flere prosesser: Den første telleren er en oppførselsmodell. Vi skal nå lage en strukturmodell som det er mulig å syntetiseres til hardware. Vi skal bruke den samme entityen, men en ny arkitektur. Telleren skal telle fra 0 til max_tall med to prosesser. En som teller enere og en som teller tiere. Enertelleren må telle så lenge ce = '1'. Tiertelleren skal telle når ce = '1' og enertelleren viser 9. architecture struktur of teller_gen is -- Vi trenger interne signal for tellerverdiene. -- Vi må også ha et signal for synkronisering -- mellom enere og tiere og et signal for -- nullstilling av telleren. signal sig_tiere : integer range 0 to 5; signal sig_enere : integer range 0 to 9; signal sig_synkroniser, nullstill : std_logic; -- Konstanter som viser maksverdier, beregnet fra -- den generiske porten. constant c_siste_tier : integer := max_tall/10; constant c_siste_ener : integer := max_tall mod 10; -- Kretsen skal ha to prosesser som teller på positiv -- flanke på clk. -- En for sig_enere og en for sig_tiere. -- Enertelleren skal telle når ce er '1'. -- Tiertelleren skal telle når ce er '1' og -- enertelleren viser 9. Tellerene skal nullstilles -- etter maxverdien. maxverdien finnes ved -- å sjekke om begge tellerverdiene er lik den -- aktuelle maksverdien. Øving 3/2015 TELE201A Digital systemkonstruksjon Side 3 av 5
-- Prosessen for å telle enere er komplett. -- Diskuter med sidemannen hvorfor den er slik. p_enere: process (clk) is if r = '0' then sig_enere <= 0; elsif ce = '1' then if sig_enere = 9 then sig_enere <= 0; sig_enere <= sig_enere + 1; -- Gjør ferdig prosessen under som skal telle -- sig_tiere. p_tiere: process (clk) is -- Fullfør koden. -- Ta med synkron reset og la telleren telle -- fra 0 til c_siste_tier dersom ce er '1' og -- sig_enere er 9. -- Så en prosess som lager et signal for -- nullstilling av telleren når den -- har kommet til maksimal verdi: p_nullstill: process (sig_tiere, sig_enere) is if (sig_tiere = c_siste_tier and sig_enere = c_siste_ener) then nullstill <= '1'; nullstill <= '0'; -- Kopler de interne tellerverdiene til -- utgangssignalene. tiere <= sig_tiere; enere <= sig_enere; end architecture; Så skal vi lage en klokke som bruker den strukturerte arkitekturen. Øving 3/2015 TELE201A Digital systemkonstruksjon Side 4 av 5
Gjør ferdig synkroniseringsprosessene. Del 4, Testbenk: Nå har vi to modeller av telleren. En basert på oppførselsmodellen og en basert på strukturbeskrivn. Vi kan se på oppførselsbeskrivn som en beskriv av hvordan vi ønsker at telleren skal oppføre seg. Den viser bare inngangssignal og utgangssignal. Strukturbeskrivn av telleren er en rtl-beskriv som er det vi ønsker å implementere. Neste trinn blir da å sjekke om disse beskrivne oppfører seg likt. Dette gjør vi med en testbenk. Testbenken inneholder de to arkitekturene, en prosess for å sette opp testsignalene, og en prosess for å sjekke om utgangene er like. Når testen avsluttes vil det skrives en melding i konsollvinduet. Koden er vedlagt, men ikke testet skikkelig. Når dere er ferdige med simuleringen med A-HDL og dere mener at kretsen oppfører seg riktig, registrerer dere dette på itslearning. Skriv et labnotat som dokumenterer at kretsen virker. Ta med nødvendige figurer og kode. Fortell hvordan dere verifiserte at kretsen virket. Frist: 29. september 2015 kl 23:59. Øving 3/2015 TELE201A Digital systemkonstruksjon Side 5 av 5