Med en MCU kan samma krets användas för att lösa olika problem genom att olika program laddas in i dess minne.

Relevanta dokument
Läs igenom hela laboration 5 innan du börjar beskriva instruktionsavkodaren i VHDL!

PROGRAMMERING AV MCU LABORATION6. Laborationens syfte

LEJON LABORATION3. Laborationens syfte

KALKYLATOR LABORATION4. Laborationens syfte

Tentamen i Digitalteknik, EITF65

Sekvensnät i VHDL del 2

INTRODUKTION TILL VIVADO

Digitalteknik EIT020. Lecture 15: Design av digitala kretsar

DIGITAL ELEKTRONIK. Laboration DE3 VHDL 1. Namn... Personnummer... Epost-adress... Datum för inlämning...

Dataminne I/O Stack 0x005D 0x3D SP low byte 0x005E 0x3E SP high byte

Ett minneselements egenskaper. F10: Minneselement. Latch. SR-latch. Innehåll:

Lunds Universitet LTH Ingenjörshögskolan IDa1, IEa1 Helsingborg. Laboration nr 4 i digitala system ht-15. Ett sekvensnät. grupp. namn.

Digitala System: Datorteknik ERIK LARSSON

LABORATION DATORKONSTRUKTION TSEA83 UART. Namn och personnummer. Version: (OS)

Elektroteknik MF1016 föreläsning 9 MF1017 föreläsning 7 Mikrodatorteknik

Processor pipelining genom historien (Intel i9-intel i7)

F2: Motorola Arkitektur. Assembler vs. Maskinkod Exekvering av instruktioner i Instruktionsformat MOVE instruktionen

Läsminne Read Only Memory ROM

Laboration D159. Sekvensnät beskrivna med VHDL och realiserade med PLD. Namn: Datum: Epostadr: Kurs:

General Purpose registers ALU I T H S V N Z C SREG. Antag att vi behöver skriva in talet 25 till register R18

DIGITALTEKNIK I. Laboration DE2. Sekvensnät och sekvenskretsar

Laboration i digitalteknik Introduktion till digitalteknik

Digital- och datorteknik

VHDL 1. Programmerbara kretsar

DIGITALTEKNIK. Laboration D172

En något mer detaljerad bild av en processor. De tre delarna i processorn är: Nere 3ll vänster finns e' antal register som används för a' lagra data.

En något mer detaljerad bild av en processor. De tre delarna i processorn är: Nere 3ll vänster finns e' antal register som används för a' lagra data.

Programmerbar logik (PLD) Programmeringsspråket VHDL Kombinatoriska funktioner i VHDL för PLD Sekvensfunktioner i VHDL för PLD

Tentamen i Digitalteknik 5p

Digital elektronik CL0090

LABORATIONSINSTRUKTION

Laboration D184. ELEKTRONIK Digitalteknik. Sekvensnät beskrivna med VHDL och realiserade med PLD

IE1205 Digital Design: F9: Synkrona tillståndsautomater

Datorarkitektur I. Tentamen Lördag 10 April Ekonomikum, B:154, klockan 09:00 14:00. Följande gäller: Skrivningstid: Fråga

Tenta i Digitalteknik

Tenta i Digitalteknik

Minnet. Minne. Minns Man Minnet? Aktivera Kursens mål: LV3 Fo7. RAM-minnen: ROM PROM FLASH RWM. Primärminnen Sekundärminne Blockminne. Ext 15.

Introduktion till syntesverktyget Altera Max+PlusII

VHDL och laborationer i digitalteknik

Tentamen. TSEA22 Digitalteknik 5 juni, 2015, kl

Programräknaren visar alltid på nästa instruktion som skall utföras. Så fort en instruktion har hämtats så visar programräknaren på nästa instruktion.

Tentamen i Digitala system - EDI610 15hp varav denna tentamen 4,5hp

