Σχεδίαση και υλοποίηση σε FPGA παράλληλης επεξεργασίας μετασχηματισμού Fourier με τεχνική in-place

Σχετικά έγγραφα
ΑΣΚΗΣΗ 2: Σχεδίαση και προσομοίωση κυκλωμάτων καταχωρητών και μετρητών

Library, package και subprograms

«Σχεδιασμός Ολοκληρωμένων Κυκλωμάτων» Χειμερινό εξάμηνο Ακολουθιακός Κώδικας

ΗΜΥ 210: Σχεδιασμός Ψηφιακών Συστημάτων. Καταχωρητές 1

ΗΜΥ 210 ΣΧΕΔΙΑΣΜΟΣ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ. Χειµερινό Εξάµηνο 2016 ΔΙΑΛΕΞΗ 15: Καταχωρητές (Registers)

«Σχεδιασμός Ολοκληρωμένων Κυκλωμάτων» Χειμερινό εξάμηνο Προχωρημένα Θέματα Σχεδιασμού με VHDL

Σχεδίαση Ψηφιακών Συστημάτων

26-Nov-09. ΗΜΥ 210: Λογικός Σχεδιασμός, Χειμερινό Εξάμηνο Καταχωρητές 1. Διδάσκουσα: Μαρία Κ. Μιχαήλ

Περίληψη. ΗΜΥ-210: Λογικός Σχεδιασµός Εαρινό Εξάµηνο Παράδειγµα: Καταχωρητής 2-bit. Καταχωρητής 4-bit. Μνήµη Καταχωρητών

Structural VHDL. Structural VHDL

«Σχεδιασμός Ολοκληρωμένων Κυκλωμάτων» Χειμερινό εξάμηνο Μηχανές Πεπερασμένων Καταστάσεων

Εργαστήριο Οργάνωσης Η/Υ. Δαδαλιάρης Αντώνιος

«Σχεδιασμός Ολοκληρωμένων Κυκλωμάτων» Χειμερινό εξάμηνο Συντρέχων Κώδικας

Εργαστήριο Οργάνωσης Η/Υ. Δαδαλιάρης Αντώνιος

«Σχεδιασμός Ολοκληρωμένων Κυκλωμάτων» Χειμερινό εξάμηνο Πακέτα και Συστατικά Στοιχεία (Υποκυκλώματα)

Σχεδίαση Ψηφιακών Συστημάτων

«Σχεδιασμός Ολοκληρωμένων Κυκλωμάτων» Χειμερινό εξάμηνο Τύποι Δεδομένων και Τελεστές

Κυκλωμάτων» Χειμερινό εξάμηνο

Κυριάκης - Μπιτζάρος Ευστάθιος Τμήμα Ηλεκτρονικών Μηχανικών Τ.Ε.

«Σχεδιασμός Ολοκληρωμένων Κυκλωμάτων» Χειμερινό εξάμηνο Συναρτήσεις, Διαδικασίες και Δομές Ελέγχου Λειτουργίας Κυκλωμάτων (testbenches)

Εργαστήριο Αρχιτεκτονικής Υπολογιστών Ι. Εισαγωγή στη VHDL

Εργαστήριο Οργάνωσης Η/Υ. Δαδαλιάρης Αντώνιος

Εργαστήριο Οργάνωσης Η/Υ. Δαδαλιάρης Αντώνιος

Περιγραφή Κυκλωμάτων με χρήση της VHDL. Δομική περιγραφή και περιγραφή Μηχανών Πεπερασμένων Καταστάσεων

Εισαγωγή στη Γλώσσα VHDL

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα ΣΗΜΑΤΑ & ΣΥΣΤΗΜΑΤΑ. Ενότητα : ΤΑΧΥΣ ΜΕΤΑΣΧΗΜΑΤΙΣΜΟΣ FOURIER

Μελέτη και σχεδίαση µιας υποτυπώδους κεντρικής µονάδας επεξεργασίας στα 32 µπιτ.

ΗΜΥ 210: Σχεδιασμός Ψηφιακών Συστημάτων. VHDL για Ακολουθιακά Κυκλώματα 1

ΗΜΥ 210 ΣΧΕΔΙΑΣΜΟΣ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ. Χειµερινό Εξάµηνο 2016 Συµπληρωµατική ΔΙΑΛΕΞΗ 14: Περιγραφή Ακολουθιακών Κυκλωµάτων στη VHDL

ΗΜΥ211 Εργαστήριο Ψηφιακών Συστημάτων

VHDL για Σχεδιασµό Ακολουθιακών Κυκλωµάτων

Εισαγωγή στη VHDL Υλοποίηση στο Quartus

Σήματα και Συστήματα ΙΙ

Πανεπιστήµιο Θεσσαλίας

Εισαγωγή στη γλώσσα περιγραφής υλικού VHDL. Γενικά χαρακτηριστικά, σύνταξη και τύποι. Ψηφιακή Σχεδίαση µε CAD ΙΙ - ιάλεξη 1 -

Προσοµοίωση Συστηµάτων µε VHDL. (Peter Ashenden, The Students Guide to VHDL)

Σύνθετοι τύποι και λειτουργίες. (Peter Ashenden, The Students Guide to VHDL)

ΛΥΣΕΙΣ 3 ης ΓΡΑΠΤΗΣ ΕΡΓΑΣΙΑΣ

ΔΙΑΚΡΙΤΟΣ ΜΕΤΑΣΧΗΜΑΤΙΣΜΟΣ FOURIER - Discrete Fourier Transform - DFT -

Εισαγωγή στη γλώσσα περιγραφής υλικού VHDL. Βασικές εντολές και η περιγραφή συνδυαστικών κυκλωµάτων. Ψηφιακή Σχεδίαση µε CAD ΙΙ - ιάλεξη 2 -

Μοντελοποίηση Επιπέδου Πύλης. (Peter Ashenden, The Students Guide to VHDL)

Kεφάλαιο 5 DFT- FFT ΔΙΑΚΡΙΤΟΣ ΜΕΤΑΣΧΗΜΑΤΙΣΜΟΣ FOURIER DISCRETE FOURIER TRANSFORM 1/ 80. ΨΗΦΙΑΚΗ ΕΠΕΞΕΡΓΑΣΙΑ ΣΗΜΑΤΟΣ DFT-FFT Σ.

Behavioral & Mixed VHDL Architectures Finite State Machines in VHDL

Σχεδίαση Ψηφιακών Συστημάτων

Συλλογή & Επεξεργασία Δεδομένων Εργαστήριο 9 Ανάλυση Fourier: Από τη Θεωρία στην Πρακτική Εφαρμογή των Μαθηματικών

Behavioral & Mixed VHDL Architectures Finite State Machines in VHDL

Σχεδίαση Ψηφιακών Συστημάτων

(Peter Ashenden, The Students Guide to VHDL)

ΗΜΥ211 Εργαστήριο Ψηφιακών Συστημάτων

VHDL Εισαγωγικές έννοιες

Πανεπιστήμιο Πατρών. Τμήμα Ηλεκτρολόγων Μηχανικών και Τεχνολογίας Υπολογιστών


Γενική οργάνωση υπολογιστή «ΑΒΑΚΑ»

Introduction to IP Cores

ΕΙΔΙΚΟΤΗΤΑ: ΤΕΧΝΙΚΟΣ ΕΦΑΡΜΟΓΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΜΑΘΗΜΑ: ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ


ΕΙΣΑΓΩΓΙΚΟ ΕΓΧΕΙΡΙ ΙΟ ΓΙΑ ΣΧΕ ΙΑΣΜΟ ΜΕ ΧΡΗΣΗ ΤΗΣ ΓΛΩΣΣΑΣ VHDL

FFT. εκέµβριος 2005 ΨΕΣ 1

Κεφάλαιο 5 ο Προγραμματισμός Ολοκληρωμένων Κυκλωμάτων

Μηχανοτρονική. Τμήμα Μηχανικών Παραγωγής και Διοίκησης 7 ο Εξάμηνο,

ΗΜΥ-210: Σχεδιασμός Ψηφιακών Συστημάτων, Χειμερινό Εξάμηνο Νοε-09. Διδάσκουσα: Μαρία Κ. Μιχαήλ

Συλλογή & Επεξεργασία Δεδομένων Εργαστήριο 8 Επεξεργασία Σήματος με την Ανάλυση Fourier. Σύστημα Συλλογής & Επεξεργασίας Μετρήσεων

inputs outputs Σχήμα 3.1: Σχηματική παράσταση της λειτουργίας του testbench

