ΗΥ220 Εργαστήριο Ψηφιακών Κυκλωµάτων Τµήµα Επιστήµης Υπολογιστών Χειµερινό Εξάµηνο 2006-2007 Εκφώνηση Εργαστηρίου Στο εργαστήριο του µαθήµατος σας ζητείται να σχεδιάσετε, να υλοποιήσετε και να επαληθεύσετε στην πλακέτα του εργαστηρίου ένα απλό παιχνίδι µε τη χρήση της γλώσσας Verilog. Το συνολικό παιχνίδι θα υλοποιηθεί σε 3 φάσεις που θα παραδίδονται σε κάθε ένα από τα 3 εργαστήρια της κάθε οµάδας κατά τη διάρκεια του εξαµήνου. Το παιχνίδι που θα υλοποιήσετε λέγεται «Τυχεροί Αριθµοί» και θα χρησιµοποιεί τις 4 οθόνες seven segment, τα 4 leds και τα 4 push-buttons που διαθέτει η πλακέτα του µαθήµατος. Στο απλό αυτο παιχνίδι ο παίκτης βλέπει στις οθόνες seven segment τους αριθµούς απο το 0 έως F (στο δεκαεξαδικό) οι οποίοι αλλάζουν αρκετές φορές το δευτερόλεπτο και µε διαφορετικό ρυθµό σε κάθε οθόνη. Όταν πατηθεί το κατάλληλο button οι αριθµοί σταµατούν να αλλάζουν και τότε πρέπει να συγκριθούν µεταξύ τους. Άν υπάρχουν ίδιοι αριθµοί τότε ανάβουν τα αντίστοιχα leds κάτω από τις οθόνες των ίδιων αριθµών και ο παίκτης έχει κερδίσει! Περισσότερες λεπτοµέρειες για την πλήρη λειτουργικότητα του παιχνιδιού θα υπάρχουν στην εκφώνηση κάθε µιας από τις φάσεις του παιχνιδιού που θα υλοποιήσετε.
Εργαστήριο 1 (Φάση 1) Εβδ. 6/11 έως 10/11 Group A. Εβδ. 13/11 έως 17/11 Group B Στο εργαστήριο 1 θα υλοποιήσετε ένα υποκοµµάτι του παιχνιδιού! Θα πρέπει να υλοποιήσετε έναν ελεγκτή για τις 4 οθόνες seven segment ο οποίος δέχεται 4 διαφορετικές εισόδους από 4 γεννήτριες αριθµών και εµφανίζει κάθε αριθµό στην αντίστοιχη οθόνη. Θα χρησιµοποιήσετε τον κώδικα που δώθηκε για το εργαστήριο 0 και θα κάνετε τις κατάλληλες αλλαγές / προσθήκες σύµφωνα µε την εκφώνηση. Μετά θα πρέπει να ακολουθήσετε την ροή του εργαλείου Altera Quartus και τα βήµατα που είδατε στο εργαστήριο 0, να «κατεβάσετε» το σχέδιο στην FPGA και να επιβεβαιώσετε οτι δουλεύει σωστά. Θα πρέπει να έρθετε στο εργαστήριο µε τον κώδικα προετοιµασµένο-έτοιµο, να διορθώσετε τυχόν λάθη και να δείξετε στον βοηθό του εργαστηρίου οτι δουλεύει σωστά. Το διάγραµµα των blocks για το εργαστήριο 1 είναι το παρακάτω: Το σχεδιό µας τώρα έχει την εξής ιεραρχία (παρόµοια µε αυτή του Lab0): Lab1_Top που περιέχει instances όλων των blocks 4 instances από NumberGenerators που γεννάνε πλέον αριθµούς απο το 0 έως το 15 κάθε δευτερόλεπτο περίπου. SSController που δέχεται τους 4 αριθµούς των 4-bit από τους 4 NumberGenerators και δηµιουργεί την κατάλληλη έξοδο για να απεικονιστούν στις οθόνες seven segment στο δεκαεξαδικό
1. NumberGenerator: Χρησιµοποιήστε τον NumberGenerator του εργαστηρίου 0 και αλλάξτε τον έτσι ώστε να γεννάει αριθµούς από το 0 έως το 15. Επίσης ζητείται η αρχική τιµή του NumberGenerator, δηλαδή η τιµή στο reset, να µπορεί να δίνεται µέσω παραµέτρου στο module. Για να το πετύχετε αυτό χρησιµοποιήστε τις parameters της Verilog. Έχοντας παραµετρική την αρχική τιµή µπορούµε να φτιάξουµε πολλά instances αυτού του block και µε τη χρήση του defparam να ξεκινούν από διαφορετική τιµη. Μην αλλάξετε τον ρυθµό γέννησης νέου αριθµού!!! 2. SSController: Όπως είδαµε στο µάθηµα οι οθόνες seven segment χρησιµοποιούν κοινή είσοδο δεδοµένων αλλά έχουν διαφορετικά σήµατα για την ενεργοποίηση της κάθε οθόνης. Έτσι µπορούµε να δίνουµε δεδοµένα και να τα εµφανίζουµε σε όποια/ες οθόνες εµείς επιθυµούµε. Ο SSController είναι µια εξέλιξη του SSDecoder του εργαστηρίου 0 οποίος εµφάνιζε τον ίδιο αριθµό και στις 4 οθόνες. Ο SSController δέχεται πλέον 4 διαφορετικούς αριθµούς σαν είσοδο και πρέπει να εµφανίζει κάθε αριθµό σε διαφορετική οθόνη (αριθµός 0 στην οθόνη 0, αριθµός 1 στην οθόνη 1 κτλ). Εφόσον οι οθόνες έχουν κοινά δεδοµένα, ο SSController πρέπει να πολυπλέκει τις 4 τιµές εισόδου στα καλώδια των δεδοµένων των οθονών και να δίνει κάθε φορά σήµα ενεργοποίησης σε µία µόνο από αυτές. Για να εµφανίζονται σωστά οι αριθµοί στις οθόνες seven segment θα πρέπει να ανανεώνουµε τις τιµές τους αρκετές φορές το δευτερόλεπτο διαφορετικά θα βλέπουµε τις τιµές στις οθόνες είτε να αναβοσβήνουν είτε να «τρέµουν». Ένας τυπικός ρυθµός ανανέωσης είναι 60 φορές το δευτερόλεπτο που σηµαίνει refresh rate 60Hz (παρόµοιος µε αυτός των monitors) οτιδήποτε περισσότερο από αυτό (π.χ. 100Hz) υπερκαλύπτει τις ανάγκες µας. Το σχηµατικό του κυκλώµατος που πρέπει να υλοποιήσετε εµφανίζεται στην εικόνα παραπάνω. Με δεδοµένο τον SSDecoder του εργαστηρίου 0 πρέπει να υλοποιήσετε σε Verilog το παραπάνω κύκλωµα. Στον SSDecoder του εργαστηρίου 0 υπάρχει ήδη το κοµµάτι απο τον DECODER µέχρι την έξοδο
o_segdata_n αλλά για αριθµούς των 3-bit ενώ εµείς πλέον έχουµε αριθµούς των 4-bit. Αλλάξτε το κοµµάτι του DECODER έτσι ώστε να αποκωδικοποιούνται οι αριθµοί απο 0 έως 15 σε τιµές που χρειάζονται οι seven segments για να δείχνουν τους αριθµούς στο δεκαεξαδικό. Οι τιµές που πρέπει να δωθούν στις seven segment οθόνες για τους δεκαεξαδικούς αριθµούς υπάρχουν στις διαφάνειες του µαθήµατος. Το κοµµάτι COUNTER είναι ένας µετρητής Ν-bits οποίος είναι υπεύθυνος για τον ρυθµό ανανέωσης των οθονών. Ουσιαστικά ρυθµίζει τον χρόνο που θα µένει ο κάθε αριθµός σε κάθε οθόνη. Τα 2-MSB του µετρητή χρησιµοποιούνται στον πολυπλέκτη του σχήµατος για την επιλογή του αριθµού που θα πάει στις οθόνες και επίσης χρησιµοποιείται για την επιλογή της οθόνης (δηλαδή σε ποιά οθόνη ενεργοποιούµε την εµφάνιση). Ο αριθµός των bits του µετρητή καθορίζει και το refresh rate οπότε πρέπει να υπολογίσετε εσείς τον αριθµό των bits δεδοµένου ότι θέλουµε το refresh_rate να είναι στο διάστηµα 60Hz έως 200Hz και ότι το ρολόι του κυκλώµατος είναι 18MHz. ( Το µήκος σε bits του µετρητή καλό θα ήταν να γίνει παραµετρικό ) O 2-tο-4 Decoder είναι ο γνωστός απλός αποκωδικοποιητής που µπορεί να υλοποιηθεί µε τον ίδιο τρόπο που υλοποιήθηκε ο DECODER. Πρίν τις εξόδους χρησιµοποιούµε καταχωρητές για την έξοδο του κυκλωµατός µας έτσι ώστε να µην δηµιουργούµε µονοπάτια µε µεγάλη χρονική καθυστέρηση. 3. Lab1_Top : Είναι το top block για το εργαστήριο το οποίο έχει τα instances από όλα τα blocks. Θέλουµε ένα instance του SSController και 4 instances των NumberGenerators όπου ο πρώτος (0) να ξεκινάει απο το 3, ο δεύτερος (1) από το 2, ο τρίτος (2) από το 1 και ο τέταρτος(3) από το 0. (defparam) Αφού γράψετε τον κώδικα καλό θα ήταν να κάνετε προσοµοίωση σε Verilog στα εργαλεία που είδατε στο φροντιστήριο µε κάποιο testbench είτε δικό σας είτε αυτό που υπάρχει στη σελίδα του µαθήµατος για το Lab0. Ένας προσοµοιωµένος κώδικας έχει πολύ περισσότερες πιθανότητες να δουλέψει σωστά. Στο εργαστήριο αφού φτιάξετε το project στο Quartus, διορθώσετε τυχόν λάθη και προγραµµατίσετε την FPGA πατήστε το button S4 που είναι το reset για να αρχίσει να δουλεύει σωστά το κύκλωµα. Θα πρέπει να βλέπετε τους αριθµούς να µετακινούνται (scroll) από δεξιά πρός τα αριστερά και να εµφανίζεται νέος αριθµός στην πιό δεξιά οθόνη. Αν δεν συµβαίνει αυτό σηµαίνει ότι έχετε κάνει κάποιο λάθος και ανάλογα µε τους αριθµούς που βλέπετε µπορείτε να εντοπίσετε λάθος σε κάποιο σηµείο του κυκλώµατος! (π.χ. αρχική τιµή των NumberGenerators, επιλογή πολυπλέκτη στον SSController,...) Αλλάγή του ρυθµού ανανέωσης των οθονών Αφού κάνετε το σχέδιο να δουλεύει σωστά πειραµατιστείτε µε τον ρυθµό ανανέωσης των οθονών. οκιµάστε να βάλετε ρυθµoύς ανανέωσης µικρότερους των 60Hz ( σε ένα παραµετρικό σχέδιο γίνεται πολύ εύκολα!!!). Τι παρατηρείτε ;
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