«Σχεδιασμός Ολοκληρωμένων Κυκλωμάτων» Χειμερινό εξάμηνο 216-217 Συντρέχων Κώδικας Παρασκευάς Κίτσος http://diceslab.cied.teiwest.gr Επίκουρος Καθηγητής Tμήμα Μηχανικών Πληροφορικής ΤΕ E-mail: pkitsos@teimes.gr Αντίρριο 4/11/215 1
ΔΟΜΗ ΠΑΡΟΥΣΙΑΣΗΣ Συνδυαστική και ακολουθιακή σχεδίαση Συντρέχων κώδικας Ακολουθιακός κώδικας Η εντολή when Η εντολή generate Η εντολή block Βασικά ακολουθιακά κυκλώματα 2
ΣΥΝΔΥΑΣΤΙΚΗ ΚΑΙ ΑΚΟΛΟΥΘΙΑΚΗ ΛΟΓΙΚΗ Είσοδος Συνδυαστικό Λογικό Κύκλωμα Έξοδος Είσοδος Συνδυαστικό Λογικό Κύκλωμα Έξοδος Κατάσταση Συνδυαστικό Ακολουθιακό Στο συνδυαστικό κύκλωμα οι έξοδοι εξαρτώνται αποκλειστικά από τις παρούσες εισόδους Στο ακολουθιακό κύκλωμα οι έξοδοι εξαρτώνται από προηγούμενες εισόδους Οπότε απαιτείται ένα στοιχείο μνήμης το οποίο συνδέεται με το συνδυαστικό κύκλωμα μέσω ενός μονοπατιού ανάδρασης 3
ΣΥΝΤΡΕΧΩΝ ΚΑΙ ΑΚΟΛΟΥΘΙΑΚΟΣ ΚΩΔΙΚΑΣ Ο VHDL κώδικας είναι από τη φύση του συντρέχων (εκτελείται παράλληλα) Μόνο ο κώδικας μέσα στις εντολές process, function και procedure εκτελείται σειριακά (ακολουθιακά) Συνολικά όμως οι παραπάνω εντολές εκτελούνται παράλληλα με τα υπόλοιπα τμήματα του κώδικα 4
ΤΡΟΠΟΙ ΠΕΡΙΓΡΑΦΗΣ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ Τύποι περιγραφής VHDL συντρέχων dataflow εκτελείται παράλληλα με χρήση υποκυκλωμάτων structural υποκυκλώματα και διασυνδέσεις Testbenches ακολουθιακός behavioral (sequential) εκτελείται ακολουθιακά Registers State machines Instruction decoders Κώδικας κατάλληλος για σύνθεση 5
ΠΑΡΑΔΕΙΓΜΑ Έστω τρεις εντολές stat1, stat2, stat3 που εκτελούνται παράλληλα Τότε όλες οι παρακάτω δηλώσεις stat1 ή stat2 ή stat3 κλπ stat2 ή stat1 ή stat1 stat3 ή stat3 ή stat2 περιγράφουν το ίδιο ακριβώς κύκλωμα!!! Εκ κατακλείδι, όταν επιθυμείται περιγραφή συνδυαστικού κυκλώματος χρησιμοποιείται συντρέχων γραφή κώδικα 6
ΤΕΛΕΣΤΕΣ 7
ΤΕΛΕΣΤΕΣ: ΠΑΡΑΔΕΙΓΜΑ --------------------------------------- LIBRARY ieee; USE ieee.std_logic_1164.all; --------------------------------------- ENTITY mux IS END mux; PORT (a, b, c, d, s, s1: IN STD_LOGIC; y: OUT STD_LOGIC); --------------------------------------- ARCHITECTURE pure_logic OF mux IS BEGIN y <= END pure_logic; (a AND NOT s1 AND NOT s) OR (b AND NOT s1 AND s) OR (c AND s1 AND NOT s) OR (d AND s1 AND s); --------------------------------------- 8
Η ΕΝΤΟΛΗ WHEN Η εντολή when μπορεί να χρησιμοποιηθεί με δύο μορφές Η απλή when (when/else) Με δυνατότητα επιλογής (with/select/when) H απλή when συντάσσεται όπως παρακάτω εκχώρηση WHEN συνθήκη ELSE εκχώρηση WHEN συνθήκη ELSE...; 9
ΠΑΡΑΔΕΙΓΜΑ 1 outp <= "" WHEN (inp='' OR reset='1') ELSE "1" WHEN ctl='1' ELSE "1"; 1
ΠΑΡΑΔΕΙΓΜΑ 2 LIBRARY ieee; USE ieee.std_logic_1164.all; ------------------------------------------- ENTITY mux IS END mux; PORT (a, b, c, d: IN STD_LOGIC; sel: IN STD_LOGIC_VECTOR (1 DOWNTO ); y: OUT STD_LOGIC); ------------------------------------------- ARCHITECTURE mux1 OF mux IS BEGIN y <= a WHEN sel= ELSE b WHEN sel= 1 ELSE c WHEN sel= 1 ELSE d; END mux1; ------------------------------------------- 11
ΠΑΡΑΔΕΙΓΜΑ 3 12
ΠΑΡΑΔΕΙΓΜΑ 4 (1/2) 13
ΠΑΡΑΔΕΙΓΜΑ 4 (2/2) 14
Η ΕΝΤΟΛΗ WHEN ΜΕ ΕΠΙΛΟΓΗ Συντάσσεται όπως παρακάτω WITH αναγνωριστικό SELECT εκχώρηση WHEN τιμή, εκχώρηση WHEN τιμή,...; Πρέπει να ελέγχονται όλες οι περιπτώσεις Αλλιώς πρέπει να χρησιμοποιείται το others 15
ΠΑΡΑΔΕΙΓΜΑ 1 ------------------------------------------- LIBRARY ieee; USE ieee.std_logic_1164.all; ------------------------------------------- ENTITY mux IS PORT (a, b, c, d: IN STD_LOGIC; sel: IN STD_LOGIC_VECTOR (1 DOWNTO ); y: OUT STD_LOGIC); END mux; ------------------------------------------- ARCHITECTURE mux2 OF mux IS BEGIN WITH sel SELECT y <= a WHEN, -- notice, instead of ; b WHEN 1, c WHEN 1, d WHEN OTHERS; -- cannot be d WHEN 11 END mux2; -------------------------------------------- 16
ΠΑΡΑΔΕΙΓΜΑ 2 ---------------------------------------------- LIBRARY ieee; USE ieee.std_logic_1164.all; ---------------------------------------------- ENTITY mux IS PORT (a, b, c, d: IN STD_LOGIC; sel: IN INTEGER RANGE TO 3; y: OUT STD_LOGIC); END mux; ---------------------------------------------- ARCHITECTURE mux3 OF mux IS BEGIN WITH sel SELECT y <= a WHEN, b WHEN 1, c WHEN 2, d WHEN 3; -- here, 3 or OTHERS are equivalent, END mux3; -- for all options are tested anyway ----------------------------------------------- 17
ΠΑΡΑΔΕΙΓΜΑ 3 ---------------------------------------------- LIBRARY ieee; USE ieee.std_logic_1164.all; ---------------------------------------------- ENTITY tri_state IS PORT (ena: IN STD_LOGIC; input: IN STD_LOGIC_VECTOR (7 DOWNTO ); output: OUT STD_LOGIC_VECTOR (7 DOWNTO )); END tri_state; ---------------------------------------------- ARCHITECTURE tri_state OF tri_state IS BEGIN output <= input WHEN (ena='') ELSE (OTHERS => Z ); END tri_state; ---------------------------------------------- 18
ΠΡΟΣΟΜΟΙΩΣΗ 19
ΠΑΡΑΔΕΙΓΜΑ 4 LIBRARY ieee; USE ieee.std_logic_1164.all; --------------------------------------------- ENTITY encoder IS PORT (x: IN STD_LOGIC_VECTOR (7 DOWNTO ); END encoder; y: OUT STD_LOGIC_VECTOR (2 DOWNTO )); --------------------------------------------- ARCHITECTURE encoder2 OF encoder IS BEGIN WITH x SELECT y <= "" WHEN "1", END encoder2; --------------------------------------------- "1" WHEN "1", "1" WHEN "1", "11" WHEN "1", "1" WHEN "1", "11" WHEN "1", "11" WHEN "1", "111" WHEN "1", "ZZZ" WHEN OTHERS; 2
ΑΡΙΘΜΗΤΙΚΗ ΚΑΙ ΛΟΓΙΚΗ ΜΟΝΑΔΑ (1/4) 21
ΑΡΙΘΜΗΤΙΚΗ ΚΑΙ ΛΟΓΙΚΗ ΜΟΝΑΔΑ (2/4) 22
ΑΡΙΘΜΗΤΙΚΗ ΚΑΙ ΛΟΓΙΚΗ ΜΟΝΑΔΑ (3/4) 2 LIBRARY ieee; 3 USE ieee.std_logic_1164.all; 4 USE ieee.std_logic_unsigned.all; 5 ---------------------------------------------- 6 ENTITY ALU IS 7 PORT (a, b: IN STD_LOGIC_VECTOR (7 DOWNTO ); 8 sel: IN STD_LOGIC_VECTOR (3 DOWNTO ); 9 cin: IN STD_LOGIC; 1 y: OUT STD_LOGIC_VECTOR (7 DOWNTO )); 11 END ALU; 12 ---------------------------------------------- 13 ARCHITECTURE dataflow OF ALU IS 14 SIGNAL arith, logic: STD_LOGIC_VECTOR (7 DOWNTO ); 15 BEGIN 16 ----- Arithmetic unit: ------ 17 WITH sel(2 DOWNTO ) SELECT 18 arith <= a WHEN "", 19 a+1 WHEN "1", 2 a-1 WHEN "1", 21 b WHEN "11", 23
ΑΡΙΘΜΗΤΙΚΗ ΚΑΙ ΛΟΓΙΚΗ ΜΟΝΑΔΑ (4/4) 22 b+1 WHEN "1", 23 b-1 WHEN "11", 24 a+b WHEN "11", 25 a+b+cin WHEN OTHERS; 26 ----- Logic unit: ----------- 27 WITH sel(2 DOWNTO ) SELECT 28 logic <= NOT a WHEN "", 29 NOT b WHEN "1", 3 a AND b WHEN "1", 31 a OR b WHEN "11", 32 a NAND b WHEN "1", 33 a NOR b WHEN "11", 34 a XOR b WHEN "11", 35 NOT (a XOR b) WHEN OTHERS; 36 -------- Mux: --------------- 37 WITH sel(3) SELECT 38 y <= arith WHEN '', 39 logic WHEN OTHERS; 4 END dataflow; 41 ---------------------------------------------- 24
ΠΡΟΣΟΜΟΙΩΣΗ 25
Η ΕΝΤΟΛΗ GENERATE Η εντολή generate μπορεί να χρησιμοποιηθεί με δύο μορφές Η απλή generate (for/generate) Με δυνατότητα συνθήκης (if/generate) Στη generate θα πρέπει πάντα να χρησιμοποιείται ετικέτα H απλή generate συντάσσεται όπως παρακάτω ετικέτα: FOR αναγνωριστικό IN εύρος GENERATE δηλώσεις END GENERATE; 26
ΠΑΡΑΔΕΙΓΜΑ 1 SIGNAL x: BIT_VECTOR (7 DOWNTO ); SIGNAL y: BIT_VECTOR (15 DOWNTO ); SIGNAL z: BIT_VECTOR (7 DOWNTO );... G1: FOR i IN x'range GENERATE z(i) <= x(i) AND y(i+8); END GENERATE; 27
ΠΑΡΑΔΕΙΓΜΑ 2 ------------------------------------------------ LIBRARY ieee; USE ieee.std_logic_1164.all; ------------------------------------------------ ENTITY shifter IS PORT (inp: IN STD_LOGIC_VECTOR (3 DOWNTO ); sel: IN INTEGER RANGE TO 4; outp: OUT STD_LOGIC_VECTOR (7 DOWNTO )); END shifter; ------------------------------------------------ ARCHITECTURE shifter OF shifter IS SUBTYPE vector IS STD_LOGIC_VECTOR (7 DOWNTO ); TYPE matrix IS ARRAY (4 DOWNTO ) OF vector; SIGNAL row: matrix; BEGIN row() <= "" & inp; G1: FOR i IN 1 TO 4 GENERATE row(i) <= row(i-1)(6 DOWNTO ) & ''; END GENERATE; outp <= row(sel); END shifter; ------------------------------------------------ 28
ΠΡΟΣΟΜΟΙΩΣΗ 29
GENERATE ΜΕ ΣΥΝΘΗΚΗ Συντάσσεται όπως παρακάτω ετικέτα1: FOR αναγνωριστικό IN εύρος GENERATE... ετικέτα 2: IF συνθήκη GENERATE δηλώσεις END GENERATE; END GENERATE; Μπορεί να χρησιμοποιηθεί και με αντίθετη σειρά 3
Η ΕΝΤΟΛΗ BLOCK Η εντολή block μπορεί να χρησιμοποιηθεί με δύο μορφές Την απλή block (simple block) Την φρουρούμενη block (guarded block) Η απλή block χρησιμοποιείται για ομαδοποίηση του κώδικα Χρησιμοποιείται σε μεγάλα τμήματα ενός ευρήτερου κώδικα Συντάσσεται όπως παρακάτω Ετικέτα: BLOCK [τμήμα δηλώσεων] BEGIN (παράλληλες δηλώσεις κώδικα) END BLOCK ετικέτα; 31
ΠΑΡΑΔΕΙΓΜΑ 1 ARCHITECTURE example... BEGIN... block1: BLOCK BEGIN... END BLOCK block1... block2: BLOCK BEGIN... END BLOCK block2;... END example; 32
ΠΑΡΑΔΕΙΓΜΑ 2 b1: BLOCK SIGNAL a: STD_LOGIC; BEGIN a <= input_sig WHEN ena='1' ELSE 'Z'; END BLOCK b1; 33
ΦΡΟΥΡΟΥΜΕΝΗ BLOCK H φρουρούμενη block εμπεριέχει μια επιπλέον παράμετρο που καλείται «φρουρός» Η εντολή εκτελείται όταν ικανοποιείται ο «φρουρός» Συντάσσεται όπως παρακάτω ετικέτα: BLOCK (έκφραση) [δηλώσεις] BEGIN (παράλληλες φρουρούμενες ή όχι δηλώσεις) END BLOCK ετικέτα; 34
1 ------------------------------- ΠΑΡΑΔΕΙΓΜΑ 2 LIBRARY ieee; 3 USE ieee.std_logic_1164.all; 4 ------------------------------- 5 ENTITY dff IS 6 PORT ( d, clk, rst: IN STD_LOGIC; 7 q: OUT STD_LOGIC); 8 END dff; 9 ------------------------------- 1 ARCHITECTURE dff OF dff IS 11 BEGIN 12 b1: BLOCK (clk'event AND clk='1') 13 BEGIN 14 q <= GUARDED '' WHEN rst='1' ELSE d; 15 END BLOCK b1; 16 END dff; 35
ΣΥΝΕΝΩΣΗ ΚΑΛΩΔΙΩΝ a b 5 4 1 d c SIGNAL a: STD_LOGIC_VECTOR(3 DOWNTO ); SIGNAL b: STD_LOGIC_VECTOR(4 DOWNTO ); SIGNAL c: STD_LOGIC; SIGNAL d: STD_LOGIC_VECTOR(9 DOWNTO ); d <= a & b & c; 36
ΔΙΑΣΠΑΣΗ ΚΑΛΩΔΙΩΝ d 1 4 5 a b c SIGNAL a: STD_LOGIC_VECTOR(3 DOWNTO ); SIGNAL b: STD_LOGIC_VECTOR(4 DOWNTO ); SIGNAL c: STD_LOGIC; SIGNAL d: STD_LOGIC_VECTOR(9 DOWNTO ); a <= d(9 downto 6); b <= d(5 downto 1); c <= d(); 37
ΣΤΑΘΕΡΗ ΟΛΙΣΘΗΣΗ ΣΤΗ VHDL SIGNAL A : STD_LOGIC_VECTOR(3 DOWNTO ); SIGNAL AshiftR: STD_LOGIC_VECTOR(3 DOWNTO ); A>>1 A(3) A(2) A(1) A() A A(3) A(2) A(1) AshiftR AshiftR (3)<= ; AshiftR (2 downto )<=A(3 DOWNTO 1); 38
ΣΤΑΘΕΡΗ ΠΕΡΙΣΤΡΟΦΗ ΣΤΗ VHDL SIGNAL A : STD_LOGIC_VECTOR(3 DOWNTO ); SIGNAL ArotL: STD_LOGIC_VECTOR(3 DOWNTO ); A(3) A(2) A(1) A() A A<<<1 ArotL A(2) A(1) A() A(3) ArotL() <=A(3); ArotL(3 DOWNTO 1) <=A(2 DOWNTO ); 39
ΔΙΑΔΟΧΙΚΟΙ ΠΟΛΥΠΛΕΚΤΕΣ (1/2) w 3 w 2 1 y w 1 1 s2 s1 4
ΔΙΑΔΟΧΙΚΟΙ ΠΟΛΥΠΛΕΚΤΕΣ (2/2) LIBRARY ieee ; USE ieee.std_logic_1164.all ; ENTITY mux_cascade IS PORT (w1, w2, w3: IN STD_LOGIC ; s1, s2 : IN STD_LOGIC ; y : OUT STD_LOGIC ) ; END mux_cascade ; ARCHITECTURE dataflow OF mux_cascade IS BEGIN y <= w1 WHEN s1 = 1' ELSE w2 WHEN s2 = 1 ELSE w3 ; END dataflow ; 41
2 σε 4 ΑΠΟΚΩΔΙΚΟΠΟΙΗΤΗΣ (1/2) En w 1 w y 3 y 2 y 1 y 1 1 w 1 y 3 1 1 1 w y 2 1 1 1 y 1 1 1 1 1 En y x x 42
2 σε 4 ΑΠΟΚΩΔΙΚΟΠΟΙΗΤΗΣ (2/2) LIBRARY ieee ; USE ieee.std_logic_1164.all ; ENTITY dec2to4 IS PORT ( w : IN STD_LOGIC_VECTOR(1 DOWNTO ) ; En : IN STD_LOGIC ; y : OUT STD_LOGIC_VECTOR(3 DOWNTO ) ) ; END dec2to4 ; ARCHITECTURE dataflow OF dec2to4 IS SIGNAL Enw : STD_LOGIC_VECTOR(2 DOWNTO ) ; BEGIN Enw <= En & w ; WITH Enw SELECT y <= 1" WHEN "1", "1" WHEN "11", "1" WHEN "11", 1" WHEN "111", "" WHEN OTHERS ; END dataflow ; 43
ΚΩΔΙΚΟΠΟΙΗΤΗΣ ΠΡΟΤΕΡΑΙΟΤΗΤΑΣ (1/2) w w 1 w 2 w 3 y y 1 z w 3 w 2 w 1 w y 1 y z 1 1 x 1 x x 1 x x x d 1 d 1 1 1 1 1 1 1 44
ΚΩΔΙΚΟΠΟΙΗΤΗΣ ΠΡΟΤΕΡΑΙΟΤΗΤΑΣ LIBRARY ieee ; USE ieee.std_logic_1164.all ; (2/2) ENTITY priority IS PORT ( w : IN STD_LOGIC_VECTOR(3 DOWNTO ) ; y : OUT STD_LOGIC_VECTOR(1 DOWNTO ) ; z : OUT STD_LOGIC ) ; END priority ; ARCHITECTURE dataflow OF priority IS BEGIN y <= "11" WHEN w(3) = '1' ELSE "1" WHEN w(2) = '1' ELSE "1" WHEN w(1) = '1' ELSE "" ; z <= '' WHEN w = "" ELSE '1' ; END dataflow ; 45
Απορίες???? 46