VHDL. ΗΜΥ-210: Λογικός Σχεδιασµός, Εαρινό Εξάµηνο Απλό παράδειγµα: Entity. Μοντελοποίηση. Απλό παράδειγµα:αρχιτεκτονική. Στοιχεία γλώσσας VHDL

Εισαγωγή Η VHDL υποστηρίζει τους εξής τρείς βασικούς και διαφορετικούς τρόπους περιγραφής

Πανεπιστήμιο Πατρών. Τμήμα Ηλεκτρολόγων Μηχανικών και Τεχνολογίας Υπολογιστών. Εργαστήριο Σχεδίασης Ολοκληρωμένων Κυκλωμάτων

Οι Βιβλιοθήκες IEEE και παραδείγµατα functions

Περιγραφή Κυκλωμάτων με χρήση της VHDL. Καταχωρητές και χρονισμός με ρολόι

ΗΜΥ-210: Σχεδιασμός Ψηφιακών Συστημάτων

ΠΑΡΑΡΤΗΜΑ Β. Verification

Σύστημα ψηφιακής επεξεργασίας ακουστικών σημάτων με χρήση προγραμματιζόμενων διατάξεων πυλών. Πτυχιακή Εργασία. Φοιτητής: ΤΣΟΥΛΑΣ ΧΡΗΣΤΟΣ

Μετάδοση πληροφορίας - Διαμόρφωση

Πρόγραμμα Μεταπτυχιακών Σπουδών «Πληροφορική και Εφαρμογές»

Πράξεις με δυαδικούς αριθμούς

Περιγραφή Κυκλωμάτων με χρήση της VHDL. Οντότητες και συντρέχουσες δηλώσεις

Kεφάλαιο 5 DFT- FFT ΔΙΑΚΡΙΤΟΣ ΜΕΤΑΣΧΗΜΑΤΙΣΜΟΣ FOURIER DISCRETE FOURIER TRANSFORM ΨΗΦΙΑΚΗ ΕΠΕΞΕΡΓΑΣΙΑ ΣΗΜΑΤΟΣ DFT-FFT. Σ.

HMY 429: Εισαγωγή στην Επεξεργασία Ψηφιακών Σημάτων. Διάλεξη 22: Γρήγορος Μετασχηματισμός Fourier Ανάλυση σημάτων/συστημάτων με το ΔΜΦ

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Σχεδίαση Ψηφιακών Συστημάτων. Ενότητα: ΚΑΤΑΧΩΡΗΤΕΣ - ΑΠΑΡΙΘΜΗΤΕΣ

H γλώσσα περιγραφής κυκλωµάτων VHDL

Ενςωματωμένα Συςτήματα Υλοποίηςη του SDES ςε Hardware

Σχεδιασμός Ολοκληρωμένων Κυκλωμάτων VLSI II

Σχεδίαση σε VHDL και υλοποίηση σε FPGA Μονάδας Παραγωγής Μουσικού Σήματος

Ενσωματωμένα Συστήματα

Σχεδιασμός Ψηφιακών Συστημάτων Χειμερινό Εξάμηνο VHDL (revisited)

ΠΕΡΙΕΧΟΜΕΝΑ. Πρόλογος...9 ΚΕΦ. 1. ΑΡΙΘΜΗΤΙΚΑ ΣΥΣΤΗΜΑΤΑ - ΚΩΔΙΚΕΣ

Βασικές Έννοιες της Πληροφορικής

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ Πάτρα 2005 ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ Η/Υ & ΠΛΗΡΟΦΟΡΙΚΗΣ Εργαστήριο Επεξεργασίας Σηµάτων Τηλεπικοινωνιών & ικτύων

Σχεδίαση κυκλωμάτων με VHDL: 1o μέρος

Αρχιτεκτονική Σχεδίαση Ασαφούς Ελεγκτή σε VHDL και Υλοποίηση σε FPGA ΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ

8.1 Θεωρητική εισαγωγή

ΣΥΣΚΕΥΕΣ ΑΠΟΘΗΚΕΥΣΗΣ (ΜΝΗΜΗ)

VHDL για Σχεδιασµό Συνδυαστικών και Ακολουθιακών Ψηφιακών Κυκλωµάτων

«Σχεδιασμός Ψηφιακών Συστημάτων σε FPGA» Εαρινό εξάμηνο

Υπάρχουν δύο τύποι μνήμης, η μνήμη τυχαίας προσπέλασης (Random Access Memory RAM) και η μνήμη ανάγνωσης-μόνο (Read-Only Memory ROM).

Ας ξεκινήσουμε. Macro-instructions. (Assembly level) Micro-instructions Main memory. (micro-code)

Τμήμα Λογιστικής. Εισαγωγή στους Ηλεκτρονικούς Υπολογιστές. Μάθημα 8. 1 Στέργιος Παλαμάς

Ψηφιακή Επεξεργασία Σημάτων

Εργαστήριο 7: Ο αλγόριθμος ταξινόμησης Radix Sort

Μετάδοση πληροφορίας - Διαμόρφωση

Σχεδίαση Ψηφιακών Συστημάτων

Transcript:

ΕΘΝΙΚΟ ΚΑΙ ΚΑΠΟΔΙΣΤΡΙΑΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΦΥΣΙΚΗΣ ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ Σχεδίαση και υλοποίηση σε FPGA παράλληλης επεξεργασίας μετασχηματισμού Fourier με τεχνική in-place Ελισσαίος Αλέξιος Παπαθεοφάνους Α.Μ. 201100151 Επιβλέπων Καθηγητής : Δ.Ι. Ρεϊσης, Αναπληρωτής Καθηγητής ΑΘΗΝΑ 2017

ΠΕΡΙΕΧΟΜΕΝΑ 1. Περίληψη.3 2. Θεωρητική εισαγωγή...4 3. Αρχιτεκτονική υπολογισμού FFT 8 4. Πηγές..14 Παράρτημα.15 2

1. Περίληψη Η εργασία αυτή έχει ως επίκεντρο τον γρήγορο μετασχηματισμό Fourier (FFT) o οποίος αποτελεί έναν αλγόριθμο γρήγορου και αποδοτικού υπολογισμού του διακριτού μετασχηματισμού Fourier (DFT). O DFT μετασχηματίζει μια ακολουθία δεδομένων στο πεδίο του χρόνου στην αντίστοιχή της στο πεδίο της συχνότητας. Ως αποτέλεσμα, ο αλγόριθμος FFT χρησιμοποιείται σε πληθώρα σύγχρονων εφαρμογών ψηφιακής επεξεργασίας σήματος. Συγκεκριμένα, μελετήθηκε αρχιτεκτονική FFT η οποία πραγματοποιεί υπολογισμούς in-place όπου δεν απαιτούνται βοηθητικές δομές αποθήκευσης δεδομένων και άρα τα αποτελέσματα των υπολογισμών αποθηκεύονται στην ίδια, μοναδική δομή δεδομένων, αντικαθιστώντας τα αρχικά δεδομένα. Η εν λόγω αρχιτεκτονική χρησιμοποιεί ένα σύστημα διευθυνσιοδότησης το οποίο επιτρέπει την παράλληλη φόρτωση, επεξεργασία και αποθήκευση των δεδομένων. Επιπλέον, πραγματοποιούνται συγκεκριμένες μεταθέσεις ανάμεσα στα δεδομένα εισόδου και εξόδου του butterfly processor με αποτέλεσμα την ελαχιστοποίηση των απαιτήσεων σε υλικό του συστήματος διευθυνσιοδότησης αλλά και την επιτάχυνση των υπολογισμών. Η παραπάνω αρχιτεκτονική FFT χρησιμοποιεί έναν radix-8 butterfly processor και εφαρμόστηκε για 64 σημεία δεδομένων εισόδου. Η υλοποίηση όλων των παραπάνω έγινε σε γλώσσα περιγραφής υλικού (HDL), ενώ ο έλεγχος και επαλήθευση των αποτελεσμάτων έγινε μέσω προγράμματος που αναπτύχθηκε στη πλατφόρμα Matlab. 3

