Computer engineering tutorial - Μέρος 1ο: Εύκολα κ γρήγορα διαγράμματα χρονισμού κυκλωμάτων

gnu_labis | Τετ, 10/22/2008 - 12:27 | 11' | 0

Καλώς ήλθατε στο πρώτο tutorial για μηχανικούς Η/Υ (κ όχι μόνο). Σε αυτό κ τα επόμενα tutorial που θα ακολουθήσουν, θα προσπαθήσω να παρουσιάσω εύκολα εργαλεία κ μεθόδους, χρήσιμα στη καθημερινότητα ενός μηχανικού. Σαν αρχή, θα ήθελα να πω ότι προτεραιότητα έχουν τα open-source εργαλεία κ όχι τα εμπορικά προγράμματα, κ ας είναι δωρεάν (όπως ή έκδοση για Linux του ISE WebPack της Xilinx για προγραμματισμό σε FPGAs). Αν μείνει χρόνος κ όρεξη, θα μιλήσουμε κ γι' αυτά, όμως ευσεβής μου πόθος είναι να έχω μια συλλογή από ανοιχτά εργαλεία, οπότε αυτά κ θα παρουσιάσω.

Το πρώτο tutorial είναι ίσως αποκλειστικά για ανθρώπους που ασχολούνται με ψηφιακά ηλεκτρονικά κυκλώματα. Στα επόμενα, θα δείξω κ εργαλεία που ενδιαφέρουν κ άλλους κλάδους, οπότε μείνετε συντονισμένοι :)


Στο πρώτο μέρος θα κοιτάξουμε ένα πολύ απλό κ χρήσιμο εργαλείο για τη γρήγορη σχεδιάση διαγραμμάτων χρονισμού. Πρόκειται για το drawtiming, open source υπό την άδεια GNU GPL.

Τα διαγράμματα χρονισμού είναι πολύ βασικά στην περιγραφή ενός ψηφιακού κυκλώματος, ιδιαίτερα σε σύγχρονα (synchronous) κυκλώματα. Τα συναντάμε πολύ συχνά όταν διαβάζουμε τις προδιαγραφές ενός ολοκληρωμένου, ή ενός δίαυλου μεταφοράς δεδομένων, όπως I2C, USB κλπ. Ένα διάγραμμα χρονισμού αποτελείται από σειρές από σήματα, κ ένα οριζόντιο άξονα που συμβολίζει την πάροδο του χρόνου. Τα σήματα είναι είτε ενός bit, οπότε συμβολίζονται με μια γραμμή που μεταβάλεται μεταξύ των λογικών καταστάσεων 0 κ 1, ή είναι πολλαπλών bits (busses), οπότε συμβολίζονται με κουτάκια τα οποία περιέχουν την τρέχουσα τιμή του bus. Τέλος υπάρχει κ η κατάσταση "δεν ξέρω τι τιμή έχω / δεν με απασχολεί" η οποία συμβολίζεται με "Χ".

Ιδού ένα παράδειγμα που περιγράφει τα σήματα σε ένα δίαυλο AMBA APB, για την ανάγνωση μιας τιμής. Το διάγραμμα διαβάζεται ως εξής: πάνω πάνω έχουμε το ρολόι του σύγχρονου κυκλώματος. Κάθε περίοδος του είναι κ ένας κύκλος του ρολογιού. Σύμφωνα με τις προδιαγραφές του AMBA, το σήμα PWRITE πρέπει να είναι 0 για να διαβάσουμε κάτι, οπότε ό,τι κ να ήταν πριν, πρέπει να μεταβεί στο 0. Στη συνέχεια ενεργοποιείται το σήμα PSEL κ τοποθετούμε στο δίαυλο PADDR τη διεύθυνση από όπου θέλουμε να διαβάσουμε. Στον επόμενο κ τελευταίο κύκλο, ενεργοποιείται το σήμα PENABLE κ τα δεδομένα που θέλουμε εμφανίζονται στο δίαυλο PRDATA.

AMBA APB read bus cycle

Αν ποτέ χρειαστήκατε να φτιάξετε ένα τέτοιο διάγραμμα κ χρησιμοποιήσατε κάποιο πρόγραμμα σχεδίασης, τότε καταλαβαίνετε πόσο δύσκολο είναι. Αν δε αποφασίσετε να το αλλάξετε ή να το διορθώσετε, τότε σίγουρα έχετε φτάσει πολύ κοντά στο να γίνεται βίαιοι με τον υπολογιστή σας.

Για να δούμε λοιπόν την εναλλακτική, "the linux way". Καταρχήν θα χρειαστείτε το εν λόγω προγραμματάκι, το drawtiming. Είναι μόλις 125KB αλλά θαυματουργό. Είτε το κατεβάζετε από τη σελίδα του, ή εναλλακτικά, σε κάποιες διανομές υπάρχει σαν πακέτο προς εγκατάσταση. Έψαξα κ είδα ότι σίγουρα υπάρχει σε Debian, Ubuntu, Fedora, OpenSuse, κ Gentoo, άρα το πιο πιθανό είναι να το έχετε ήδη κ να χρειάζεται απλά να εγκαταστήσετε το πακέτο. Όπου το βρήκα, το πακέτο λεγόταν πάντα "drawtiming".

Αφού λοιπόν το εγκαταστήσετε, ανοίξτε τον αγαπημένο σας editor, κ γράψτε:


