
FIFO (Πρώτο μέσα, Πρώτο έξω) είναι μια μέθοδος αποθήκευσης δεδομένων, στην οποία τα πρώτα δεδομένα που εγγράφονται σε έναν buffer είναι επίσης τα πρώτα δεδομένα που ανακτώνται. Η αρχή λειτουργίας είναι παρόμοια με μια ουρά. Τα δεδομένα εισέρχονται στον buffer με μια συγκεκριμένη σειρά και παραμένουν αποθηκευμένα μέχρι να διαβαστούν. Τα πιο παλιά δεδομένα βγαίνουν πρώτα από τον buffer, ενώ τα πιο νέα δεδομένα περιμένουν πίσω τους.
Σε συστήματα FPGA και ASIC, το FIFO χρησιμοποιείται συνήθως ως προσωρινή περιοχή αποθήκευσης ανάμεσα σε κυκλώματα που παράγουν δεδομένα και κυκλώματα που καταναλώνουν δεδομένα. Αντί να στέλνουν δεδομένα άμεσα από ένα μπλοκ σε ένα άλλο, τα εισερχόμενα δεδομένα αποθηκεύονται πρώτα στο FIFO. Το κυκλωματικά, στη συνέχεια, διαβάζει τα αποθηκευμένα δεδομένα όταν είναι έτοιμο. Αυτή η προσέγγιση βοηθά στη διατήρηση μιας συνεχούς και αξιόπιστης ροής δεδομένων.
Σε αντίθεση με τη συνηθισμένη μνήμη, το FIFO δεν απαιτεί εξωτερικές γραμμές διευθύνσεων για να επιλέξει θέσεις αποθήκευσης. Κατά τη διάρκεια μιας λειτουργίας εγγραφής, τα εισερχόμενα δεδομένα τοποθετούνται αυτόματα στην επόμενη διαθέσιμη θέση στον buffer. Κατά τη διάρκεια μιας λειτουργίας ανάγνωσης, τα παλαιότερα αποθηκευμένα δεδομένα ανακτώνται αυτόματα και αποστέλλονται στην έξοδο.
Αυτή η διαδικασία διαχειρίζεται από τους εσωτερικούς δείκτες εγγραφής και ανάγνωσης. Όταν νέα δεδομένα εγγράφονται, ο δείκτης εγγραφής μετακινείται στην επόμενη θέση αποθήκευσης. Όταν τα δεδομένα διαβάζονται, ο δείκτης ανάγνωσης προχωρά στο επόμενο διαθέσιμο στοιχείο. Επειδή αυτοί οι δείκτες λειτουργούν αυτόματα, το FIFO απαιτεί λιγότερη λογική ελέγχου σε σύγκριση με τη συμβατική μνήμη.
Το μειονέκτημα είναι ότι τα δεδομένα μπορούν να προσπελαστούν μόνο διαδοχικά. Σε αντίθεση με τη RAM, το FIFO δεν μπορεί να προσπελάσει άμεσα μια συγκεκριμένη θέση αποθήκευσης. Κάθε λειτουργία ανάγνωσης ακολουθεί την ακριβή σειρά στην οποία τα δεδομένα γράφτηκαν αρχικά.
Το FIFO χρησιμοποιείται ευρέως όταν διάφορα μέρη ενός συστήματος λειτουργούν σε διάφορες ταχύτητες. Σε πολλές εφαρμογές, μια συσκευή παράγει δεδομένα συνέχεια ενώ μια άλλη συσκευή επεξεργάζεται ή μεταδίδει αυτά τα δεδομένα με πιο αργό ρυθμό. Χωρίς προσωρινή αποθήκευση, τα εισερχόμενα δεδομένα μπορεί να φτάσουν γρηγορότερα από ότι μπορεί να διαχειριστεί, προκαλώντας απώλεια δεδομένων.
Για παράδειγμα, ένας αναλογικός-ψηφιακός μετατροπέας (ADC) μπορεί να παράγει συνεχώς ψηφιακά δείγματα, ενώ ένας επεξεργαστής, PCI bus ή διεπαφή επικοινωνίας επεξεργάζεται αυτά τα δείγματα σε διαφορετική ταχύτητα. Ένα FIFO λειτουργεί ως ενδιάμεσος buffer που αποθηκεύει τα εισερχόμενα δεδομένα και τα απελευθερώνει όταν το κυκλωματικά είναι έτοιμο. Αυτή η ικανότητα επιτρέπει και τις δύο πλευρές του συστήματος να λειτουργούν ανεξάρτητα χωρίς να χάνουν πληροφορίες.
Το FIFO μπορεί επίσης να λύσει τις ασυμβατότητες πλάτους δεδομένων μεταξύ συσκευών. Σε ορισμένα συστήματα, μια συσκευή μπορεί να εξάγει 8 bit δεδομένα ενώ μια άλλη περιμένει 16 bit δεδομένα. Άμεση επικοινωνία μπορεί να απαιτήσει επιπλέον λογική μετατροπής για να αναδιοργανώσει τα δεδομένα.
Ένα FIFO μπορεί να απλοποιήσει αυτή τη διαδικασία, αποθηκεύοντας προσωρινά τα εισερχόμενα δεδομένα και παρουσιάζοντάς τα σε μια μορφή που ταιριάζει με τη συσκευή που τα λαμβάνει. Αυτή η ικανότητα βοηθά διάφορα μπλοκ υλικού να ανταλλάσσουν δεδομένα αποτελεσματικά, μειώνοντας την πολυπλοκότητα της διεπαφής.
Οι δομές FIFO γενικά χωρίζονται σε συγχρονισμένο FIFO και ασύγχρονο FIFO.
Ένα συγχρονισμένο FIFO χρησιμοποιεί ένα μόνο σήμα ρολογιού για τις λειτουργίες ανάγνωσης και εγγραφής. Δεδομένου ότι όλες οι δραστηριότητες πραγματοποιούνται υπό την ίδια πηγή ρολογιού, οι χρονικές σχέσεις είναι πιο εύκολες να διαχειριστούν και να επαληθευτούν. Τα συγχρονισμένα FIFOs χρησιμοποιούνται συνήθως όταν τα δεδομένα παραμένουν εντός ενός μόνο τομέα ρολογιού.
Ένα ασύγχρονο FIFO χρησιμοποιεί ξεχωριστά ρολόγια για την εγγραφή και την ανάγνωση. Δεδομένα μπορεί να εισέλθουν στο FIFO χρησιμοποιώντας μια συχνότητα ρολογιού και να βγουν χρησιμοποιώντας μια άλλη. Δεδομένου ότι τα δύο ρολόγια λειτουργούν ανεξάρτητα, τα ασύγχρονα FIFOs χρησιμοποιούνται ευρέως για τη μεταφορά δεδομένων μεταξύ διαφορετικών τομέων ρολογιού.
Αυτή η δυνατότητα είναι ιδιαίτερα σημαντική σε συστήματα FPGA όπου οι επεξεργαστές, οι διεπαφές επικοινωνίας, οι ελεγκτές μνήμης και οι περιφερειακές συσκευές συχνά λειτουργούν σε διαφορετικές συχνότητες.
Η αξιόπιστη λειτουργία FIFO εξαρτάται από την γνώση του πόσα δεδομένα είναι αυτή τη στιγμή αποθηκευμένα στη μνήμη. Εάν συνεχίζουν να φτάνουν νέα δεδομένα αφού το FIFO φτάσει χωρητικότητα, μπορεί να παραγραφούν έγκυρες πληροφορίες. Ομοίως, η προσπάθεια ανάγνωσης δεδομένων από ένα κενό FIFO παράγει άκυρα αποτελέσματα.
Για την πρόληψη αυτών των καταστάσεων, οι σχεδιασμοί FIFO χρησιμοποιούν αρκετούς δείκτες κατάστασης.
Η ένδειξη πλήρους δείχνει ότι όλες οι διαθέσιμες θέσεις αποθήκευσης είναι κατειλημμένες και δεν μπορεί να γραφούν επιπλέον δεδομένα. Η ένδειξη κενού δείχνει ότι δεν μένουν έγκυρα δεδομένα διαθέσιμα προς ανάγνωση.
Πολλές υλοποιήσεις FIFO παρέχουν επίσης δείκτες σχεδόν πλήρεις και σχεδόν κενούς. Αυτοί οι δείκτες λειτουργούν ως πρώιμες προειδοποιήσεις πριν το FIFO φτάσει σε κατάσταση εντελώς πλήρους ή εντελώς κενού. Η λογική ελέγχου μπορεί να χρησιμοποιήσει αυτούς τους δείκτες για να επιβραδύνει, να σταματήσει ή να ρυθμίσει τις μεταφορές δεδομένων προτού προκύψει υπερφορτώσεις ή υποφορτώσεις.
Επειδή αυτοί οι δείκτες κατάστασης επηρεάζουν άμεσα την ακεραιότητα των δεδομένων και την αξιοπιστία του συστήματος, αποτελούν αναπόσπαστο μέρος του σχεδιασμού FIFO.
Οι δομές FIFO γενικά χωρίζονται σε FIFO Ενός Ρολογιού (SCFIFO) και FIFO Δύο Ρολογιών (DCFIFO). Αυτές οι δομές είναι σχεδιασμένες να υποστηρίζουν διαφορετικές σχέσεις ρολογιού και απαιτήσεις μεταφοράς δεδομένων.
Οι πιο κοινές δομές FIFO περιλαμβάνουν:
• SCFIFO (FIFO Ενός Ρολογιού)
• DCFIFO (FIFO Δύο Ρολογιών)
• DCFIFO Μικτού Πλάτους (FIFO Δύο Ρολογιών με διαφορετικά πλάτη δεδομένων ανάγνωσης και εγγραφής)
Στην πλειονότητα της τεκμηρίωσης FPGA, οι στάνταρ διπλής χρονικής FIFOs και οι ασαφούς πλάτους διπλής χρονικής FIFOs κατηγοριοποιούνται και οι δύο ως διπλής χρονικής FIFOs εκτός εάν απαιτείται διάκριση.