2. Θεωρητική Εισαγωγή Ο DFT για ένα πλήθος N σημείων ορίζεται σύμφωνα με τη μαθηματική σχέση cos 2 sin2, 0,,1 Ο υπολογισμός του DFT σύμφωνα με τον παραπάνω ορισμό είναι πολύ αργός και απαιτητικός σε πόρους, γεγονός που τον καθιστά μη αποδοτικό. Αντί αυτού στην πράξη χρησιμοποιείται ο αλγόριθμος FFT και συγκεκριμένα ο Cooley Tukey αλγόριθμος που είναι και η πιο συνηθισμένη εκδοχή του FFT. Η λογική του έγκειται στον χωρισμό, με αναδρομικό τρόπο, του Ν σημείων DFT σε πλήθος Ν1 DFTs, Ν2 σημείων έκαστος έτσι ώστε Ν = N1N2. Ως αποτέλεσμα, το πλήθος πράξεων που απαιτούνται για τον υπολογισμό του DFΤ μειώνεται από Ο(Ν 2 ) σε Ο(ΝlogN), μια βελτίωση η οποία αυξάνεται πολύ γρήγορα όσο αυξάνεται το πλήθος σημείων N του DFT. Στην παρούσα εργασία εφαρμόστηκε ο radix-8 decimation-in-time (DIT) FFT όπου ο αρχικός DFT Ν σημείων χωρίζεται σε 8 DFTs, N/8 σημείων έκαστος. Παρακάτω παρουσιάζεται η μαθηματική θεμελίωση του εν λόγω αλγόριθμου. Σημειώνεται καταρχάς πως οι εκθετικοί μιγαδικοί συντελεστές φάσης που εμφανίζονται στον ορισμό του DFT αποκαλούνται παραδοσιακά twiddle factors και συμβολίζονται για λόγους ευκολίας ως Παρουσιάζουν επιπλέον τις εξής ιδιότητες τις οποίες εκμεταλλευόμαστε ώστε να καταστήσουμε αποδοτικό τον αλγόριθμο / Οπότε 4

/ / / / / / / / / / / / / / / / / / / / / 0,,1 / / / Τα παραπάνω εφαρμόστηκαν για Ν = 64 πλήθος σημείων δεδομένων εισόδου, οπότε παρουσιάζεται παρακάτω και το αντίστοιχο data flow (Εικόνα 1). Όπως φαίνεται ο αλγόριθμος απαιτεί για την ολοκλήρωση του πλήθος stages ίσο με log8n = 2. Για καθένα από τα 2 αυτά stages, η μαθηματική σχέση, σε μορφή πίνακα, που υλοποιούν τα radix-8 butterflies, ανάμεσα στα δεδομένα εισόδου και εξόδου τους, είναι Ο παραπάνω πίνακας των twiddle factors μπορεί να απλοποιηθεί χρησιμοποιώντας τις αντίστοιχες ιδιότητες με αποτέλεσμα τη μείωση των απαιτούμενων υπολογισμών. 5

Εικόνα 1. Data flow διάγραμμα radix-8 DIT FFT αλγόριθμου για Ν=64 σημεία δεδομένων εισόδου. Τα twiddle factors αναπαρίστανται ως k αντί. 6

Προκύπτει οπότε Εικόνα 2. Radix-8 butterfly Ειδικά για το 2 ο stage του αλγόριθμου, τα δεδομένα εισόδου του κάθε butterfly είναι πολλαπλασιασμένα το καθένα με το αντίστοιχο twiddle factor, όπως φαίνεται στο flow diagram, σύμφωνα με τη σχέση, 0, 1,, N/8-1 Τέλος, σημειώνεται ότι τα αποτελέσματα ύστερα από την υλοποίηση του αλγόριθμου είναι διατεταγμένα όπως φαίνεται στο flow diagram. Προκειμένου αυτά να διαταχθούν στη σωστή σειρά απαιτείται η παρακάτω μετάθεση των bits των δεικτών τους. 7

3. Αρχιτεκτονική FFT Οι σύγχρονες εφαρμογές στους τομείς της επεξεργασίας σήματος και των τηλεπικοινωνιών απαιτούν οι υπολογισμοί του FFT να γίνονται πολύ γρήγορα και με ελάχιστους πόρους. Οι αρχιτεκτονικές που στοχεύουν στα παραπάνω χαρακτηριστικά περιλαμβάνουν γενικά έναν butterfly processor, μια μνήμη για την αποθήκευση των δεδομένων και μια μνήμη ROM με τις προϋπολογισμένες τιμές των twiddle factors. Στην παρούσα εργασία μελετήθηκε και υλοποιήθηκε μια αρχιτεκτονική FFT η οποία χρησιμοποιεί τεχνική in-place όπου η ίδια δομή αποθήκευσης δεδομένων χρησιμοποιείται για την αποθήκευση των δεδομένων εισόδου, εξόδου αλλά και των ενδιάμεσων σταδίων του αλγόριθμου FFT. Χρησιμοποιώντας έναν radix-8 butterfly processor, οι υπολογισμοί μπορούν να επιταχυνθούν περιλαμβάνοντας συνολικά 8 μνήμες για τα Ν=64 σημεία δεδομένων εισόδου. Η τεχνική αυτή μπορεί επιπλέον να γενικευθεί για radix-b butterfly processors με χρήση b πλήθους μνήμων, όπου b μια δύναμη του 2, και για οποιοδήποτε Ν που είναι δύναμη του 2. Χρησιμοποιήθηκε επιπλέον ένα σύνθετο σύστημα διευθυνσιοδότησης το οποίο, εκμεταλλευόμενο ορισμένες μεταθέσεις (permutations) ανάμεσα στα δεδομένα εισόδου και εξόδου του radix-8 butterfly processor, επιτρέπει την παράλληλη φόρτωση, επεξεργασία και αποθήκευση των δεδομένων με αποτέλεσμα την επιτάχυνση των υπολογισμών. Τέλος, η αρχιτεκτονική γίνεται ακόμα πιο αποδοτική ελαχιστοποιώντας τις απαιτήσεις σε υλικό της μονάδας ελέγχου που παράγει τις διευθύνσεις των δεδομένων και των twiddle factors και που υποδεικνύει τα σωστά permutations σε κάθε stage. Εικόνα 3. Αρχιτεκτονική του in-place FFT processor 8

Παρακάτω παρουσιάζεται το data flow διάγραμμα του αλγόριθμου που εφαρμόζεται από την εν λόγω αρχιτεκτονική (Εικόνα 4). Τα 8 διαφορετικά χρώματα υποδηλώνουν τις 8 διαφορετικές memory banks ενώ ο αριθμός εντός του κύκλου υποδεικνύει τον δείκτη του permutation που εφαρμόστηκε. Σημειώνεται ότι όλοι οι δείκτες που εμφανίζονται είναι σε μορφή ψηφίου, πλάτους log28 = 3 bits. Παρουσιάζεται επίσης η εσωτερική δομή της μονάδας ελέγχου (Εικόνα 5) όπου φαίνεται συγκεκριμένα πως παράγονται οι διευθύνσεις των στοιχείων που εμπλέκονται στους υπολογισμούς του κάθε butterfly, για τη γενικευμένη περίπτωση του αλγόριθμου. Σε κάθε stage i, 0 i log864-1, ο butterfly control counter, με πλήθος ψηφίων m-1 = 1, όπου m=log864, μετράει από το 0 έως b m-1 1 = 7. Οι τιμές αυτές αντιστοιχούν στις b = 8 πλήθους διαφορετικές 8-άδες δεδομένων του κάθε butterfly. Καθεμία από τις τιμές αυτές προωθείται ως διεύθυνση στα 8 memory banks αφού πρώτα υποβληθεί σε bitwise XOR με τον δείκτη του εκάστοτε bank. Αυτό επιτυγχάνεται, όπως φαίνεται και στην εικόνα, με τη χρήση shift left registers, πλάτους ενός 3bit ψηφίου. Αρχικά, ξεκινούν με την τιμή 0 και ύστερα από κάθε stage το ψηφίο το οποίο αντιστοιχεί στον αριθμό της memory bank στην οποία είναι συνδεδεμένοι γίνεται shift-in. Φαίνεται επιπλέον ο μηχανισμός με τον οποίο παράγονται οι κατάλληλοι δείκτες των permutations κάθε στιγμή. Χρησιμοποιείται ένας βοηθητικός counter, vcount, πλάτους m=2 ψηφίων, ο οποίος είναι σχεδιασμένος με τέτοιο τρόπο ώστε σε κάθε stage i να μετράει με τα i+1 most significant ψηφία του. Έτσι, τα 2 most significant ψηφία του ταυτίζονται πάντα με τα i+1 και i ψηφία του butterfly control counter τα οποία ελέγχουν τα output και input permutation networks αντίστοιχα. Η δομή του φαίνεται στην Εικόνα 6. Εικόνα 5. Μονάδα ελέγχου της αρχιτεκτονικής. Τα πλάτη εκφράζονται σε radix-b ψηφία εκτός από όπου αναφέρονται bits. 9

