ΜΑΘΗΜΑ: ΜΙΚΡΟΫΠΟΛΟΓΙΣΤΕΣ ΘΕΜΑΤΑ ΙΟΥΝΙΟΥ 2012 Καθηγητής: Νικολαΐδης Νικ. Ημ/νία εξέτασης: 28-6-2012 ΘΕΜΑ 1 (3,5 μονάδες) Σχεδιάστε το απλούστερο κύκλωμα για συνδεθεί μία ROM 16 ΚΒ σε έναν 8051: α) ως μνήμη προγράμματος και β) ως μνήμη δεδομένων. Με ποιες εντολές θα χρησιμοποιείται σε κάθε περίπτωση; Ποιες θα είναι οι βασικές διευθύνσεις και ποιες οι εικόνες τους; Προτείνετε έναν τρόπο περιορισμού των εικόνων χωρίς την προσθήκη επιπλέον εξαρτημάτων. Απάντηση Αφού δεν αναφέρεται άλλο περιφερειακό δε θα χρησιμοποιηθεί αποκωδικοποιητής διευθύνσεων και η ROM μπορεί να καταλαμβάνει όλο το διαθέσιμο χώρο διευθύνσεων. Για να συνδεθεί μία ROM ως μνήμη προγράμματος θα πρέπει να ενεργοποιείται από το!psen ενώ ως μνήμη δεδομένων θα πρέπει να ενεργοποιείται από το!rd. Όλοι οι υπόλοιποι ακροδέκτες συνδέονται κανονικά, δηλαδή ο διάδρομος δεδομένων στη θύρα Ρ0 και ο διάδρομος διευθύνσεων (γραμμές Α0-Α13, 2 14 =16 ΚΒ) στο address latch και στη θύρα Ρ2. 8051 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 EA RST VCC P0.0/ P0.1/ P0.2/ P0.3/ P0.4/ P0.5/ P0.6/ P0.7/ P2.0/ P2.1/ P2.2/0 P2.3/1 P2.4/ P2.5/ P2.6/4 P2.7/5 0 1 74HC573 D7 D6 D5 D4 D3 D2 D1 D0 LE OE Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0 0 1 ROM 16KB 0 1 D0 D1 D2 D3 D4 D5 D6 D7 OE CE X2 X1 GND ALE PSEN P3.6/WR P3.7/RD Για να διαβάσουμε τη μνήμη ως μνήμη προγράμματος θα χρησιμοποιήσουμε την εντολή MOVC είτε με τη χρήση του DPTR (MOVC A,@A+DPTR) είτε με τη χρήση του PC (MOVC A,@A+PC). Για να τη διαβάσουμε ως μνήμη δεδομένων θα χρησιμοποιήσουμε την εντολή MOVX είτε μέσω του DPTR (MOVX A,@DPTR) είτε μέσω των R0/R1 (MOVX A,@Ri). Η μνήμη έχει μέγεθος 16 ΚΒ και καταλαμβάνει όλο το χώρο των 64 Κ. Άρα, θα έχει βασικές διευθύνσεις από 0000h μέχρι 3FFFh και τρεις εικόνες στις διευθύνσεις 4000h 7FFFh, 8000h BFFFh και C000h FFFFh. Οι διευθύνσεις αυτές μπορούν να βρεθούν και με τη χρήση του επόμενου πίνακα. Απαντήσεις θεμάτων Μικροϋπολογιστών Ιουνίου 2012 Νικολαΐδης Νικ. - 1 -
8 4 2 1 8 4 2 1 8 4 2 1 8 4 2 1 Α15 Α14 Α13 Α12 Α11 Α10 Α9 Α8 Α7 Α6 Α5 Α4 Α3 Α2 Α1 Α0 Βασικές Εικόνα Εικόνα Εικόνα 1 2 3 Χ Χ Δ δ Δ δ Δ δ δ δ δ δ δ δ δ δ 0000-3FFF 4000-7FFF 8000- BFFF C000- FFFF (XX=00) (XX=01) (XX=10) (X=11) Για να περιοριστούν οι εικόνες από τρεις σε μία αρκεί να συνδέσουμε τη γραμμή Α15 στη είσοδο!cε της ROM. 8 4 2 1 8 4 2 1 8 4 2 1 8 4 2 1 Α15 Α14 Α13 Α12 Α11 Α10 Α9 Α8 Α7 Α6 Α5 Α4 Α3 Α2 Α1 Α0 Βασικές Εικόνα 0 Χ δ δ δ δ δ δ δ δ δ δ δ δ δ Δ 0000-3FFF (X=0) 4000-7FFF (X=1) ΘΕΜΑ 2 (3,5 μονάδες) Να σχεδιαστεί ένας αποκωδικοποιητής διευθύνσεων: α) με κλασικά ψηφιακά κυκλώματα και β) με GAL16V8 με τα ακόλουθα χαρακτηριστικά. Να δέχεται εισόδους τις απαραίτητες γραμμές του διαδρόμου διευθύνσεων. Να ενεργοποιεί μία ROM 16 KB που να ξεκινάει από την 0000h, μία RAM 8 KB που να τελειώνει στην FFFFh, και τέσσερα περιφερειακά I/O των 2 ΚΒ και μία δεύτερη RAM 4 KB σε διευθύνσεις της επιλογής σας. Θεωρήστε ενιαίο χώρο διευθύνσεων. Απάντηση α) Σχεδίαση με κλασικά ψηφιακά κυκλώματα Όταν σχεδιάζουμε με κλασικά ψηφιακά κυκλώματα προσπαθούμε να κάνουμε οικονομία στα εξαρτήματα θυσιάζοντας διευθύνσεις σε εικόνες των συσκευών που θα συνδεθούν. Με τον τρόπο αυτό δημιουργούμε το απλούστερο κύκλωμα. Οι συσκευές που θα συνδεθούν είναι 7 σε πλήθος. Η μνήμη ROM, όμως, έχει μέγεθος μεγαλύτερο από το 1/8 των 64 Κ. Θα πρέπει, επομένως, ή να συνενώσουμε δύο διαμερίσματα σε ένα με μία πύλη AND σε δύο από τις εξόδους ενός αποκωδικοποιητή 3 σε 8 ή να χρησιμοποιήσουμε αποκωδικοποίηση δύο επιπέδων με δύο αποκωδικοποιητές από 2 σε 4. Στη συνέχεια παρουσιάζονται και οι δύο λύσεις. Προσοχή: και στις δύο λύσεις πρέπει να γίνει συγχρονισμός των περιφερειακών με τα σήματα!rd και!wr. Ο συγχρονισμός αυτός μπορεί να γίνει είτε με πύλες στις εξόδους των αποκωδικοποιητών είτε μέσω εισόδων των αποκωδικοποιητών. Η εκφώνηση δεν αναφέρει τίποτε σχετικό και, έτσι, δε θα ασχοληθούμε με το θέμα αυτό. Λύση 1 η (Αποκωδικοποιητής 3 σε 8 και πύλη AND) Οι διευθύνσεις που επιλέγονται για κάθε συσκευή με βάση την εκφώνηση είναι: Α 15 Α 14 Α 13 =000 001 010 011 100 101 110 111 0 1 2 3 4 5 6 7 8 9 A B C D E F ROM P1 P2 P3 P4 RAM2 RAM1 Απαντήσεις θεμάτων Μικροϋπολογιστών Ιουνίου 2012 Νικολαΐδης Νικ. - 2 -
Decoder 3 to 8 000 (0) 001 (1) 010 (2) 011 (3) 100 (4) 101 (5) 110 (6) 111 (7) ROM P1 P2 P3 P4 RAM2 RAM1 5 4 Λύση 2 η (Δύο αποκωδ/τές από 2 σε 4) Οι διευθύνσεις που επιλέγονται για κάθε συσκευή με βάση την εκφώνηση είναι: Α 15 Α 14 00 01 10 11 1 ο ψηφίο hex 0 1 2 3 4 5 6 7 8 9 A B C D E F ROM Περιφερειακά RAM2 RAM1 Α 15 Α 14 Α 13 Α 12 0100 0101 0110 0111 1 ο ψηφίο hex 4 5 6 7 P1 Ρ2 P3 Ρ4 CS Decoder 00 (0) 01 (1) ROM CS Decoder 00 (0) 01 (1) P1 P2 2 to 4 10 (2) RAM2 2 to 4 10 (2) P3 11 (3) RAM1 11 (3) P4 5 4 Η δεύτερη αυτή λύση είναι προτιμότερη επειδή χρησιμοποιεί μόνο ένα ολοκληρωμένο, έναν διπλό αποκωδικοποιητή από 2 σε 4. β)σχεδίαση με GAL Όταν σχεδιάζουμε με GAL προσπαθούμε να την αξιοποιήσουμε όσο γίνεται περισσότερο ώστε να έχουμε τις λιγότερες εικόνες των συσκευών που θα συνδέσουμε. Από την 16V8 χρειαζόμαστε 7 εξόδους και περισσεύουν 11 γραμμές ως είσοδοι. Το μικρότερο απαιτούμενο διαμέρισμα είναι αυτό των περιφερειακών και έχει μέγεθος 2 ΚΒ. Για την αποκωδικοποίησή του απαιτούνται 5 γραμμές διεύθυνσης, τις Α15 μέχρι Α11. Άρα, στην GAL περισσεύουν 6 γραμμές που θα μείνουν ασύνδετες. Απαντήσεις θεμάτων Μικροϋπολογιστών Ιουνίου 2012 Νικολαΐδης Νικ. - 3 -
Οι διευθύνσεις που επιλέγονται, με βάση την εκφώνηση, είναι μόνον οι απαραίτητες για κάθε συσκευή. Τώρα δεν έχουμε λόγο να προσέξουμε τα διαμερίσματα που θα καταλάβουν οι συσκευές. Μπορούν να χρησιμοποιηθούν οποιαδήποτε μπλοκ των 2 ΚΒ. Το πρόγραμμα σε CUPL θα είναι: Device g16v8as; Name AddressDec; /** Inputs **/ Pin 1 = 5; Pin 2 = 4; Pin 3 = ; Pin 4 = ; Pin 5 = 1; /** Outputs **/ Pin 15 = ROM; Pin 16 = RAM1; Pin 14 = RAM2; Pin 17 = Per1; Pin 13 = Per2; Pin 18 = Per3; Pin 12 = Per4; Hex 5 α/α Συσκευή Αρχική Τελική Αρχική Τελική 1 ROM 0000 3FFF 0000.0000 0011.1111 2 Per 1 4000 47FF 0100.0000 0100.0111 3 Per 2 4800 4FFF 0100.1000 0100.1111 4 Per 3 5000 57FF 1001.0000 1001.0111 5 Per 4 5800 5FFF 1001.1000 1001.1111 6 RAM 2 D000 DFFF 1101.0000 1101.1111 7 RAM 1 E000 FFFF 1110.0000 1111.1111 /** Logic Equations **/ FIELD address = [5..1] ;!ROM = address:'h'[0000..3fff];!ram1 = address:'h'[d000..dfff];!ram2 = address:'h'[e000..ffff];!per1 = address:'h'[4000..47ff];!per2 = address:'h'[4800..4fff];!per3 = address:'h'[5000..57ff];!per4 = address:'h'[5800..5fff]; ΘΕΜΑ 3 (3 μονάδες) α) Ποιοι προσημασμένοι αριθμοί του κώδικα BCD μπορούν να παρασταθούν σε 2 bytes; Πώς θα γίνεται η αντιστροφή προσήμου των αριθμών αυτών; β) Γράψτε μία ρουτίνα που να αντιστρέφει το πρόσημο του αριθμού του κώδικα BCD των 4 nibbles που δείχνει ο R0. Το αποτέλεσμα να φυλάγεται στις θέσεις RESULT. γ) Με χρήση της προηγούμενης υπορουτίνας, γράψτε ένα πρόγραμμα που να αφαιρεί τους BCD αριθμούς των 16 bits των θέσεων NUMA και NUMB. Το αποτέλεσμα να φυλάγεται και πάλι στις θέσεις RESULT. Να γίνει, δηλαδή, η αφαίρεση RESULT = NUMA NUMB. Απαντήσεις θεμάτων Μικροϋπολογιστών Ιουνίου 2012 Νικολαΐδης Νικ. - 4 -
Απάντηση α) Οι απροσήμαστοι αριθμοί του κώδικα BCD που μπορούν να παρασταθούν σε 2 bytes είναι 10000 (από 0000 μέχρι 9999). Ως προσημασμένοι θα είναι οι μισοί θετικοί και οι μισοί αρνητικοί. Άρα, οι αριθμοί του κώδικα BCD που μπορούν να παρασταθούν σε 2 bytes είναι από -5000 μέχρι 4999. Για τη μετατροπή προσθέτουμε και αφαιρούμε το 10 4, όπου 10 η βάση του συστήματος αρίθμησης και 4 το πλήθος των ψηφίων. Μπορούμε, ακόμη, να πάρουμε το συμπλήρωμα ως προς 9 και να προσθέσουμε τη μονάδα. Η δεύτερη αυτή μέθοδος χρησιμοποιείται στην επόμενη ρουτίνα επειδή δίνει απλούστερο πρόγραμμα. β) Η ρουτίνα που αντιστρέφει το πρόσημο του αριθμού παίρνει το συμπλήρωμα ως προς 9 του αριθμού και τον αυξάνει κατά 1. BCDCPL: MOV A,#99h ;Συμπλήρωμα ως προς 9 των 2 CLR C ;ψηφίων, χιλιάδων και εκατοντάδων SUBB A,@R0 INC R0 MOV A,#99h ;Συμπλήρωμα ως προς 9 των 2 CLR C ;ψηφίων, δεκάδων και μονάδων SUBB A,@R0 DEC R0 ;Επαναφέρουμε τον R0 στην αρχική του τιμή MOV A,RESULT+1 ;Συμπλήρωμα ως προς 10 = ADD A,#1 ; = συμπλήρωμα ως προς 9 συν 1 MOV A,RESULT ADDC A,#0 RET γ) Το κυρίως πρόγραμμα καλεί την προηγούμενη ρουτίνα για να αντιστρέψει το πρόσημο του NUMB και, στη συνέχεια, κάνει πρόσθεση του NUMA με το NUMB. MOV R0,#NUMB CALL BCDCPL MOV A,NUMA+1 ADD A,RESULT+1 ;Αντιστροφή πρόσημου του NUMB ;RESULT <-- -NUMB ;RESULT <-- NUMA + (-NUMB) MOV A,NUMA ADDC A,RESULT JMP $ Απαντήσεις θεμάτων Μικροϋπολογιστών Ιουνίου 2012 Νικολαΐδης Νικ. - 5 -