VGA controller
Το πρότυπο VGA που υποστηρίζεται από την πλακέτα επιτάσσει μια ελάχιστη ανάλυση 640x480 pixel. Μια εικόνα τέτοιου μεγέθους και με βάθος 4 bit ανά χρωματικό κανάλι (RGB) απαιτεί 640x480x12bit = 3.686.400 ψηφία μνήμης (~460 kByte) για την αποθήκευσή της εσωτερικά της FPGA στην προσωρινή για αυτό το σκοπό μνήμη VGA buffer του κυκλώματος. Η αντίστοιχη τιμή για την υποστήριξη της πλήρους χρωματικής πληροφορίας του RGB συστήματος (δηλαδή 0-255 ή 8 bit για κάθε χρωματικό κανάλι) είναι περίπου 921 kByte. Το μέγιστο βάθος χρώματος ανά κανάλι (κόκκινο, πράσινο, μπλε) καθορίζεται από τις προδιαγραφές της πλακέτας. Το πρωτόκολλο VGA επιτάσσει την προβολή συγκεκριμένου αριθμού στοιχείων, για τη διατήρηση του συγχρονισμού με την οθόνη στα 60 Hz, που αγγίζει τα 25.000.000 pixels/sec (ή αλλιώς 25 ΜΗz). Για την προβολή της εικόνας χρησιμοποιείται η μνήμη VGA buffer ι οποία και διαβάζεται με τον υψηλό ρυθμό των 25 MHz από την πλευρά της οθόνης για τη διατήρηση του συγχρονισμού. Προσαρμόζοντας τις απαιτήσεις στις δυνατότητες παλαιότερης τεχνολογίας πλακετών, το μέγιστο δυνατό μέγεθος εικόνας που επιλέχθηκε να υποστηριχθεί είναι 160x120 pixels (για να αποτελεί και ακέραιο πολλαπλάσιο της αρχικής ανάλυσης 640x480) και το βάθος χρώματος στα 4 ψηφία ανά κανάλι.
Με δεδομένο ότι το πρωτόκολλο VGA επιτάσσει την προβολή κατ’ ελάχιστον 640x480 ενεργών pixel, οι δυνατές επιλογές είναι: (α) να επεκταθεί κάθε pixel της εικόνας οριζόντια και κατακόρυφα ώστε να καλύψει εν τέλει όλη την εικόνα διατηρώντας την αναλογία οριζόντιων προς κάθετων στοιχείων ή (β) να χρησιμοποιηθεί ένα μαύρο πλαίσιο γύρω από την εικόνα με τα ενεργά στοιχεία να περιορίζονται μόνο στην μικρότερη ανάλυση (εδώ 160x120). Οι παραπάνω μέθοδοι εφαρμόζονται ευρέως κάθε φορά που η πηγή των δεδομένων εμφανίζει ασυμβατότητες με το πρωτόκολλο επικοινωνίας με μια συσκευή απεικόνισης. Με παρόμοιο τρόπο εξάλλου λειτουργεί και η προβολή βίντεο από ιστότοπους όπως το YouTube. Εδώ προτιμήθηκε ο συνδυασμός και των δύο μεθόδων αφού η αρχική εικόνα επεκτείνεται x2 και στις δυο κατευθύνσεις και στη συνέχεια προβάλλεται σε ένα κεντραρισμένο πλαίσιο 320x240 στοιχείων (περίπτωση 2, Εικόνα). Ο διακόπτης (σήμα switch) καθορίζει την ανάλυση της εικόνας. Στη θέση ‘0’ η ανάλυση διατηρείται στην μέγιστη δυνατή τιμή της 160x120, ενώ αν ο διακόπτης μετακινηθεί πάνω, στη θέση του λογικού ‘1’, τότε το κύκλωμα μειώνει την ανάλυση ακόμα περισσότερο στην τιμή 80x60.
Εικόνα 1. Οι πιθανές λύσεις για την προβολή εικόνων που δεν καλύπτουν το πρωτόκολλο VGA.
Keyboard controller
Αυτό το παράδειγμα αναφέρεται στη διασύνδεση της θύρα PS/2 σε ένα PS/2
πληκτρολόγιο. Το παράδειγμα δεν θα ισχύει για τα νεότερα USB πληκτρολόγια, ή για
τα παλαιότερα, XT πληκτρολόγια. Τα πληκτρολόγια περιέχουν το δικό τους
μικροεπεξεργαστή, ο οποίος
συνεχώς σαρώνει τα πλήκτρα και στη συνέχεια αποστέλλει τους βασικούς κωδικούς
από την πίεση κάποιου πλήκτρου στον κεντρικό υπολογιστή - στην περίπτωσή μας
μέσω της θύρας PS / 2.
Για ένα PS / 2 πληκτρολόγιο η πίεση κάποιου πλήκτρου προσδιορίζεται από έναν κωδικό σάρωση. Αυτός ο κωδικός συνδέεται με ένα φυσικό κλειδί. Έτσι για παράδειγμα, το αριστερό πλήκτρο Shift και το δεξί πλήκτρο Shift έχουν διαφορετικούς κωδικούς σάρωσης. Όταν πατάμε ένα πλήκτρο ένας κωδικός σάρωσης Make αποστέλλεται στη θύρα PS/2 από το πληκτρολόγιο, ενώ όταν αφήνουμε το πλήκτρο, ένας άλλος κωδικός σάρωσης Break αποστέλλεται στη θύρα PS/2.
Οι κωδικοί σάρωσης για όλα τα πλήκτρα σε ένα πληκτρολόγιο PS/2 φαίνονται στο ακόλουθο σύνδεσμο (http://www.cs.ucr.edu/\~jtarango/cs122a/lab3/lab3\_scancodekeyboard.png). Για όλα τα γράμματα και ψηφία o κωδικός σάρωσης Make είναι ένα μόνο Βyte ενώ ο κωδικός σάρωσης Break αποτελείται από δύο Byte (το F0 Hex byte και το ίδιο Byte του Make, π.χ. 12 πατώντας και F0,12 αφήνοντας το left shift). Οι κωδικοί σάρωσης δεν έχουν καμία σχέση με τους κωδικούς ASCII των βασικών χαρακτήρων. Υπενθυμίζεται ότι ο κώδικας ASCII για ένα κεφαλαίο γράμμα είναι διαφορετικός από τον κώδικα ASCII του αντίστοιχου πεζού γράμματος. Στο επίπεδο διασύνδεσης PS/2, για τη διάκριση ενός κεφαλαίου από ένα πεζό γράμμα θα πρέπει να ελέγχετε εάν έχει πατηθεί το πλήκτρο Shift (ή το πλήκτρο CapsLock) πριν πατηθεί το πλήκτρο γράμματος και πριν αφεθεί ξανά το πλήκτρο Shift.
Για παράδειγμα, αν θέλατε να πληκτρολογήσετε ένα κεφαλαίο Α θα πατούσατε το πλήκτρο αριστερό Shift, μετά το πλήκτρο Α, μετά θα αφήνατε το πλήκτρο Α, και τέλος θα αφήνατε το πλήκτρο αριστερό Shift. Η παραπάνω διαδικασία θα στείλει τις ακόλουθες τιμές (bytes) στη θύρα PS/2.
12 , 1C , F0 1C , F0 12 .
Σχήμα 1. Αποστολή ενός πλήκτρου μέσω PS/2
Arithmetic Logic Unit (ALU)
Ειδικά για το κύκλωμα εκτέλεσης πράξεων (ALU) λόγω της πολυπλοκότητας ο σχεδιασμός οδήγησε σε δύο διαφορετικά υποκυκλώματα με σκοπό την αποδοτικότερη λειτουργία. Το ένα κύκλωμα είναι υπεύθυνο για την εκτέλεση όλων των λογικών πράξεων, των συγκρίσεων, των προσθέσεων και των αφαιρέσεων. Η λογική για την εκτέλεση των πράξεων αυτών τοποθετείται στα LUTs. Οι πράξεις που υποστηρίζονται με τους αντίστοιχους κωδικούς του σήματος operation είναι:
"0001" -- πρόσθεση Α + Β
"0010" -- αφαίρεση Α - Β
"0011" – πολλαπλασιασμός Α * Β (με τα λιγότερο σημαντικά ψηφία στην έξοδο)
"0100" -- πολλαπλασιασμός Α * Β (με τα περισσότερο σημαντικά ψηφία στην έξοδο)
"0101" – λογική πράξη Α OR Β
"0110" -- λογική πράξη Α AND Β
"0111" -- λογική πράξη Α NAND Β
"1000" -- λογική πράξη Α XOR Β
"1001" -- λογική πράξη Α NOR Β
"1010" – σύγκριση ισότητας αριθμών A == B (θεωρώντας Α,Β μη προσημασμένους)
"1011" -- σύγκριση αριθμών A >= B (θεωρώντας Α,Β προσημασμένους)
"1100" – σύγκριση αριθμών A >= B (θεωρώντας Α,Β μη προσημασμένους)
"1101" – σύγκριση αριθμών A < B (θεωρώντας Α,Β προσημασμένους)
"1110" -- σύγκριση αριθμών A < B (θεωρώντας Α,Β μη προσημασμένους)
"1111" – σύγκριση ανισότητας αριθμών A != B (θεωρώντας Α,Β μη προσημασμένους)
Efficient MULTIPLIER
Το δεύτερο είναι υπεύθυνο για την εκτέλεση πολλαπλασιασμών μεταξύ λέξεων 32 ψηφίων. Ο διαχωρισμός τους προέκυψε λόγω της μεγάλης καθυστέρησης που εισάγει το κύκλωμα του πολλαπλασιασμού ακόμα και όταν χρησιμοποιούνται τα ειδικά για αυτό σκοπό κυκλώματα πολλαπλασιαστών της FPGA. Η επιλογή διάσπασης του πολλαπλασιασμού σε δύο βήματα ευνοεί την αύξηση της συχνότητας λειτουργίας.
Σχήμα 2. Το μπλοκ διάγραμμα του κυκλώματος πολλαπλασιασμού δύο σταδίων.
Με στόχο την βελτίωση της συχνότητας λειτουργίας κάθε πολλαπλασιασμός σχεδιάστηκε να απαιτεί δύο κύκλους ρολογιού για να ολοκληρωθεί. Στον έναν κύκλο εκτελούνται παράλληλα από δύο χωριστούς πολλαπλασιαστές οι πράξεις A x B15…0 και A x Β31…16. Αυτή η διάσπαση του τελεστή Β μειώνει την καθυστέρηση αφού ένας πολλαπλασιασμός 32 x 16 ψηφίων γίνεται πιο γρήγορα από έναν πολλαπλασιασμό 32 x 32 ψηφίων. Τα δύο γινόμενα αποθηκεύονται σε καταχωρητές και στον επόμενο κύκλο αθροίζονται με κατάλληλη μετατόπιση μεταξύ τους (Σχήμα). Τέλος, επιλέγεται ανάλογα με την εντολή αν στην έξοδο πρέπει να εμφανιστεί το άνω ή κάτω μισό του 64 ψηφίων αποτελέσματος του πολλαπλασιασμού.
Video Transciever
Το τελευταίο εμπόδιο είναι ο συγχρονισμός των κυκλωμάτων. Από τη μια μεριά υπάρχει η flash μνήμη από την οποία θα πρέπει να αντλείται ένα πλήρες στιγμιότυπο εικόνας κάθε 1/15 του δευτερολέπτου για να προβάλλεται με ομαλή ροή (15 fps) το βίντεο. Αυτό απαιτεί την ανάγνωση 160x120x15 = 288.000 διαδοχικών διευθύνσεων από τη μνήμη flash που περιέχει τη συνολική πληροφορία του βίντεο. Άρα ένα ρολόι χρονισμένο κοντά σε αυτή την τιμή πρέπει να χρησιμοποιηθεί για την σωστή ανάγνωση της μνήμης. Από την άλλη μεριά το πρωτόκολλο VGA επιτάσσει την προβολή συγκεκριμένου αριθμού στοιχείων, για τη διατήρηση του συγχρονισμού με την οθόνη στα 60 Hz, που αγγίζει τα 25.000.000 στοιχεία ανά δευτερόλεπτο (ή αλλιώς 25 ΜΗz ρολόι). Ακριβώς επειδή η μνήμη flash δεν μπορεί να λειτουργήσει σε τόσο υψηλό ρυθμό ανανέωσης (καθυστέρηση ανάγνωσης και καθυστέρηση καλωδίωσης ~100 ns), παρεμβάλλεται η μνήμη VGA buffer που υλοποιείται εσωτερικά της FPGA και για αυτό το λόγο μπορεί να χρονιστεί αποτελεσματικά σε συχνότητες ακόμα και πάνω από 100 MHz. Έτσι για την προβολή της εικόνας η μνήμη VGA buffer διαβάζεται με τον υψηλό ρυθμό των 25 MHz από την πλευρά της οθόνης για τη διατήρηση του χρονισμού και εγγράφεται με τον πολύ μικρότερο ρυθμό των 294 kHz από τη μεριά της Flash μνήμης.
Για την προσομοίωση διαφορετικών συνθηκών μεταφοράς δεδομένων χρησιμοποιούνται οι δύο πρώτοι διακόπτες (s0 & s1), κατά σειρά αρίθμησης όπως αυτοί εμφανίζονται στην πλακέτα. Με τον διακόπτη s0 ελέγχεται η ροή του βίντεο. Όταν βρίσκεται στη θέση του λογικού ‘1’, ή απλούστερα στην πάνω θέση, το βίντεο αναπαράγεται, ενώ αντίθετα όταν μετακινηθεί στην κάτω θέση (λογικό ‘0’) η αναπαραγωγή σταματάει (μορφή ελέγχου play/pause). Ο διακόπτης s1 καθορίζει την ανάλυση της εικόνας. Στη θέση ‘0’ προσομοιώνεται η συμπεριφορά του ισχυρού δικτύου με μεγάλο διαθέσιμο εύρος ζώνης και η ανάλυση διατηρείται στην μέγιστη δυνατή τιμή της 160x120. Αντιθέτως αν ο διακόπτης s1 μετακινηθεί πάνω, στη θέση του λογικού ‘1’, τότε το κύκλωμα προσομοιώνει την κατάσταση του ασθενούς δικτύου και η ανάλυση μειώνεται ακόμα περισσότερο στην τιμή 80x60. Επειδή το παράθυρο προβολής όμως μένει σταθερό στην τιμή 320x240 το αποτέλεσμα είναι μια εμφανής πτώση στην ποιότητα της προβαλλόμενης εικόνας.
Παράδειγμα υλοποίησης
Συνδυάζοντας τον VGA Controller με τον Flash Memory Transciever μπορεί να υλοποιηθεί το ακόλουθο κύκλωμα αναπαραγωγής video.
Σχήμα 3. Το προτεινόμενο κύκλωμα.
Το πρώτο στάδιο περιλαμβάνει την αποκωδικοποίηση του βίντεο και την εξαγωγή των επιμέρους καρέ (frames) για την εξαγωγή της χρωματικής πληροφορίες των 3 βασικών χρωμάτων (RGB) για κάθε pixel της εικόνας. Εφόσον δεν υπάρχει διαθέσιμος ένας αυτόματος decoder η παραπάνω διαδικασία γίνεται εκτός πλακέτας (off-line) και περιλαμβάνει τα ακόλουθα στάδια:
-
Επιλογή βίντεο. Ένα σύντομο βίντεο 4 δευτερολέπτων επιλέχθηκε για την συγκεκριμένη εργασία.
-
Μετατροπή των αναλογιών της εικόνας ώστε να συμβαδίζει με το πρότυπο VGA 640x480 pixels. Η διαδικασία αυτή εκτελείτε με οποιοδήποτε πρόγραμμα επεξεργασίας βίντεο.
-
Λήψη στιγμιότυπων από το βίντεο. Για την ομαλή ροή των εικόνων σε ταχύτητα που θα δεν θα αναγνωρίζεται από το ανθρώπινο μάτι επιλέχθηκε ένας αριθμός 15 στιγμιοτύπων ανά δευτερόλεπτο, 60 συνολικά για τα 4 δευτερόλεπτα. Μεγαλύτερος αριθμός σημαίνει περισσότερη πληροφορία και άρα περισσότερη μνήμη αποθήκευσης που αποτελεί πρόβλημα για τις δυνατότητες της συγκεκριμένης πλακέτας (ενδεικτικά για 1 frame 640x480 με 12 bit βάθος χρώματος απαιτούνται περίπου 3.5 Mb πληροφορίας).
-
Μετατροπή των εικόνων σε μορφή RGB πληροφορίας για των χρωματικό τόνο κάθε pixel της κάθε μιας από τις 60 εικόνες και αποθήκευση της πληροφορίας στην μνήμη flash της πλακέτας.
Για την εξαγωγή της RGB πληροφορίας κάθε pixel για κάθε frame της εικόνας παρέχεται ένα μικρό και εύχρηστο Matlab script (converter.m). Για την αποφυγή προβλημάτων συμβατότητας των χρησιμοποιούμενων συναρτήσεων προτίνεται η χρήση του πακέτου Matlab 2012b στο οποίο και έγινε η υλοποίηση. Οδηγίες για τη χρήση παρέονται και εντός του αρχείου.