10 Εικόνα 4. Data flow διάγραμμα για b=8 και Ν=64

Εικόνα 6. Εσωτερική οργάνωση του vcount Τα permutation networks τα οποία υλοποιούν τα αντίστοιχα permutations παρουσιάζονται στην Εικόνα 7. Αποτελούνται από log2b = 3 υποσυστήματα multiplexers καθένα από τα οποία αποτελείται με τη σειρά του από, πλήθους b=8, πλάτους log2b bits, 2-input multiplexers. Κάθε στιγμή, το input permutation network ελέγχεται από τον αντίστοιχο input permutation δείκτη με τέτοιο τρόπο ώστε κάθε bit του ψηφίου του δείκτη να ελέγχει και ένα υποσύστημα από multiplexers. Έτσι, το most significant bit ελέγχει τους multiplexers του 1 ου υποσυστήματος ενώ το least significant bit αυτούς του τελευταίου υποσυστήματος. Ομοίως λειτουργεί και το output permutation network ελεγχόμενο από το ψηφίο του output permutation δείκτη. Τέλος, φαίνεται πως υπολογίζονται και οι διευθύνσεις των κατάλληλων twiddle factors κάθε στιγμή. Τα m-1 least significant ψηφία του vcount υποβάλλονται σε bitwise XOR με τα ίδια ψηφία shift left κατά ένα ψηφίο. Εικόνα 7. Διασύνδεση ανάμεσα στις μνήμες και τις εισόδους και εξόδους του butterfly processor 11

Η υλοποίηση της παραπάνω αρχιτεκτονικής έγινε σε γλώσσα περιγραφής υλικού VHDL, ενώ η επαλήθευση των αποτελεσμάτων έγινε με πρόγραμμα που αναπτύχθηκε στην πλατφόρμα Matlab. H παρουσίαση του κώδικα και στις δύο περιπτώσεις γίνεται στο Παράρτημα. Ως σήμα εισόδου εφαρμόστηκε μια υπέρθεση δύο ημιτόνων 5 και 20 Hz οπότε και παρουσιάζονται τα αντίστοιχα αποτελέσματα που προέκυψαν τόσο από την αρχιτεκτονική που μελετήθηκε όσο και από τον DIT FFT αλγόριθμο που υλοποιήθηκε στο Matlab (Εικόνα 8). Εικόνα 8. Αποτελέσματα του DIT FFT αλγόριθμου και της αρχιτεκτονικής που μελετήθηκε όπου φαίνεται και η ακρίβεια που επιτεύχθηκε. 12

Εικόνα 9. RTL Schematic της αρχιτεκτονικής 13

4. Πηγές 1. Discrete-Time Signal Processing Alan V. Oppenheim, Ronald W.Shcafer 2. Digital Signal Processing Alan V. Oppenheim, Ronald W.Shcafer 3. Digital Signal Processing with Field Programmable Gate Arrays U.Meyer-Baese 4. Fast Algorithms for Digital Signal Processing Blahut R.E. 5. Parallel Memory Accessing in FFT Processors K. Nakos, D. Reisis and N. Vlassopoulos 14

Παράρτημα Radix-8 Butterfly Processor library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity butterfly_processor_radix8_complex is port ( clk : in std_logic; i0 : in std_logic_vector (111 downto 0); i1 : in std_logic_vector (111 downto 0); i2 : in std_logic_vector (111 downto 0); i3 : in std_logic_vector (111 downto 0); i4 : in std_logic_vector (111 downto 0); i5 : in std_logic_vector (111 downto 0); i6 : in std_logic_vector (111 downto 0); i7 : in std_logic_vector (111 downto 0); twi : in std_logic_vector (895 downto 0); o0 : out std_logic_vector (111 downto 0); o1 : out std_logic_vector (111 downto 0); o2 : out std_logic_vector (111 downto 0); o3 : out std_logic_vector (111 downto 0); o4 : out std_logic_vector (111 downto 0); o5 : out std_logic_vector (111 downto 0); o6 : out std_logic_vector (111 downto 0); o7 : out std_logic_vector (111 downto 0); 15

ro0 : out std_logic_vector (55 downto 0); ro1 : out std_logic_vector (55 downto 0); ro2 : out std_logic_vector (55 downto 0); ro3 : out std_logic_vector (55 downto 0); ro4 : out std_logic_vector (55 downto 0); ro5 : out std_logic_vector (55 downto 0); ro6 : out std_logic_vector (55 downto 0); ro7 : out std_logic_vector (55 downto 0); io0 : out std_logic_vector (55 downto 0); io1 : out std_logic_vector (55 downto 0); io2 : out std_logic_vector (55 downto 0); io3 : out std_logic_vector (55 downto 0); io4 : out std_logic_vector (55 downto 0); io5 : out std_logic_vector (55 downto 0); io6 : out std_logic_vector (55 downto 0); io7 : out std_logic_vector (55 downto 0) ); end butterfly_processor_radix8_complex; architecture Behavioral of butterfly_processor_radix8_complex is -- SIGNALS!!! type input_real is array (0 to 7) of signed(55 downto 0); type input_imaginary is array (0 to 7) of signed(55 downto 0); type twiddles is array (0 to 7) of std_logic_vector(111 downto 0); 16

type twiddles_real is array (0 to 7) of signed (55 downto 0); type twiddles_imaginary is array (0 to 7) of signed (55 downto 0); signal in_re : input_real; signal in_im : input_imaginary; type shifted_out is array (0 to 7) of signed (167 downto 0); signal sout_re : shifted_out; signal sout_im : shifted_out; signal out_re0 : signed (167 downto 0); signal out_re1 : signed (167 downto 0); signal out_re2 : signed (167 downto 0); signal out_re3 : signed (167 downto 0); signal out_re4 : signed (167 downto 0); signal out_re5 : signed (167 downto 0); signal out_re6 : signed (167 downto 0); signal out_re7 : signed (167 downto 0); signal out_im0 : signed (167 downto 0); signal out_im1 : signed (167 downto 0); signal out_im2 : signed (167 downto 0); signal out_im3 : signed (167 downto 0); signal out_im4 : signed (167 downto 0); signal out_im5 : signed (167 downto 0); signal out_im6 : signed (167 downto 0); signal out_im7 : signed (167 downto 0); signal twids : twiddles; 17

signal twi_re : twiddles_real; signal twi_im : twiddles_imaginary; signal m : signed (55 downto 0); signal m1 : signed (55 downto 0); type intermediate_real is array (0 to 7) of signed (111 downto 0); type intermediate_imaginary is array (0 to 7) of signed (111 downto 0); signal inter_real : intermediate_real; signal inter_imag : intermediate_imaginary; begin m <= to_signed(23170,56); m1 <= to_signed(32768,56); in_re(0) <= signed(i0(111 downto 56)); in_re(1) <= signed(i1(111 downto 56)); in_re(2) <= signed(i2(111 downto 56)); in_re(3) <= signed(i3(111 downto 56)); in_re(4) <= signed(i4(111 downto 56)); in_re(5) <= signed(i5(111 downto 56)); in_re(6) <= signed(i6(111 downto 56)); in_re(7) <= signed(i7(111 downto 56)); in_im(0) <= signed(i0(55 downto 0)); in_im(1) <= signed(i1(55 downto 0)); in_im(2) <= signed(i2(55 downto 0)); in_im(3) <= signed(i3(55 downto 0)); 18

in_im(4) <= signed(i4(55 downto 0)); in_im(5) <= signed(i5(55 downto 0)); in_im(6) <= signed(i6(55 downto 0)); in_im(7) <= signed(i7(55 downto 0)); twids(0) <= twi(895 downto 784); twids(1) <= twi(783 downto 672); twids(2) <= twi(671 downto 560); twids(3) <= twi(559 downto 448); twids(4) <= twi(447 downto 336); twids(5) <= twi(335 downto 224); twids(6) <= twi(223 downto 112); twids(7) <= twi(111 downto 0); twi_re(0) <= signed(twids(0) (111 downto 56)); twi_re(1) <= signed(twids(1) (111 downto 56)); twi_re(2) <= signed(twids(2) (111 downto 56)); twi_re(3) <= signed(twids(3) (111 downto 56)); twi_re(4) <= signed(twids(4) (111 downto 56)); twi_re(5) <= signed(twids(5) (111 downto 56)); twi_re(6) <= signed(twids(6) (111 downto 56)); twi_re(7) <= signed(twids(7) (111 downto 56)); twi_im(0) <= signed(twids(0) (55 downto 0)); twi_im(1) <= signed(twids(1) (55 downto 0)); twi_im(2) <= signed(twids(2) (55 downto 0)); twi_im(3) <= signed(twids(3) (55 downto 0)); twi_im(4) <= signed(twids(4) (55 downto 0)); twi_im(5) <= signed(twids(5) (55 downto 0)); twi_im(6) <= signed(twids(6) (55 downto 0)); 19

