1 2G1518 Datorteknik Föreläsning 5, våren 2007 Bussar In- och utmatning – I/O Pollning Handskakning
2 F1F2F3 F4 F5F6F7F8F9F10Ö2Ö1 Ö3 Ö4Ö5 LAB-1 LAB-2Hemlab-1Ö6 Ö7LAB-3 Hemlab-2Ö8Hemlab-3Ö9TentamenÖ10 Assemblerkod 4 stegs pipeline Nios2time Nios2io C-kod Nios2int Cache-minnen CPU-scheduling 2G1518 Datorteknik
3 Rubriker ● Bussöverföring – läsning och skrivning ● Adressering – memory-mapped, I/O- mapped ● Parallellport – uppbyggnad och funktion ● Handskakning ● Serieport – funktion, paritetskontroll ● Eko-program, kommunikationsprogram ● Timer
4 Att läsa ● Kursboken, avsnitt: 1.4 Maskinvara 2.6 Bussar och enkel I/O-hantering 5.2 Koppling till omvärlden, sida 151–156 9.4 Kommunikation mellan processor och I/O-enheter
5 Programexekvering i två steg EXECUTE FETCH (update PC) (decode)
6 Programmerarens datormodell... cell 0 cell 1 cell 2 cell 3 cell 4... r0 r31 r1 program counter register CPU minne
7 Viktiga delar i en dator CPU MEM BUS I/O program data
8 Rubriker ● Bussöverföring – läsning och skrivning ● Adressering – memory-mapped, I/O- mapped ● Parallellport – uppbyggnad och funktion ● Handskakning ● Serieport – funktion, paritetskontroll ● Eko-program, kommunikationsprogram ● Timer
9 Bussöverföring MASTER SLAVE BUS
10 Exempel: memory read ● Master – till exempel processorn (CPU) ● Slave – till exempel minnet (MEM) ● Master levererar adress (Address) ● Master ger läsbegäran (Read Request) ● Slave levererar data ● Slave levererar kvittens (Acknowledge)
11 Exempel: memory read Adress (flera ledningar) Data (flera ledningar) Read Request Acknowledge
12 Exempel: memory write ● Master – till exempel processorn (CPU) ● Slave – till exempel minnet (MEM) ● Master levererar adress (Address) och Data ● Master ger skrivbegäran (Write Request) ● Slave levererar kvittens (Acknowledge)
13 Exempel: memory write Adress (flera ledningar) Data (flera ledningar) Write Request Acknowledge
14 Asynkron buss ”any time” Adress (flera ledningar) Data (flera ledningar) Read Request Acknowledge
15 Synkron buss Adress (flera ledningar) Data (flera ledningar) Read Request Acknowledge address memrd data Clock
16 Asynkron eller synkron buss? ● Asynkron klarar enheter med olika hastighet bra för blandade och långsamma (äldre) system ● Synkron kan ge högre hastighet kan överföra adress och data separat, tiden mellan kan utnyttjas till annat bra för snabba, likadana enheter
17 Flera slave-enheter inkopplade på olika adresser MASTER SLAVE ?? Adress-avkodare
18 Flera slave-enheter inkopplade på olika adresser MASTER MEM ?? Adress-avkodare
19 Flera slave-enheter inkopplade på olika adresser MASTER SLAVEMEM ?? Adress-avkodare
20 Flera Master går bra – Arbiter väljer mellan dem Master MEM I/O Adress dittenAdress datten ?? Adress-avkodare Master Arbiter
21 Bussledningar ● Adressledningar: 8–64 stycken för att kunna peka ut varje byte ● Dataledningar: 8–128 bitar ● Kontrolledningar för styrning Read, Write (eller RD/WR och Strobe) Acknowledge (eller motsatsen, Hold) Bus Request, Bus Grant – för Arbiter IRQ – Interrupt ReQuest ● Övrigt: Vcc, GND, Clock, Reset,...
22 Bussledningar (forts.) ● Långsam Slave behöver extra tid vid läsning/skrivning ● Långsam Slave fördröjer ACK (eller aktiverar HOLD) ● Tidsövervakning, Time-Out, om Acknowledge aldrig kommer ● Bus Error – ingen ACK kom innan Time-Out
23 Bussledningar (forts.) ● Varje Slave måste ha adressavkodare med olika adresser så att bara en enhet svarar på varje request ● Läsning/skrivning av oanvänd adress medför Time-Out (och Bus Error) eftersom ingen enhet aktiverar Acknowledge
24 Bus Error: extra signal på bussen MASTER SLAVE BUS Time-Out Bus Error
25 Rubriker ● Bussöverföring – läsning och skrivning ● Adressering – memory-mapped, I/O-mapped ● Parallellport – uppbyggnad och funktion ● Handskakning ● Serieport – funktion, paritetskontroll ● Eko-program, kommunikationsprogram ● Timer
26 Inkoppling av in- och utenheter ● Antingen memory-mapped... in- och utenheter kopplas in på samma sätt som minne LOAD och STORE för läsning och skrivning ●...eller I/O-mapped in- och utenheter kopplas in med speciella, extra bussledningar Nya instruktioner IN och OUT för läsning och skrivning
27 Inkoppling av in- och utenheter ● Memory-mapped ● Minne och I/O måste ha olika adresser ● Minne och I/O har samma kontrollsignaler ● Load, Store för I/O ● I/O-mapped ● Minne och I/O kan ha samma adresser ● Minne och I/O har olika kontrollsignaler ● Speciella in- och ut- instruktioner: IN R1,117 OUT R2,118
28 Rubriker ● Bussöverföring – läsning och skrivning ● Adressering – memory-mapped, I/O- mapped ● Parallellport – uppbyggnad och funktion ● Handskakning ● Serieport – funktion, paritetskontroll ● Eko-program, kommunikationsprogram ● Timer
29 Parallellport ● Brukar ha 8, 16, eller 32 bitar (anslutningar) ● Signalriktning: in eller ut kan vara inställbar för varje bit ● Inport består normalt av grindar ● Utport består normalt av register ● Handskakningssignaler kan finnas
30 Parallell IN-port & RD IN-PORT IN-DATA RD Adress Data Kontroll CPU-BUSS IN 0 IN n DnDn D0D0 IN 1 D1D1 grindar &&
31 IN-port ● Läsning öppnar grindarna ● Det värde som finns på inporten just då hämtas in till programmet som resultat av LOAD- eller IN-instruktion ● Lämpligt för tryckknappar (till exempel)
32 IN-porten kopplad till annan dator ● IN-porten på min dator kan kopplas till UT-porten på en annan dator ● Filöverföring?
33 Exempel ● Texten "SOPPA" ska överföras ● Mottagaren ser värdet extra länge ● Mottagaren kan inte veta om det är ett eller två "P" ● Resultat: "SOPA" S O P P A
34 IN-port med handskakning ● Extra signaler, förutom data ● Till datorn: skrivsignal för inporten (WRITE) ● Från datorn: "Har ännu inte läst indata" = Input Buffer Full, IBF
35 IN-port med handskakning RD IN-PORT IBFWRIN-DATA RD IBF Adress Data Control CPU-BUSS IN 0 IN n DnDn D0D0 IN 1 D1D1 Q Q’ set clear IBF WR RD vippa grindar &&&......
36 Handskakning ● IBF = Input Buffer Full ● Puls på WR ettställer IBF-vippan ● Utanför datorn finns något (någon?) som ger en puls på WR när det finns nya data ● När datorn läser inporten nollställs IBF-vippan av läs-signalen RD
37 Parallell UT-port UT-PORT UT-DATA WR Adress Data Control CPU-BUSS Q Q’ D clk Q Q’ D Q D clk DnDn D0D0 D1D1 UT 0 UT n UT 1 WR Q Q’ set clear OBE RD WR register (vippor) clk
38 UT-port ● UT-porten innehåller vippor (till exempel 8, 16, 32 stycken) som tillsammans blir ett UT-register ● Datorn skriver till UT-registret ● Utanför datorn kan senaste värdet avläsas ● Lämpligt för lysdioder, motorer (till exempel)
39 UT-port med handskakning ● Extra signaler ● Till datorn: lässignal för utdata, READ ● Från datorn: "Finns ännu inga nya utdata" = Output Buffer Empty, OBE
40 UT-port med handskakning UT-PORT OBERDUT-DATA WR OBE Adress Data Control CPU-BUSS Q Q’ D clk Q Q’ D Q D clk DnDn D0D0 D1D1 UT 0 UT n UT 1 WR Q Q’ set clear OBE RD WR register (vippor) vippa clk
41 Parallellport Handskakningssignaler ● IBF = Input Buffer Full ● OBF = Output Buffer Empty ● IBF och OBE är tillgängliga för program ● IBF och OBE är tillgängliga för hårdvaran
42 Handskakningssignaler (forts.) ● IBF = Input Buffer Full ● Aktiv signal IBF (full inport) begäran om åtgärd, från omvärlden till program "Hallå där, nu finns nya indata" ● Samma signal IBF (full inport) varning till omvärlden, från datorn "Stopp, datorn har ännu inte läst senaste indata"
43 Handskakningssignaler (forts.) ● OBE = Output Buffer Empty ● Aktiv signal OBE (tom utport) begäran om åtgärd, från omvärlden till program "Hallå där, leverera nya utdata" ● Samma signal OBE (tom utport) varning till omvärlden, från datorn "Stopp, datorn har ännu inte levererat nya utdata"
44 Handskakningssignaler: IBF ● IBF – Input Buffer Full ● IBF ettställs normalt av hårdvaran när omgivningen levererar nya data till inporten ● IBF nollställs (kvitteras) av program ● Två konstruktionstyper: nollställning kan ske vid läsning av inport (implicit bieffekt), eller med egen instruktion (explicit)
45 Handskakningssignaler: OBE ● OBE – Output Buffer Empty ● OBF ettställs normalt av hårdvaran när omgivningen har tagit hand om utdata ● OBE nollställs (kvitteras) av program ● Två konstruktionstyper: nollställning kan ske vid skrivning av utport (implicit bieffekt), eller med egen instruktion (explicit)
46 0x840 0x844 0x848 0x84C SW7 SW6 SW5 SW4 SW5 SW4 SW6SW GLOBAL RESET Delar av Nios2-kortet Nios2 button_pio Memory-mapped
47 0x850 0x854 0x858 0x85C SW5 SW4 SW6SW GLOBAL RESET Delar av Nios2-kortet Nios2 dip_pio Memory-mapped
48 0x810 0x814 0x818 0x81C D3 D4 D5 D6 SW5 SW4 SW6SW GLOBAL RESET Delar av Nios2-kortet D6 D5 D4 D3 Nios2 led_pio Memory-mapped
49 Minnesliknande beteende ● Så här ska minne fungera: ● Ett värde som skrivs till en viss adress kan sedan läsas från samma adress ● Skrivning till en adress påverkar inte innehållet på andra adresser ● Läsning från en adress påverkar inte innehållet på någon adress
50 Icke minnesliknande beteende ● Så här kan in- och utenheter fungera: ● Ett värde som skrivs till en viss adress går inte att få tillbaka vid läsning från samma adress ● Skrivning till en adress kan påverka innehållet på flera andra adresser ● Läsning från en adress kan påverka innehållet på en eller flera adresser
51 Program för handskakning Invänta READY (blockerande I/O) PÅHOPP AVHOPP IBF==1? Nollställ IBF LÄS INDATA LÄS IBF JA NEJ INHOPP UTHOPP OBE==1? Nollställ OBE SKRIV UTDATA LÄS OBE JA NEJ Wait for READY Action & Acknowledge !
52 Program för handskakning Direkt retur (icke-blockerande I/O) PÅHOPP AVHOPP IBF==1? Nollställ IBF RETVAL= DATAIN LÄS IBF JA NEJ RETVAL=–1 PÅHOPP AVHOPP OBE==1? Nollställ OBE SKRIV DATAUT Nollställ RETVAL LÄS OBE JA NEJ RETVAL= –1
31 januari 20072G1518, föreäsning 5, vht2006 (D2)53 getdata från Inport rutin med pollning av statusbit (blockerande I/O) #int in_data(reg) definedatain 0x... definestatus 0x... defineibfmask 0x... in_data:loadreg1 <-- status andireg1 <-- ibfmask beqin_data loadreg <-- datain return
31 januari 20072G1518, föreäsning 5, vht2006 (D2)54 #put_data(data) definedataut 0x... definestatus 0x... defineobemask 0x... put_data:loadreg1 <-- status andireg1 <-- obemask beqput_data storedataut <-- data return putdata till Utport rutin med pollning av statusbit (blockerande I/O)
55 Rubriker ● Bussöverföring – läsning och skrivning ● Adressering – memory-mapped, I/O- mapped ● Parallellport – uppbyggnad och funktion ● Handskakning ● Serieport – funktion, paritetskontroll ● Eko-program, kommunikationsprogram ● Timer
56 Serieport ● Bit för bit i stället för flera bitar samtidigt ● Asynkron kommunikation vanligt en byte kan komma när som helst överföringslinjen är i vila mellan två data-bytes ● Synkron kommunikation – mera speciellt det kommer alltid en ström av bitar utfyllnadskoder sänds mellan två data-bytes
57 Seriell kommunikation skiftregister parallella data in parallella data ut skiftregister seriell kabel Sändare Mottagare
58 Synkron seriell kommunikation ● Klocksignalen överförs på en extrasladd ● Synkroniseringskoder skickas då och då så att skiftregistren börjar på samma bit seriell kabel clock klocksignal
59 Asynkron seriell kommunikation ● Varje byte (tecken, bokstav) sänds för sig ● Ett tecken kodas ofta med ISO men på labbarna använder vi 7-bits ASCII ● Dessutom tillkommer 1 startbit (alltid 0:a) 1 paritetsbit (tillval) – udda eller jämn paritet 1, 1½ eller 2 stoppbitar (alltid 1:or)
60 Asyknron seriell kommunikation 0x x xxxxxP1 1 7-bitars ASCII en startbit (0) en Paritetsbit (P) Stoppbit(ar) (1:or) Synkroniseringsflank – övergång från 1:a till 0:a Avkänningstidpunkter
61 Serieport med asynkron kommunikation ● Bithastighet – antal bitar per sekund kallas felaktigt för baud-rate ● Teckenlängd – behöver inte vara 1 byte kan vara 5, 6, 7 eller 8 bitar ● Paritetsbit (räknas inte in i teckenlängden) av/på, jämn eller udda – enkel felkontroll ● Antal stoppbitar – minst en flera stoppbitar ger längre vila mellan två bytes
62 Paritetskontroll ● Jämn paritet = jämnt antal ettor i ordet/byten ● Udda paritet = udda antal ettor i ordet/byten ● Feldetektering upptäcker om 1 bit ändrat värde ● Sändaren kompletterar data med extra bit, värdet sätts så att pariteten blir rätt ● Mottagaren kontrollerar att pariteten är rätt
31 januari 20072G1518, föreäsning 5, vht2006 (D2)63 in_char från serieport rutin med pollning av statusbit #int in_char(void) definedata... definestatus... defineibfmask... in_char:loadtmpreg <-- status anditmpreg <-- ibfmask beqin_char loadoutreg <-- data return
31 januari 20072G1518, föreäsning 5, vht2006 (D2)64 putchar till serieport rutin med pollning av statusbit #out_char(data in inreg) definedataout... definestatus... defineobemask... out_char:loadtmpreg <-- status anditmpreg <-- obemask beqout_char storedataout <-- inreg return
65 Nios2 uart_0 Memory-mapped 0x860 0x864 0x868 uart_00x860-86F uart_1 0x880-88F uart_0 STATUS RxRdy (IBF) TxRdy (OBE) RxDATA (RD) TxDATA (WR)
31 januari 20072G1518, föreäsning 5, vht2006 (D2)66 getchar från Serieport syntetisk Nios-2-kod (blocking) #int returvärde = in_char(void).equdatain, 0x860# 0x880.equdataut, 0x864# 0x884.equstatus, 0x868# 0x888.equibfmask, 0x80# 0x80 = 0b in_char: MOVIAr8, datain LDWr9, 8(r8)# status=datain+8 ANDIr9, r9, ibfmask BEQ r9, r0, in_char LDWr2, 0(r8) RET
31 januari 20072G1518, föreäsning 5, vht2006 (D2)67 #void out_char(parameter).equdatain, 0x860# 0x880.equdataut, 0x864# 0x884.equstatus, 0x868# 0x888.equobemask, 0x40# 0x40=0b out_char: MOVIAr8, datain LDWr9, 8(r8)#status=datain+8 ANDIr9, r9, obemask BEQ r9, r0, out_char STWr4, 4(r8)# dataut=datain+4 RET out_char från Serieport syntetisk Nios-2-kod (blocking)
68 Rubriker ● Bussöverföring – läsning och skrivning ● Adressering – memory-mapped, I/O- mapped ● Parallellport – uppbyggnad och funktion ● Handskakning ● Serieport – funktion, paritetskontroll ● Eko-program, kommunikationsprogram ● Timer
69 Laboration 2: eko-program ● Skriv ett program som ekar tillbaka bytes från tangentbordet till hyperterminalfönstret ● main:callinitserie# vid behov ● loop:callin_char# läs en byte movr4,r2# kopiera callout_char# sänd tillbaka ● br loop# loopa
70 Flödesschema för eko-program START in_charout_char initserie
71 Flödesschema för korsvis kommunikation START in_charx? send_char NEJ JA rec_charx? out_char JA NEJ nytt tecken från tangentbord? om ja: sänd ut tecknet på länken nytt tecken från länken? om ja: skriv tecknet till skärmen
72 Program för korsvis kommunikation ● start:callinitserie# initera serieportar vid behov ● gettst:callin_charx# tecken från tangentbord ? bltr2, r0, rectst# om inte: hopp till rectst ● send:movr4, r2 ● callsend_char# sänd ett tecken ● rectst:callrec_charx# tecken mottaget ? bltr2, r0, gettst# om inte: hopp till gettst ● put:movr4, r2 ● call out_char# och skriv ut mottaget tecken ● brgettst# loopa
73 Korsvis kommunikation med paritetskontroll START get_charx? parmake NEJ JA nytt tecken från tangentbord? om ja: beräkna checksumma simulera slumpmässiga fel sänd ut tecknet på länken nytt tecken från länken? om ja: kolla checksumma skriv tecknet till skärmen send_char errmake rec_charx? partest NEJ JA put_char
74 Korsvis kommunikation med paritetskontroll ● start:callinitserie# initera serieportar vid behov ● gettst:callget_charx# tecken läst från tangentbord? bltr2, r0, rectst# om inte: hopp till rectst ● movr4, r2# annars: beräkna checksumma callparmake movr4, r2# och simulera slumpmässiga fel callerrmake movr4, r2 ● callsend_char# sänd sedan ett tecken ● rectst:callrec_charx# tecken mottaget från kommunikationslänk? bltr2, r0, gettst# om inte: hopp till gettst ● movr4, r2# annars: kontrollera checksumma callpartst movr4, r2 ● call put_char# skriv slutligen ett tecken till skärmen ● brgettst# och loopa
75 Rubriker ● Bussöverföring – läsning och skrivning ● Adressering – memory-mapped, I/O- mapped ● Parallellport – uppbyggnad och funktion ● Handskakning ● Serieport – funktion, paritetskontroll ● Eko-program, kommunikationsprogram ● Timer
76 Timer ● Används för exaktare tidmätning ● Har en räknare (counter), stegar 1 steg varje klockcykel kan stega från 0 upp till inställt värde eller stega från inställt värde ner till 0 ● När räknaren har tickat klart: Time-Out precis som en äggklocka
77 Timer: Time-Out ● Vid Time-Out ettställs en vippa ● Värdet i vippan är tillgängligt för program ● Värdet i vippan är tillgängligt elektriskt ● Innan nästa tidmätning ska vippan återställas HUR?
78 Flödesschema för subrutin som väntar på Time-Out entry return TimeOut==1? Read TimeOut YES NO Clear TimeOut Wait for READY Action & Acknowledge !
79 Flödesschema DELAY med program-loop N = start N = N - 1 N == 0 ? IN-hopp UT-hopp JA NEJ K = msekK = K - 1K == 0 ? IN-hopp UT-hopp JA NEJ Byt ut program-loop mot timer-loop Program-loop 1 millisekund Laboration 1 IN-parameter i r4
80 Flödesschema DELAY med timer K := K - 1K = 0 ? IN-hopp UT-hopp JA NEJ entry return TimeOut=1? Clear TimeOut Read TimeOut YES NO Timer-loop 1 millisekund K := msek Laboration 2 IN-parameter i r4
81 Timer – räknare som räknar ned ● Räknaren laddas med önskad periodtid tiden väljs med program ● Räknarinnehållet minskas med 1 varje klockcykel ● När räknaren kommit ner till noll så ettställs Time-Out ● Räknaren kan laddas om av hårdvaran (med samma värde igen) vid Time-Out
82 Timer – statusvippa Time-Out ● Time-Out kan läsas med program ● Time-Out finns också tillgänglig som elektrisk signal ● ettställs vid Time-Out ● ska nollställas av program
83 Timer – statusvippa Run ● Run ettställs av program annars startar inte timern ● Kan nollställas av program
84 Timer – skiss på hårdvaran counter clock period copy write (by program) run start time-out Q Q’ D cl set clear stop zero snap-shot read (by program) copy load Q Q’ D cl from program read from program
85 Nios2 Timer Memory-mapped 0x820 0x824 0x828 0x82C 0x830 0x834 0x838 0x83C
86 Timerns register är halvbreda ● Alla Timer-register kan läsas och skrivas med LDW (Load Word, 32 bitar) ● Bara de 16 bitarna till höger används
87 Nios2 Timer 0x820 status 0x824 control 0x828 periodl 0x82C periodh 0x830 snapl 0x834 snaph run TO Time-Out ITO cont start stop 15 0
88 Nios2 Timer ● Time-Out = TO, bit 0 på adress 0x820 ● Run = bit 1 på adress 0x820 ● Återställning av Time-Out: skriv valfritt värde till 0x820 värdet ignoreras, men bussöverföringen (skrivning till 0x820) gör att Timern återställer Time-Out ● Start = kör igång, ettställ bit 2 på adress 0x824 ● Stop = stoppa, ettställ bit 3 på adress 0x824
89 Minneskarta Nios2 Alla adresser är hexadecimala ● 0 - 7FFboot_monitor_rom ● Fled_pio ● Ftimer_0 ● Fbutton_pio ● Fdip-pio ● Fuart_0 (”hyperterminal) ● Fuart_1 (”annat labkort”) ● FFFFsram, 256 kByte