Η επιλογή μιας δομής FIFO εξαρτάται κυρίως από το πώς τα δεδομένα εισέρχονται και εξέρχονται από την μνήμη. Η σχέση μεταξύ του ρολογιού εγγραφής και του ρολογιού ανάγνωσης είναι συνήθως ο πιο σημαντικός παράγοντας κατά την επιλογή της κατάλληλης αρχιτεκτονικής FIFO.
Ένα FIFO Ενός Ρολογιού χρησιμοποιεί ένα σήμα ρολογιού για να ελέγχει τη διαδικασία εγγραφής και ανάγνωσης. Δεδομένου ότι και οι δύο διαδικασίες λειτουργούν εντός του ίδιου τομέα ρολογιού, ο έλεγχος χρόνου είναι σχετικά απλός και τα ζητήματα συγχρονισμού ελαχιστοποιούνται.
Όταν έγκυρα δεδομένα φτάσουν στη είσοδο FIFO και μια αίτηση εγγραφής ενεργοποιηθεί, τα δεδομένα αποθηκεύονται στην επόμενη διαθέσιμη θέση μνήμης στην ενεργή ακμή ρολογιού. Καθώς φτάνουν περισσότερα δεδομένα, ο δείκτης εγγραφής συνεχίζει να προχωρά μπροστά στη περιοχή αποθήκευσης του FIFO.
Όταν ενεργοποιηθεί μια αίτηση ανάγνωσης, το FIFO ανακτά τα παλαιότερα αποθηκευμένα δεδομένα και τα τοποθετεί στην έξοδο. Ο δείκτης ανάγνωσης προχωρά τότε στην επόμενη αποθηκευμένη θέση. Αυτή η συνεχής κίνηση των δεικτών ανάγνωσης και εγγραφής επιτρέπει τη ροή των δεδομένων μέσω του FIFO στη σωστή σειρά.
Τα FIFOs ενός ρολογιού παρέχουν επίσης αρκετούς δείκτες κατάστασης που βοηθούν στην παρακολούθηση των συνθηκών της μνήμης. Η ένδειξη πλήρους δείχνει ότι όλες οι θέσεις αποθήκευσης είναι κατειλημμένες και οι επιπλέον εγγραφές πρέπει να σταματήσουν. Η ένδειξη σχεδόν πλήρους προειδοποιεί ότι το FIFO πλησιάζει την χωρητικότητα.
Η ένδειξη κενού δείχνει ότι δεν μένουν έγκυρα δεδομένα στη μνήμη, ενώ η ένδειξη σχεδόν κενού προειδοποιεί ότι μένει μόνο μια μικρή ποσότητα δεδομένων. Πολλές υλοποιήσεις περιλαμβάνουν επίσης έναν μετρητή χρησιμοποιημένων λέξεων, ο οποίος αναφέρει πόσα δεδομένα είναι αυτή τη στιγμή αποθηκευμένα στο FIFO.
Αυτοί οι δείκτες επιτρέπουν τη γύρω λογική να λαμβάνει ασφαλείς αποφάσεις ανάγνωσης και εγγραφής ενώ διατηρεί αξιόπιστη λειτουργία FIFO.
Ένα FIFO Δύο Ρολογιών χρησιμοποιεί ξεχωριστά ρολόγια για τις λειτουργίες εγγραφής και ανάγνωσης. Η πλευρά εγγραφής λειτουργεί εντός ενός τομέα ρολογιού, ενώ η πλευρά ανάγνωσης λειτουργεί σε έναν άλλο.
Τα εισερχόμενα δεδομένα εγγράφονται στο FIFO χρησιμοποιώντας το ρολόι εγγραφής. Αφού αποθηκευτούν, τα δεδομένα παραμένουν μέσα στη μνήμη μέχρι να τα ανακτήσει η πλευρά ανάγνωσης χρησιμοποιώντας το ρολόι ανάγνωσης. Δεδομένου ότι τα δύο ρολόγια είναι ανεξάρτητα, το FIFO μπορεί να μεταφέρει με ασφάλεια δεδομένα μεταξύ διαφορετικών τομέων ρολογιού.
Αυτή η δυνατότητα καθιστά τα FIFOs δύο ρολογιών μία από τις πιο κοινές λύσεις για τη διασταύρωση τομέων ρολογιού σε συστήματα FPGA.
Για να υποστηριχθεί η αξιόπιστη λειτουργία, οι διπλές FIFO με χρονισμό παρέχουν σήματα κατάστασης και για τις δύο πλευρές της διεπαφής. Η πλευρά εγγραφής χρησιμοποιεί συνήθως σήματα όπως wrfull και wrempty για να υποδείξει τις συνθήκες της προσωρινής μνήμης εγγραφής. Η πλευρά ανάγνωσης χρησιμοποιεί συνήθως rdfull και rdempty για να υποδείξει τη διαθεσιμότητα δεδομένων για ανάγνωση.
Ξεχωριστοί μετρητές παρέχονται επίσης συχνά, έτσι ώστε κάθε τομέας χρονισμού να μπορεί να παρακολουθεί την ποσότητα αποθηκευμένων δεδομένων ανεξάρτητα. Αυτοί οι δείκτες επιτρέπουν και στις δύο πλευρές της FIFO να παίρνουν αποφάσεις χωρίς να παρεμβαίνουν η μία στην άλλη.
Ορισμένες εφαρμογές απαιτούν διαφορετικά πλάτη δεδομένων στη πλευρά εγγραφής και στη πλευρά ανάγνωσης της FIFO. Σε αυτές τις περιπτώσεις, μπορεί να χρησιμοποιηθεί μια FIFO Διπλού Χρονισμού Μεικτού Πλάτους.
Για παράδειγμα, τα δεδομένα μπορεί να εγγράφονται στη FIFO ως λέξεις 16-bit αλλά να διαβάζονται ως λέξεις 8-bit. Η FIFO οργανώνει αυτόματα τις αποθηκευμένες πληροφορίες και εκτελεί την απαιτούμενη μετατροπή πλάτους διατηρώντας τη σειρά των αρχικών δεδομένων.
Αυτή η δυνατότητα είναι χρήσιμη όταν συνδέονται συσκευές που χρησιμοποιούν διαφορετικά πλάτη λεωφόρων. Αντί να προστεθεί ξεχωριστό κύκλωμα μετατροπής, η FIFO χειρίζεται την προσαρμογή πλάτους εσωτερικά.
Μια FIFO Μονού Χρονισμού χρησιμοποιείται γενικά όταν η ανάγνωση και η εγγραφή συμβαδίζουν εντός του ίδιου τομέα χρονισμού. Η απλούστερη αρχιτεκτονική της διευκολύνει την ανάλυση χρονισμού και την υλοποίηση.
Μια FIFO Διπλού Χρονισμού είναι προτιμότερη όταν τα δεδομένα πρέπει να μετακινούνται μεταξύ ανεξάρτητων τομέων χρονισμού. Παρέχει αξιόπιστη διασταύρωση τομέων χρονισμού και βοηθά στην εξάλειψη προβλημάτων συγχρονισμού.
Όταν απαιτείται τόσο διασταύρωση τομέων χρονισμού όσο και μετατροπή πλάτους δεδομένων, μια FIFO Διπλού Χρονισμού Μεικτού Πλάτους παρέχει μια αποτελεσματική λύση συνδυάζοντας και τις δύο λειτουργίες μέσα σε μια μόνο δομή FIFO.
Η FIFO λειτουργεί ως προσωρινός χώρος αποθήκευσης μεταξύ διαφορετικών τμημάτων ενός ψηφιακού συστήματος. Σε πολλές εφαρμογές, τα δεδομένα δεν φθάνουν και δεν αποχωρούν με την ίδια ακριβώς ταχύτητα. Ένας συσκευής μπορεί να παράγει δεδομένα συνεχώς, ενώ μια άλλη συσκευή μπορεί να επεξεργάζεται ή να μεταδίδει αυτά τα δεδομένα σε πιο αργό ρυθμό. Χωρίς μια προσωρινή μνήμη μεταξύ τους, τα εισερχόμενα δεδομένα μπορούν να συσσωρεύονται πιο γρήγορα από ό,τι μπορούν να επεξεργαστούν, οδηγώντας σε απώλεια δεδομένων.
Μια FIFO λύνει αυτό το πρόβλημα αποθηκεύοντας δεδομένα καθώς φθάνουν και απελευθερώνοντάς τα όταν το κύκλωμα λήψης είναι έτοιμο. Αυτό δημιουργεί μια ομαλότερη ροή πληροφοριών και επιτρέπει σε διαφορετικά μέρη του συστήματος να λειτουργούν πιο αποτελεσματικά χωρίς να απαιτούν τέλεια συγχρονισμένη συντονισμό.
Πέρα από την απλή προσωρινή μνήμη, η FIFO βοηθά επίσης στη βελτίωση της συνολικής απόδοσης του συστήματος. Συγκεντρώνοντας δεδομένα προσωρινά πριν από τη μεταφορά, η FIFO μειώνει τον αριθμό των λειτουργιών πρόσβασης λεωφόρου και ελαχιστοποιεί την περιττή επικοινωνιακή επιβάρυνση. Αυτό επιτρέπει τη χρήση των πόρων του συστήματος πιο αποτελεσματικά.
Η FIFO μπορεί επίσης να μειώσει το φορτίο του επεξεργαστή. Αντί να αναγκάζει την CPU να χειρίζεται κάθε μεμονωμένη μεταφορά δεδομένων, τα δεδομένα μπορούν να συσσωρεύονται στη FIFO και να επεξεργάζονται σε μεγαλύτερες μπλοκ. Αυτή η προσέγγιση βελτιώνει την απόδοση και ελευθερώνει πόρους του επεξεργαστή για άλλες εργασίες.
Ένα άλλο σημαντικό πλεονέκτημα είναι η υποστήριξη για λειτουργίες Άμεσου Προσβάσιμου Μνήμης (DMA). Σε συστήματα υψηλής ταχύτητας, η DMA επιτρέπει στα δεδομένα να μετακινούνται άμεσα μεταξύ περιφερειακών συσκευών και μνήμης χωρίς συνεχή εμπλοκή της CPU. Η FIFO παρέχει την προσωρινή αποθήκευση που απαιτείται για να υποστηρίξει αυτές τις μεταφορές και να διατηρήσει μια συνεχή ροή δεδομένων.
Χωρίς την προσωρινή μνήμη FIFO και την υποστήριξη DMA, ο επεξεργαστής μπορεί να ξοδεύει σημαντικό χρόνο διαχειριζόμενος την κίνηση των δεδομένων, γεγονός που μπορεί να μειώσει την συνολική απόδοση του συστήματος και να αυξήσει τον κίνδυνο συμφόρησης μετάδοσης.
Μια FIFO Μονού Χρονισμού χρησιμοποιείται συνήθως όταν τόσο η διαδικασία εγγραφής όσο και η διαδικασία ανάγνωσης ελέγχονται από το ίδιο σήμα χρονισμού. Επειδή και οι δύο πλευρές της FIFO λειτουργούν μέσα στον ίδιο τομέα χρονισμού, η διαχείριση του χρόνου είναι απλότερη και τα ζητήματα συγχρονισμού είναι πιο εύκολα στην αποφυγή.
Μια κοινή εφαρμογή είναι η απόκτηση δεδομένων από αισθητήρες. Σε πολλά συστήματα, ένας αισθητήρας μπορεί να παράγει δεδομένα πολύ πιο γρήγορα από την διεπαφή επικοινωνίας που είναι υπεύθυνη για τη μετάδοση αυτών των δεδομένων σε μια άλλη συσκευή.
Για παράδειγμα, μια FPGA μπορεί να συλλέγει δεδομένα από έναν αισθητήρα μέσω μιας διεπαφής SPI υψηλής ταχύτητας. Κάθε δείγμα αισθητήρα φθάνει γρήγορα και πρέπει να αποθηκευτεί άμεσα για να αποφευχθεί η απώλεια πληροφοριών. Ταυτόχρονα, τα συγκεντρωμένα δεδομένα μπορεί να χρειαστεί να μεταδοθούν μέσω μιας διεπαφής UART που λειτουργεί σε πολύ χαμηλότερο ρυθμό μετάδοσης.
Καθώς τα δεδομένα από αισθητήρες εισέρχονται στην FPGA, εγγράφονται απευθείας στη FIFO. Τα αποθηκευμένα δεδομένα περιμένουν στη μνήμη προσωρινά ενώ η UART τα μεταδίδει σταδιακά με τη δική της ταχύτητα. Καθώς τα δεδομένα αποχωρούν από τη FIFO, νέα δείγματα αισθητήρα συνεχίζουν να εισέρχονται στη μνήμη. Αυτή η συνεχής διαδικασία εγγραφής και ανάγνωσης επιτρέπει και στις δύο πλευρές του συστήματος να λειτουργούν σε διαφορετικούς ρυθμούς δεδομένων ενώ παραμένουν συγχρονισμένες από την ίδια πηγή χρονισμού.
Απορροφώντας προσωρινές διαφορές ταχύτητας μεταξύ συλλογής δεδομένων και μετάδοσης δεδομένων, ένα FIFO με μία μόνο ρολόι βοηθά στη διατήρηση μιας σταθερής ροής δεδομένων και αποτρέπει την απώλεια δεδομένων.
Ένα FIFO Διπλού Ρολογιού είναι σχεδιασμένο για συστήματα στα οποία η πλευρά εγγραφής και η πλευρά ανάγνωσης λειτουργούν με διαφορετικά σήματα ρολογιού. Αυτή η κατάσταση είναι κοινή σε σχεδιασμούς FPGA, καθώς πολλά λειτουργικά μπλοκ λειτουργούν σε διαφορετικές συχνότητες και χρονικές απαιτήσεις.
Όταν τα δεδομένα μεταφέρονται από ένα ρολόι σε ένα άλλο, οι άμεσες συνδέσεις μπορούν να δημιουργήσουν προβλήματα συγχρονισμού. Τα δεδομένα μπορεί να φτάσουν πολύ νωρίς, πολύ αργά ή κατά τη διάρκεια ασταθών χρονικών παραθύρων, οδηγώντας σε αναξιόπιστη λειτουργία.
Ένα FIFO διπλού ρολογιού παρέχει ένα ασφαλές όριο μεταξύ των δύο ρολογιών. Τα εισερχόμενα δεδομένα εγγράφονται στο FIFO χρησιμοποιώντας το ρολόι πηγής. Αφού αποθηκευτούν, τα δεδομένα παραμένουν στη μνήμη μέχρι να τα αναγνώσει η πλευρά προορισμού χρησιμοποιώντας το δικό της ρολόι. Το FIFO διαχειρίζεται εσωτερικά τη διαδικασία μεταφοράς έτσι ώστε και οι δύο χρονικοί τομείς να μπορούν να λειτουργούν ανεξάρτητα.
Ένα σύστημα επεξεργασίας βίντεο παρέχει ένα καλό παράδειγμα. Μια κάμερα μπορεί να καταγράψει δεδομένα εικόνας χρησιμοποιώντας μία συχνότητα ρολογιού, ενώ ένας ελεγκτής VGA εξάγει δεδομένα εικόνας χρησιμοποιώντας μια διαφορετική συχνότητα ρολογιού. Καθώς τα δεδομένα εικόνας παράγονται από την κάμερα, γράφονται συνεχώς στο FIFO. Ο ελεγκτής VGA στη συνέχεια διαβάζει τα αποθηκευμένα δεδομένα εικόνας με την ταχύτητα που απαιτείται για την έξοδο οθόνης.
Επειδή το ρολόι εγγραφής και το ρολόι ανάγνωσης είναι εντελώς ανεξάρτητα, το FIFO λειτουργεί ως γέφυρα μεταξύ των δύο χρονικών συστημάτων. Αυτό επιτρέπει στα δεδομένα εικόνας να μεταφέρονται αξιόπιστα από τη διεπαφή της κάμερας στη διεπαφή της οθόνης, χωρίς σφάλματα συγχρονισμού.
Για το λόγο αυτό, τα FIFO διπλού ρολογιού χρησιμοποιούνται ευρέως για διασταυρώσεις χρονικών τομέων, ταχύτατη μεταφορά δεδομένων, συστήματα επεξεργασίας βίντεο, διεπαφές επικοινωνίας και άλλες εφαρμογές όπου τα δεδομένα πρέπει να κινούνται μεταξύ ανεξάρτητων χρονικών περιβαλλόντων.
Οι συσκευές Altera FPGA παρέχουν διάφορους τρόπους για να υλοποιηθεί η λειτουργικότητα FIFO. Η καλύτερη μέθοδος εξαρτάται από τις απαιτήσεις σχεδιασμού, το χρονοδιάγραμμα ανάπτυξης και το επίπεδο προσαρμογής που απαιτείται.
Σε τα περισσότερα έργα, ο στόχος είναι ο ίδιος. Ένα FIFO πρέπει να προστεθεί μεταξύ δύο λειτουργικών μπλοκ ώστε τα δεδομένα να μπορούν να αποθηκευτούν προσωρινά, να μεταφερθούν αξιόπιστα και να υποβληθούν σε επεξεργασία με την απαιτούμενη ταχύτητα. Η διαφορά έγκειται στο πώς δημιουργείται και ενσωματώνεται το FIFO στο σχέδιο FPGA.
Τρεις κοινές μέθοδοι υλοποίησης είναι ευρέως χρησιμοποιούμενες στην ανάπτυξη FPGA Altera.
Η πρώτη μέθοδος είναι να κατασκευάσουμε ένα FIFO απευθείας χρησιμοποιώντας κωδικό RTL (Επίπεδο Μεταφοράς Μητρώου).
Σε αυτή την προσέγγιση, ο σχεδιαστής δημιουργεί τη συνολική δομή FIFO, συμπεριλαμβανομένου του πίνακα μνήμης, του δείκτη ανάγνωσης, του δείκτη εγγραφής, της λογικής ανίχνευσης πλήρους, της λογικής ανίχνευσης κενής και των κυκλωμάτων ελέγχου. Κάθε τμήμα της λειτουργίας FIFO ορίζεται χειροκίνητα μέσα στον κωδικό HDL.
Αυτή η μέθοδος παρέχει το υψηλότερο επίπεδο ευελιξίας. Το βάθος του FIFO, το πλάτος δεδομένων, οι σηματοδότες κατάστασης και η συμπεριφορά ελέγχου μπορούν να προσαρμοστούν ώστε να ταιριάζουν σε συγκεκριμένες απαιτήσεις εφαρμογής. Επιπλέον χαρακτηριστικά μπορούν επίσης να προστεθούν εάν οι τυπικές υλοποιήσεις FIFO δεν παρέχουν τη ζητούμενη λειτουργικότητα.
Ωστόσο, η ανάπτυξη ενός FIFO από το μηδέν απαιτεί ισχυρή κατανόηση της αρχιτεκτονικής FIFO, της ανάλυσης χρόνου και των τεχνικών σχεδίασης FPGA. Περισσότερη επιβεβαίωση και δοκιμή είναι επίσης απαραίτητη για να διασφαλιστεί η αξιόπιστη λειτουργία υπό όλες τις συνθήκες.
Για το λόγο αυτό, η ανάπτυξη προσαρμοσμένων FIFO συνήθως διατίθεται για εφαρμογές που απαιτούν εξειδικευμένα χαρακτηριστικά ή μοναδικές απαιτήσεις απόδοσης.
Η δεύτερη μέθοδος είναι η χρήση ενός έργου FIFO ανοιχτού κώδικα ή τρίτου μέρους.
Αντί να σχεδιάσετε το FIFO από την αρχή, ένα υπάρχον μοντέλο FIFO εισάγεται στο έργο και συνδέεται με τη γύρω λογική. Δεδομένου ότι ο πηγαίος κώδικας είναι συχνά διαθέσιμος, ο σχεδιασμός μπορεί να τροποποιηθεί εάν απαιτούνται πρόσθετα χαρακτηριστικά ή ρυθμίσεις.
Αυτή η προσέγγιση μπορεί να μειώσει σημαντικά τον χρόνο ανάπτυξης. Πολλή από την αρχιτεκτονική FIFO έχει ήδη δημιουργηθεί, δοκιμαστεί και επικυρωθεί, επιτρέποντας στους σχεδιαστές να επικεντρωθούν στην ολοκλήρωση του συστήματος παρά στην ανάπτυξη FIFO χαμηλού επιπέδου.
Όταν οι απαιτήσεις του έργου διαφέρουν ελαφρά από την τυπική συμπεριφορά FIFO, ο πηγαίος κώδικας μπορεί να επεξεργαστεί για να υποστηρίξει τη ζητούμενη λειτουργικότητα, ενώ εξακολουθεί να αποφεύγει την προσπάθεια που απαιτείται για τη δημιουργία ενός εντελώς νέου σχεδίου FIFO.
Η πιο κοινή μέθοδος είναι η χρήση των πυρήνων FIFO που παρέχονται από το λογισμικό Quartus II.
Το Quartus II περιλαμβάνει ενσωματωμένους γεννήτριες FIFO που επιτρέπουν τη δημιουργία δομών FIFO μέσω μιας γραφικής διεπαφής ρύθμισης. Αντί να γράφουν χειροκίνητα τη λογική FIFO, οι σχεδιαστές επιλέγουν τις απαιτούμενες παραμέτρους και επιτρέπουν στο λογισμικό να παράγει την υλοποίηση αυτόματα.
Κατά τη διάρκεια της παραμετροποίησης, μπορούν να οριστούν αρκετές σημαντικές ρυθμίσεις. Αυτές περιλαμβάνουν:
• Τύπος FIFO (μονοχρονισμός ή διχρονισμός)
• Πλάτος δεδομένων
• Βάθος FIFO
• Επιλογές υλοποίησης μνήμης
• Σήματα κατάστασης πλήρους και κενής
• Ορια σχεδόν πλήρους και σχεδόν κενής
• Ρυθμίσεις χρονισμού ανάγνωσης και εγγραφής
Αφού επιλεγούν οι παράμετροι, το Quartus II δημιουργεί τα αρχεία FIFO και τη λογική υποστήριξης που απαιτείται για το σχεδιασμό FPGA.
Αφού ολοκληρωθεί η παραμετροποίηση FIFO, το Quartus II δημιουργεί αυτόματα μια βελτιστοποιημένη υλοποίηση για τη επιλεγμένη συσκευή FPGA Altera.
Το δημιουργηθέν FIFO μπορεί στη συνέχεια να συνδεθεί άμεσα με τη γύρω λογική. Τα εισερχόμενα δεδομένα συνδέονται με τη διεπαφή εγγραφής, τα εξερχόμενα δεδομένα συνδέονται με τη διεπαφή ανάγνωσης και τα σήματα κατάστασης χρησιμοποιούνται για τον έλεγχο της ροής δεδομένων σε όλο το σύστημα.
Επειδή ο δημιουργημένος σχεδιασμός είναι βελτιστοποιημένος για την αρχιτεκτονική FPGA στόχου, η χρησιμοποίηση πόρων είναι συνήθως πιο αποτελεσματική από πολλές χειροκίνητα αναπτυγμένες υλοποιήσεις. Ο χρόνος ανάπτυξης μειώνεται επίσης, διότι μεγάλο μέρος του σχεδιασμού, της επιβεβαίωσης και της εργασίας βελτιστοποίησης διεκπεραιώνεται αυτόματα από το λογισμικό.
Για τα περισσότερα έργα FPGA, ο πυρήνας FIFO IP του Quartus II παρέχει την ταχύτερη και απλούστερη διαδρομή για την υλοποίηση αξιόπιστης λειτουργικότητας FIFO διατηρώντας ταυτόχρονα αποτελεσματική χρήση των πόρων FPGA.
Το FIFO παρέχει έναν απλό και αξιόπιστο τρόπο αποθήκευσης δεδομένων, αντιστοίχισης ρυθμών μεταφοράς και υποστήριξης επικοινωνίας μεταξύ διαφορετικών εξαρτημάτων του συστήματος. Κατανοώντας τις αρχιτεκτονικές FIFO, τα σήματα κατάστασης, τη συγχρονική και ασύγχρονη λειτουργία, καθώς και τις μεθόδους υλοποίησης, οι σχεδιαστές μπορούν να βελτιώσουν την ακεραιότητα δεδομένων, να αποτρέψουν τις συνθήκες υπερχείλισης και υποχέλισης και να κατασκευάσουν πιο αποτελεσματικά ψηφιακά συστήματα.
Οι αποθηκευτές FIFO λειτουργούν ως προσωρινή αποθήκευση μεταξύ κυκλωμάτων παραγωγής δεδομένων και κυκλωμάτων κατανάλωσης δεδομένων. Όταν μία συσκευή παράγει δεδομένα γρηγορότερα από ό,τι μπορεί μία άλλη να τα επεξεργαστεί, το FIFO αποθηκεύει τις εισερχόμενες πληροφορίες και τις απελευθερώνει όταν η συσκευή λήψης είναι έτοιμη. Αυτό αποτρέπει την απώλεια δεδομένων, βελτιώνει την αξιοπιστία του συστήματος και επιτρέπει και στις δύο κυκλωμάτων να λειτουργούν ανεξάρτητα χωρίς να απαιτείται τέλεια αντιστοίχιση ταχύτητας.
Οι ασύγχρονοι FIFO χρησιμοποιούν ξεχωριστούς χρονισμούς για τις λειτουργίες εγγραφής και ανάγνωσης, επιτρέποντας στα δεδομένα να μεταφέρονται με ασφάλεια μεταξύ ανεξάρτητων χρονικών τομέων. Αυτό αποτρέπει προβλήματα συγχρονισμού και χρονισμού που μπορεί να προκύψουν όταν μεταφέρονται σήματα απευθείας μεταξύ κυκλωμάτων που λειτουργούν σε διαφορετικές συχνότητες. Ως αποτέλεσμα, οι ασύγχρονοι FIFO χρησιμοποιούνται συνήθως σε διεπαφές επικοινωνίας, συστήματα βίντεο, επεξεργαστές και ελεγκτές μνήμης.
Τα σήματα κατάστασης FIFO παρέχουν πληροφορίες σε πραγματικό χρόνο σχετικά με τη χρήση του αποθηκευτικού χώρου. Οι σημαίες πλήρους και σχεδόν πλήρους προειδοποιούν όταν ο χώρος αποθήκευσης εξαντλείται, ενώ οι σημαίες κενής και σχεδόν κενής υποδεικνύουν όταν ελάχιστα ή καθόλου δεδομένα παραμένουν διαθέσιμα. Αυτά τα σήματα επιτρέπουν στη λογική ελέγχου να προσαρμόσει τις μεταφορές δεδομένων πριν συμβούν σφάλματα, βοηθώντας στη διατήρηση της ακεραιότητας των δεδομένων και της σταθερής λειτουργίας του συστήματος.
Τα συστήματα βίντεο συχνά περιλαμβάνουν συσκευές που λειτουργούν σε διαφορετικές συχνότητες χρονισμού, όπως κάμερες και ελεγκτές οθόνης. Ένας διχρονικός FIFO αποθηκεύει τα εισερχόμενα δεδομένα εικόνας χρησιμοποιώντας έναν χρονισμό και επιτρέπει την ανάγνωσή τους χρησιμοποιώντας έναν άλλο χρονισμό. Αυτό δημιουργεί μια αξιόπιστη γέφυρα μεταξύ των δύο χρονικών τομέων και εξασφαλίζει τη συνεχή μεταφορά εικόνας χωρίς σφάλματα συγχρονισμού ή διαφθορά δεδομένων.
Οι πυρήνες FIFO IP του Quartus II απλοποιούν την ανάπτυξη δημιουργώντας αυτόματα βελτιστοποιημένη λογική FIFO με βάση τις ρυθμίσεις που καθορίζονται από τον χρήστη, όπως βάθος, πλάτος, τύπο χρονισμού και σήματα κατάστασης. Αυτό μειώνει το χρόνο σχεδίασης, ελαχιστοποιεί την προσπάθεια επιβεβαίωσης και συχνά παρέχει καλύτερη εκμετάλλευση πόρων από τις χειροκίνητα κωδικοποιημένες υλοποιήσεις, καθιστώντας το την προτιμώμενη λύση για τα περισσότερα έργα FPGA.
2024/08/28
2024/07/29
2024/10/6
2024/07/4
2025/09/20
2024/04/22
2024/07/15
2025/09/15
2023/12/28
2024/11/15