twi_im(7) <= signed(twids(7) (55 downto 0)); inter_real(0) <= in_re(0)*twi_re(0) - in_im(0)*twi_im(0); inter_real(1) <= in_re(1)*twi_re(1) - in_im(1)*twi_im(1); inter_real(2) <= in_re(2)*twi_re(2) - in_im(2)*twi_im(2); inter_real(3) <= in_re(3)*twi_re(3) - in_im(3)*twi_im(3); inter_real(4) <= in_re(4)*twi_re(4) - in_im(4)*twi_im(4); inter_real(5) <= in_re(5)*twi_re(5) - in_im(5)*twi_im(5); inter_real(6) <= in_re(6)*twi_re(6) - in_im(6)*twi_im(6); inter_real(7) <= in_re(7)*twi_re(7) - in_im(7)*twi_im(7); inter_imag(0) <= in_re(0)*twi_im(0) + in_im(0)*twi_re(0); inter_imag(1) <= in_re(1)*twi_im(1) + in_im(1)*twi_re(1); inter_imag(2) <= in_re(2)*twi_im(2) + in_im(2)*twi_re(2); inter_imag(3) <= in_re(3)*twi_im(3) + in_im(3)*twi_re(3); inter_imag(4) <= in_re(4)*twi_im(4) + in_im(4)*twi_re(4); inter_imag(5) <= in_re(5)*twi_im(5) + in_im(5)*twi_re(5); inter_imag(6) <= in_re(6)*twi_im(6) + in_im(6)*twi_re(6); inter_imag(7) <= in_re(7)*twi_im(7) + in_im(7)*twi_re(7); out_re0 <= m1*inter_real(0) + m1*inter_real(1) + m1*inter_real(2) + m1*inter_real(3) + m1*inter_real(4) + m1*inter_real(5) + m1*inter_real(6) + m1*inter_real(7); out_re1 <= m1*inter_real(0) + m*inter_real(1) + m*inter_imag(1) + m1*inter_imag(2) - m*inter_real(3) + m*inter_imag(3) - m1*inter_real(4) - m*inter_real(5) - m*inter_imag(5) - m1*inter_imag(6) + m*inter_real(7) - m*inter_imag(7); out_re2 <= m1*inter_real(0) + m1*inter_imag(1) - m1*inter_real(2) - m1*inter_imag(3) + m1*inter_real(4) + m1*inter_imag(5) - m1*inter_real(6) - m1*inter_imag(7); out_re3 <= m1*inter_real(0) - m*inter_real(1) + m*inter_imag(1) - m1*inter_imag(2) + m*inter_real(3) + m*inter_imag(3) - m1*inter_real(4) + m*inter_real(5) - m*inter_imag(5) + m1*inter_imag(6) - m*inter_real(7) - m*inter_imag(7); 20

out_re4 <= m1*inter_real(0) - m1*inter_real(1) + m1*inter_real(2) - m1*inter_real(3) + m1*inter_real(4) - m1*inter_real(5) + m1*inter_real(6) - m1*inter_real(7); out_re5 <= m1*inter_real(0) - m*inter_real(1) - m*inter_imag(1) + m1*inter_imag(2) + m*inter_real(3) - m*inter_imag(3) - m1*inter_real(4) + m*inter_real(5) + m*inter_imag(5) - m1*inter_imag(6) - m*inter_real(7) + m*inter_imag(7); out_re6 <= m1*inter_real(0) - m1*inter_imag(1) - m1*inter_real(2) + m1*inter_imag(3) + m1*inter_real(4) - m1*inter_imag(5) - m1*inter_real(6) + m1*inter_imag(7); out_re7 <= m1*inter_real(0) + m*inter_real(1) - m*inter_imag(1) - m1*inter_imag(2) - m*inter_real(3) - m*inter_imag(3) - m1*inter_real(4) - m*inter_real(5) + m*inter_imag(5) + m1*inter_imag(6) + m*inter_real(7) + m*inter_imag(7); out_im0 <= m1*inter_imag(0) + m1*inter_imag(1) + m1*inter_imag(2) + m1*inter_imag(3) + m1*inter_imag(4) + m1*inter_imag(5) + m1*inter_imag(6) + m1*inter_imag(7); out_im1 <= m1*inter_imag(0) + m*inter_imag(1) - m*inter_real(1) - m1*inter_real(2) - m*inter_imag(3) - m*inter_real(3) - m1*inter_imag(4) - m*inter_imag(5) + m*inter_real(5) + m1*inter_real(6) + m*inter_imag(7) + m*inter_real(7); out_im2 <= m1*inter_imag(0) - m1*inter_real(1) - m1*inter_imag(2) + m1*inter_real(3) + m1*inter_imag(4) - m1*inter_real(5) - m1*inter_imag(6) + m1*inter_real(7); out_im3 <= m1*inter_imag(0) - m*inter_imag(1) - m*inter_real(1) + m1*inter_real(2) + m*inter_imag(3) - m*inter_real(3) - m1*inter_imag(4) + m*inter_imag(5) + m*inter_real(5) - m1*inter_real(6) - m*inter_imag(7) + m*inter_real(7); out_im4 <= m1*inter_imag(0) - m1*inter_imag(1) + m1*inter_imag(2) - m1*inter_imag(3) + m1*inter_imag(4) - m1*inter_imag(5) + m1*inter_imag(6) - m1*inter_imag(7); out_im5 <= m1*inter_imag(0) - m*inter_imag(1) + m*inter_real(1) - m1*inter_real(2) + m*inter_imag(3) + m*inter_real(3) - m1*inter_imag(4) + m*inter_imag(5) - m*inter_real(5) + m1*inter_real(6) - m*inter_imag(7) - m*inter_real(7); out_im6 <= m1*inter_imag(0) + m1*inter_real(1) - m1*inter_imag(2) - m1*inter_real(3) + m1*inter_imag(4) + m1*inter_real(5) - m1*inter_imag(6) - m1*inter_real(7); out_im7 <= m1*inter_imag(0) + m*inter_imag(1) + m*inter_real(1) + m1*inter_real(2) - m*inter_imag(3) + m*inter_real(3) - m1*inter_imag(4) - m*inter_imag(5) - m*inter_real(5) - m1*inter_real(6) + m*inter_imag(7) - m*inter_real(7); 21

sout_re(0) <= out_re0 srl 30; sout_re(1) <= out_re1 srl 30; sout_re(2) <= out_re2 srl 30; sout_re(3) <= out_re3 srl 30; sout_re(4) <= out_re4 srl 30; sout_re(5) <= out_re5 srl 30; sout_re(6) <= out_re6 srl 30; sout_re(7) <= out_re7 srl 30; sout_im(0) <= out_im0 srl 30; sout_im(1) <= out_im1 srl 30; sout_im(2) <= out_im2 srl 30; sout_im(3) <= out_im3 srl 30; sout_im(4) <= out_im4 srl 30; sout_im(5) <= out_im5 srl 30; sout_im(6) <= out_im6 srl 30; sout_im(7) <= out_im7 srl 30; o0 (111 downto 56) <= std_logic_vector(sout_re(0)(55 downto 0)); o1 (111 downto 56) <= std_logic_vector(sout_re(1)(55 downto 0)); o2 (111 downto 56) <= std_logic_vector(sout_re(2)(55 downto 0)); o3 (111 downto 56) <= std_logic_vector(sout_re(3)(55 downto 0)); o4 (111 downto 56) <= std_logic_vector(sout_re(4)(55 downto 0)); o5 (111 downto 56) <= std_logic_vector(sout_re(5)(55 downto 0)); o6 (111 downto 56) <= std_logic_vector(sout_re(6)(55 downto 0)); o7 (111 downto 56) <= std_logic_vector(sout_re(7)(55 downto 0)); o0 (55 downto 0) <= std_logic_vector(sout_im(0)(55 downto 0)); o1 (55 downto 0) <= std_logic_vector(sout_im(1)(55 downto 0)); 22

