ΠΑΡΑ ΕΙΓΜΑ 8 ΓΕΝΝΗΤΡΙΑ ΨΕΥ ΟΤΥΧΑΙΩΝ ΑΡΙΘΜΩΝ (PSEUDORANDOM GENERATOR) 8. ΓΕΝΙΚΑ Στο παράδειγµα αυτό θα εξοµοιώσουµε ένα Hardware µοντέλο µιας ψευδοτυχαίας γεννήτριας αριθµών χρησιµοποιώντας τις εντολές προγραµµατισµού ενός µικροϋπολογιστή. Οι εντολές που θα χρησιµοποιηθούν είναι εντολές λογικών πράξεων (NOT, XOR, SHIFT) και µεταφοράς δεδοµένων. Στο Σχ. 8.1 έχουµε µια ψευδοτυχαία γεννήτρια αριθµών η οποία αποτελείται από ένα shift register των 8 bits ( - ) µε µια ανάδραση. Όταν εφαρµόζουµε παλµούς ρολογιού στην είσοδο Ck του shift register, µετακινούνται προς τα αριστερά τα bits του shift register ενώ η είσοδος D µετακινείται στη θέση. Έχουµε δηλαδή µετά από κάθε παλµό στο Ck, n 1 = Qn Q για n=1,2...6 και Q 4 = D = XOR(Q,Q ) όπου το συµβολίζει τη χρονική στιγµή µετά την εφαρµογή του παλµού. Με αυτό τον τρόπο, εφαρµόζοντας διαδοχικούς παλµούς στο Ck, παίρνουµε και διαδοχικά διαφορετικούς συνδυασµούς -, (pattern) κατά ένα "κάπως τυχαίο τρόπο". Μετά από ένα πεπερασµένο πλήθος παλµών επαναλαµβάνεται η ίδια ακολουθία διαδοχικών patterns, γι' αυτό και η γεννήτρια λέγεται "ψευδοτυχαία". Το ελάχιστο πλήθος των διαδοχικών µη περιοδικών patterns ονοµάζεται περίοδος της ψευδοτυχαίας γεννήτριας. Για την περίπτωση του Σχ. 8.1 η περίοδος της γεννήτριας είναι (21) 1 =(19) 16. 1
SHIFT REGISTER D CK CLOCK Σχ. 8. Ψευδοτυχαία Γεννήτρια (21) 1. 8.1 ΑΝΑΣΚΟΠΗΣΗ ΜΕΡΙΚΩΝ ΕΝΤΟΛΩΝ ΤΟΥ 88/85 Πριν παρουσιάσουµε το πρόγραµµα που θα εξοµοιώσει την παραπάνω ψευδοτυχαία γεννήτρια θα εξηγήσουµε τις εντολές (Rotate left), RAL (Rotate left Through carry), MVI r, DATA MOV r 1, r 2 των µικροπρόσεσορς 88 ή 885. Με τις εντολές MOV r 1, r 2, όπου r = A,B,C,D,E,H,L είναι ένας από τους καταχωρητές του 88 ή 885, µεταφέρουµε το περιεχόµενο του καταχωρητή r 2 στον καταχωρητή r 1.Το περιεχόµενο του καταχωρητή r 2 παραµένει αµετάβλητο. Οι εντολές αυτές είναι εντολές ενός byte. Αντιθέτως οι εντολές MVI r, DATA είναι εντολές που χρειάζονται δύο bytes για να προσδιορισθούν πλήρως και µεταφέρουν το περιεχόµενο του δεύτερου byte στον καταχωρητή που προσδιορίζει ο κωδικός της εντολής, δηλαδή, το πρώτο byte. Έτσι MVI Β, 8H σηµαίνει "βάλε στον καταχωρητή Β τον αριθµό 8" και σε γλώσσα µηχανής το µνηµονικό MVI Β, 8Η γίνεται 6, 8. Οι εντολές και RAL απεικονίζονται στο Σχ. 8.2. Η µεν (Rotate left) µετακινεί το περιεχόµενο του Accumulator (A) µια θέση προς τα αριστερά, ενώ το Bit το πηγαίνει στο carry και στο Bit, η δε RAL (Rotate left Through carry), µεταχειρίζεται το carry σαν ένατο bit του Accumulator µετακινεί κυκλικά προς τα αριστερά όλα τα bit του Accumulator µαζί µε το carry. 2
CY CY RAL CY CY RRC RAR Σχ. 8.2 Σχηµατική παράσταση των εντολών, RRC, RAL, RAR Επίσης οι εντολές που κάνουν λογικές πράξεις χρησιµοποιούν σαν παραµέτρους το περιεχόµενο του Accumulator και το περιεχόµενο ενός καταχωρητή r, ή µιας θέσης µνήµης Μ, ή ενός byte δεδοµένων που ακολουθεί τον κωδικό της εντολής. Το αποτέλεσµα της πράξης τελικά τίθεται στον Accumulator. Έτσι µετά τη λογική πράξη ο Accumulator περιέχει το αποτέλεσµα ενώ το προηγούµενο περιεχόµενο (η µια από τις δύο παραµέτρους) χάνεται. Μόνο οι πράξεις "σύγκρινε", δηλαδή οι εντολές CMP r, CPI (data), αφήνουν τον Accumulator αµετάβλητο. Οι εντολές λογικών πράξεων που περιέχονται στο ρεπερτόριο των εντολών του 88 ή 885 είναι, ORA r ;(Α) OR (r) (Α) ANA r ;(Α) AND (r) (Α) XRA r ;(Α) XOR (r) (Α) ORI DATA ;(Α) OR (DATA (Α) ANI DATA ;(Α) AND (DATA) (Α) XRI DATA ;(Α) XOR (DATA) (Α) CPI DATA CMP r RAL RAR RRC ;(Α) COMPARE (DATA) ;(Α) COMPARE (r) CMA ;NOT (A) (Α) STC CMC ;CY=1 ;NOT (CY) (CY) όπου r = A,B,C,D,E,H,L, και αν r=m τότε (r) = ((H)(L)) 3
8.2 SOFTWARE ΜΟΝΤΕΛΟ ΤΗΣ ΨΕΥ ΟΤΥΧΑΙΑΣ ΓΕΝΝΗΤΡΙΑΣ Για να έλθουµε στην εξοµοίωση της ψευδοτυχαίας γεννήτριας, ας υποθέσουµε ότι στον καταχωρητή Β του 88 βάζουµε τους διαδοχικούς τυχαίους αριθµούς και στον Accumulator τα ενδιάµεσα αποτελέσµατα µέχρι να πάρουµε τον επόµενο τυχαίο αριθµό. Επίσης ας χρησιµοποιήσουµε και το CY για να αποθηκεύσουµε το αποτέλεσµα της ανάδρασης Q Q 4. Στο Σχ. 8.3 φαίνονται σχηµατικά οι διάφορες φάσεις από τις οποίες πρέπει να περάσει ο µικροϋπολογιστής για να µας δώσει τους διαδοχικούς τυχαίους αριθµούς. Επίσης, κάθε φορά που ο 4
CY Accumulator Register B X X X X X X X X X X X X X X X X X X X X X X X X X X 1 MVI B,Q o X Q 2 MOV A,B 3 4 5 6 XRA B X * * * * * * * CMA X * * * * * * * Q * * * * * * * X 8 Q 9 MOV A,B 1 RAL Q 11 MOV B,A 12 OUT O1 13 WAIT 1s 2 ΣΧ. 8.3 Software µοντέλο της ψευδοτυχαίας γεννήτριας 5
µικροϋπολογιστής υπολογίζει και ένα τυχαίο αριθµό, τον δείχνει στη θύρα 1, περιµένει 1 sec και µετά υπολογίζει τον επόµενο ψευδοτυχαίο αριθµό. Στη συνέχεια θα περιγράψουµε τα βήµατα που φαίνονται στο Σχ. 8.3 και µετά θα δώσουµε το πρόγραµµα µαζί µε την µετάφρασή του σε γλώσσα µηχανής που θα πρέπει να τοποθετηθεί στον υπολογιστή. ΒΗΜΑ : ΒΗΜΑ 1: ΒΗΜΑ 2: ΒΗΜΑ 3,4,5: Ο accumulator, το CY και ο καταχωρητής B, περιέχουν άγνωστα bytes. Θέτουµε στον καταχωρητή Β την αρχική τιµή της ψευδοτυχαίας γεννήτριας. Έστω - =. Μεταφέρουµε τον τρέχοντα τυχαίο αριθµό στον Accumulator για να αρχίσουµε τον υπολογισµό του επόµενου τυχαίου αριθµού. Μετακινούµε προς τα αριστερά τρεις φορές τα bits του Accumulator, έτσι ώστε να φέρουµε το στη θέση του bit. ΒΗΜΑ 6: Εκτελούµε τη λογική πράξη XOR µεταξύ του Accumulator και του καταχωρητή Β. Έτσι στο Bit του Accumulator θα έχουµε, µετά τη λογική πράξη, το Q Q 4. ΒΗΜΑ : Εκτελούµε τη λογική πράξη ΝΟΤ επί του ΒΗΜΑ 8: ΒΗΜΑ 9: περιεχόµενου του Accumulator. Έτσι, µετά τη λογική πράξη, στο bit του Accumulator θα έχουµε Q Q 4. Αποθηκεύουµε προσωρινά το bit του Accumulator στο CY. Μεταφέρουµε, το περιεχόµενο του καταχωρητή Β (προηγούµενο τυχαίο αριθµό), στον Accumulator ΒΗΜΑ 1: Μετακινούµε κυκλικά µέσω του CY τον Accumulator έτσι ώστε τα n 1 = Qn Q και n=1,2,6 και Q 4 = CY = NOR Q Q. ΒΗΜΑ 11: Μεταφέρουµε τον νέο τυχαίο αριθµό που υπολογίσαµε στον καταχωρητή Β για να τον χρησιµο- 6
ποιήσουµε στον υπολογισµό του επόµενου τυχαίου αριθµού. ΒΗΜΑ 12: είχνουµε τον νέο τυχαίο αριθµό στη θύρα 1, όπου και αποθηκεύεται µόνιµα. ΒΗΜΑ 13: Περιµένουµε για ένα δευτερόλεπτο και ξαναρχίζουµε τον υπολογισµό του επόµενου τυχαίου αριθµού από το Βήµα 2. ;SOFTWARE ΜΟΝΤΕΛΟ ΓΙΑ ΨΕΥ ΟΤΥΧΑΙΑ ΓΕΝΝΗΤΡΙΑ ΠΕΡΙΟ ΟΥ=21 1. ;ΚΑΤΑΧΩΡΗΤΕΣ ΠΟΥ ΕΠΗΡΕΑΖΟΝΤΑΙ:Β, Α, Flags. ;ΥΠΟΡΟΥΤΙΝΕΣ ΠΟΥ ΧΡΗΣΙΜΟΠΟΙΟΥΝΤΑΙ:(OPTION) DELAY. ;ΚΑΤΑΧΩΡΗΤΕΣ Β: ΑΠΟΘΗΚΕΥΕΙ ΤΡΕΧΟΝΤΑ ΤΥΧΑΙΟ ΑΡΙΘΜΟ. a b c d * 2 6 22 8 RAND: 23 24 25 26 A8 2 2F 28 29 8 2A 1 2B 4 2C D31 2E CDXXXX 211 C322 ORG 2H MVI B, MOV A,B XRA B CMA MOV A,B RAL MON B,A OUT 1 CALL DELAY JMP RAND ;ΘΕΣΕ ΑΡΧΙΚΗ ΤΙΜΗ ΓΕΝΝ. Η ; ;ΦΕΡΕ Q 4 στο Bit ; " ; " ;BIT ΤΟΥ Α = Q 4 Q ;BIT ΤΟΥ Α = NOT( Q Q 4 ) ;ΑΠΟΘΗΚΕΥΣΕ ΣΤΟ CY ΤΟ NOT ;( Q Q 4 ) ;ΦΕΡΕ Q - ΣΤΟΝ Α ;(Α) = ΝΕΟΣ ΤΥΧ. ΑΡΙΘΜΟΣ ;ΦΕΡΕ ΣΤΟΝ Β ΤΟΝ ΝΕΟ ΤΥΧ. ΑΡΙΘΜΟ ; ΕΙΞΕ ΤΟΝ ΝΕΟ ΑΡΙΘΜΟ ΣΤΟ PORT 1 ;ΠΕΡΙΜΕΝΕ 1 SEC ;ΥΠΟΛΟΓΙΣΕ ΝΕΟ ΤΥΧ. ΑΡΙΘΜΟ * Βλέπε σηµείωση στο τέλος του παραδείγµατος Άσκηση 8.1. Να γραφτεί ένα πρόγραµµα σε γλώσσα Assembly και να µεταφρασθεί σε γλώσσα µηχανής το όποιο να τυπώνει όλες τις διαδοχικές καταστάσεις µιας περιόδου της ψευδοτυχαίας γεννήτριας του Σχ. 8.1. Επίσης να δίνει στη θύρα 2 την περίοδο
της ψευδοτυχαίας γεννήτριας σε δεκαεξαδικό σύστηµα. Αρχική κατάσταση για την ψευδοτυχαία γεννήτρια είναι. Η αρχή του προγράµµατος τίθεται στη θέση 2 Η. Υπόµνηµα: Μπορείτε να χρησιµοποιήσετε την υπορουτίνα DISP η οποία είναι αποθηκευµένη στο monitor του µικροϋπολογιστικού συστήµατος SDK-85 µε αρχική διεύθυνση 3 και η οποία τυπώνει στο τηλέτυπο, που είναι συνδεδεµένο µε το σύστηµα, το περιεχόµενο του Accumulator. Η υπορουτίνα DISP χαλάει όλους τους registers της CPU, επίσης εάν έχει κληθεί διαδοχικά 18 φορές δίνει αυτόµατα ένα CR, LF στο τηλέτυπο. Για να µην χάσετε τα περιεχόµενα των βοηθητικών καταχωρητών της CPU, πριν καλέσετε την υπορουτίνα DISP, αποθηκεύστε τους καταχωρητές στο STACK του συστήµατος χρησιµοποιώντας κατάλληλα τις εντολές PUSH και, όταν επιστρέφεται από το STACK, ανακαλέστε τους καταχωρητές από το STACK µε τις εντολές POP. Μια γενική ανάλογη περίπτωση φαίνεται παρακάτω: PUSH PUSH PUSH *PUSH CALL *POP POP POP POP PSW B D H DISP H D B PSW Στο Σχ. 8.4 προτείνεται ένα flow-chart για την άσκηση 8.1. * Παρατηρήστε ότι ισχύει last-in-first-out. 8
ΑΡΧΗ ΑΡΧΙΚΗ ΚΑΤΑΣΤΑΣΗ ΓΕΝΝ. B,C ΑΠΑΡΙΘΜΗΤΗΣ ΠΕΡΙΟ ΟΥ D ΑΡΧΙΚΗ ΤΙΜΗ(D) = ΥΠΟΛΟΓΙΣΕ ΕΠΟΜΕΝΟ ΤΥΧΑΙΟ ΑΡΙΘΜΟ ΕΙΞΕ ΤΟ ΝΕΟ ΑΡΙΘΜΟ ΣΤΟ ΤΥΛΕΤΥΠΟ ΣΥΓΚΡΙΝΕ ΤΟ ΝΕΟ ΑΡΙΘΜΟ ΜΕ ΤΗΝ ΑΡΧΙΚΗ ΣΥΝΘΗΚΗ ΤΟΥ C ΕΙΞΕ ΤΗΝ ΠΕΡΙ- Ο Ο ΣΤΟ PORT 2 ΝΑΙ? = ΟΧΙ ΑΥΞΗΣΕ ΑΠΑΡΙΘΜΗΤΗ ΠΕΡΙΟ ΟΥ ΤΕΛΟΣ Σχ. 8.4 Flow chart άσκησης 1 Άσκηση 8.2. Υπολόγισε το χρόνο που χρειάζεται ο υπολογιστής για να δώσει ένα τυχαίο αριθµό εάν η διάρκεια των καταστάσεων του µικροπρόσεσορ είναι 5ns. Υπόµνηµα MOV r 1, r 2 χρειάζεται 5 clock cycles MVI r, DATA " " " XRA r " 4 " " " 4 " " RAL " 4 " " JMP " 1 " " CMA " 4 " " 9
Άσκηση 8.3. Εάν η θύρα 1 δεν µπορεί να συγκρατήσει τα δεδοµένα που της δίνουν, επειδή δεν έχει latches, τι τροποποιήσεις ή τι προσθήκες πρέπει να γίνουν µεταξύ των βηµάτων 12 και 13 ώστε η θύρα 1 να δείχνει τον τρέχοντα τυχαίο αριθµό. Σηµείωση α: ιεύθυνση Μνήµης. Έστω Μ. β: Περιεχόµενο θέσης µνήµης Μ, κωδικός εντολής. c: Περιεχόµενο " " Μ1 παράµετρος εντολής d: " " " Μ2 " " Το τµήµα, β, δηλαδή ο κωδικός της εντολής, καθορίζει εάν η επόµενη ή και η µεθεπόµενη θέση µνήµης είναι παράµετροι εντολής. 1