2G1518 Datorteknik Föreläsning 5 Bussar In- och utmatning (Input/Output, I/O) Programstyrd pollning hösten 2005 för D3 och CLMDA m fl
3 övningsgrupper denna vecka ● onsdag 5 oktober kl 10–12 – L42, L43, L44 (Drottning Kristinas väg 30) ● torsdag 6 oktober kl 10–12 – Q21, Q22, Q23
Föreläsning 5 Innehåll, rubriker ● Bussöverföring (Bus Data Transfer) ● Read/Write ● I/O-enheter, adressering ● Parallellport, funktion, pollning ● Serieport, funktion, pollning ● Timer, funktion, pollning ● Eko-program, Kommunikations-program ● Paritetskontroll
Litteraturhänvisningar Kursbokens avsnitt 1.4 Maskinvara 2.6 Bussar och enkel I/O-hantering 5.2 Koppling till omvärlden, sid 9.4 Kommunikation mellan processor...
Programexekvering i två steg EXECUTE FETCH (update PC) (decode)
Viktiga delar i en dator CPU MEM BUS I/O program data
Bus Data Transfer viktiga aspekter MASTER SLAVE BUS
Bus Data Transfer Memory Read ● Master - till exempel CPU ● Slave - till exempel Memory ● Master levererar adress (t. ex. PC-value) ● Master ger läsbegäran (Read Request) ● Slave levererar data (t. ex. en instruktion) ● Slave levererar kvittens (Acknowledgement) ● Används vid Fetch Instruction och LOAD
Bus Data Transfer Memory Read Address Read Vad händer om (Rd) Ack uteblir ? 12 Data (Rd) Ack 34
Bus Data Transfer Memory Write ● Master - till exempel CPU ● Slave - till exempel minne ● Master levererar adress ● Master levererar data ● Master ger skrivbegäran (Write Request) ● Slave levererar kvittens (Acknowledgement) ● Används vid STORE
Bus Data Transfer Memory Write Address Write Vad händer om (Wr) Ack uteblir ? 2 Data (Wr) Ack
Bus Data Transfer Asynchronous Memory Read Address Read Data (Rd) Ack Slave kvitterar (med ACK) först när Slave levererar data
Bus Data Transfer Synchronous Memory Read Address Read Data (Rd) Ack clock address memrd data
Asynkron / synkron buss ● Asynkron – klarar enheter med olika hastigheter – bra för långsamma och blandade enheter (I/O) ● Synkron – kan ge högre hastighet – kan överföra adress och data separat, och utnyttja tiden mellan dem till annat (split-transaction bus) – bra för snabba, likadana enheter (minne)
Flera SLAVE fungerar bra - på olika adresser ! MASTER BUS SLAVE ?? Adress-avkodare
Flera minnen - på olika adresser ! CPU MEM BUS MEM Adress dittenAdress datten ?? Adress-avkodare
Flera Slave - på olika adresser ! CPU MEM BUS I/O Adress dittenAdress datten ?? Adress-avkodare
Flera Master fungerar - en Arbiter behövs för att välja mellan dem Master MEM BUS I/O Adress dittenAdress datten ?? Adress-avkodare Master Arbiter
Bussledningar Adressledningar 8-64 stycken, för att kunna peka ut varje byte Dataledningar, minst 8 bitar, upp till 128 bitar eller mer Kontrolledningar Read + Write, eller RD/WR och Data Strobe Ack, gemensam för läs och skriv Bus Request, Bus Grant – vid flera Masters IRQ - Interrupt ReQuest Övrigt Jord (Gnd), spänningsmatning (Vcc), clock, reset, m fl
Bussledningar (forts.) ● Långsam Slave kan bromsa läsning/skrivning ● fördröj Acknowledge, eller ● inför speciell Hold-signal ● Tidövervakning, Time-Out ● om Acknowledge aldrig kommer ● Bus Error – ingen Acknowledge kom
Bussledningar (forts.) ● Om det finns mer än en Master så behövs en Bus Arbiter (fördelare) ● Varje Slave måste ha adressavkodare så att max. en enhet svarar på Request ● Läsning/skrivning till oanvänd adress medför... – Time-out eftersom ingen enhet svarar med Acknowledgement
Bus Data Transfer Bus Error MASTER SLAVE (svarar ej) BUS Time-Out BusErrror X Adress-avkodare
Två sätt att ansluta I/O Memory Mapped Memory och I/O har olika adresser Samma kontroll-signaler för minne och I/O Vanliga Load och Store används för I/O, inga specialinstruktioner behövs I/O Mapped Memory och I/O kan ha samma adresser Olika kontroll-signaler för minne och I/O Speciella instruktioner används för I/O IN R1,117 OUT R2,118
Parallell-port ● Parallellport brukar ha en multipel av 8 signaler/anslutningar ● Signalriktning kan vara programmerbar separat för varje signal/pinne ● Inport består normalt av grindar – läsning ger värdet just då ● Utport består normalt av register – skrivning sätter nytt värde, gäller till nästa skrivning ● Handskakningssignaler kan finnas
IN-port & IN-PORT IN-DATA RD + adress- avkodning Adress Data Control CPU-BUSS IN 0 IN n DnDn D0D0 IN 1 D1D1 grindar & & RD + adressavkodning
IN-port IN-PORT IBFWR + adressavkodningIN-DATA IBF Adress Data Control CPU-BUSS IN 0 IN n DnDn D0D0 IN 1 D1D1 Q Q’ set clear IBF WR RD vippa grindar & & & RD + adress- avkodning RD + adressavkodning
UT-port UT-PORT OBERD + adressavkodningUT-DATA OBE Adress Data Control CPU-BUSS Q Q’ D cl Q Q’ D cl Q Q’ D cl DnDn D0D0 D1D1 UT 0 UT n UT 1 Q Q’ set clear OBE RD WR register (vippor) vippa WR + adress- avkodning WR + adressavkodning
Nios2 button_pio Memory Mapped Addresses 0x840 0x844 0x848 0x84C SW7 SW6 SW5 SW4 SW5 SW4 SW6SW GLOBAL RESET Delar av Lab-kortet D6 D5 D4 D3
D6 D5 D4 D3 Nios2 dip_pio Memory Mapped Addresses 0x850 0x854 0x858 0x85C SW5 SW4 SW6SW GLOBAL RESET Delar av Lab-kortet
Nios2 led_pio Memory Mapped Addresses 0x810 0x814 0x818 0x81C D3 D4 D5 D6 SW5 SW4 SW6SW GLOBAL RESET Delar av Lab-kortet D6 D5 D4 D3
Parallell-port Handskakningssignaler IBF - Input Buffer Full OBE - Outport Buffer Empty IBF och OBE är tillgängliga för program IBF och OBE är tillgängliga för hårdvara
Parallell-port (forts.) Handskakningssignaler IBF - Input Buffer Full OBE - Outport Buffer Empty Aktiv signal IBF (full inport) begäran om åtgärd, från omvärlden till CPU/program betyder: “hallå där, nu finns nya indata” Aktiv signal OBE (tom utport) begäran om åtgärd, från omvärlden till CPU/program betyder: “hallå där, leverera nya utdata” (Klarsignal = Readysignal)
Parallell-port (forts.) Handskakningssignaler IBF - Input Buffer Full IBF ettställs normalt då omgivningen levererar nya data till inporten IBF nollställs/kvitteras av program, t.ex. vid läsning av inport (implicit sidoeffekt) eller med egen instruktion (explicit)
Parallell-port (forts.) Handskakningssignaler OBE, Output Buffer Empty OBE ettställs normalt då omgivningen har tagit hand om utdata OBE nollställs/kvitteras av program, t.ex. vid skrivning av utport (implicit sidoeffekt) eller med egen instruktion (explicit)
Minnesliknande beteende vid läsning och skrivning 1. Ett värde som skrivs till en viss adress kan sedan läsas från samma adress 2. Skrivning till en adress påverkar ej innehåll på andra adresser 3. Läsning från en adress påverkar ej innehåll på någon adress Annat beteende vid minnesreferenser kallas för "icke minnesliknade" I/O-enheter bryter oftast mot (1), ibland mot (2), men ska helst inte bryta mot (3)
Handskakning med IBF/OBE Flödes-schema, invänta ready (blockerande I/O) INHOPP UTHOPP 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 !
Handskakning med IBF/OBE Flödes-schema, direkt retur (icke blockerande I/O) INHOPP UTHOPP IBF=1? Nollställ IBF PAR:= INDATA LÄS IBF JA NEJ PAR:= -1INHOPP UTHOPP OBE=1? Nollställ OBE och PAR SKRIV UTDATA LÄS OBE JA NEJ PAR:= -1
getdata från inport – subrutin med pollning av statusbit (blockerande I/O) #int returvärde = getdata(void) defineindata 0x... definestatus 0x... defineibfmask 0x... getdata:loadreg1 <-- status andireg1, reg1,ibfmask beqreg1, zero, getdata loadreturvärde <-- indata return
putdata till utport – rutin med pollning av statusbit (blockerande I/O) #void putdata(parameter) defineutdata 0x... definestatus 0x... defineobemask 0x... putdata:loadreg1 <-- status andireg1, reg1, obemask beqreg1, zero, putdata storeutdata <-- parameter return
Serie-port ● Används för seriell kommunikation ● Vanligt är asynkron kommunikation, ett tecken kan komma när som helst ● Synkron kommunikation finns även, det kommer alltid en ström av bitar
Serieport Parallella data in Parallella data ut skiftregister Seriell kabel skiftregister SändareMottagare
Serie-port Asynkron kommunikation Varje tecken (bokstav) sänds för sig Ett tecken kodas ofta med 7 bitars ASCII Dessutom tillkommer 1 startbit 1 paritetsbit (opt) udda eller jämn paritet 1 eller 2 stoppbitar
Serie-port Asynkron kommunikation 0x x xxxxxP1 1 7-bitars ASCII 1 startbit (0) 1 Paritetsbit (P) Stoppbit(ar) (1) Synkroniseringsflank Avkänningstidpunkter
Synkronisering ● Bit-synkronisering mottagare måste polla mitt i prick ● Byte-synkronisering När börjar nytt tecken (SYN) ● Block-synkronisering När börjar ett nytt block/paket (SOH...)
Serie-port Asynkron kommunikation ● Bithastighet (kallas felaktigt för baudrate) ● Teckenlängd (5, 6, 7, 8, …) ● Paritet On/Off, Even/Odd ● Antal Stoppbitar (1, 1½, 2) (antal perioder mellan sända tecken) (baudrate = signaleringshastighet)
getchar från serieport rutin med pollning av statusbit ;int returvärde = getchar(void) defineindata0x... definestatus0x... defineibfmask0x... getchar:loadtmpreg <-- status anditmpreg, tmpreg, ibfmask beqtmpreg, zero, getchar loadreturvärde <-- indata return
putchar till serieport rutin med pollning av statusbit #void putchar(parameter) defineutdata0x... definestatus0x... defineobemask0x... putchar:loadtmpreg <-- status anditmpreg, tmpreg, obemask beqtmpreg, zero, putchar storeutdata <-- parameter return
Nios uart_0 Memory Mapped Addresses 0x860 0x864 0x868 uart_00x860-86F uart_1 0x880-88F uart_0 STATUS RxRdy (IBF) TxRdy (OBE) RxDATA (RD) TxDATA (WR)
#int returvärde = getchar(void).equindata,0x860;0x880.equutdata,0x864;0x884.equstatus,0x868;0x888.equibfmask,0x80;0x80 getchar: MOVIAr8, indata LDWr9, 8(r8)# status = indata + 8 ANDIr9, r9, ibfmask BEQ r9, r0, getchar LDWr4, 0(r8) RET getchar från serieport, Nios2-kod (blocking)
putchar från serieport, Nios2-kod (blocking) #void putchar(parameter).equindata,0x860;0x880.equutdata,0x864;0x884.equstatus,0x868;0x888.equobemask,0x40;0x40 putchar: MOVIAr8, indata LDWr9, 8(r8)# status = indata + 8 ANDIr9, r9, obemask BEQ r9, r0, putchar STWr4, 4(r8)# utdata = indata + 4 RET
Laboration 2 EKO-program ● Skriv ett progam som ekar tecken från tangentbord till terminalfönster start:callinitserie# VID BEHOV main:callgetchar movr2, r4 callputchar brmain
Flödesschema för EKO-program START getcharputcharinit
Flödesschema för korsvis kommunikation START getcharx? sendchar NEJ JA reccharx? putchar 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
EKO-program med korsvis kommunikation start:callinitserie# initera serieportar vid behov gettst:callgetcharx# tecken läst från tangentbord? bltr2, r0, rectst# om inte: hopp till rectst movr4, r2# annars: sänd callsendchar# ett tecken rectst:callreccharx# tecken mottaget från kommunikationslänk? bltr2, r0, gettst# om inte: hopp till gettst movr4, r2# annars: skriv till skärm call putchar# ett tecken brgettst# och loopa
Korsvis kommunikation med paritetskontroll START getcharx? 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 sendchar errmake reccharx? partest NEJ JA putchar
Korsvis kommunikation med paritetskontroll start:callinitserie# initera serieportar vid behov gettst:callgetcharx# 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 callsendchar# sänd sedan ett tecken rectst:callreccharx# tecken mottaget från kommunikationslänk? bltr2, r0, gettst# om inte: hopp till gettst movr4, r2# annars: kontrollera checksumma callpartest movr4, r2 call putchar# skriv slutligen ett tecken till skärmen brgettst# och loopa
Hardware Timer ● Används för exaktare tidmätning ● alt1: Counter räknar upp från 0 till value ● alt2: Counter räknar ner från value till 0 ● när Counter räknat klart kallas det Time-Out ● Vid Time-Out ettställs en vippa vars värde finns tillgängligt för program och elektriskt ● Vippan kan nollställas (hur?)
Counter som räknar Flödesschema för väntan entry return TimeOut=1? Read TimeOut YES NO Clear TimeOut Wait for Time-Out Action & Acknowledgement !
Flödesschema DELAY med PROGRAM-LOOP N := startN := N - 1 N = 0 ? IN-hopp UT-hopp JA NEJ K := millisek K := K - 1 K = 0 ? IN-hopp UT-hopp JA NEJ Byt ut program-loop mot timer-loop Program-loop 1 millisekund Laboration 1 IN-parameter i r4
Flödesschema DELAY med TIMER K := K - 1 K = 0 ? IN-hopp UT-hopp JA NEJ entry return TimeOut=1? Clear TimeOut Read TimeOut YES NO Timer-loop 1 millisekund K := millisek Laboration 2 IN-parameter i r4
Timer med Counter som räknar ner Counter laddas med period Counter minskas med ett vid klockflank Counter=0 medför ettställ Time-Out Counter laddas om vid Time-Out period kan väljas med program
Timer Statusvippa Time-Out Statusvippa som kallas Time-Out ● ettställs vid Time-Out kan pollas av program ● ska nollställas av program tillgänglig som elektrisk signal
Timer Statusvippa Run Statusvippa som kallas Run ettställs av program nollställs av program kan pollas av program tillgänglig som elektrisk signal ?
Nios Timer Hårdvaru-figur counter clock period copy write from program run start time-out Q Q’ D cl set clear stop zero snap-shot read from program copy load Q Q’ D cl from program read from program
Nios Timer Memory Mapped Addresses 0x820 0x824 0x828 0x82C 0x830 0x834 0x838 0x83C
0x820 status 0x824 control 0x828 periodl 0x82C periodh 0x830 snapl 0x834 snaph Nios Timer Status / Control etc run TO Time-Out ITO cont start stop 15 0
Nios Timer Hokus Pokus TO - Time Out, bit 0 på adress 0x820 run, bit 1 på adress 0x820 Clear Time Out, Write anything to 0x820 Continous Counting, ”set” bit 1 at 0x824 Start run,”set” bit 2 at 0x824 Stop Counting, ”set” bit 3 at 0x824 WR to snapshot, copy Counter to SnapShot (ej komplett information)
Serieport Parallella data in Parallella data ut skiftregister Seriell kabel skiftregister SändareMottagare
Paritet i ett n-bitars ord jämn eller udda paritet ● Jämn paritet = jämnt antal ettor i ordet ● Udda paritet = udda antal ettor i ordet ● Feldetektering Detekterar alla ”udda-bits-fel” dvs om ett udda antal bitar har växlat värde ● Felkorrigering, hur då ??? ● Omsändning !!!
Paritetskontroll vid kommunikation ● 1-bits checksumma för varje 7-bits tecken ● Sändaren – kompletterar med en extra bit – bitens värde sätts så att det blir rätt paritet i det ord som sänds ● Mottagaren – kontrollerar att det är rätt paritet i det mottagna ordet
Kartbild av minnet ● AdressMEM / IO ● 0 - 7FFboot_monitor_rom ● Fled_pio ● Ftimer_0 ● Fbutton_pio ● Fdip-pio ● Fuart_0 (”main”) ● Fuart_1_debug ● FFFFsram, 256 kByte
Macro för en ny syntetisk instruktion.macroLOAD reg, addr MOVIA\reg, \addr LDW\reg, [\reg].endm Effekten av detta är att man kan använda en ny instruktion, LOAD %L0, 0x470 för att kopiera 32 bitar till %L0 från minnet på adress 0x470