o2 (55 downto 0) <= std_logic_vector(sout_im(2)(55 downto 0)); o3 (55 downto 0) <= std_logic_vector(sout_im(3)(55 downto 0)); o4 (55 downto 0) <= std_logic_vector(sout_im(4)(55 downto 0)); o5 (55 downto 0) <= std_logic_vector(sout_im(5)(55 downto 0)); o6 (55 downto 0) <= std_logic_vector(sout_im(6)(55 downto 0)); o7 (55 downto 0) <= std_logic_vector(sout_im(7)(55 downto 0)); --FOR TESTING ro0 (55 downto 0) <= std_logic_vector(sout_re(0)(55 downto 0)); ro1 (55 downto 0) <= std_logic_vector(sout_re(1)(55 downto 0)); ro2 (55 downto 0) <= std_logic_vector(sout_re(2)(55 downto 0)); ro3 (55 downto 0) <= std_logic_vector(sout_re(3)(55 downto 0)); ro4 (55 downto 0) <= std_logic_vector(sout_re(4)(55 downto 0)); ro5 (55 downto 0) <= std_logic_vector(sout_re(5)(55 downto 0)); ro6 (55 downto 0) <= std_logic_vector(sout_re(6)(55 downto 0)); ro7 (55 downto 0) <= std_logic_vector(sout_re(7)(55 downto 0)); io0 (55 downto 0) <= std_logic_vector(sout_im(0)(55 downto 0)); io1 (55 downto 0) <= std_logic_vector(sout_im(1)(55 downto 0)); io2 (55 downto 0) <= std_logic_vector(sout_im(2)(55 downto 0)); io3 (55 downto 0) <= std_logic_vector(sout_im(3)(55 downto 0)); io4 (55 downto 0) <= std_logic_vector(sout_im(4)(55 downto 0)); io5 (55 downto 0) <= std_logic_vector(sout_im(5)(55 downto 0)); io6 (55 downto 0) <= std_logic_vector(sout_im(6)(55 downto 0)); io7 (55 downto 0) <= std_logic_vector(sout_im(7)(55 downto 0)); end Behavioral; 23

Control Unit library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity control_unit is port ( clk : in std_logic; ab0 : out std_logic_vector (2 downto 0); ab1 : out std_logic_vector (2 downto 0); ab2 : out std_logic_vector (2 downto 0); ab3 : out std_logic_vector (2 downto 0); ab4 : out std_logic_vector (2 downto 0); ab5 : out std_logic_vector (2 downto 0); ab6 : out std_logic_vector (2 downto 0); ab7 : out std_logic_vector (2 downto 0); ip : out std_logic_vector (2 downto 0); op : out std_logic_vector (2 downto 0); tw : out std_logic_vector (2 downto 0); vcountout : out std_logic_vector (5 downto 0) --FOR TESTING ONLY ); end control_unit; architecture Behavioral of control_unit is -- COMPONENTS!!! component vcounter_6bit is port ( clk : in std_logic; en_flg : in std_logic; count : out std_logic_vector (5 downto 0) ); end component; component counter_3bit is port ( clk : in std_logic; en_flg : out std_logic; count : out std_logic_vector (2 downto 0) ); end component; component register_1bit is port ( 24

I : in std_logic; O : out std_logic; clk : in std_logic ); end component; component register_3bit is port ( I : in std_logic_vector (2 downto 0); O : out std_logic_vector (2 downto 0); clk : in std_logic ); end component; -- SIGNALS!!! type bank_register_in is array (1 to 7) of std_logic_vector (2 downto 0); type bank_register_out is array (1 to 7) of std_logic_vector (2 downto 0); signal bri : bank_register_in; signal bro : bank_register_out; signal main_counter_en : std_logic :='0'; signal main_counter_count : std_logic_vector (2 downto 0):="000"; signal v_counter_count : std_logic_vector (5 downto 0):="000000"; signal vcri : std_logic :='1'; signal vcro : std_logic :='0'; signal lsd : std_logic_vector (2 downto 0); signal msd : std_logic_vector (2 downto 0); begin MC : counter_3bit port map (clk, main_counter_en, main_counter_count); bri(1)<="001"; bri(2)<="010"; bri(3)<="011"; bri(4)<="100"; bri(5)<="101"; bri(6)<="110"; bri(7)<="111"; 25

RB1 : register_3bit port map(bri(1),bro(1),main_counter_en); RB2 : register_3bit port map(bri(2),bro(2),main_counter_en); RB3 : register_3bit port map(bri(3),bro(3),main_counter_en); RB4 : register_3bit port map(bri(4),bro(4),main_counter_en); RB5 : register_3bit port map(bri(5),bro(5),main_counter_en); RB6 : register_3bit port map(bri(6),bro(6),main_counter_en); RB7 : register_3bit port map(bri(7),bro(7),main_counter_en); ab0 <= main_counter_count; ab1 <= main_counter_count xor bro(1); ab2 <= main_counter_count xor bro(2); ab3 <= main_counter_count xor bro(3); ab4 <= main_counter_count xor bro(4); ab5 <= main_counter_count xor bro(5); ab6 <= main_counter_count xor bro(6); ab7 <= main_counter_count xor bro(7); VCR : register_1bit port map (vcri,vcro,main_counter_en); VC : vcounter_6bit port map(clk,vcro,v_counter_count); vcountout <= v_counter_count; --- FOR TESTING ONLY lsd <= v_counter_count (2 downto 0); msd <= v_counter_count (5 downto 3); ip <= lsd; op <= lsd xor msd; tw <= lsd; end Behavioral; Input/Output Permutation Network library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity perm_interconnection is port ( in0 : in std_logic_vector (111 downto 0); 26

in1 : in std_logic_vector (111 downto 0); in2 : in std_logic_vector (111 downto 0); in3 : in std_logic_vector (111 downto 0); in4 : in std_logic_vector (111 downto 0); in5 : in std_logic_vector (111 downto 0); in6 : in std_logic_vector (111 downto 0); in7 : in std_logic_vector (111 downto 0); out0 : out std_logic_vector (111 downto 0); out1 : out std_logic_vector (111 downto 0); out2 : out std_logic_vector (111 downto 0); out3 : out std_logic_vector (111 downto 0); out4 : out std_logic_vector (111 downto 0); out5 : out std_logic_vector (111 downto 0); out6 : out std_logic_vector (111 downto 0); out7 : out std_logic_vector (111 downto 0); s2 : in std_logic; s1 : in std_logic; s0 : in std_logic ); end perm_interconnection; architecture Behavioral of perm_interconnection is --COMPONENTS!!! component mux_2to1_32bit is port ( I0 : in std_logic_vector (111 downto 0); I1 : in std_logic_vector (111 downto 0); S : in std_logic; O : out std_logic_vector (111 downto 0) ); end component; --SIGNALS!!! type mux_array_out is array (0 to 7) of std_logic_vector (111 downto 0); signal s2_mo : mux_array_out; signal s1_mo : mux_array_out; --signal s0_mo : mux_array_out; begin 27

