Τμήμα Επιστήμης Υπολογιστών - Άσκηση 12: Ο Απλός...
Transcript of Τμήμα Επιστήμης Υπολογιστών - Άσκηση 12: Ο Απλός...
Άσκηση12:ΟΑπλόςΥπολογιστήςστονΠροσομοιωτή
(μέροςΒ’)
012c(Άσκηση12) – 25- 29 Ιαν.2021– ΜανόληςΚατεβαίνης
©copyrightUniversityofCrete– https://www.csd.uoc.gr/~hy120/20f/copyright.html
Πανεπ.Κρήτης– Τμ.Επ.Υπολογιστών– ΗΥ-120ΨηφιακήΣχεδίαση
Προοίμιο:Πρωτοβουλίες/παραλλαγέςευπρόσδεκτες• ΣτηνεκφώνησηαυτήπαρουσιάζεταιέναςδυνατόςτρόποςναφτιαχτείέναςαπλόςυπολογιστήςσανεκείνοντουμαθήματοςκαιτουΕργαστηρίουστοCircuitVerse,όμωςπροφανώςυπάρχουνκιάλλοι
• Είστεευπρόσδεκτοινακάνετετηδικήσαςπαραλλαγήηπρόταση• Καλέςιδέεςαπόδικέςσαςπαραλλαγές/προτάσειςθαεξεταστούνγιάπιθανήενσωμάτωσηστηνεκφώνησητηςεπόμενηςχρονιάς
• Καινοτομίεςαπόπλευράςσαςθαεκτιμηθούνβαθμολογικάθετικά(αρκείηπαραλλαγήσαςναμηναφαιρείαπότονυπολογιστήκάποιαουσιαστικήδυνατότητα,όπωςδομέςδεδομένων,επιστροφήαπόδιαδικασίες,κλπ)
• ΗεντολήJumpεδώέχειδιαφορετικόνOpcodeαπ’ό,τιείχεστηνΆσκ.11• Ηεντολήjumpx δεν ανήκειστηνομάδα“Indexed αριθμητικής/ld/st/inp”
2012c-Άσκηση12:οΑπλόςΥπολογιστήςστονΠροσομοιωτή(μέροςΒ')-ΗΥ-120©U.Crete
ΣημείωσηγιάτονέοUserInterfaceτουCircuitVerse• Τοcircuitverse.org/simulator απέκτησενέοUserInterface• Μοιάζειναέχει(τουλάχιστον)έναbugστοSaveOffline– ότανέχειπολλάprojectsαποθηκευμένακαιγεμίζεικατακόρυφατομενούOpenOffline,(α)χαλάειτοUI,και (β)κάθενέοsaveσβήνεικαι πανωγράφειτοτελευταίοproject.Επίσης,δενδουλεύειτοdeletepreviouslysavedproject(γιάναξαλαφρώσειτοσχετικόμενού)
• ΤοπαλαιόUserInterface,πουμοιάζειναδουλεύεικαλά,βρισκεταιστο:https://circuitverse.org/simulator_old– οιSplittersστηνεδώεκφώνησηείναιαπότοπαλαιόUserInterf.καιαριθμούνταbitsλανθασμένα(+1στηνθέσητουτελικούbit)– καιτοfontσταPropertiesείναιμαύροπάνωσεμαύροL
3012c-Άσκηση12:οΑπλόςΥπολογιστήςστονΠροσομοιωτή(μέροςΒ')-ΗΥ-120©U.Crete
ΑλλαγέςαπόΆσκ.11:μόνονεπάνω,δεξιά&αριστερά• Δεξιάπλευρά,πάνωαπότονΣυσσωρευτή(ACC):– accLd:γράφουμεστονACCσεόλεςτιςάλλεςπεριπτώσειςεκτός:st/inp(dmWr),CTI (br/jmp),καιτονπρώτοκύκλοτωνIndexed– condition:συνδυαστικήσυνάρτησητουπεριεχομένουτουACC:• τοaluMd επιλέγει:=accZero,ή=accSign,ήτααντίθετάτους,ή=1
• Αριστερήπλευρά,πάνωαπότηΜνήμηΕντολών(IMEM):– flip-flopκατάστασηςS• Xfirst:ανάβει(μόνον)κατάτον1ο κύκλοτωνIndexed ALU/ld/st/inp• Xsecond:ανάβει(μόνο)τον2ο κύκλοτωνIndexed ALU/ld/st/inp
– busSrc:ότανXfirst,τοαλλάζουμεσε01(δηλ.dmRd), μέσωmux– pcMd,pcLd,addrMd:νέες,ενημερωμένεςσυναρτήσεις
5012c-Άσκηση12:οΑπλόςΥπολογιστήςστονΠροσομοιωτή(μέροςΒ')-ΗΥ-120©U.Crete
ΣήματαελέγχουACC&BUS• busSrc_Effective:είτετοbusSrc όπωςτοδίνειηεντολή,είτεοκωδικός01πουτονχρειαζό-μαστετον1ο κύκλοτωνεντολώνIndexed
• dmWr:γράφουνστημνήμηδεδομένωνμόνονοιεντολέςstore καιinput,δηλαδήαυτέςπουανάβουντοacc2bus ήτοext2bus
• accLd =not (dmWr or CTI or Xfirst)– γράφουμεστονACC σεόλεςτιςάλλεςπεριπτώ-σειςεκτόςstore/inp (dmWr), εκτόςbranch/jmp(CTI),καιεκτόςτονπρώτοκύκλοτωνIndexed
• condition:συνδυαστικήσυνάρτησητουΣυσσωρευτή(ACC) καιτουaluMd– βλ.επόμενηδιαφάνεια
6012c-Άσκηση12:οΑπλόςΥπολογιστήςστονΠροσομοιωτή(μέροςΒ')-ΗΥ-120©U.Crete
Condition: συνθήκηδιακλαδώσεων• ΤόσοηALUόσοκαιτοCondition,ωςσυνδυαστικάκυκλώματα,πάντακάτιυπολογίζουνκαθένα,αλλά:– ΤοConditionχρησιμοποιείταιμόνονότανCTI==1,αλλάτότεaccLd==0καιηέξοδοςτηςALUαγνοείται
– ΗέξοδοςτηςALUχρησιμοποιείταιμόνονότανaccLd==1,αλλάτότεCTI==0καιάρατοConditionαγνοείται
• ΤοMSbitτουaluMd,ότανείναι1,προκαλείcond=1ανεξαρτήτωςτιμήςτουACC,άραχρησιμεύειγιάταάλματαχωρίςσυνθήκη(jump καιjumpx)– Οιjmp &jmpx εκτελούνταιμεακριβώςτονίδιοτρόποκαιοιδύο,εκτόςim2bus γιάjmp,ενώdmRd γιάjmpx
• ΤομεσαίοbitτουaluMd επιλέγει,μέσωπολυπλέ-κτη,ανθακοιτάξουμετοaccZero ήτοaccSign
• ΤοLSbitτουaluMd επιλέγειανθαθεωρηθείεπιτυ-χίαηθετικήήηαρνητικήπολικότητατωνπαραπάνω
7012c-Άσκηση12:οΑπλόςΥπολογιστήςστονΠροσομοιωτή(μέροςΒ')-ΗΥ-120©U.Crete
Opcode1bit 1bit 2bits 1bit 3bits
X CTI busSrc passB aluMode
8012c-Άσκηση12:οΑπλόςΥπολογιστήςστονΠροσομοιωτή(μέροςΒ')-ΗΥ-120©U.Crete
IndexedALU/load/store/inp(indirectDMEMaccess)
ControlTransfer
Instruction(branch/jump(x))
aluMd ALUout cond000 0 A&B =accZero001 1 A|B = ~accZero010 2 A+B =accSign011 3 ??? =~accSign100 4 A&(~B) alwaystrue101 5 A|(~B) alwaystrue110 6 A- B alwaystrue111 7 SLT alwaystrue(ίδιαμεCircuitVrs)
busSrc enable00 0 im2bus01 1 dmRd10 2 acc2bus11 3 ext2bus
9012c-Άσκηση12:οΑπλόςΥπολογιστήςστονΠροσομοιωτή(μέροςΒ')-ΗΥ-120©U.Crete
1b 1b 2b 1b 3bits
X CTI busSrc passB aluMode
ΚυρίωςΈλεγχος
ΕντολέςCTI
10012c-Άσκηση12:οΑπλόςΥπολογιστήςστονΠροσομοιωτή(μέροςΒ')-ΗΥ-120©U.Crete
• CTI=ControlTransferInstru-ction(εντολήμτφ.ελέγχου),δηλ.διακλάδωσηήάλμα
• pcMd =CTI and Condition• ΥπόλοιπεςεντολέςεκτόςCTI:CTI==0,άραpcMd =0,άραοπολυπλέκτηςστηνείσοδοτουPCτροφοδοτείταιαπότοναυξητήPC+1
• ΑποτυχημένεςΔιακλαδώσεις:CTI==1,αλλάCondition==0,οπότεpcMd =0,επομένωςκαιπάλιPC← PC+1,αφούησυνθήκητηςδιακλάδωσηςήτανψευδής
• ΕπιτυχημένεςΔιακλαδώσεις:CTI==1καιCondition==1,επομένωςpcMd =1,άραο πολυπλέκτηςστηνείσοδοτουPC τροφοδοτείταιαπότο BUS– jmp &jmpx είναισανπάντοτεεπιτυχ.branch,επειδήaluMd επιλέγειπάνταCond =1
• CTI==1προκαλείCTI_or_Xfirst =1προςταδεξιά,γιάνασβήσειτοaccLd
Indexed: 1ος κύκλος
11012c-Άσκηση12:οΑπλόςΥπολογιστήςστονΠροσομοιωτή(μέροςΒ')-ΗΥ-120©U.Crete
• ΤοMSbitτουOpcode,X,σηματοδοτείτιςεντολέςALU,load,store,ήinputπουείναιIndexed – ηεντ.jumpx δεν είναισεαυτές
• Γιάτηναρχικοποίησητουstatebit,S,βλ.επόμ.διαφ.
• ΓιάτιςεντολέςαυτέςόπουX==1,τονπρώτοκύκλορολογιούτους,S==0,άραSbar==1,άραανάβειτοσήμαXfirst
• Xfirst==1, μέσωτουπολυπλέκτηδεξιά,δίνει01δηλ.dmRd,ανεξαρτήτωςτουπεδίουbusSrcτουOpcode, γιάανάγνωσητηςδιεύθυνσηςτουτελεστέου
• Xfirst==1,αριστερά,δίνειpcLd=0γιάναμείνειοPCαμτβλ.στηνίδιαεντολή• Xfirst==1,αριστερά,δίνειεπόμενηκατάστασηnxtS=1γιάτον2ο κύκλο
Indexed: 2ος κύκλος
12012c-Άσκηση12:οΑπλόςΥπολογιστήςστονΠροσομοιωτή(μέροςΒ')-ΗΥ-120©U.Crete
• ΓιάτιςεντολέςαυτέςμεX==1,τονδεύτεροκύκλοτους,S==1,άραανάβειτοσήμαXsecond
• ΤοXsecond επηρεάζειμόνοντοσήμαaddrMd,άραστρίβειτονπολυπλέκτητηςδιεύθυν-σηςτηςDMEM προςτονTMP,ενώσεόλεςτιςάλλεςπεριπτώσειςαυτόςήταναπότοπεδίοiaddr τηςεντολής
• Απόόλεςτιςάλλεςαπόψεις,ηεντολήεκτελείταιπανομοιότυπαμετιςκανονικέςεντολέςALU/load/store/input,καιnxtS =0καιpcLd =1 όπωςγιάτιςυπόλοιπεςεντ.
• Γιάόλεςτιςυπόλοιπεςεντολές,X==0,επομένωςXfirst =Xsecond =0,καιτοbitκατάστασης,S,αγνοείται.Έτσι,nxtS =0καιpcLd =1,άραπάντααλλάζουντονPCπηγαίνονταςστηνεπόμενηεντολή,καιπάνταS==0όταναρχίζειηεπόμενηεντολή– Κανονικά,τοResetέπρεπεναπηγαίνεικαιστοS,αλλάεάνηπρώτηεντολήδενείναιIndexedτότεαυτήθααγνοήσειτοS,καιθακάνειnxtS=0,δηλ.σωστάγιάτηνεπόμενη
ΕντολέςALU/load/store/inputImmediate&Κανονικές
13012c-Άσκηση12:οΑπλόςΥπολογιστήςστονΠροσομοιωτή(μέροςΒ')-ΗΥ-120©U.Crete
Opcode Opcode/controlfields(binary)Λειτουργία
Assembly Hex X CTI busSrc passB aluModeandi 00
0 0 00(im2bus)
0
000 ACC← ACC&iaddr (andimmed.)
ori 01 001 ACC← ACC| iaddr (orimmediate)
addi 02 010 ACC← ACC+iaddr (addimmed.)
subi 06 110 ACC← ACC- iaddr (sub immed.)
ldi 08 1 xxx ACC← iaddr (loadimmediate)
and 10
0 0 01(dmRd)
0
000 ACC← ACC&DM[iaddr] (and)
or 11 001 ACC← ACC| DM[iaddr] (or)
add 12 010 ACC← ACC+DM[iaddr] (add)
sub 16 110 ACC← ACC- DM[iaddr] (subtract)
ld 18 1 xxx ACC← DM[iaddr] (load)st 20 0 0 10(acc2bus) x xxx DM[iaddr]← ACC (store)inp 30 11(ext2bus) x xxx DM[iaddr]← Ext_kbd_in (input)
Εντολές CTIκαιIndexedALU/load/store/input
14012c-Άσκηση12:οΑπλόςΥπολογιστήςστονΠροσομοιωτή(μέροςΒ')-ΗΥ-120©U.Crete
Opcode Opcode/controlfields(binary) ΛειτουργίαAssembly Hex X CTI busSrc passB aluModebeq 40
0 100
(im2bus)x
000 if (accZero)then PC← iaddrbne 41 001 if (not accZero)then PC← iaddrblt 42 010 if (accSign)then PC← iaddrbge 43 011 if (not accSign)then PC← iaddrjmp 44 x 1xx PC← iaddr (unconditionaljump)jmpx 54 01(dmRd) x 1xx PC← DM[iaddr] (jumpindexed)andx 90
1 0 01(dmRd)
0
000 ACC← ACC&DM[DM[iaddr]] (and)orx 91 001 ACC← ACC| DM[DM[iaddr]] (or)addx 92 010 ACC← ACC+DM[DM[[iaddr]] (add)subx 96 110 ACC← ACC– DM[DM[iaddr]] (sub)ldx 98 1 xxx ACC← DM[DM[iaddr]] (loadindx)stx A0 1 0 10(acc2bus) x xxx DM[DM[iaddr]]← ACC (storeindx)inpx B0 11(ext2bus) x xxx DM[DM[iaddr]]← Ext_kbd_in
Παράδειγμα 1: ΑρχικοποίησηDMEMAssembly: Instr.Mem.
00: inp p (00) 00: 30 00loop→ 01: inpx *p(00) 01: B0 00
02: ld p (00) 02: 18 0003: addi 1 03: 02 0104: st p (00) 04: 20 0005: subi 10 05: 06 1006: blt 01 (loop) 06: 42 01
15012c-Άσκηση12:οΑπλόςΥπολογιστήςστονΠροσομοιωτή(μέροςΒ')-ΗΥ-120©U.Crete
p=input();do{
*p=input();p++;
} while (p<0x10);
DataMem.
00: p01:
• Ηinp στο00διαβάζειαπότοπληκτρολόγιοτηδιεύθυνσητηςπρώτηςθέσηςτηςDMEMπουθέλουμενααρχικοποιήσουμε
• Στο01αρχικοποιούμεαπόπληκτρολόγιοεκείπουδείχνειοp• Στο06επαναλαμβάνουμεμέχρικαιτηθέση0FτηςDMEM
Παράδειγμα2:ΒρόχοςδιπλασιασμούστοιχείωνπίνακαAssembly: Instr.Mem.
07: inp n(01) 07: 30 0108: ldi 0 08: 08 0009: st i(02) 09: 20 02
loop→ 0a: ld i(02) 0a: 18 020b: sub n(01) 0b: 16 010c: bge exit(17) 0c: 43 170d: ldi a(08) 0d: 08 080e: add i (02) 0e: 12 020f: st p(00) 0f: 20 0010: ldx *p(00) 10: 98 0011: addx *p(00) 11: 92 0012: stx *p(00) 12: A0 0013: ld i(02) 13: 18 0214: addi 1 14: 02 0115: st i(02) 15: 20 0216: jmp loop(0a) 16: 44 0a
16012c-Άσκηση12:οΑπλόςΥπολογιστήςστονΠροσομοιωτή(μέροςΒ')-ΗΥ-120©U.Crete
n=input();i=0;while(i<n){
a[i]=a[i]+a[i];i=i+1;
} DataMem.
00: p01: n02: i
…08: a[0]09: a[1]0a: a[2]0b: a[3]0c: a[4]
ΗΜνήμηΕντολώνμεταδύοαυτάπαραδείγματα
17012c-Άσκηση12:οΑπλόςΥπολογιστήςστονΠροσομοιωτή(μέροςΒ')-ΗΥ-120©U.Crete
Στιςδύοεπό-μενεςθέσεις,17-18,είναιοιεντολές:17: inp0318:jmpx03ώστεναδιαβάζειέναναριθμό–διεύθυνσηεντο-λήςαπότοπληκ-τρολόγιοκαιναπηδάεισεαυτήτηδιεύθυνση(αυτόείναικαιtestτηςjmpx)
Τιέχετενακάνετε1. Μελετήστεκαικαταλάβετετηνεκφώνηση2. ΤροποποιήστετοναπλόυπολογιστήσαςτηςΆσκησης11ώστε
αυτόςναυλοποιείκαιτιςνέεςεντολέςαυτήςεδώτηςάσκησης3. Κατανοήστεκαιελέγξτετησωστήεκτέλεσητωνδύοπαραδειγμά-
τωνπρογραμμάτωναπότιςδιαφάνειες15και164. Γράψτεκαιτρέξτε,καιμερικέςδικέςσαςεντολέςστιςθέσεις17-1F
ή19-1Fήκαι00-06,ήκάντεμιάδικήσαςπαραλλαγήτουβρόχουεπεξεργασίαςστοιχείωνπίνακα(«Παράδειγμα2»)
5. Αναφορά(PDF):– φωτογρ.κυκλώματόςσας&εξηγήσειςόπουδιαφέρειαπόεκφώνηση,– Assembly,binary,&εξηγήσειςγιάτιςεντολές/παραλλαγέςστο4παραπ.
18012c-Άσκηση12:οΑπλόςΥπολογιστήςστονΠροσομοιωτή(μέροςΒ')-ΗΥ-120©U.Crete