ΗΥ220 Εργαστήριο Ψηφιακών Κυκλωµάτων Τµήµα Επιστήµης Υπολογιστών Χειµερινό Εξάµηνο 2006-2007 Εκφώνηση Εργαστηρίου Στο εργαστήριο του µαθήµατος σας ζητείται να σχεδιάσετε, να υλοποιήσετε και να επαληθεύσετε στην πλακέτα του εργαστηρίου ένα απλό παιχνίδι µε τη χρήση της γλώσσας Verilog. Το συνολικό παιχνίδι θα υλοποιηθεί σε 3 φάσεις που θα παραδίδονται σε κάθε ένα από τα 3 εργαστήρια της κάθε οµάδας κατά τη διάρκεια του εξαµήνου. Το παιχνίδι που θα υλοποιήσετε λέγεται «Τυχεροί Αριθµοί» και θα χρησιµοποιεί τις 4 οθόνες seven segment, τα 4 leds και τα 4 push-buttons που διαθέτει η πλακέτα του µαθήµατος. Στο απλό αυτο παιχνίδι ο παίκτης βλέπει στις οθόνες seven segment τους αριθµούς απο το 0 έως F (στο δεκαεξαδικό) οι οποίοι αλλάζουν αρκετές φορές το δευτερόλεπτο και µε διαφορετικό ρυθµό σε κάθε οθόνη. Όταν πατηθεί το κατάλληλο button οι αριθµοί σταµατούν να αλλάζουν και τότε πρέπει να συγκριθούν µεταξύ τους. Άν υπάρχουν ίδιοι αριθµοί τότε ανάβουν τα αντίστοιχα leds κάτω από τις οθόνες των ίδιων αριθµών και ο παίκτης έχει κερδίσει! Περισσότερες λεπτοµέρειες για την πλήρη λειτουργικότητα του παιχνιδιού θα υπάρχουν στην εκφώνηση κάθε µιας από τις φάσεις του παιχνιδιού που θα υλοποιήσετε.
Εργαστήριο 3 (Φάση 3) Εβδ. 11/12 έως 15/12 και 08/01 έως 12/01 Group A. Εβδ. 18/12 έως 22/12 και 15/01 έως 19/01 Group B Στο εργαστήριο 3 θα υλοποιήσετε το τελευταίο κοµµάτι που ελέγχει την ροή του παιχνιδιού. Θα πρέπει να φτιάξετε µια κεντρική FSM όπως περιγράφεται λεπτοµερώς παρακάτω και το παιχνίδι θα παίζεται ως εξής: αρχικά πρέπει να προγραµµατίσουµε τους ρυθµούς των αριθµών για κάθε οθόνη, µε τα inc (inc button0 - S1) και dec (dec button1 - S2) ενώ µε το select (select button2 - S3) επιλέγουµε την επόµενη οθόνη. Όταν έχουµε προγραµµατίσει και την τελευταία οθόνη, µε το select θα ξεκινήσει το παιχνίδι όπου οι αριθµοί θα «τρέχουν». Πατώντας πάλι το select οι αριθµοί πρέπει να σταµατήσουν και να ανάψουν τα λαµπάκια κάτω από τις οθόνες που έχουν ίδιους αριθµούς και να δούµε αν ο παίκτης έχει κερδίσει. Θα πρέπει να έρθετε στο εργαστήριο µε τον κώδικα προετοιµασµένο-έτοιµο, να διορθώσετε τυχόν λάθη και να δείξετε στον βοηθό του εργαστηρίου οτι δουλεύει σωστά. Το διάγραµµα των blocks για το εργαστήριο 3 είναι το παρακάτω: Το σχεδιό µας τώρα (Game_Top) έχει την εξής ιεραρχία (παρόµοια µε το Lab2): 3 πλεον instances από NumberGenerators που γεννάνε αριθµούς απο το 0 έως το 15 και µπορούν να προγραµµατίζονται έτσι ωστε να γεννάνε νέο αριθµό σε µεταβλητό χρόνο (από το Lab2) και µπορούν επίσης να σταµατούν να γεννάνε αριθµούς. (θα τους µετατρέψετε εσείς). SSController που δέχεται τους 3 αριθµούς των 4-bit από τους πλέον 3 NumberGenerators και 1 από τον GameController και δηµιουργεί την κατάλληλη έξοδο για να απεικονιστούν στις οθόνες seven segment στο δεκαεξαδικό (από το Lab1). Το block ButtonDebounce που σας έχει δωθεί έτοιµο.
Το block GameController το οποίο διαχειρίζεται την ροή του παιχνιδιού και είναι η «εξέλιξη» του RateController από το Lab2. Θα το µετατρέψετε εσείς!!! 1. NumberGenerator: Χρησιµοποιήστε τον NumberGenerator του εργαστηρίου 2 και µετατρέψτε τον έτσι ώστε να δέχεται µια νέα πόρτα enable και να γεννάει νέους αριθµούς µόνο όταν το σήµα enable είναι ενεργοποιηµένο. Εναλλακτικά µπορείτε να θεωρήσετε ότι δέχεστε ένα σήµα stop το οποίο όταν ενεργοποιηθεί σταµατάει το block να γεννάει νέους αριθµούς. 2. GameController: Ο GameController είναι ο «εγκέφαλος» του παιχνιδιού και ελέγχει τη ροή και τα βήµατα για το παιχνίδι. Θα πρέπει να χρησιµοποιήστε τον κώδικα από τον RateController που φτιάξατε για το Lab2 και θα πρέπει να προσθέσετε ακόµη µια FSM µε 3 καταστάσεις. Στην πρώτη κατάσταση µετά το reset πρέπει να ρυθµίσουµε τον ρυθµό γέννησης νέου αριθµού για κάθε οθόνη (Calibration State). Αρχικά δηλαδή ο GameController πρέπει να συµπεριφέρεται όπως ο RateController. Αφού ολοκληρώσουµε τον προγραµµατισµό ρυθµού των αριθµών (inc και dec για τον 0, select, inc και dec για τον 1, select, inc και dec για τον 2, select ) τότε ξεκινάει το παιχνίδι και µεταφερόµαστε σε άλλη κατάσταση (Game State) όπου οι αριθµοί «τρέχουν» και περιµένουµε το σήµα select για να µεταβούµε σε άλλη κατάσταση όπου οι αριθµοί σταµατούν να «τρέχουν» και πρέπει να τους συγκρίνουµε µεταξύ τους για να δούµε εάν ο παίκτης κέρδισε (Evaluation State). Όταν το select ξαναεµφανιστεί τοτέ πάµε στην κατάσταση (Game State) για να ξαναπαίξουµε. Όπως αντιλαµβάνεστε στην Calibration State πάµε µόνο στην αρχή για να ρυθµίσουµε τους ρυθµούς των αριθµών. Στο block πρέπει να προσθέσετε µια έξοδο enable που θα πηγαίνει σε όλους τους NumberGenerators και να την απενεργοποιείτε όταν είστε σε κατάσταση που πρέπει να σταµατήσουν οι αριθµοί να «τρέχουν». Αν χρησιµοποιήσετε στους NumberGenerators σήµα stop τότε θα πρέπει να ενεργοποιείτε το stop από τον GameController αντιστοίχως. Επίσης πρέπει να προσθέσετε µια έξοδο FSMstate που θα βγάζει την κατάσταση της FSM, θα πηγαίνει στον SSController και θα εµφανίζεται στην πιό αριστερή οθόνη για να ξέρουµε σε ποιά κατάσταση του παιχνιδιού
βρισκόµαστε. Ανάλογα µε την κωδικοποίηση των καταστάσεων θα βλέπετε και τον κατάλληλο αριθµό στην οθόνη. Επιπλέον αυτό µπορεί να σας βοηθήσει αρκετά στο debugging. Όσο αφορά τα leds θα πρέπει να βλέπουµε την εξής συµπεριφορά: Στην κατάσταση Calibration πρέπει να βλέπουµε στο κατάλληλο led ποιον NumberGenerator προγραµµατίζουµε. Στην κατάσταση Game δεν πρέπει να ανάβει κανένα led. Στην κατάσταση Evaluation πρέπει να ανάβει κάτω από κάθε οθόνη το αντίστοιχο led µόνο εάν ο αριθµός που εµφανίζεται σε αυτή την οθόνη υπάρχει σε τουλάχιστον άλλη µία. ηλαδή µόνο εάν ο NumberGenerator αυτής της οθόνης έχει ίδια τιµή µε τουλάχιστον ένα NumberGenerator από τους άλλους δύο. Για να πάρετε τους αριθµούς από τους NumberGenerators πρέπει να προσθέσετε 3 πόρτες εισόδου στον GameController και να τις συνδέσετε όπως φαίνεται στο block diagram. Επίσης το led4 που βρίσκεται κάτω από την οθόνη που θα δείχνει την κατάσταση του παιχνιδιού θα πρέπει να ανάβει αν τουλάχιστον 2 αριθµοί στις οθόνες είναι ίδιοι για να δείχνει οτι ο παίκτης κέρδισε. Προσοχή!!! Τα leds είναι active-low! Hints: Ο barrel shift register που είχε ο RateController του Lab2 πρέπει να παραµείνει αλλά να κάνει shift µόνο όταν η FSM είναι στην κατάλληλη κατάσταση που κανονίζουµε τους ρυθµούς. Κρατήστε τον 4-bits, παρόλο που 3 είναι πλέον αρκετά, για να χρησιµοποιήσετε το extra bit για άλλο σκοπό. Σε περίπτωση που έχετε υλοποιήσει διαφορετικά τον RateController προσθέστε την αναγκαία λογική. Για την µετάβαση από την κατάσταση Calibration στην Game µπορείτε να χρησιµοποιήσετε το κατάλληλο bit από τον barrel shift register. Είναι πιο εύκολο την συνδυαστική λογική για τις εξόδους να την γράφετε µε wires εκτός του always block που έχει τις µετάβασεις των καταστάσεων. (π.χ. ιαφάνεια 18 FSM). Όσοι επιθυµούν µπορούν να υλοποιήσουν FSM µε περισσότερες καταστάσεις π.χ. πολλαπλές καταστάσεις Calibration, µια για κάθε ΝumberGenerator, και να µην χρησιµοποιήσουν τον barrel shift register από το lab2. Μην προσοµοιώσετε το συνολικό κύκλωµα µε τον ButtonDebouncer µαζί!!! ηµιουργείστε εσείς τις εξόδους του στο testbench!!! Αφού γράψετε τον κώδικα να κάνετε προσοµοίωση σε Verilog στα εργαλεία που είδατε στο φροντιστήριο µε κάποιο testbench. Ένας προσοµοιωµένος κώδικας έχει πολύ περισσότερες πιθανότητες να δουλέψει σωστά στο εργαστήριο.
Στο εργαστήριο αφού φτιάξετε το project στο Quartus, διορθώσετε τυχόν λάθη και προγραµµατίσετε την FPGA, πατήστε το button S4 που είναι το reset για να αρχίσει να δουλεύει σωστά το κύκλωµα. Θα πρέπει να µπορείτε να παίξετε το παιχνίδι ξεκινώντας µε αυξοµείωση ρυθµών στις οθόνες και µετά να παίζετε µε το button select. ΟΙ ΑΝΤΙΓΡΑΦΕΣ ΚΩ ΙΚΑ ΘΑ ΤΙΜΩΡΟΥΝΤΑΙ ΑΠΟ Ε Ω ΚΑΙ ΣΤΟ ΕΞΗΣ ΜΕ ΜΗ ΕΝΙΣΜΟ ΤΩΝ ΟΜΑ ΩΝ ΠΟΥ ΕΧΟΥΝ ΤΟΝ Ι ΙΟ ΚΩ ΙΚΑ ΑΝΕΞΑΡΤΗΤΩΣ ΑΠΟ ΤΟ ΣΕ ΠΟΙΑ ΟΜΑ Α ΑΝΗΚΕΙ Ο ΚΩ ΙΚΑΣ ΚΑΙ ΠΟΙΑ ΕΚΑΝΕ ΧΡΟΝΙΚΑ ΠΡΩΤΗ ΤΟ ΕΡΓΑΣΤΗΡΙΟ!!! ΕΙΝΑΙ ΥΠΟΧΡΕΩΣΗ ΣΑΣ ΝΑ ΜΗΝ ΙΑΝΕΜΕΤΕ ΤΟΝ ΚΩ ΙΚΑ!!!
Pin Assignments Pin Name Input / Output Active (High / Low) Pin Number Clock (18MHz) I - 43 Reset_n (Button 4 - S4) I L 64 Segment A O L 67 Segment B O L 70 Segment C O L 69 Segment D O L 66 Segment E O L 73 Segment F O L 65 Segment G O L 72 Segment Dot O L 71 Segment1 Enable (DIG1) O H 5 Segment2 Enable (DIG2) O H 83 Segment3 Enable (DIG3) O H 79 Segment4 Enable (DIG4) O H 80 Led1 (LD1) O L 53 Led2 (LD2) O L 58 Led3 (LD3) O L 60 Led4 (LD4) O L 62 Button 1 (S1) I L 54 Button 2 (S2) I L 59 Button 3 (S3) I L 61