M20 : mux_2to1_32bit port map (in0, in4, s2, s2_mo(0)); M21 : mux_2to1_32bit port map (in1, in5, s2, s2_mo(1)); M22 : mux_2to1_32bit port map (in2, in6, s2, s2_mo(2)); M23 : mux_2to1_32bit port map (in3, in7, s2, s2_mo(3)); M24 : mux_2to1_32bit port map (in4, in0, s2, s2_mo(4)); M25 : mux_2to1_32bit port map (in5, in1, s2, s2_mo(5)); M26 : mux_2to1_32bit port map (in6, in2, s2, s2_mo(6)); M27 : mux_2to1_32bit port map (in7, in3, s2, s2_mo(7)); M10 : mux_2to1_32bit port map (s2_mo(0), s2_mo(2), s1, s1_mo(0)); M11 : mux_2to1_32bit port map (s2_mo(1), s2_mo(3), s1, s1_mo(1)); M12 : mux_2to1_32bit port map (s2_mo(2), s2_mo(0), s1, s1_mo(2)); M13 : mux_2to1_32bit port map (s2_mo(3), s2_mo(1), s1, s1_mo(3)); M14 : mux_2to1_32bit port map (s2_mo(4), s2_mo(6), s1, s1_mo(4)); M15 : mux_2to1_32bit port map (s2_mo(5), s2_mo(7), s1, s1_mo(5)); M16 : mux_2to1_32bit port map (s2_mo(6), s2_mo(4), s1, s1_mo(6)); M17 : mux_2to1_32bit port map (s2_mo(7), s2_mo(5), s1, s1_mo(7)); M00 : mux_2to1_32bit port map (s1_mo(0), s1_mo(1), s0, out0); M01 : mux_2to1_32bit port map (s1_mo(1), s1_mo(0), s0, out1); M02 : mux_2to1_32bit port map (s1_mo(2), s1_mo(3), s0, out2); M03 : mux_2to1_32bit port map (s1_mo(3), s1_mo(2), s0, out3); M04 : mux_2to1_32bit port map (s1_mo(4), s1_mo(5), s0, out4); M05 : mux_2to1_32bit port map (s1_mo(5), s1_mo(4), s0, out5); M06 : mux_2to1_32bit port map (s1_mo(6), s1_mo(7), s0, out6); M07 : mux_2to1_32bit port map (s1_mo(7), s1_mo(6), s0, out7); end Behavioral; 8 Banks RAM library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; use std.textio.all; use ieee.std_logic_textio.all; entity ram2 is port( clk : in std_logic; wr_en : in std_logic; --for all banks rd_addr0 : in std_logic_vector(3-1 downto 0); rd_addr1 : in std_logic_vector(3-1 downto 0); rd_addr2 : in std_logic_vector(3-1 downto 0); rd_addr3 : in std_logic_vector(3-1 downto 0); 28

rd_addr4 : in std_logic_vector(3-1 downto 0); rd_addr5 : in std_logic_vector(3-1 downto 0); rd_addr6 : in std_logic_vector(3-1 downto 0); rd_addr7 : in std_logic_vector(3-1 downto 0); wr_addr0 : in std_logic_vector(3-1 downto 0); wr_addr1 : in std_logic_vector(3-1 downto 0); wr_addr2 : in std_logic_vector(3-1 downto 0); wr_addr3 : in std_logic_vector(3-1 downto 0); wr_addr4 : in std_logic_vector(3-1 downto 0); wr_addr5 : in std_logic_vector(3-1 downto 0); wr_addr6 : in std_logic_vector(3-1 downto 0); wr_addr7 : in std_logic_vector(3-1 downto 0); data_in0 : in std_logic_vector(111 downto 0); data_in1 : in std_logic_vector(111 downto 0); data_in2 : in std_logic_vector(111 downto 0); data_in3 : in std_logic_vector(111 downto 0); data_in4 : in std_logic_vector(111 downto 0); data_in5 : in std_logic_vector(111 downto 0); data_in6 : in std_logic_vector(111 downto 0); data_in7 : in std_logic_vector(111 downto 0); data_out0 : out std_logic_vector(111 downto 0); data_out1 : out std_logic_vector(111 downto 0); data_out2 : out std_logic_vector(111 downto 0); data_out3 : out std_logic_vector(111 downto 0); data_out4 : out std_logic_vector(111 downto 0); data_out5 : out std_logic_vector(111 downto 0); data_out6 : out std_logic_vector(111 downto 0); data_out7 : out std_logic_vector(111 downto 0) ); end ram2; architecture Behavioral of ram2 is type ram_type is array (0 to 7) of std_logic_vector(111 downto 0); -------initialize memory from file------- impure function InitRamFromFile (RamFileName : in string) return ram_type is FILE RamFile : text is in RamFileName; variable RamFileLine : line; variable RAM : ram_type; begin for i in 0 to 7 loop 29

readline(ramfile, RamFileLine); hread (RamFileLine, RAM(i)); end loop; return RAM; end function; ----------------------------------------- signal RAM0 : ram_type:=initramfromfile("ram0renew15.dat"); signal RAM1 : ram_type:=initramfromfile("ram1renew15.dat"); signal RAM2 : ram_type:=initramfromfile("ram2renew15.dat"); signal RAM3 : ram_type:=initramfromfile("ram3renew15.dat"); signal RAM4 : ram_type:=initramfromfile("ram4renew15.dat"); signal RAM5 : ram_type:=initramfromfile("ram5renew15.dat"); signal RAM6 : ram_type:=initramfromfile("ram6renew15.dat"); signal RAM7 : ram_type:=initramfromfile("ram7renew15.dat"); begin process(clk) begin if rising_edge(clk) then if wr_en = '1' then RAM0(to_integer(unsigned(rd_addr0))) <= data_in0; --ekana to wr->rd RAM1(to_integer(unsigned(rd_addr1))) <= data_in1; RAM2(to_integer(unsigned(rd_addr2))) <= data_in2; RAM3(to_integer(unsigned(rd_addr3))) <= data_in3; RAM4(to_integer(unsigned(rd_addr4))) <= data_in4; RAM5(to_integer(unsigned(rd_addr5))) <= data_in5; RAM6(to_integer(unsigned(rd_addr6))) <= data_in6; RAM7(to_integer(unsigned(rd_addr7))) <= data_in7; end if; end if; end process; -- read outside process -- distributed ram data_out0 <= RAM0(to_integer(unsigned(rd_addr0))); 30