Program kan beskrivas på olika abstrak3onsnivåer. Högnivåprogram: läsbart (för människor), hög abstrak3onsnivå, enkelt a> porta (fly>a 3ll en annan ar

Tentamen i Digitala system - EITA15 15hp varav denna tentamen 4,5hp

AVR 5. Styrning av trafikljus. Digitala system 15 p

Lösningsförslag till Tenta i Mikrodator

F5 Introduktion till digitalteknik

Programmerbara kretsar och VHDL 2. Föreläsning 10 Digitalteknik, TSEA22 Oscar Gustafsson Institutionen för systemteknik

CE_O3. Nios II. Inför lab nios2time

LV6 LV7. Aktivera Kursens mål:

Per Holm Lågnivåprogrammering 2014/15 24 / 177. int och double = = 2, 147, 483, 647

Enchipsdatorer med tillämpningar LABORATION 7, ROBOT

Kontrollskrivning Mikrodatorteknik CDT S2-704

Lågnivåprogrammering. Föreläsning 2 Lågnivåprogrammering. Binära tal. En enkel modell av datorns inre

Provmoment: Ladokkod: Tentamen ges för: Tentamen TE111B El3. Namn: Personnummer: Tentamensdatum: Tid: 14:00-18:00.

Tentamen i IE1204/5 Digital Design måndagen den 15/

Konstruktionsmetodik för sekvenskretsar

Tenta i Digitalteknik

"Crash Course in Programming"

Datorarkitekturer med operativsystem ERIK LARSSON

Datormodell. Datorns uppgifter -Utföra program (instruktioner) Göra beräkningar på data Flytta data Interagera med omvärlden

Grundläggande datavetenskap, 4p

Styrenheten styrsignalsekvenser programflödeskontroll

Datorsystemteknik DVGA03 Föreläsning 8

Datorteknik. Tomas Nordström. Föreläsning 6. För utveckling av verksamhet, produkter och livskvalitet.

Digitala projekt rapport

HF0010. Introduktionskurs i datateknik 1,5 hp

L15 Introduktion modern digital design

Digitalteknik 7.5 hp distans: 5.1 Generella sekvenskretsar 5.1.1

Övning2 Datorteknik, HH vt12 - Programmering

Tenta i Digitalteknik

Digital- och datorteknik

std_logic & std_logic_vector

DESIGN AV SEKVENTIELL LOGIK

Högskolan i Halmstad Digital- och Mikrodatorteknik 7.5p. Lista på registeruppsättningen i PIC16F877A Datablad TTL-kretsar 74-serien

System S. Datorarkitektur - en inledning. Organisation av datorsystem: olika abstraktionsnivåer. den mest abstrakta synen på systemet

Lösningar till tentamen i EIT070 Datorteknik

Design av digitala kretsar

Lösningförslag till Exempel på tentamensfrågor Digitalteknik I.

Hjälpmedel: Appendix A. VHDL-syntax. (bifogas detta prov) Appendix B.2. IEEE-package (bifogas detta prov)

Simulering med ModelSim En kort introduktion

Datorteknik. Tomas Nordström. Föreläsning 2. För utveckling av verksamhet, produkter och livskvalitet.

Datorsystem Laboration 2: Minnesmappade bussar

c a OP b Digitalteknik och Datorarkitektur 5hp ALU Design Principle 1 - Simplicity favors regularity add $15, $8, $11

Digitalteknik: CoolRunner-II CPLD Starter Kit Med kommentarer för kursen ht 2012

Chalmers ekniska Högskola Institutionen för Data- och Informationsteknik. EDA 321 Digitalteknik syntes Laboration 2 - VHDL

PARALLELL OCH SEKVENTIELL DATABEHANDLING. Innehåll

FÖRELÄSNING 8 INTRODUKTION TILL DESIGN AV DIGITALA ELEKTRONIKSYSTEM

TENTAMEN. Datorteknik. D1/E1/Mek1/Ö Hjälpmedel: Häfte "ARM-instruktioner", A4-format, 17 sidor. Maxpoäng:

LABORATIONSINSTRUKTION

Foto: Rona Proudfoot (some rights reserved) Datorarkitektur 1. Datapath & Control. December

Digitalteknik och Datorarkitektur

En Von Neumann-arkitektur ( Von Neumann-principen i föreläsning 1) innebär:

Lösningar till tentamen i EIT070 Datorteknik

Digitalteknik: CoolRunner-II CPLD Starter Kit

IE1205 Digital Design: F8: Minneselement: Latchar och Vippor. Räknare

Datorteknik. Föreläsning 6. Processorns uppbyggnad, pipelining. Institutionen för elektro- och informationsteknologi, LTH. Mål

Introduktion till Xilinx CPLD och ISE WebPack 6.2 Version NV

TSEA22 Digitalteknik 2019!

Sekvensnät. William Sandqvist

Transkript:

MCU LABORATION5 Laborationens syfte I denna laboration ska två praktiska uppgifter lösas. Först ska trafikljusen i en korsning styras. Därefter ska antalet lejon i en bur räknas (likt lejonburen i tidigare laboration). Men, istället för att lösa uppgifter med två olika kretsar ska de lösas med en mer generell krets, en MCU (Micro-Controller-Unit). En MCU, eller enkretsdator, kan liknas med en liten dator bestående av CPU (Central- Processing-Unit), programminne och arbetsminne, allt samlat i en och samma IC-krets. En MCU har även inbyggda moduler för att kommunicera med sin omgivning, som generella in- och utsignalsportar, där elektriska komponenter enkelt kan anslutas. Med en MCU kan samma krets användas för att lösa olika problem genom att olika program laddas in i dess minne. Laborationen består av två delar. Först ska MCUn, hårdvaran, konstrueras med hjälp av VHDL och utvecklingsverktyget ISE från Xilinx. Hårdvaran realiseras på Nexys4 FPGAkort. Därefter ska två program skrivas som löser de två uppgifterna.

2 Lab 5: MCU Följande färdigskrivna VHDL komponenter finns tillgängliga under laborationen: Komponent/Entity Filnamn Beskrivning SR4 sr4.vhd 4-bitars skiftregister REG5 reg5.vhd 5-bitars register MUX3x5 mux3x5.vhd 5-bitars 3 till 1 multiplexer ALU8 alu8.vhd 8-bitars ALU REG8 reg8.vhd 8-bitars register MUX2x8 mux2x8 8-bitars 2 till 1 multiplexer Nexys4 FPGA utvecklingskort Figur 5.1: Strömställarna SW0 till SW15 genererar en logiskt hög signal då de är i sitt övre läge. Knapparna som är arrangerade i ett kors, BTNx, genererar en logiskt hög signal då de trycks ner. Knappen CPU RESET fungerar på motsatt sätt, låg signal genereras då den trycks ner. Anslutningarna JA-JD är generella in- och utsignalsportar som kan kopplas till yttre komponenter.

Lab 5: MCU 3 Introduktion Läs igenom hela manualen innan du börjar beskriva hårdvaran i VHDL! Efter att hårdvaran implementerats och testats, ska två olika praktiska problem lösas genom att två olika program skrivs och laddas ner till MCUn. Först ska trafikljusen vid en vägkorsning styras och därefter ska antalet lejon i en bur räknas (likt lejonburen i tidigare laboration). Ob- Figur 5.2: Blockschema av MCUn som ska konstrueras. servera att klock- och resetsignal inte är utritade. I denna laboration ska hårdvaran för en MCU (Micro-Controller-Unit) realiseras på ett Nexys4 FPGA-kort med hjälp av VHDL. Då MCUn är implementerad kommer den att kunna utföra ett antal operationer, exempelvis att addera två tal. MCUn styrs genom att ett program laddas ner i dess minne. Programmet kommer att bestå av en lista med instruktioner som talar om för MCUn vilka operationer den ska utföra och i vilken ordning. I figur 5.2 visas ett blockschema av MCUn som ska konstrueras. Hårdvarudelen av laborationen kommer till stor del bestå av att konstruera CPU (Central-Processing-Unit) blocket då övriga block kommer att tillhandahållas som färdiga VHDL moduler. Minnet i kretsen är ett ROM (Read-Only-Memory), kretsen själv kan inte modifiera dess innehåll utan endast läsa det. Programmet som styr MCUn kommer att lagras i minnet och varje instruktion i programmet kommer att sparas på en given rad, minnesadress. Överföringen av programmet till minnet kommer att utföras med ett PC-program som beskrivs senare. MCUn kommer inte att ha något dataminne där data kan sparas. Varje instruktion kommer att ta en klockcykel för MCUn att utföra. Kretsen kommer att

4 Lab 5: MCU drivas med en 1 khz klocka som erhålls genom att 100 MHz klockan på Nexys4 kortet divideras i klockblocket. För felsökning av program finns det även en manuell klocka, BTNC. Valet mellan 1 khz och manuell klocka görs med brytaren SW15, se figur 5.1. Under laborationen kommer externa komponenter, som lysdioder och brytare, anslutas till MCUn. De komponenter som är insignaler till kretsen ansluts till kontakten JA och utsignaler till JB. Båda dessa signaler består av åtta bitar och synkroniseras med resten av kretsen i IO-blocket (Input-Output). Den synkroniserade versionen av JA är signalen INPUT i figur 5.2 och JB är ansluten till OUTPUT. När ett program körs i MCUn kommer debug-blocket att skriva ut adressen till den instruktion som exekveras för stunden på Nexys4 7-segmentsdisplay. Vilket kan vara användbart vid felsökning av ett program. Då ett program exekveras läser CPUn ut en instruktion I från en adress A i minnet, se figur 5.2. CPUn avkodar instruktionen, utför nödvändiga operationer och bestämmer adressen varifrån nästa instruktion ska hämtas. Figur 5.3: Abstrakt blockschema av CPUn som ska konstrueras. För att CPUn ska veta var i programmet den befinner sig måste den komma ihåg adressen till instruktionen som körs för stunden. CPUn ska därför ha en programräknare PC (Program-Counter), som är ett register 1 vars värde alltid är adressen till den instruktion som körs för stunden, se figur 5.3. Stacken i figuren kommer att förklaras mer i detalj senare, men kan ses som ett minne där programadresser kan sparas och läsas ut. Beräkningar som utförs av CPUn kommer att göras med en ALU. Resultatet från ALUn 1 Ett register består av ett antal D-element som sitter parallellt. Register används då man behöver ett minne som kan spara mer än en bit. T.ex. består ett 8-bitars register av åtta D-element och har 2 8 olika tillstånd.

Lab 5: MCU 5 kommer att kunna sparas i ett av två register, R0 och R1, i registerblocket. Den ena operanden till ALUn kommer alltid att komma från instruktionen (minnet), den andra operanden kommer att vara en av R0, R1 eller signalen INPUT. Konstruktionen blir därmed begränsad i avseende på att det inte går att utföra några operationer mellan de båda registerna R0 och R1. Instruktionsavkodaren i CPUn har till uppgift att utifrån instruktionen I generera styrsignaler till alla komponenter i CPUn så att rätt operation erhålls. Mer information om de olika delarna av CPUn kommer att ges senare. Instruktioner De instruktioner som kretsen stödjer kallas instruktionsuppsättning och utgör gränssnittet mellan hård- och mjukvara. Instruktionsuppsättningen specificerar även kraven för hårdvaran, då kretsen måste kunna utföra de olika instruktionerna. MCUn som konstrueras under laborationen kommer endast stödja ett fåtal instruktioner men kan utan vidare byggas ut för att stödja fler. Figur 5.4: Varje instruktion, I, består av 13 bitar. Bit 12-9 är operationskoden, bit 8 destinationsbiten och bit 7-0 är data. Observera att bit 0 är den minst signifikanta. Varje instruktion består av en 4-bitars operationskod, en destinationsbit samt 8-bitars data, totalt 13 bitar. Med operationskoden OPCODE bestäms vilken operation som ska utföras. Destinationsbiten DEST styr, i vissa instruktioner, vilket av de två registerna R0 och R1 som ska användas. De 8 databitarna DATA används som operand i beräkningar eller för att ange adressen till nästa instruktion Bitarna i varje instruktion organiseras enligt figur 5.4. Nedan följer en beskrivning av de instruktioner som kretsen ska stödja. Istället för 4- bitars OPCODE anges instruktionerna med förkortningar för att det ska vara lättare att komma i håg dem. I listan nedan gäller att RX = { R0 om DEST = 0, R1 om DEST = 1. CALL Anropa subrutin (CALL subroutine). Nästa adress i ordningen, PC+1, sparas (PUSH) på stacken och nästa adress bestäms av DATA[4:0]. Kan användas då man har en programsnutt som ska köras från flera ställen i programmet, liknande ett funktionsanrop i t.ex. Java och C.

6 Lab 5: MCU RET Återgå från subrutin (RETurn from subroutine). Nästa adress hämtas och tas bort (POP) från stacken. Används endast i slutet av en subrutin för att återgå till huvudprogrammet. BZ Hoppa om noll (Brach if Zero). Om RX=0 så bestäms nästa adress av DATA[4:0], annars är nästa adress PC+1. Används för att hoppa över/till programkod beroende på om ett villkor är uppfyllt, liknande if-satser i Java och C. B Hoppa (Branch). Ovillkorligt programhopp till adressen som anges av DATA[4:0]. Kan användas i slutet av programmet för att börja om från adress 0. ADD Addera (ADD). Värdet DATA adderas till RX. RX + =RX+DATA. SUB Subtrahera (SUBtract). Värdet DATA subtraheras från RX. RX + =RX-DATA. AND Bitvis OCH (AND). Bitvis OCH-funktion med RX och DATA. RX[i] + =RX[i] DATA[i], i=0..7. LD Ladda (LoaD). Ladda RX med DATA. RX + =DATA. OUT Skriv till utsignal (WRite to output). Utsignalen får värdet som finns i register RX. OUTPUT + =RX. IN Läs från insignal (ReaD from input). RX laddas med värdet av insignalen. RX + =INPUT. Med instruktionerna ovan kan ett enkelt program skrivas som ADRESS OPCODE DEST DATA 00 LD R0 2 01 SUB R0 1 02 BZ R0 04 03 B 01 04 B 04 På progammadress 00 laddas R0 med värdet 2, därefter minskas R0s värde med ett. På adress 02 kontrolleras om R0=0. Om så är fallet hoppar programmet till 04, annars fortsätter det på 03 där det hoppar tillbaka till 01. När programmet till slut kommer fram till adress 04 kommer det stå kvar där tills kretsen nollställs. 00 01 02 03 01 02 04 04... Programmflödet kan även visualiseras med ett tillståndsdiagam där tillståndskoderna motsvarar adresserna i programmet, se figur 5.5. Då minnet som används under laborationen kommer att ha begränsad kapacitet kan det vara bra att återanvända instruktionsstycken. I programmet nedan används instruktionerna på adress 10 till 14 som en subrutin för att generera en fördröjning.

Lab 5: MCU 7 Figur 5.5: Tillståndsdiagrammet visualiserar i vilken ordning programadresserna exekveras, en form av programmflödesdiagram. ADRESS OPCODE DEST DATA 00 IN R0 01 OUT R0 02 BZ R0 06 03 SUB R0 1 04 CALL 10 05 B 01 06 CALL 10 07 B 00... 10 LD R1 2 11 SUB R1 1 12 BZ R1 14 13 B 11 14 RET Programmet börjar med att ladda R0 med värdet av insignalen INPUT. Värdet av R0 skrivs sedan till utsignalen OUTPUT. Om R0=0 hoppar programmet till 06 annars minskas R0 med 1 och subrutinen anropas vid 04. När subrutinen är slut, på adress 14, återgår programmet till adress 05, alltså raden efter där subrutinsanropet gjordes. Därefter upprepas proceduren tills R0 är 0 då programmet hoppar 06 och subrutinen anropas än en gång. Efter det körs programmet ifrån början igen. Minne Minnets storlek bestäms av två parametrar, antal rader och antal bitar per rad. Under laborationen används ett minne med 32 rader där varje rad består av 13 bitar, se bild 5.6. Med insignalen address bestäms vilken rad som ska finnas på utsignalen mem_data vid nästa stigande flank hos signalen clk. Då alla 32 rader ska kunna nås, måste ingången address bestå av 5 bitar. Likaså, måste utgången mem_data vara 13 bitar bred för att hela raden ska kunna läsas ut. Minnet utnyttjas så att varje rad motsvarar en rad i programmet. Del 1. Hårdvara - Konstruktion av CPU

8 Lab 5: MCU Figur 5.6: 32x13bit minne. I denna delen ska nu hårdvaran för CPUn konstrueras. Konstruktionen delas upp i tre delar, adressväljare, beräkningsenhet och instruktionsavkodare, se figur 5.7. Figur 5.7: Blockschema av CPU. För att göra schemat tydligare symboliserar signalen K följande sex signaler: StackOp[1:0], AddrSrc[1:0], ALUOp[2:0], ALUSrc, OutEna och RegEna. Beräkningsenheten utför aritmetiska operationer samt läser och skriver till IO-blocket. Då resultatet från ALUn i beräkningsenheten är noll, ska utsignalen (flaggan) Z bli aktiv (hög) vilket kommer att användas för att styra villkorliga instruktioner. Instruktionsavkodaren avkodar instruktionen I från minnet. Beroende på instruktion och signalen Z genereras styrsignaler till alla delar av CPUn samt till IO-blocket.

Lab 5: MCU 9 I adressväljaren genereras adressen till nästa instruktion. Adressväljaren ska även innehålla programräknaren PC, vars värde alltid ska vara adressen till instruktionen som exekveras för stunden. 5.1. Adressväljaren I detta avsnitt ska först en stack realiseras. Stacken tillsammans med andra komponenter ska sedan användas för att realisera adressväljaren. Beroende på instruktionen som exekveras kommer nästa adress genereras på olika sätt. Speciellt gäller att vid subrutins anrop med instruktionen CALL så måste återhoppsadressen sparas undan så att programmet kan återgå till denna adress då subrutinen är slut, vid instruktionen RET. För att spara återhoppsadressen ska en stack användas. Stacken arbetar enligt principen att det som senast sparats där är det som först läses ut, det vill säga ett minne utav LIFOtyp (Last In First Out). Uppgift 5.1.1. Implementering av stacken Stacken ska ha 4 st. minnesceller, där varje cell består av 5 bitar. Med 4 minnesceller kan lika många successiva subrutinsanrop kan göras. Skulle ytterligare ett göras kommer återhoppsadressen från den första subrutinen att gå förlorad och programmet kraschar. I 5.8 ses stacken med dess in- och utsignaler, observera antalet bitar för de olika signalerna. Stackens tillstånd ska endast ändras vid insignalen clk stigande flank. Utsignal ToS (Top-of-Stack) ges av stackens översta cell. Signalen n_rst är en asynkron aktiv låg resetsignal som ska nollställa alla stackens celler. Signal StackOp ska styra stacken enligt tabellen nedan Figur 5.8: Symbol av stacken som ska implementeras. Anslutningarna D och ToS är 5 bitar breda och StackOp 2 bitar bred. StackOp PUSH POP HOLD Funktion Värdet av D sparas överst på stacken. tidigare sparade värdet trycks ned ett steg Stackens innehåll flyttas upp ett steg. och den understa cellen får värdet 0. Stackens innehåll oförändrat

10 Lab 5: MCU Nedan ges ett exempel på hur stacken ska bete sig vid de olika operationerna. StackOp = PUSH D = 20 Före: Efter: ToS 2 ToS 20 0 2 0 0 0 0 StackOp = POP Före: Efter: ToS 1 ToS 2 2 3 3 4 4 0 StackOp = HOLD Före: Efter: ToS 1 ToS 1 2 2 3 3 0 0 För att implementera stacken ska fem stycken skiftregister SR4 användas. Dessa ska kopplas parallellt, så att varje skiftregister håller en bit ur varje tal som finns på stacken. Operationerna PUSH och POP blir då det samma som att höger- respektive vänsterskifta skiftregisternas innehåll.

Lab 5: MCU 11 Hemuppgift 5.1.1.1 Använd fem skiftregister SR4 och anslut kretsarna för att realisera stacken enligt ovan. Rita nätet samt sätt ut signalerna från figur 5.8. Datablad för SR4 finns i appendix. Fyll värdet för signalen StackOp vid de olika operationerna. Operation POP PUSH HOLD StackOp[1:0] Alla filer som behövs under laborationen finns i katalogen S:\MCU, kopiera hela mappen till U:\<ditt namn>. I mappen finns det fem undermappar. Under komponenter finns VHDL-filer för de komponenter som kan användas under laborationen, komponenterna finns listade i början av manualen. Innehållet i misc ska användas då designen synteseras och implementeras i ISE. Mappen tb innehåller alla testbäddar som ska användas. I labbfiler finns VHDL-filerna som beskriver MCUn och i mappen fpga_rom_editor finns PC-programmet som används för att skriva och ladda ner program till MCUn. För att undvika fel som beror på att signaler tilldelas fel värde i olika filer används ett package där konstanter definieras och som sedan kan användas i andra filer, likt headerfiler i C. Öppna först filen labbfiler/cpu_pkg.vhd och fyll i de konstanta värdena för signalen StackOp som styr stackens operationer enligt hemuppgiften ovan. Glöm inte att avkommentera raderna där konstanterna är deklarerade. Öppna därefter labblifer/stack.vhd och implementera stacken genom att instansiera och koppla ihop fem stycken skiftregister SR4 (definierade i filen sr4.vhd), konstanterna från cpu_pkg kan användas. Om några utsignaler från komponenten SR4 inte behövs kan dessa anslutas till open. Ordet open är reserverat i VHDL och talar om för synteseringsverktyget att utsignalen inte används, se exempel nedan.

12 Lab 5: MCU instancename: entity adder port map( adder_input => signala, adder_out1 => signalb, adder_out2 => open ); Skapa ett nytt simuleringsprojekt i Questa Sim. Filerna cpu_pkg.vhd och sr4.vhd måste läggas till i projektet då de används i stack.vhd och stack_tb.vhd. Verifiera därefter stackens beteende med filen stack_tb.vhd. Det kan underlätta att öppna stack_tb och läsa igenom kommentarerna för att förstå vad som händer. Under simuleringen finns signalen message tillgänglig och kan läggas till i vågformsfönstret. Den gör det lättare identifiera vilken rad i stack_tb.vhd som genererar insignaler till testobjektet. Uppgift 5.1.2. Implementering av adressväljaren Slut på uppgift 5.1.1 Adressväljaren, innehållande stacken, ska nu realiseras så att rätt adress genereras vid de olika instruktionerna. Vid instruktioner som inte påverkar programflödet, t ex. ADD och OUT, är nästa adress den som följer i ordningen, det vill säga A + = PC+1. Vid progamhoppsinstruktionen B ska däremot nästa adress vara den som ges av de fem minst signifikanta bitarna i instruktionen, A + =DATA[4:0]. Detsamma gäller för instruktionen BZ om resultatet från ALU är noll. Även vid subrutinsanrop med instruktionen CALL gäller att A + =DATA[4:0]. Dock så måste återhoppsadressen, PC+1, sparas på stacken. Vid instruktionen RET ges nästa adress av det översta elementet från stacken, ToS. Insignaler till adressväljarblocket är clk, n_rst, StackOp[1:0], AddrSrc[1:0] och DATA[4:0]. Dess utsignaler är A och pc_debug, båda fem bitar breda. För styra valet av vilket värde som ska tilldelas A kommer det att behövas en komponent vars utgång kan kopplas ihop med en av dess ingångar. Vad kallas denna komponent? Svar: Komponenten ovan ska styras med signalen AddrSrc, så att A tilldelas ett av värdena i tabellen nedan Nästa adress A PC+1 ToS DATA[4:0] Beskrivning Nästa adress i ordningen. Top-of-Stack, det översta värdet på stacken. De fem minst signifikanta bitarna i instruktionen. Adressväljaren ska även innehålla programräknaren PC, som vid varje stigande flank hos clk ska tilldelas värdet av nästa adress A +. Värdet av PC ska även anslutas till utsignalen pc_debug för att debug-modulen ska fungera senare när program körs.

Lab 5: MCU 13 Hemuppgift 5.1.2.1 Rita schemat för adressväljarblocket innehållande stacken, PC, komponenten från frågan ovan samt en komponent med vars hjälp PC+1 kan erhållas (tillgängliga komponenter finns listade i början av labbmanualen). Sätt ut in- och utsignaler! Fyll i värdet för signalen AddrSrc vid de olika operationerna. A + PC+1 ToS DATA AddrSrc[1:0] Fyll i värdena för signalen AddrSrc i filen cpu_pkg.vhd så att de stämmer överens med din implementation. Öppna därefter filen labbfiler/adressvaljare.vhd och implementera adressväljarblocket. Om en komponent har en bredare in- eller utsignal än vad den ska anslutas till så kan följande syntax användas EIGHT <= "0000" & FOUR; FOUR <= EIGHT(3 downto 0); - - EIGHT 8 bitar bred, Four 4 bitar bred - - de fyra översta bitarna fylls med nollor. - - Kan vara riskabelt vid 2-komplement. - - Endast de fyra lägsta bitarna används. Observera att en utsignal deklarerad med out i en entity inte kan läsas av i dess implementation, använd istället en intern signal vars värde sedan tilldelas utsignalen. Testa designen med filen adressvaljare_tb.vhd, tänk på att alla komponeter som används måste läggas till i simuleringsprojektet. Titta i filen adressvaljare_tb.vhd för att förstå simuleringen. Då signalen A ändras via ett kombinatoriskt nät kan det vara svårt att verifiera om blocket beter sig korrekt. Titta istället på utsignalen pc_debug som har värdet av nuvarande adress (pc_debug = PC) och uppdateras vid varje klockflank.

14 Lab 5: MCU 5.2. Beräkningsenhet Slut på uppgift 5.1.2 Det andra blocket av CPUn, beräkningsenheten, ska nu konstrueras. Beräkningsenheten ska förutom ALUn innehålla registerblocket vilket är det enda minnet i MCUn där temporär data kan sparas. Först kommer registerblocket, innehållande de två 8-bitars registerna R0 och R1 konstrueras. Därefter ska registerblocket användas för att implementera beräkningsenheten. Uppgift 5.2.1. Implementering av registerblocket Registerblocket ska styras med två signaler, RegEna och DEST. Signalen DEST, bit 8 från instruktionen, bestämmer vilket av de två registerna som ska vara aktivt. Om DEST=0 ska värdet av R0 finnas på registerblockets utsignal RegOut, annars ska värdet av R1 finnas på utsignalen. RegOut ska ändras direkt då DEST ändras. Om RegEna=1 ska det aktiva registrets innehåll uppdateras med resultatet F från ALU vid nästa stigande klockflank, annars ska det aktiva registret vara oförändrat. Övriga insignaler till registerblocket är clk och n_rst, där den senare ska nollställa registerna asynkront då den är låg.

Lab 5: MCU 15 Hemuppgift 5.2.1.1 Rita nätet för registerblocket innehållande R0 och R1 med tillgängliga komponenter och vanliga grindar, t. ex. AND, NOT osv. Sätt även ut in- och utsignaler. Implementera registerblocket i filen labbfiler/registerblock.vhd med tillgängliga komponenter. Logiska funktioner mellan signaler, som AND, NOT, implementeras med VHDL syntax. Verifiera registerblocket med filen registerblock_tb.vhd. Uppgift 5.2.2. Implementering av beräkningsenhet Slut på uppgift 5.2.1 ALUn i beräkningsenheten ska ta två 8-bitars operander, A och B, och utföra operationen som bestäms av insignalen ALUOp. Utsignalen från ALU är resultatet F samt statussignalen Z som är hög då F=0. Operand A ska alltid vara de åtta minst signifikanta bitarna ur instruktionen, DATA[7:0]. Operand B ska däremot vara en utav två möjliga. Antingen det aktiva registret från registerblocket RegOut eller signalen INPUT från IO-blocket. Valet av B gör med signalen ALUSrc, där ett hög värde medför att B=INPUT och ett lågt värde att B=RegOut. Utsignalen från beräkningsenheten är signalen Z, som ska användas som villkor i instruktionsavkodaren. Och signalen OUTPUT som ska tilldelas resultatet F från ALUn. OUTPUT kommer senare att anslutas till JB via IO-blocket.

16 Lab 5: MCU Hemuppgift 5.2.2.1 Rita nätet för beräkningsenheten bestående av registerblock, ALU samt övriga komponenter som krävs. Insignal är DEST, ALUOp, RegEna, INPUT, ALUSrc, DATA, clk och n_rst. Utsignaler är OUTPUT och Z. Implementera beräkningsenheten i filen berakningsenhet.vhd och testa den sedan med filen berakningsenhet_tb.vhd. 5.3. Instruktionsavkodare Slut på uppgift 5.2.2 Det sista blocket i CPUn, instruktionsavkodaren, ska nu konstrueras så att rätt styrsignaler genereras till de övriga blocken vid de olika operationerna. Uppgift 5.3.1. Implementering av instruktionsavkodare Instruktionsavkodaren ska utifrån fältet OPCODE från instruktionen I, generera rätt styrsignaler till adressväljarblocket, beräkningsenheten samt IO-blocket. Utöver signalen OPCODE används signalen Z från beräkningsenheten som insignalen till instruktionsavkodaren för att styra villkorliga instruktioner.

Lab 5: MCU 17 Utsignaler från instruktionsavkodaren är de som använts i tidigare uppgifter AddrSrc, StackOp, ALUOp, ALUSrc, RegEna samt signalen OutEna vars funktion är att styra när IO-blockets utsignalbuffert ska laddas. Ett högt värde hos OutEna medför att utsignalen tilldelas värdet av OUTPUT från beräkningsenheten vid nästa klockflank. Hemuppgift 5.3.1 Fyll i tabellen nedan så att instruktionerna implementeras enligt specifikationen tidigare i manualen. Koda även varje instruktion med fyra bitar, I[12:9]. Observera att det finns utrymme för att lägga till egna instruktioner om man vill. T.ex. kan en instruktion där DATA skrivs direkt till OUTPUT visa sig vara mycket användbar senare i laborationen. OPCODE I[12:9] Z StackOp AddrSrc ALUOp ALUSrc OutEna RegEna CALL - RET - BZ 0 BZ - - - - 1 B - ADD - SUB - LD - OUT - IN - AND - StackOp = { PUSH, POP, HOLD } AddrSel = { PC+1, ToS, DATA[4:0] } AluOp = { A, B, A+B, B-A, A B, A B, A B } Än så länge har de olika instruktionerna bara angetts med förkortningar. I kretsen måste dessa dock kodas binärt, här med fyra bitar. Öppna cpu_pkg.vhd och definera bitmönster för de olika instruktionerna enligt tabellen i hemuppgiften ovan. Det spelar ingen roll hur dessa kodas så länge man är konsekvent och använder samma kodning då programmen skrivs. Öppna filen instruktionsavkodare.vhd och implementera instruktionsavkodaren enligt tabellen ovan. Här kan det vara bra att använda konstanterna från cpu_pkg för att avkoda signalen OPCODE. Testa därefter instruktionsavkodaren med filen instruktionsavkodare_tb.vhd och kontrollera

18 Lab 5: MCU så att rätt styrsignaler genereras vid de olika instruktionerna. 5.4. CPU Slut på uppgift 5.3.1 Som sista del av hårdvarudelen av laborationen ska de tre blocken, adressväljare, beräkningsenhet och instruktionsavkodare, kopplas ihop för att implementera CPUn. Därefter ska MCUn syntetiseras och implementeras i ISE. Uppgift 5.4.1. Implementering av CPU Öppna filen cpu.vhd och instansiera och koppla ihop de olika blocken enligt figur 5.7. Tänk på att ersätta signalen K i figuren med de verkliga signalerna. Uppgift 5.4.2. Syntetisering och implementering av MCU Skapa nu ett nytt projekt i ISE, se appendix. Lägg därefter till alla filer från mapparna labbfiler och misc i projektet. Lägg även till de filer från mappen komponenter som använts för att implementera CPUn. Syntetisera, implementera och generera bitströmmen för projektet i ISE. Kopplingarna mellan blocken i CPUn kan kontrolleras efter syntetisering via RTL-schemat, se appendix för ISE. Slut på uppgift 5.4.2 Del 2. Mjukvara - Programmering av MCU Med en väl fungerande MCU återstår nu bara att skriva programmen som löser de två problemen, trafikkorsningen och lejonburen. Minnesmodulen i MCUn är avsedd att innehålla programmet som styr enhetens beteende. Efter att bitströmmen generats i ISE fylls hela minnesarean med nollor. Bitströmmen måste därför modifieras så att ert program placeras i minnet. Modifieringen av bitströmmen kommer att göras med programmet FPGA_ROM_Editor.exe som finns i mappen rom_editor. När programmet används är det viktigt att ni väljer rätt bit-fil. Namnet på bit-filen är detsamma som projektnamnet i ISE, bit-filen finns i projektets mapp. Det är av största vikt att ni väljer rätt (er egen) bit-fil! Figur 5.9 visar hur programmet ser ut på skärmen när det har startats. Antalet programrader (instruktioner) är 32 och varje instruktion består av en fyrabitars operationskod, en destinationsbit och åtta bitar data (MSB..... LSB). En bock i en ruta markerar att motsvarande bit är satt till en etta, annars noll. Efter varje instruktionsrad finns det en ruta där ni kan skriva kommentarer. De fyra knapparna i programmet har följande funktion

Lab 5: MCU 19 Figur 5.9: Skärmklipp av FPGA_ROM_Editor s gränssnitt. Programmet används för att kopiera er kod till MCUns minne innan designen laddas ner till FPGA-kortet. Ladda ner till FPGA Spara som Öppna: Rensa: Tar xxx.bit (genererad av ISE), modifierar bitmönstret så att ert program läggs i minnet. Därefter laddas designen ner till FPGA-kortet via USB-kabeln. Sparar instruktioner och kommentarer (spara.hex filen i er katalog). Hämta instruktioner och kommentarer från.hex fil Nollställer alla instruktioner och kommentarer. Observera att då programmet laddas ner kommer även konfigurationen för hårdvaran

20 Lab 5: MCU att laddas över till FPGA-kortet. Labbkortet som är anslutet till Nexys4 består av två delar, en trafikkorsning och en lejonbur (figur 5.10). Med strömställaren S3 väljer man om kortet skall fungera som en trafikkorsning (TRAFIK) eller lejonbur (LEJON). Det finns två kontakter på labbkortet, märkta JA respektive JB. Dessa skall kopplas till motsvarande kontakter på Nexys4 och är polariserade med stift så att de inte kopplas fel. Var försiktig, tvinga aldrig! Figur 5.10: Labbkort JB är signaler från Nexys4 till labbkortet enligt nedan: JB Strömställare S3 i läge trafik Strömställare S3 i läge lejon D0 (LSB) Rött ljus huvudgata D0 (LSB) till 7-segmentsavkodare D1 Gult ljus huvudgata D1 till 7-segmentsavkodare D2 Grönt ljus huvudgata D2 7-segmentsavkodare D3 Rött ljus sidogata D3 (MSB) 7-segmentsavkodare D4 Gult ljus sidogata D5 Grönt ljus sidogata D6 D7 (MSB) JA är signaler från labbkort till Nexys4 enligt nedan (oberoende av strömställaren S3):

Lab 5: MCU 21 JA Funktion D0 (LSB) 0 = Dag, 1 = Natt (S4) D1 1 = Bil på sidogata (S5) D2 1 = Lejon framför givare G1 D3 1 = Lejon framför givare G2 D4 0 D5 0 D6 0 D7 (MSB) 0 Uppgift 5.5. Programmering av trafikkorsning I denna uppgift gäller det att programmera styrningen av trafikljus i en korsning, ett trafikljus på en huvudgata och ett på korsande sidogata. Strömställaren S4 fungerar som omkopplare mellan dag och natt. Knappen S5 används för att simulera att en bil kommer på sidogatan, se figur 5.10. Under dagtid, S4 = 0, skall trafikljuset fungera som ett vanligt trafikljus, dvs. växla mellan rött och grönt enligt vedertagen standard. I läget natt, S4 = 1, skall trafikljuset visa grönt på huvudgatan och rött på sidogatan, tills det kommer en bil på sidogatan (S5 = 1 då knappen Bil trycks ner) då ska ljuset skall växla en gång så att det blir grönt på sidogatan och bilen kan passera. Då minnet är begränsat har vi inga krav på att det skall vara olika tider på hur lång tid respektive färg skall lysa. Tips: Det finns en möjlighet att göra koden mer effektiv genom att skapa egna instruktioner. Uppgift 5.6. Programmering av lejonbur I denna uppgift skall en kontrollenhet programmeras som håller reda på hur många lejon som är ute. I princip är denna uppgift identisk med labbuppgift 1.4 med undantagen att det inte finns någon diod för fara och endast nio lejon behöver räknas. För att bli godkänd på laboration 5 krävs att ni programmerar er MCU enligt ovanstående uppgifter och kan redovisa i detalj hur ni har löst uppgifterna, både hård- och mjukvara.