# initialize the signals
PCLK=tick, PADDR, PWRITE=X, PSEL=0, PENABLE=0, PRDATA.
# One cycle per line
PADDR="addr", PWRITE=0, PSEL=1.
PRDATA="data", PENABLE=1.
PSEL=0, PENABLE=0,PRDATA=X.

Αυτό είναι όλο. Το παραπάνω "κείμενο" περιγράφει ακριβώς την εικόνα του παραδείγματος. Για να μετατρέψετε την περιγραφή σας σε εικόνα, σώστε το αρχείο με κάποιο όνομα (πχ amba_read.td, η κατάληξη δεν έχει σημασία) κ δώστε σε ένα τερματικό, στο φάκελο που το σώσατε:


drawtiming amba_read.td --output amba_read.png

H παραπάνω εντολή θα δημιουργήσει το διάγραμμα κ θα το σώσει σαν εικόνα με όνομα amba_read.png στον ίδιο φάκελο. Το πρόγραμμα υποστηρίζει άπειρα διαφορετικά format για εικόνες, κ χρησιμοποιεί τo κατάλληλo, ανάλογα με την κατάληξη του αρχείου που δίνετε σαν output (σε αυτή την περίπτωση .png). Εδώ θα βρείτε μια λίστα με τα υποστηριζόμενα format. Επίσης, από την έκδοση 0.7 κ μετά, μπορείτε να σώζετε κ σε postscript (.ps).

Αν θέλετε μεγαλύτερες διαστάσεις στην εικόνα σας, μπορείτε να παίξετε με τις παραμέτρους "--scale" (default = 1.0), "--pagesize", κ "--aspect". Περισσότερες πληροφορίες στη σελίδα man του προγράμματος:


man drawtiming

Στην ίδια σελίδα man (καθώς κ στην ιστοσελίδα του προγράμματος) μπορείτε να διαβάσετε κ όλες τις άλλες παραμέτρους κ λεπτομέρειες σύνταξης της περιγραφής του διαγράμματος.

Επιστρέφοντας στο δικό μας παράδειγμα, η πρώτη γραμμή δίνει αρχικές τιμές. Αυτές εμφανίζονται στο διάγραμμα στον πρώτο κύκλο του ρολογιού. Κάθε σήμα δηλώνεται με τη μορφή "name = value". Για το ρολόι υπάρχει η ειδική τιμή "tick", ώστε να μη χρειάζεται σε κάθε κύκλο να μεταβάλουμε από μόνοι μας την κατάσταση σου. Δηλώνεται μια φορά στην αρχή κ τέρμα. Αν απλά δηλώσουμε όνομα σήματος αλλά όχι τιμή, αυτό ισοδυναμεί με το να του δίναμε αρχική τιμή "Χ". Η τελεία στο τέλος της γραμμής υποδηλώνει το τέλος του πρώτου κύκλου του ρολογιού. Γραμμές που αρχίζουν με "#" είναι σχόλια.

Στις επόμενες γραμμές περιγράφουμε 3 ακόμα κύκλους του ρολογιού, με τον ίδιο τρόπο. Πάλι, κάθε κύκλος τελειώνει με μια τελεία στο τέλος της γραμμής.

Κάποιες τελευταίες σημειώσεις, κ σας αφήνω να ψάξετε τα υπόλοιπα στα παραδείγματα του man page κ της ιστοσελίδας.

  • Μπορείτε να τερματίσετε μια γραμμή με ελληνικό ερωτηματικό, αν δεν θέλετε να προχωρήσει ακόμα ο κύκλος του ρολογιού.
  • Μπορείτε να εμφανίσετε εξαρτήσεις μεταξύ σημάτων, χρησιμοποιώντας το σύμβολο "=>". Αν πχ στο προηγούμενο παράδειγμα αλλάξουμε το κείμενο μας όπως φαίνεται παρακάτω, τότε θα πάρουμε σαν αποτέλεσμα το διάγραμμα στο τέλος του tutorial, με ένα μπλε βέλος μεταξύ PSEL κ PENABLE.
  • Επίσης μπορούμε να σημειώσουμε πάνω στο διάγραμμα συγκεκριμένα χρονικά διαστήματα κ να τους δώσουμε όνομα. Στο επόμενο παράδειγμα το κάνουμε αυτό μεταξύ του PADDR="addr" κ PRDATA="X", κ ονομάζουμε το διάστημα "tBusy".


# initialize the signals
PCLK=tick, PADDR, PWRITE=X, PSEL=0, PENABLE=0, PRDATA.
# One cycle per line, unless line ends with ";"
PADDR="addr", PWRITE=0, PSEL=1.
PSEL=>PENABLE=1;
PRDATA="data".
PADDR -tBusy> PRDATA=X;
PSEL=0, PENABLE=0.

Αυτά λοιπόν τα ωραία μπορείτε να κάνετε με έναν editor κ ένα πρόγραμμα ολίγων KB. Αν προβάλετε τη διαδικασία αυτή σε ένα διάγραμμα δεκάδων η κ παραπάνω κύκλων με 20-30 σήματα, τότε καταλαβαίνετε την ευκολία αυτής της προσέγγισης. Διαβάστε κ τα σχετικά links κ man pages, κ για απορίες, εδώ είμαστε.

Καλή τύχη, κ καλά διαγράμματα!

Δώσε αστέρια!

MO: (ψήφοι: 0)