data_out1 <= RAM1(to_integer(unsigned(rd_addr1))); data_out2 <= RAM2(to_integer(unsigned(rd_addr2))); data_out3 <= RAM3(to_integer(unsigned(rd_addr3))); data_out4 <= RAM4(to_integer(unsigned(rd_addr4))); data_out5 <= RAM5(to_integer(unsigned(rd_addr5))); data_out6 <= RAM6(to_integer(unsigned(rd_addr6))); data_out7 <= RAM7(to_integer(unsigned(rd_addr7))); end Behavioral; Twiddle Factors ROM library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; use std.textio.all; use ieee.std_logic_textio.all; entity rom is port( ); clk : in std_logic; --rd_en : in std_logic; rd_addr : in std_logic_vector(2 downto 0); data_out : out std_logic_vector(895 downto 0) end rom; architecture Behavioral of rom is type rom_type is array (0 to 7) of std_logic_vector(895 downto 0); signal ROM1 : rom_type := (x"00000000008000_00000000000000_00000000008000_00000000000000_ 00000000008000_00000000000000_00000000008000_00000000000000_000 00000008000_00000000000000_00000000008000_00000000000000_000000 00008000_00000000000000_00000000008000_00000000000000", x"00000000008000_00000000000000_00000000007f62_fffffffffff374 _00000000007d8a_ffffffffffe707_00000000007a7d_ffffffffffdad8_000000000 07642_ffffffffffcf04_000000000070e3_ffffffffffc3a9_00000000006a6e_fffffff fffb8e3_000000000062f2_ffffffffffaecc", x"00000000008000_00000000000000_00000000007d8a_ffffffffffe707 _00000000007642_ffffffffffcf04_00000000006a6e_ffffffffffb8e3_000000000 31

05a82_ffffffffffa57e_0000000000471d_ffffffffff9592_000000000030fc_fffffff fff89be_000000000018f9_ffffffffff8276", x"00000000008000_00000000000000_00000000007a7d_ffffffffffdad8 _00000000006a6e_ffffffffffb8e3_00000000005134_ffffffffff9d0e_000000000 030fc_ffffffffff89be_00000000000c8c_ffffffffff809e_ffffffffffe707_ffffffffff8 276_ffffffffffc3a9_ffffffffff8f1d", x"00000000008000_00000000000000_00000000007642_ffffffffffcf04 _00000000005a82_ffffffffffa57e_000000000030fc_ffffffffff89be_000000000 00000_ffffffffff8000_ffffffffffcf04_ffffffffff89be_ffffffffffa57e_ffffffffffa57e_ ffffffffff89be_ffffffffffcf04", x"00000000008000_00000000000000_000000000070e3_ffffffffffc3a9 _0000000000471d_ffffffffff9592_00000000000c8c_ffffffffff809e_ffffffffffcf0 4_ffffffffff89be_ffffffffff9d0e_ffffffffffaecc_ffffffffff8276_ffffffffffe707_fffff fffff8583_00000000002528", x"00000000008000_00000000000000_00000000006a6e_ffffffffffb8e3 _000000000030fc_ffffffffff89be_ffffffffffe707_ffffffffff8276_ffffffffffa57e_ff ffffffffa57e_ffffffffff8276_ffffffffffe707_ffffffffff89be_000000000030fc_fffff fffffb8e3_00000000006a6e", x"00000000008000_00000000000000_000000000062f2_ffffffffffaecc _000000000018f9_ffffffffff8276_ffffffffffc3a9_ffffffffff8f1d_ffffffffff89be_ff ffffffffcf04_ffffffffff8583_00000000002528_ffffffffffb8e3_00000000006a6e_ 00000000000c8c_00000000007f62"); begin data_out <= ROM1(to_integer(unsigned(rd_addr))); end Behavioral; Matlab Script close all; clear all; clc; %% INPUT SIGNAL s1=cos(2*pi*5*linspace(0,1,64)); 32

s2=cos(2*pi*20*linspace(0,1,64)); s=s1+s2; f=linspace(-64/2,64/2,64); %% RADIX 8 TWIDDLES ARRAY AND 64 POINT TWIDDLES n=0:1:7; k=0:1:7; w0=exp(-2*pi*i*k(1)*n/8); w1=exp(-2*pi*i*k(2)*n/8); w2=exp(-2*pi*i*k(3)*n/8); w3=exp(-2*pi*i*k(4)*n/8); w4=exp(-2*pi*i*k(5)*n/8); w5=exp(-2*pi*i*k(6)*n/8); w6=exp(-2*pi*i*k(7)*n/8); w7=exp(-2*pi*i*k(8)*n/8); w=[w0;w1;w2;w3;w4;w5;w6;w7]; dit_tw0 = exp(-2*pi*i*k(1)*n/64); dit_tw1 = exp(-2*pi*i*k(2)*n/64); dit_tw2 = exp(-2*pi*i*k(3)*n/64); dit_tw3 = exp(-2*pi*i*k(4)*n/64); dit_tw4 = exp(-2*pi*i*k(5)*n/64); dit_tw5 = exp(-2*pi*i*k(6)*n/64); dit_tw6 = exp(-2*pi*i*k(7)*n/64); dit_tw7 = exp(-2*pi*i*k(8)*n/64); %% STAGE 1/2 OF DIT FFT b00=w*[s(1);s(9);s(17);s(25);s(33);s(41);s(49);s(57)]; %% ALGORITHM b01=w*[s(2);s(10);s(18);s(26);s(34);s(42);s(50);s(58)]; b02=w*[s(3);s(11);s(19);s(27);s(35);s(43);s(51);s(59)]; b03=w*[s(4);s(12);s(20);s(28);s(36);s(44);s(52);s(60)]; b04=w*[s(5);s(13);s(21);s(29);s(37);s(45);s(53);s(61)]; b05=w*[s(6);s(14);s(22);s(30);s(38);s(46);s(54);s(62)]; b06=w*[s(7);s(15);s(23);s(31);s(39);s(47);s(55);s(63)]; b07=w*[s(8);s(16);s(24);s(32);s(40);s(48);s(56);s(64)]; mb00 = [ 19710 + 0*i,18628 + 10784*i,12436 + 26876*i,140397 + 31350*i,161654 + 0*i,140397 + -31351*i,12436 + -26876*i,18628 + - 10785*i].'./(2^15); % ARCHITECTURE mb01 = [ 10338 + 0*i,10364 + 4572*i,9817 + 12545*i,133083 + -74546*i,- 194460 + 0*i,133083 + 74545*i,9817 + -12545*i,10364 + -4573*i ].'./(2^15); mb02 = [ -20929 + 0*i,-21341 + -7216*i,-23648 + -15759*i,16654 + - 190842*i,46365 + 0*i,16654 + 190841*i,-23648 + 15759*i,-21341 + 7215*i ].'./(2^15); 33

mb03 = [ 23648 + 0*i,23320 + 11577*i,21878 + 30292*i,-17383 + -76209*i,190808 + 0*i,-17383 + 76208*i,21878 + -30292*i,23320 + -11578*i ].'./(2^15); mb04 = [ 23648 + 0*i,24675 + 8304*i,30292 + 21878*i,-41596 + -66180*i,- 190808 + 0*i,-41596 + 66179*i,30292 + -21878*i,24675 + -8305*i ].'./(2^15); mb05 = [ -20929 + 0*i,-20196 + -9985*i,-15759 + -23648*i,-146723 + - 123169*i,-46365 + 0*i,-146723 + 123168*i,-15759 + 23648*i,-20196 + 9984*i ].'./(2^15); mb06 = [ 10338 + 0*i,10559 + 4094*i,12545 + 9817*i,-146816 + 41392*i,194460 + 0*i,-146816 + -41393*i,12545 + -9817*i,10559 + -4095*i].'./(2^15); mb07 = [ 19710 + 0*i,20795 + 5544*i,26876 + 12436*i,-77108 + 121444*i,- 161654 + 0*i,-77108 + -121445*i,26876 + -12436*i,20795 + - 5545*i].'./(2^15); %% STAGE 2/2 OF DIT FFT bi10=[b00(1);b01(1);b02(1);b03(1);b04(1);b05(1);b06(1);b07(1)].*dit_tw0.'; %% ALGORITHM bi11=[b00(2);b01(2);b02(2);b03(2);b04(2);b05(2);b06(2);b07(2)].*dit_tw1.'; bi12=[b00(3);b01(3);b02(3);b03(3);b04(3);b05(3);b06(3);b07(3)].*dit_tw2.'; bi13=[b00(4);b01(4);b02(4);b03(4);b04(4);b05(4);b06(4);b07(4)].*dit_tw3.'; bi14=[b00(5);b01(5);b02(5);b03(5);b04(5);b05(5);b06(5);b07(5)].*dit_tw4.'; bi15=[b00(6);b01(6);b02(6);b03(6);b04(6);b05(6);b06(6);b07(6)].*dit_tw5.'; bi16=[b00(7);b01(7);b02(7);b03(7);b04(7);b05(7);b06(7);b07(7)].*dit_tw6.'; bi17=[b00(8);b01(8);b02(8);b03(8);b04(8);b05(8);b06(8);b07(8)].*dit_tw7.'; b10=w*bi10; %% ALGORITHM b11=w*bi11; b12=w*bi12; b13=w*bi13; b14=w*bi14; b15=w*bi15; b16=w*bi16; b17=w*bi17; mb10 = [ 65534 + 0*i,15386 + 6373*i,53949 + 53949*i,-23263 + -56161*i,0 + 0*i,-23263 + 56160*i,53949 + -53949*i,15386 + -6374*i ].'./(2^15); %ARCHITECTURE mb11 = [ 66830 + 3288*i,22770 + 10761*i,64733 + 71413*i,-14787 + - 41322*i,-194 + 3986*i,-38367 + 81133*i,47041 + -42636*i,996 + - 355*i].'./(2^15); mb12 = [ 71435 + 7036*i,27581 + 14743*i,84587 + 103072*i,-9471 + - 31221*i,-802 + 8130*i,-71840 + 134406*i,42079 + -34534*i,-44083 + 13371*i].'./(2^15); mb13 = [ 82667 + 12256*i,31328 + 18784*i,134404 + 181230*i,-5924 + - 23697*i,-1876 + 12618*i,-204117 + 340545*i,38145 + -28291*i,1048543 + - 262649*i].'./(2^15); mb14 = [ 117391 + 23354*i,34699 + 23185*i,498046 + 745380*i,-3516 + - 17693*i,-3518 + 17690*i,498042 + -745373*i,34694 + -23194*i,117389 + - 23353*i ].'./(2^15); 34

mb15 = [ 1048552 + 262652*i,38144 + 28284*i,-204117 + -340556*i,-1876 + -12616*i,-5936 + 23692*i,134404 + -181227*i,31330 + -18778*i,82672 + - 12263*i ].'./(2^15); mb16 = [ -44084 + -13372*i,42078 + 34530*i,-71842 + -134408*i,-802 + - 8131*i,-9471 + 31219*i,84588 + -103071*i,27582 + -14744*i,71434 + - 7037*i].'./(2^15); mb17 = [ 995 + 354*i,47041 + 42634*i,-38368 + -81135*i,-194 + -3987*i,- 14787 + 41321*i,64732 + -71413*i,22770 + -10762*i,66832 + - 3296*i].'./(2^15); %% DIT FFT "REVERSAL" dit_fft_out = [b10;b11;b12;b13;b14;b15;b16;b17].'; % FOR STAGE 2/2 dit_fft_out = [b00;b01;b02;b03;b04;b05;b06;b07].'; % FOR STAGE 1/2 dit_correct_out = digitrevorder(dit_fft_out,8); my_fft_out = [mb10;mb11;mb12;mb13;mb14;mb15;mb16;mb17].'; my_correct_out = digitrevorder(my_fft_out,8); %% ALGORITHM RESULTS & BUILT-IN ALGORITHM RESULTS & ARCHITECTURE RESULTS test_res = fftshift(abs(fft(s))); %BUILT-IN ALGORITHM RESULTS dit_actual_res = fftshift(abs(dit_correct_out)); % ALGORITHM RESULTS my_actual_res = fftshift(abs(my_correct_out)); % ARCHITECTURE RESULTS 35