«Σχεδιασμός Ολοκληρωμένων Κυκλωμάτων» Χειμερινό εξάμηνο 2016-2017 Ακολουθιακός Κώδικας Παρασκευάς Κίτσος http://diceslab.cied.teiwest.gr Επίκουρος Καθηγητής Tμήμα Μηχανικών Πληροφορικής ΤΕ E-mail: pkitsos@teimes.gr Αντίρριο 25/11/2016 1
ΔΟΜΗ ΠΑΡΟΥΣΙΑΣΗΣ Συνδυαστική και ακολουθιακή σχεδίαση Διεργασία (process) Σήματα και μεταβλητές Η εντολή If Η εντολή Wait Η εντολή Case Η εντολή Loop Case έναντι If Case έναντι When Χρονισμός ρολογιού Σχεδιασμός συνδυαστικών κυκλωμάτων με ακολουθιακό κώδικα 2
ΣΥΝΔΥΑΣΤΙΚΗ ΚΑΙ ΑΚΟΛΟΥΘΙΑΚΗ ΛΟΓΙΚΗ Είσοδος Συνδυαστικό Λογικό Κύκλωμα Έξοδος Είσοδος Συνδυαστικό Λογικό Κύκλωμα Έξοδος Κατάσταση Συνδυαστικό Ακολουθιακό Στο συνδυαστικό κύκλωμα οι έξοδοι εξαρτώνται αποκλειστικά από τις παρούσες εισόδους Στο ακολουθιακό κύκλωμα οι έξοδοι εξαρτώνται από προηγούμενες εισόδους Οπότε απαιτείται ένα στοιχείο μνήμης το οποίο συνδέεται με το συνδυαστικό κύκλωμα μέσω ενός μονοπατιού ανάδρασης 3
ΤΡΟΠΟΙ ΠΕΡΙΓΡΑΦΗΣ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ Τύποι περιγραφής VHDL συντρέχων dataflow εκτελείται παράλληλα με χρήση υποκυκλωμάτων structural υποκυκλώματα και διασυνδέσεις Testbenches ακολουθιακός behavioral (sequential) εκτελείται ακολουθιακά Registers State machines Instruction decoders Κώδικας κατάλληλος για σύνθεση 4
ΣΥΝΤΡΕΧΩΝ ΚΑΙ ΑΚΟΛΟΥΘΙΑΚΟΣ ΚΩΔΙΚΑΣ Ο VHDL κώδικας είναι από τη φύση του συντρέχων (εκτελείται παράλληλα) Μόνο ο κώδικας μέσα στις εντολές process, function και procedure εκτελείται σειριακά (ακολουθιακά) Συνολικά όμως οι παραπάνω εντολές εκτελούνται παράλληλα με τα υπόλοιπα τμήματα του κώδικα 5
ΔΙΕΡΓΑΣΙΑ (PROCESS) H διεργασία εκτελείται ακολουθιακά Χαρακτηρίζεται από την παρουσία εντολών If, Wait, Case και Loop Και από την ύπαρξη μιας λίστας ευαισθησίας Εκτελείται κάθε φορά που αλλάζει τιμή κάποιο σήμα στη λίστα ευαισθησίας Συντάσσεται όπως βλέπουμε παρακάτω [ετικέτα]: Process (λίστα ευαισθησίας) begin [variable όνομα τύπος [εύρος] [:=αρχική τιμή;]] (ακολουθιακός κώδικας) End process [ετικέτα]; Η χρήση των μεταβλητών είναι προαιρετική 6
ΠΑΡΑΔΕΙΓΜΑ -------------------------------------- LIBRARY ieee; USE ieee.std_logic_1164.all; -------------------------------------- ENTITY dff IS END dff; PORT (d, clk, rst: IN STD_LOGIC; q: OUT STD_LOGIC); -------------------------------------- ARCHITECTURE behavior OF dff IS PROCESS (clk, rst) IF (rst= 1 ) THEN q <= 0 ; ELSIF (clk EVENT AND clk= 1 ) THEN END IF; END PROCESS; END behavior; q <= d; 7
ΣΗΜΑΤΑ ΚΑΙ ΜΕΤΑΒΛΗΤΕΣ Τα σήματα (signals) και οι μεταβλητές (variables) χρησιμοποιούνται για τη μεταβίβαση στατικών τιμών Το σήμα μπορεί να δηλωθεί σε ένα πακέτο (package) σε μια οντότητα (entity) ή σε μια architecture Το σήμα έχει καθολική εμβέλεια Η μεταβλητή έχει τοπική εμβέλεια Δεν μπορεί να μεταδοθεί έξω από τη διεργασία που χρησιμοποιείται Η ενημέρωση ενός αντικειμένου τύπου variable μπορεί να γίνει άμεσα (στην επόμενη γραμμή) Το σήμα αντίθετα (μέσα σε μια process) δεν μπορεί να μεταδοθεί άμεσα 8
Η ΕΝΤΟΛΗ IF H εντολή If συντάσσεται όπως παρακάτω Ιf συνθήκες Then αποδόσεις τιμών; Elsif συνθήκες Then αποδόσεις τιμών; Else αποδόσεις τιμών; End if; H άσκοπη χρήση έχει αρνητικές συνέπειες Η εντολή if/else μπορεί να οδηγήσει στη δημιουργία ενός μη απαραίτητου κωδικοποιητή προτεραιότητας 9
LIBRARY ieee; USE ieee.std_logic_1164.all; --------------------------------------------- ENTITY counter IS PORT (clk : IN STD_LOGIC; END counter; ΠΑΡΑΔΕΙΓΜΑ digit : OUT INTEGER RANGE 0 TO 9); --------------------------------------------- ARCHITECTURE counter OF counter IS count: PROCESS(clk) VARIABLE temp : INTEGER RANGE 0 TO 10; IF (clk EVENT AND clk= 1 ) THEN END IF; digit <= temp; END PROCESS count; END counter; temp := temp + 1; IF (temp=10) THEN END IF; temp := 0; 10
Η ΕΝΤΟΛΗ WAIT H εντολή Wait συντάσσεται όπως παρακάτω (τρείς περιπτώσεις) Wait Until συνθήκη_σήματος; ή ή Wait On σήμα1 [,σήμα2, ]; Wait For χρόνος; Όταν χρησιμοποιείται η εντολή wait η διεργασία δεν πρέπει να έχει λίστα ευαισθησίας Η εντολή wait for χρησιμοποιείται μόνο για προσομοίωση του κυκλώματος 11
ΠΑΡΑΔΕΙΓΜΑ LIBRARY ieee; USE ieee.std_logic_1164.all; -------------------------------------- ENTITY dff IS PORT (d, clk, rst: IN STD_LOGIC; q: OUT STD_LOGIC); END dff; -------------------------------------- ARCHITECTURE dff OF dff IS PROCESS WAIT ON rst, clk; IF (rst= 1 ) THEN q <= 0 ; ELSIF (clk EVENT AND clk= 1 ) THEN q <= d; END IF; END PROCESS; END dff; 12
Η ΕΝΤΟΛΗ CASE (1/2) H εντολή Case συντάσσεται όπως παρακάτω Case αναγνωριστικό is When τιμή => αποδόσεις τιμών; When τιμή => αποδόσεις τιμών; End Case; Στις αποδόσεις των τιμών (when τιμή) πρέπει να εξεταστούν όλοι οι δυνατοί συνδυασμοί του αναγνωριστικού Χρησιμοποιείται η λέξη-κλειδί others Επίσης χρησιμοποιείται η λέξη null όταν δε πρόκειται να συμβεί καμιά πράξη 13
Η ΕΝΤΟΛΗ CASE (2/2) Η τιμή When μπορεί να πάρει τρεις μορφές When τιμή --Μοναδική τιμή When τιμή1 to τιμή2 -Εύρος When τιμή1 τιμή2 --Τιμή1 ή τιμή2 ή 14
ΠΑΡΑΔΕΙΓΜΑ ---------------------------------------------- LIBRARY ieee; USE ieee.std_logic_1164.all; ---------------------------------------------- ENTITY dff IS PORT (d, clk, rst: IN BIT; q: OUT BIT); END dff; ---------------------------------------------- ARCHITECTURE dff3 OF dff IS PROCESS (clk, rst) CASE rst IS WHEN 1 => q<= 0 ; WHEN 0 => IF (clk EVENT AND clk= 1 ) THEN q <= d; END IF; WHEN OTHERS => NULL; -- Unnecessary, rst is of type BIT END CASE; END PROCESS; END dff3; 15
Η ΕΝΤΟΛΗ LOOP (1/2) H εντολή Loop (βρόχος) είναι χρήσιμη όταν πρέπει να χρησιμοποιηθεί ένα τμήμα κώδικα πολλές φορές Υπάρχουν διάφοροι τρόποι χρήσης της Loop For/Loop (επαναλαμβάνει συγκεκριμένο αριθμό φορών) [ετικέτα:] For ταυτοποιητής In εύρος Loop (ακολουθιακές εντολές) End Loop [ετικέτα]; 16
Η ΕΝΤΟΛΗ LOOP (2/2) While/loop (Ο βρόχος επαναλαμβάνεται όσο ισχύει κάποια συνθήκη) [ετικέτα:] While συνθήκη Loop (ακολουθιακές εντολές); End Loop [ετικέτα]; Exit (χρησιμοποιείται για τον τερματισμό της εκτέλεσης του βρόχου) [ετικέτα:] EXIT [ετικέτα] [συνθήκη when]; NEXT: Χρησιμοποιείται για την παράλειψη βημάτων του βρόχου [ετικέτα:] NEXT [ετικέτα_βρόχου] [συνθήκη when]; 17
ΠΑΡΑΔΕΙΓΜΑ 1 ------------------------------------------------ LIBRARY ieee; USE ieee.std_logic_1164.all; ------------------------------------------------ ENTITY adder IS GENERIC (length : INTEGER := 8); PORT (a, b: IN STD_LOGIC_VECTOR (length-1 DOWNTO 0); cin: IN STD_LOGIC; s: OUT STD_LOGIC_VECTOR (length-1 DOWNTO 0); cout: OUT STD_LOGIC); END adder; ------------------------------------------------ ARCHITECTURE adder OF adder IS PROCESS (a, b, cin) VARIABLE carry : STD_LOGIC_VECTOR (length DOWNTO 0); carry(0) := cin; FOR i IN 0 TO length-1 LOOP s(i) <= a(i) XOR b(i) XOR carry(i); carry(i+1) := (a(i) AND b(i)) OR (a(i) AND carry(i)) OR (b(i) AND carry(i)); END LOOP; cout <= carry(length); END PROCESS; END adder; ------------------------------------------------ 18
ΠΑΡΑΔΕΙΓΜΑ 2 --------------------------------------------- LIBRARY ieee; USE ieee.std_logic_1164.all; --------------------------------------------- ENTITY barrel IS GENERIC (n: INTEGER := 8); PORT (inp: IN STD_LOGIC_VECTOR (n-1 DOWNTO 0); shift: IN INTEGER RANGE 0 TO 1; outp: OUT STD_LOGIC_VECTOR (n-1 DOWNTO 0)); END barrel; --------------------------------------------- ARCHITECTURE RTL OF barrel IS PROCESS (inp, shift) IF (shift=0) THEN outp <= inp; ELSE outp(0) <= '0'; FOR i IN 1 TO inp'high LOOP outp(i) <= inp(i-1); END LOOP; END IF; END PROCESS; END RTL; 19
CASE ΕΝΑΝΤΙ IF Η εντολή If/Else μπορεί να οδηγήσει στην υλοποίηση ενός κωδικοποιητή προτεραιότητας Σε μερικά σύγχρονα εργαλεία βελτιστοποίησης αυτό δεν συμβαίνει Όταν χρησιμοποιείται για τη περιγραφή ενός συνδυαστικού κυκλώματος προκύπτει συνήθως ένας πολυπλέκτης Με την εντολή Case αυτό δεν συμβαίνει Οι παρακάτω κώδικες υλοποιούν το ίδιο φυσικό κύκλωμα πολυπλέκτη 20
CASE ΕΝΑΝΤΙ WHEN Οι παρακάτω κώδικες οδηγούν στο ίδιο κύκλωμα 21
ΚΑΚΟΣ ΧΡΟΝΙΣΜΟΣ ΡΟΛΟΓΙΟΥ Ο μεταγλωττιστής δε μπορεί να συνθέσει κώδικα που περιέχει αποδόσεις τιμών και στις δύο μεταβάσεις του ίδιου σήματος αναφοράς (ρολόι) Η παρακάτω περίπτωση δεν μπορεί να συντεθεί Όταν απαιτείται τέτοιας μορφής κώδικας χρησιμοποιούνται τεχνικές όπως παρακάτω 22
ΑΚΟΛΟΥΘΙΑΚΟΣ ΚΩΔΙΚΑΣ ΓΙΑ ΣΧΕΔΙΑΣΜΟ ΣΥΝΔΥΑΣΤΙΚΟΥ ΚΥΚΛΩΜΑΤΟΣ Αν ο κώδικας προορίζεται για συνδυαστικό κύκλωμα πρέπει όλος ο πίνακας αλήθειας του να περιγράφεται πλήρως στον κώδικα Θα πρέπει όλα τα σήματα εισόδου που χρησιμοποιούνται στη διεργασία να υπάρχουν στη λίστα ευαισθησίας Θα πρέπει όλοι οι συνδυασμοί των σημάτων εισόδου/εξόδου να περιλαμβάνονται στον κώδικα 23
Σύμβολο D Q Clock D LATCH Πίνακας αλήθειας Clock D 0 1 0 1 1 Q(t+1) Q(t) 0 1 Διάγραμμα χρονισμού Clock D Q t 1 t 2 t 3 t 4 Time 24
Σύμβολο D Q Clock D FLIP-FLOP Πίνακας αλήθειας Clk D 0 1 0 1 Q(t+1) 0 1 Q(t) Q(t) Διάγραμμα χρονισμού Clock D Q t 1 t 2 t 3 t 4 Time 25
ΔΗΜΙΟΥΡΓΙΑ ΚΑΤΑΧΩΡΗΤΩΝ Flip flop παράγεται όταν γίνεται απόδοση τιμής σε ένα αντικείμενο τύπου signal τη στιγμή που κάποιο άλλο σήμα αλλάζει κατάσταση Δηλαδή όταν συμβαίνει μια σύγχρονη απόδοση τιμής Μια τέτοια απόδοση τιμής, είναι σύγχρονη, και παρουσιάζεται μόνο σε μια διεργασία, συνάρτηση ή διαδικασία (με δήλωση if signal event ή wait until ) H variable δεν θα δημιουργήσει απαραίτητα flip flop αν η τιμή του δεν χρησιμοποιηθεί έξω από τη διεργασία (ή τη συνάρτηση ή τη διαδικασία) Αν όμως μια variable παίρνει τιμή τη στιγμή που κάποιο άλλο σήμα αλλάζει κατάσταση και αυτή η τιμή μεταβιβάζεται σε ένα signal τότε παράγεται flip flop H variable παράγει καταχωρητή όταν διαβάζεται πριν αποδοθεί τιμή σε αυτό 26
D FLIP FLOP (1 η ΛΥΣΗ ΛΑΝΘΑΣΜΕΝΗ): ΔΥΟ FLIP FLOP ----------------------------------------- LIBRARY ieee; USE ieee.std_logic_1164.all; ----------------------------------------- ENTITY dff IS END dff; PORT (d, clk: IN STD_LOGIC; q: BUFFER STD_LOGIC; qbar: OUT STD_LOGIC); ----------------------------------------- ARCHITECTURE two_dff OF dff IS PROCESS (clk) IF (clk EVENT AND clk= 1 ) THEN END IF; END PROCESS; END two_dff; q <= d; qbar <= NOT d; ----------------------------------------- -- generates a register -- generates a register 27
D FLIP FLOP (2 η ΛΥΣΗ ΣΩΣΤΗ): ENA FLIP FLOP ----------------------------------------- LIBRARY ieee; USE ieee.std_logic_1164.all; ----------------------------------------- ENTITY dff IS END dff; PORT (d, clk: IN STD_LOGIC; q: BUFFER STD_LOGIC; qbar: OUT STD_LOGIC); ----------------------------------------- ARCHITECTURE one_dff OF dff IS PROCESS (clk) IF (clk EVENT AND clk= 1 ) THEN END IF; END PROCESS; qbar <= NOT q; END one_dff; q <= d; ----------------------------------------- -- generates a register -- uses logic gate (no register) 28
ΚΥΚΛΩΜΑΤΑ ΤΩΝ ΔΥΟ ΠΑΡΑΔΕΙΓΜΑΤΩΝ 29
ΚΩΔΙΚΑΣ D LATCH LIBRARY ieee ; USE ieee.std_logic_1164.all ; ENTITY latch IS PORT ( D, Clock : IN STD_LOGIC ; Q : OUT STD_LOGIC) ; END latch ; D Clock Q ARCHITECTURE behavioral OF latch IS PROCESS ( D, Clock ) IF Clock = '1' THEN Q <= D ; END IF ; END PROCESS ; END behavioral; 30
ΚΩΔΙΚΑΣ D FLIP-FLOP LIBRARY ieee ; USE ieee.std_logic_1164.all ; ENTITY flipflop IS PORT ( D, Clock : IN STD_LOGIC ; Q : OUT STD_LOGIC) ; END flipflop ; D Q Clock ARCHITECTURE behavioral OF flipflop IS PROCESS ( Clock ) IF Clock'EVENT AND Clock = '1' THEN Q <= D ; END IF ; END PROCESS ; END behavioral ; 31
ΚΩΔΙΚΑΣ D FLIP-FLOP LIBRARY ieee ; USE ieee.std_logic_1164.all ; ENTITY flipflop IS PORT ( D, Clock : IN STD_LOGIC ; Q : OUT STD_LOGIC) ; END flipflop ; D Q Clock ARCHITECTURE behavioral2 OF flipflop IS PROCESS ( Clock ) IF rising_edge(clock) THEN Q <= D ; END IF ; END PROCESS ; END behavioral2; 32
ΚΩΔΙΚΑΣ D FLIP-FLOP LIBRARY ieee ; USE ieee.std_logic_1164.all ; ENTITY flipflop IS PORT ( D, Clock : IN STD_LOGIC ; Q : OUT STD_LOGIC) ; END flipflop ; D Q Clock ARCHITECTURE behavioral3 OF flipflop IS PROCESS WAIT UNTIL rising_edge(clock) ; Q <= D ; END PROCESS ; END behavioral3 ; 33
D FLIP-FLOP ΜΕ ΑΣΥΓΧΡΟΝH LIBRARY ieee ; USE ieee.std_logic_1164.all ; ΕΠΑΝΑΦΟΡΑ (RESET) ENTITY flipflop_ar IS PORT ( D, Resetn, Clock : IN STD_LOGIC ; Q : OUT STD_LOGIC) ; END flipflop_ar ; D Q Clock Resetn ARCHITECTURE behavioral OF flipflop_ar IS PROCESS ( Resetn, Clock ) IF Resetn = 1' THEN Q <= '0' ; ELSIF rising_edge(clock) THEN Q <= D ; END IF ; END PROCESS ; END behavioral ; 34
D FLIP-FLOP ΜΕ ΣΥΓΧΡΟΝΗ ΕΠΑΝΑΦΟΡΑ (RESET) LIBRARY ieee ; USE ieee.std_logic_1164.all ; ENTITY flipflop_sr IS PORT ( D, Resetn, Clock : IN STD_LOGIC ; Q : OUT STD_LOGIC) ; END flipflop_sr ; ARCHITECTURE behavioral OF flipflop_sr IS PROCESS(Clock) IF rising_edge(clock) THEN IF Resetn = 1' THEN Q <= '0' ; ELSE Q <= D ; END IF ; END IF; END PROCESS ; END behavioral ; D Q Clock Resetn 35
ΣΥΓΧΡΟΝΟ ΕΝΑΝΤΙ ΑΣΥΓΧΡΟΝΟ Στην εντολή IF η ασύγχρονη δήλωση γίνεται Πριν τη δήλωση rising_edge(clock) Στην εντολή IF η σύγχρονη δήλωση γίνεται Μετά τη δήλωση rising_edge(clock) 36
8-BIT ΚΑΤΑΧΩΡΗΤΗΣ ΜΕ ΑΣΥΓΧΡΟΝΟ LIBRARY ieee ; USE ieee.std_logic_1164.all ; RESET ENTITY reg8 IS PORT ( D : IN STD_LOGIC_VECTOR(7 DOWNTO 0) ; Resetn, Clock : IN STD_LOGIC ; Q : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ) ; END reg8 ; ARCHITECTURE behavioral OF reg8 IS PROCESS ( Resetn, Clock ) IF Resetn = '0' THEN Q <= "00000000" ; ELSIF rising_edge(clock) THEN Q <= D ; END IF ; END PROCESS ; END behavioral ;` 8 Resetn 8 D Q Clock reg8 37
8-BIT ΚΑΤΑΧΩΡΗΤΗΣ ΜΕ ΣΗΜΑ LIBRARY ieee ; USE ieee.std_logic_1164.all ; ΕΠΙΤΡΕΨΗΣ (ENABLE) ENTITY regne IS GENERIC ( N : INTEGER := 8 ) ; PORT ( D : IN STD_LOGIC_VECTOR(N-1 DOWNTO 0) ; Enable, Clock : IN STD_LOGIC ; Q : OUT STD_LOGIC_VECTOR(N-1 DOWNTO 0) ) ; END regne ; ARCHITECTURE behavioral OF regne IS PROCESS (Clock) IF rising_edge(clock) THEN IF Enable = '1' THEN Q <= D ; END IF ; END IF; END PROCESS ; END behavioral ; N Enable D Q Clock regn N 38
Απορίες???? 39