«Σχεδιασμός Ολοκληρωμένων Κυκλωμάτων» Χειμερινό εξάμηνο 2016-2017 Τύποι Δεδομένων και Τελεστές Δρ. Παρασκευάς Κίτσος Επίκουρος Καθηγητής Tμήμα Μηχανικών Πληροφορικής ΤΕ E-mail: pkitsos@teimes.gr Αντίρριο 21/10/2015 1
ΔΟΜΗ ΠΑΡΟΥΣΙΑΣΗΣ Προκαθορισμένοι τύποι δεδομένων Τύποι δεδομένων οριζόμενοι από το χρήστη Πίνακες Signed και Unsigned τύποι Μετατροπή δεδομένων Τελεστές Ιδιότητες Η εντολή Generic 2
ΠΡΟΚΑΘΟΡΙΣΜΕΝΟΙ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ (1/6) Bit: Λογική δύο επιπέδων (0, 1) Bit_vector: Μονοδιάστατος πίνακας (διάνυσμα) από bits signal x: Bit -- το x δηλώνεται ως σήμα ενός ψηφίου τύπου bit signal y: bit_vector(3 downto 0) -- το y είναι διάνυσμα των 4-bit με MSB το αριστερότερο signal z: bit_vector(0 to 5) -- το z είναι διάνυσμα των 6-bit με MSB το δεξιότερο x<= 0 ; Y<= 0011 ; --MSB= 0 z<= 011011 ; --MSB= 1 3
ΠΡΟΚΑΘΟΡΙΣΜΕΝΟΙ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ (2/6) std_ulogic και std_ulogic_vector: Παρουσιάστηκε στο πρότυπο IEEE 1164. Η διένεξη λογικών επιπέδων (π.χ. κατά την οδήγηση μιας τιμής από διαφορετικές πηγές) δεν μπορούν να επιλυθούν Ο τύπος std_logic (όμοια με πριν αλλά χωρίς την U, επιτρέπει αυτόματη λύση Επίπεδο Ερμηνεία U X Μη επιλύσιμη Ισχυρή άγνωστη (συνθέσιμη) 0 Ισχυρή χαμηλή (συνθέσιμη) 1 Ισχυρή υψηλή (συνθέσιμη) Z W L H Υψηλή εμπέδηση (συνθέσιμη) Αδύναμη άγνωστη Αδύναμη χαμηλή Αδύναμη υψηλή - Αδιάφορη κατάσταση 4
ΠΡΟΚΑΘΟΡΙΣΜΕΝΟΙ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ (3/6) Boolean (λογικός): TRUE (Αληθής), FALSE (Ψευδής) Integer (Ακέραιος): Αριθμοί των 32-bit (το πολύ). Από -2.147.483.647 έως τον +2.147.483.647 Natural (Φυσικός): Μη αρνητικοί ακέραιοι. Από 0 έως +2.147.483.647 Real (πραγματικός): Από -1.0Ε38 έως τον +1.0Ε38. Μη συνθέσιμος 5
ΠΡΟΚΑΘΟΡΙΣΜΕΝΟΙ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ (4/6) signed (προσημασμένος) και unsigned (μη προσημασμένος) O signed έχει εύρος τιμών από (2 n-1-1) έως +(2 n-1-1) (χρησιμοποιείται για αναπαράσταση συμπληρώματος ως προς 2) O unsigned έχει εύρος τιμών από 0 έως +2 n -1 Χρήση παρόμοια με την std_logic_vector αλλά δέχονται αριθμητικές πράξεις Π.χ signal x : signed(3 downto 0); signal y: unsigned(3 downto 0).. x<= 1100 ; -- είναι ο -4 y<= 1100 ; -- είναι ο 12 6
ΠΡΟΚΑΘΟΡΙΣΜΕΝΟΙ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ (5/6) Οι προκαθορισμένοι τύποι δεδομένων προσδιορίζονται από τα πρότυπα IEEE 1076 και IEEE 1164 Πακέτο standard της βιβλιοθήκης std Περιέχει τύπους δεδομένων όπως Bit, Boolean, Integer και Real Πακέτο std_logic_1164 της βιβλιοθήκης ieee Περιέχει τύπους δεδομένων όπως std_logic και std_ulogic 7
ΠΡΟΚΑΘΟΡΙΣΜΕΝΟΙ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ (6/6) Πακέτο std_logic_arith της βιβλιοθήκης ieee Περιέχει τύπους δεδομένων όπως signed και unsigned Και συναρτήσεις μετατροπής δεδομένων conv_integer(p), conv_unsigned(p,b), conv_signed(p,b) και conv_std_logic_vector(p,b) Πακέτο std_logic_signed και std_logic_unsigned της βιβλιοθήκης ieee Επιτρέπει εκτέλεση πράξεων με δεδομένα τύπου std_logic_vector σαν να ήταν δεδομένα τύπου signed ή unsigned 8
ΠΑΡΑΔΕΙΓΜΑ (1/2) Στο παράδειγμα αυτό θα δούμε τη διαφορά μεταξύ απόδοσης τιμής σε ένα bit και στην απόδοση τιμής σε ένα διάνυσμα από bit (δηλαδή bit vs bit_vector ή std_logic vs std_logic_vector ή std_ulogic vs std_ulogic_vector) 9
ΠΑΡΑΔΕΙΓΜΑ (2/2) 10
ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ ΟΡΙΖΟΜΕΝΟΙ ΑΠΟ ΤΟΝ ΧΡΗΣΤΗ Προκαθορισμένος Type integer is range -2147483647 to +2147483647; Οριζόμενος από τον χρήστη Type my_integer is range -32 to 32; Type student_grade is range 0 to 100; 11
ΠΙΝΑΚΕΣ (1/2) Οι πίνακες είναι μια συλλογή από αντικείμενα του ίδιου τύπου δεδομένων και είναι ή Μονοδιάστατοι (1Δ) ή Δισδιάστατοι (2Δ) ή Μονοδιάστατοι επί μονοδιάστατοι (1Δ x 1Δ) α) βαθμωτό στοιχείο, β) 1Δ, γ) 1Δx1Δ και δ) 2Δ 12
ΠΙΝΑΚΕΣ (2/2) Ορισμός νέου τύπου πίνακα Type όνομα_πινακα Is Array (προδιαγραφή) Of τύπος_δεδομένων; Για να χρησιμοποιήσουμε το νέο πίνακα Signal όνομα_σήματος: τύπος_σήματος [:=αρχική_τιμή]; H αρχική τιμή είναι προαιρετική και χρησιμοποιείται μόνο για τη εξομοίωση 13
ΠΙΝΑΚΕΣ: ΠΑΡΑΔΕΙΓΜΑΤΑ Παράδειγμα 1 Type row Is Array (7 downto 0) Of std_logic; Type matrix Is Array (0 to 3) of row; Signal x: matrix; Παράδειγμα 2 Type matrix Is Array (0 to 3) of std_logic_vector(7 downto 0); 14
SIGNED ΚΑΙ UNSIGNED ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ (1/4) Και οι δύο τύποι βρίσκονται στο πακέτο std_logic_arith Π.χ signal x : signed(3 downto 0); signal y: unsigned(0 to 3). x<= 1100 ; -- είναι ο -4 x<= 0101 ; -- είναι ο 5 y<= 1100 ; -- είναι ο 12 Y<= 0101 ; -- είναι ο 5 15
SIGNED ΚΑΙ UNSIGNED ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ (2/4) Χρησιμοποιούνται ΜΟΝΟ για αριθμητικές πράξεις και ΟΧΙ για λογικές Αντίθετα οι std_logic_vector δέχονται λογικές και ΟΧΙ αριθμητικές πράξεις 16
SIGNED ΚΑΙ UNSIGNED ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ (3/4) Παράδειγμα Library IEEE; Use Ieee.std_logic_1164.all; Use Ieee.std_logic_arith.all;. signal a: In signed(4 downto 0); signal b: In signed(4 downto 0); signal x: Out signed(4 downto 0);. v<= a + b ; --Επιτρεπόμενη πράξη (είναι αριθμητική) w<= a AND b ; --Μη επιτρεπόμενη πράξη (είναι λογική) 17
SIGNED ΚΑΙ UNSIGNED ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ (4/4) Παράδειγμα Library IEEE; Use Ieee.std_logic_1164.all;. signal a: In std_logic_vector(4 downto 0); signal b: In std_logic_vector (4 downto 0); signal x: Out std_logic_vector (4 downto 0);. v<= a + b ; --Μη επιτρεπόμενη πράξη (είναι αριθμητική) w<= a AND b ; --Επιτρεπόμενη πράξη (είναι λογική) 18
STD_LOGIC_VECTOR vs SIGNED Ή UNSIGNED Όμως τα δεδομένα τύπου std_logic_vector μπορούν να συμμετάσχουν σε αριθμητικές σαν να είναι δεδομένα signed ή unsigned. Πως??? Με χρήση των πακέτων std_logic_signed και std_logic_unsigned αντίστοιχα Library IEEE; Use Ieee.std_logic_1164.all; Use Ieee.std_logic_unsigned.all;. signal a: In std_logic_vector(4 downto 0); signal b: In std_logic_vector (4 downto 0); signal x: Out std_logic_vector (4 downto 0);. v<= a + b ; --Επιτρεπόμενη πράξη (είναι αριθμητική) w<= a AND b ; --Επιτρεπόμενη πράξη (είναι λογική) 19
ΜΕΤΑΤΡΟΠΕΣ ΔΕΔΟΜΕΝΩΝ Το πακέτο std_logic_arith περιέχονται συναρτήσεις μετατροπής δεδομένων Conv_integer(p): μετατρέπει την παράμετρο p τύπου integer, unsigned, signed ή std_ulogic σε τιμή τύπου integer Conv_unsigned(p, b): μετατρέπει την παράμετρο p τύπου integer, unsigned, signed ή std_ulogic σε τιμή τύπου unsigned μεγέθους b- bit Conv_signed(p, b): μετατρέπει την παράμετρο p τύπου integer, unsigned, signed ή std_ulogic σε τιμή τύπου signed μεγέθους b- bit Conv_std_logic_vector(p, b): μετατρέπει την παράμετρο p τύπου integer, unsigned, signed ή std_logic σε τιμή τύπου std_logic_vector μεγέθους b- bit 20
ΜΕΤΑΤΡΟΠΕΣ ΔΕΔΟΜΕΝΩΝ: ΠΑΡΑΔΕΙΓΜΑ Library IEEE; Use Ieee.std_logic_1164.all; Use Ieee.std_logic_arith.all;. signal a: In unsigned(4 downto 0); signal b: In unsigned(4 downto 0); signal x: Out std_logic_vector(4 downto 0);. x<= conv_std_logic_vector((a + b), 5); 21
ΣΥΝΘΕΣΙΜΟΙ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ 22
ΤΕΛΕΣΤΕΣ H VHDL παρέχει διάφορους τύπους προκαθορισμένων τελεστών Τελεστές απόδοσης (ανάθεσης) τιμής Λογικοί τελεστές Αριθμητικοί τελεστές Τελεστές σύγκρισης Τελεστές ολίσθησης Τελεστές συνένωσης 23
ΤΕΛΕΣΤΕΣ ΑΠΟΔΟΣΗΣ ΤΙΜΗΣ <= Χρησιμοποιείται για την απόδοση τιμής σε ένα σήμα (signal) := Χρησιμοποιείται για την απόδοση τιμής σε μια μεταβλητή (variable), σταθερά (constant) ή generic (γενική παράμετρος). Χρησιμοποιείται επίσης για την απόδοση αρχικών τιμών => Χρησιμοποιείται για την απόδοση τιμών σε μεμονωμένα στοιχεία διανύσματος, με την εντολή others ή στην εντολή port map 24
ΛΟΓΙΚΟΙ ΤΕΛΕΣΤΕΣ Εκτέλεση λογικών πράξεων Τα δεδομένα πρέπει να είναι τύπου bit, std_logic ή std_ulogic (ή τα αντίστοιχα διανύσματα) NOT, AND, OR, NAND, NOR, XOR, XNOR O τελεστής NOT έχει προτεραιότητα έναντι όλων των άλλων 25
ΑΡΙΘΜΗΤΙΚΟΙ ΤΕΛΕΣΤΕΣ Τα δεδομένα πρέπει να είναι τύπου integer, signed, unsigned, real ή std_logic_vector (με χρήση του std_logic_signed ή std_logic_unsigned) +, -, *, /, **, MOD, REM, ABS 26
ΤΕΛΕΣΤΕΣ ΣΥΓΚΡΙΣΗΣ Οι τελεστές σύγκρισης είναι οι παρακάτω = (ίσο), /= (όχι ίσο), < (μικρότερο), > (μεγαλύτερο), <= (μικρότερο ή ίσο), >= (μεγαλύτερο ή ίσο) 27
ΤΕΛΕΣΤΕΣ ΟΛΙΣΘΗΣΗΣ Σύνταξη <αριστερός τελεστέος> <πράξη ολίσθησης> <δεξιός τελεστέος> Ο αριστερός τελεστέος πρέπει να είναι bit_vector ενώ ο δεξιός τελεστέος πρέπει να είναι τύπου integer (με πρόσημο + ή αν θέλουμε) Sll (λογική ολίσθηση αριστερά) Srl (λογική ολίσθηση δεξιά) Sla (αριθμητική ολίσθηση αριστερά) Sra (αριθμητική ολίσθηση δεξιά) Rol (λογική αριστερή περιστροφή) Ror (λογική δεξιά περιστροφή) 28
ΤΕΛΕΣΤΕΣ ΣΥΝΕΝΩΣΗΣ Χρησιμοποιούνται για την ομαδοποίηση τιμών & (,,, ) Π.χ. z <= x & 1101010 ; z<= ( 1, 1, 0, 1, 0 ); -- z<= 11010 ; 29
ΠΑΡΑΔΕΙΓΜΑ (1/2) ------------------------------------------ LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ------------------------------------------ ENTITY adder1 IS PORT (a, b : IN SIGNED (3 DOWNTO 0); sum : OUT SIGNED (4 DOWNTO 0)); END adder1; ------------------------------------------ ARCHITECTURE adder1 OF adder1 IS BEGIN sum <= a + b; END adder1; ------------------------------------------ ------------------------------------------ LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ------------------------------------------ ENTITY adder2 IS PORT (a, b : IN SIGNED (3 DOWNTO 0); sum : OUT INTEGER RANGE -16 TO 15); END adder2; ------------------------------------------ ARCHITECTURE adder2 OF adder2 IS BEGIN sum <= CONV_INTEGER(a + b); END adder2; ------------------------------------------ 30
ΠΑΡΑΔΕΙΓΜΑ (2/2) 31
ΙΔΙΟΤΗΤΕΣ ΔΕΔΟΜΕΝΩΝ Οι συνθέσιμες ιδιότητες δεδομένων είναι d low: επιστρέφει το χαμηλότερο δείκτη του πίνακα d high: επιστρέφει τον υψηλότερο δείκτη του πίνακα d left: επιστρέφει τον αριστερότερο δείκτη του πίνακα d right: επιστρέφει τον δεξιότερο δείκτη του πίνακα d length: επιστρέφει το μέγεθος του διανύσματος d range: επιστρέφει το εύρος του διανύσματος d reverse_range: επιστρέφει το εύρος του διανύσματος σε αντίστροφη σειρά Π.χ. Signal d: std_logic_vector(8 downto 1) Τότε d low=1, d high=8, d left=8, d right=1, d length=8, d range=(8 downto 1), d reverse_range=(1 to 8) 32
Έστω ένα σήμα s, τότε ΙΔΙΟΤΗΤΕΣ ΣΗΜΑΤΩΝ s event: Επιστρέφει τιμή true όταν προκύπτει κάποιο συμβάν στο s (συνθέσιμη) s stable: Επιστρέφει τιμή true όταν δεν προκύψει κάποιο συμβάν στο s (συνθέσιμη) s active: Επιστρέφει τιμή true όταν s= 1 s quiet <time>: Επιστρέφει τιμή true όταν δεν έχει προκύψει κάποιο συμβάν στο s εντός του time s last_event: Επιστρέφει το χρόνο που έχει περάσει από το τελευταίο συμβάν s last_active: Επιστρέφει το χρόνο που έχει περάσει από τη τελευταία φορά που s=1 s last_value: Επιστρέφει τη τιμή του s από το τελευταίο συμβάν 33
Η ΕΝΤΟΛΗ GENERIC Με την Generic (Γενική παράμετρος) ορίζουμε μια παράμετρο. Τη δηλώνουμε στην Entity οπότε είναι ορατή από ολόκληρο τον σχεδιασμό Generic (όνομα_παραμέτρου: τύπος_παραμέτρου :=τιμή_παραμέτρου); Π.χ Entity my_entity is Generic (n:integer:=8); Port( ); End my_entity; Architecture my_architecture of my_entity is End my_architecture; 34
ΠΑΡΑΔΕΙΓΜΑ 1 -------------------------------------------- ENTITY parity_det IS GENERIC (n : INTEGER := 7); PORT (input: IN BIT_VECTOR (n DOWNTO 0); output: OUT BIT); END parity_det; -------------------------------------------- ARCHITECTURE parity OF parity_det IS BEGIN PROCESS (input) VARIABLE temp: BIT; BEGIN temp := '0'; FOR i IN input'range LOOP temp := temp XOR input(i); END LOOP; output <= temp; END PROCESS; END parity; -------------------------------------------- 35
ΠΑΡΑΔΕΙΓΜΑ 2 -------------------------------------------- ENTITY parity_gen IS GENERIC (n : INTEGER := 7); PORT (input: IN BIT_VECTOR (n-1 DOWNTO 0); END parity_gen; ----------------------------------------------- ARCHITECTURE parity OF parity_gen IS BEGIN PROCESS (input) BEGIN output: OUT BIT_VECTOR (n DOWNTO 0)); VARIABLE temp1: BIT; VARIABLE temp2: BIT_VECTOR (output'range); temp1 := '0'; FOR i IN input'range LOOP END LOOP; temp1 := temp1 XOR input(i); temp2(i) := input(i); temp2(output'high) := temp1; output <= temp2; END PROCESS; END parity; ----------------------------------------------- 36
Απορίες???? 37