ΕΞΟΜΟΙΩΝΟΝΤΑΣ COMPILED ΣΧΕΔΙΑΣΕΙΣ VHDL
Αφού κάνουμε compile τα μοντέλα VHDL, μπορούμε να τα εξομοιώσουμε για να βεβαιωθούμε ότι αυτά λειτουργούν σωστά. Θα εξομοιώσουμε την behavioral αρχιτεκτονική του 4-bit register και χειροκίνητα και με το test bench για να βεβαιωθούμε ότι είναι σωστή.
Πρώτα θα την εξομοιώσουμε χειροκίνητα:
Πρέπει να πάμε στο directory όπου είναι τοποθετημένη η VHDL βιβλιοθήκη. Από αυτό το directory τυπώνουμε qhsim –lib my_vhdl από το prompt του UNIX. Πρέπει να αγνοήσουμε όποια προειδοποίηση σχετικά με τον πίνακα μετάφρασης (translation table). (Σημείωση: Όταν ορίζουμε την βιβλιοθήκη για τον εξομοιωτή, μπορούμε να χρησιμοποιήσουμε είτε το πραγματικό είτε το mapped όνομα.)
Αφού εμφανιστεί το παράθυρο του εξομοιωτή, θα δούμε ένα startup παράθυρο όπως αυτό :
( startup window)
Αν η βιβλιοθήκη δεν είναι η my_vhdl, πρέπει να την αλλάξουμε σε my_vhdl και μετά να πατήσουμε το πλήκτρο return για να δούμε τα περιεχόμενα της βιβλιοθήκης. Αν το dialog box εξαφανιστεί, τότε το επαναφέρουμε από το μενού : File -> Load New Design ….Το πάνω κουτί δείχνει τις οντότητες της βιβλιοθήκης και το κάτω κουτί δείχνει τις αρχιτεκτονικές που έχουν καταχωρηθεί για την επιλεγμένη οντότητα.
Τώρα πρέπει να επιλέξουμε την γραμμή entity reg4 στο κουτί της οντότητας (entity box). Για αυτήν την εξομοίωση επιλέγουμε την αρχιτεκτονική behav. Στην συνέχεια το κουμπί Load για να την φορτώσουμε.
Τυπώνουμε view * για να δούμε όλα τα παράθυρα των σχεδιάσεων. Στην οθόνη θα δούμε να ανοίγουν εννιά παράθυρα. Παρακάτω βλέπουμε μία σύντομη περιγραφή αυτών των παραθύρων:
Quick VHDL
Αυτό είναι το προτρεπτικό παράθυρο του εξομοιωτή (simulator prompt window). Μπορούμε να εισάγουμε εντολές για τον εξομοιωτή σε αυτό το παράθυρο όπως επίσης και να χρησιμοποιήσουμε τα pull-down μενού για να δώσουμε εντολές.
Structure
Αυτό το παράθυρο δείχνει την δομή της σχεδίασής μας. Επειδή η σχεδίασή μας είναι απλή μας δείχνει μόνο το top-level reg4 (behav) και το στάνταρ VHDL πακέτο. Αν είχαμε πολλαπλά πακέτα σε αυτήν την σχεδίαση, θα τα βλέπαμε και αυτά εδώ.Επίσης μπορούμε να κοιτάξουμε την δομή της σχεδίασης. Κάνουμε κλικ στην γραμμή PACKAGE. Όταν γίνει αυτό, το παράθυρο Source θα δείχνει την δομή για αυτό το πακέτο. Επίσης, το παράθυρο Signals θα αλλάξει και θα δείξει τα διαθέσιμα σήματα για αυτό το πακέτο. Για το στάνταρ πακέτο δεν υπάρχει κανένα.
Process
Αυτό το παράθυρο τις ενεργές διαδικασίες (by default). Επειδή έχουμε μόνο μία διαδικασία στον 4-bit καταχωρητή μας, μόνο μία θα δείξει εδώ.
Signals
Αυτό το παράθυρο δείχνει τα ονόματα όλων των σημάτων για την τρέχουσα δομή. Ακόμη δείχνει την αρχική τιμή κάθε σήματος (στην περίπτωσή μας είναι όλα μηδέν). Μπορούμε να επιλέξουμε σήματα σε αυτό το παράθυρο (κάνοντας κλικ σε αυτά ή κρατώντας κάτω το πλήκτρο shift για να επιλέξουμε από μία συνεχόμενη σειρά ή με το πλήκτρο control για να επιλέξουμε ομάδες σημάτων) και μετά να χρησιμοποιήσουμε τα μενού Force, Wave, List για να αλλάξουμε τις δυνάμεις στα σήματα αυτά, να τα προσθέσουμε στο παράθυρο Wave ή να τα προσθέσουμε στο παράθυρο List.
Variables
Αυτό το παράθυρο δείχνει τις μεταβλητές που υπάρχουν στο μοντέλο μας. Μπορούμε να αλλάξουμε τις αρχικές τιμές τους ή να αλλάξουμε αυτές κατά την διάρκεια της εξομοίωσης, βοηθώντας στο debug του μοντέλου μας.
Source
Αυτό το παράθυρο τον πηγαίο κώδικα (source code) των μοντέλων μας. Θα δείξει την τρέχουσα επιλεγμένη δομή στο παράθυρο Structure. Επίσης κατά την διάρκεια της εξομοίωσης θα μας δείξει την τρέχουσα γραμμή κώδικα που εκτελείτε όταν “περπατάμε” (stepping) μέσα από την σχεδίασή μας.
Wave
Αυτό το παράθυρο είναι σαν ένας λογικός αναλυτής. Θα δείξει τα λογικά ίχνη των σημάτων καθώς θα τρέχει η εξομοίωση. Μπορούμε να προσθέσουμε σήματα σε αυτό το παράθυρο από το παράθυρο Signals. Χρησιμοποιώντας τα μενού σε αυτό το παράθυρο, μπορούμε να γράψουμε τα περιεχόμενα σε ένα αρχείο postscript, να κάνουμε zoom in και zoom out στο χρόνο, να προσθέσουμε κέρσορες, να δείξουμε σημαντικούς χρόνους και άλλες επιλογές.
Dataflow
Αυτό το παράθυρο δείχνει μία αναπαράσταση ροής δεδομένων (dataflow) του μοντέλου μας. Οι είσοδοι με τις αρχικές τιμές τους είναι στα αριστερά και οι έξοδοι με τις αρχικές τους τιμές είναι στα δεξιά.
List
Αυτό το παράθυρο είναι μία λίστα των τιμών των εισόδων και των εξόδων σε συγκεκριμένους χρόνους. Μπορούμε να προσθέσουμε σήματα σε αυτό το παράθυρο από το παράθυρο Signals. Το μενού επιλογών (option menu) μας επιτρέπει να διαμορφώσουμε το παράθυρο καθώς επίσης και να το σώσουμε σε ένα αρχείο για να το αναλύσουμε αργότερα.
Τώρα είμαστε έτοιμοι να βάλουμε τα σήματά μας στα παράθυρα List και Wave. Από το παράθυρο Signals χρησιμοποιούμε το μενού Wave->Signals in region για βάλουμε τα σήματα στο παράθυρο Wave. Χρησιμοποιώντας το μενού List->Signals in region θα βάλουμε τα σήματα στο παράθυρο List.
Τώρα χρειάζεται να στήσουμε (set up) τις δυνάμεις εισόδου (input forces) για να διεγείρουν το κύκλωμα. Ας στήσουμε το ρολόι (clock) πρώτα. Στο παράθυρο Signals επιλέγουμε clk και χρησιμοποιούμε το μενού Force για να το ωθήσουμε. Δίνουμε την τιμή ‘0’ στο value, την τιμή ‘0’ για το delay και την τιμή ‘100’ για τον χρόνο επανάληψης (repeat time). Αφήνουμε το kind να είναι “Freeze”.
Τώρα επαναλαμβάνουμε το τελευταίο βήμα, αλλά δίνουμε στο value την τιμή ‘1’ και στο delay την τιμή ‘50’. Αυτό μας δίνει ένα ρολόι 100 ns με 50% duty cycle.
Τώρα πιέζουμε το κουμπί Step. Το βέλος στο παράθυρο Source θα μας δείξει την τρέχουσα θέση στο πρόγραμμα και το παράθυρο Wave θα δείξει τα αποτελέσματα όπως αυτά συμβαίνουν.
Αφού προχωρήσουμε μερικές εντολές, η έξοδος θα αλλάξει στην εντολή wait. Αν δεν αλλάξουμε κάποια από τις δυνάμεις εισόδου (input forces) δεν θα συμβεί κάτι το ενδιαφέρον. Μπορούμε να πειραματιστούμε, αλλάζοντας τα σήματα enable και input για να δούμε πως πραγματικά δουλεύει ο κώδικας. Ξανά επιλέγουμε τα σήματα από το παράθυρο Signals και χρησιμοποιούμε το μενού Force για να τα ωθήσουμε.
Επιλέγοντας τα σήματα ένα προς ένα και ωθώντας τα είναι κάτι ανιαρό. Ένας καλύτερος τρόπος είναι να δημιουργήσουμε ένα force file το οποίο θα περιέχει τις ίδιες εντολές όπως το να επιλέγουμε και να ωθούμε τα σήματα ένα προς ένα. Αν αντιγράψουμε τα δεδομένα από το directory $CLASS, τότε έχουμε ένα τέτοιο αρχείο στο δικό μας directory. Αν δεν έχουμε αντιγράψει αυτό το αρχείο, τότε πρέπει να βάλουμε τα παρακάτω σε ένα καθαρό αρχείο ASCII, το οποίο ονομάζεται reg4_stim :
force –freeze /clk 0 0 –repeat 100
force –freeze /clk 1 50 –repeat 100
run 100
force d0 1
force d1 1
force d2 1
force d3 1
run 100
force en 1
run 100
force en 0
force d0 0
force d2 0
run 100
force en 1
run 100
Αυτό είναι ένα αρχείο διέγερσης (stimulus file) για το 4-bit register. Αυτό το αρχείο στήνει ένα ρολόι (περίοδος 100 ns, duty cycle 50%) και ωθεί τις εισόδους να δείξουν διάφορους τρόπους λειτουργίας του καταχωρητή.
Επαναθέτουμε την τρέχουσα εξομοίωση σε χρόνο μηδέν χρησιμοποιώντας το μενού File->Restart Design από το παράθυρο Quick VHDL. Αυτό απομακρύνει τις προηγούμενες ωθήσεις (forces) και μηδενίζει τον χρόνο. Δεν αλλάζουμε καμία επιλογή στο dialog box που εμφανίζεται.
Για να τρέξουμε την εξομοίωση με το δικό μας force file τυπώνουμε do reg4_stim στο παράθυρο Quick VHDL.
Τώρα εξετάζουμε τα αποτελέσματα. Στο παράθυρο Wave , χρησιμοποιούμε το μενού Zoom->Full Size για να δούμε όλη την κυματομορφή. Αν βλέπουμε μόνο κάποια από τα σήματα, κάνουμε scroll up ή scroll down στο παράθυρο ή αλλάζουμε το μέγεθος του παραθύρου για να τα δούμε όλα. Τώρα ας χρησιμοποιήσουμε αυτήν την απεικόνιση για να αναλύσουμε το μοντέλο.
Τώρα ας κοιτάξουμε το παράθυρο List. Παρατηρούμε ότι για τον χρόνο 200 ns, υπάρχουν δύο βήματα που χρειάζονται. Αυτά δείχνονται με το δέλτα. Αυτό συμβαίνει γιατί το ρολόι στα 200 ns κάνει μία μετάβαση high-to-low και η είσοδος en κάνει μία μετάβαση low-to-high. Αυτά δρομολογούνται σαν δύο διακριτά γεγονότα (discrete events) στον χρόνο 200 ns. Έτσι αυτά δείχνονται σαν δύο delta events στο παράθυρο list.
Τώρα πρέπει να θυμηθούμε ότι έχουμε και το test bench για να δοκιμάσουμε το κύκλωμα. Ας το χρησιμοποιήσουμε τώρα για να επαληθεύσουμε το κύκλωμα.