«Σχεδιασμός Ολοκληρωμένων Κυκλωμάτων» Χειμερινό εξάμηνο 2016-2017 Πακέτα και Συστατικά Στοιχεία (Υποκυκλώματα) Παρασκευάς Κίτσος http://diceslab.cied.teiwest.gr Επίκουρος Καθηγητής Tμήμα Μηχανικών Πληροφορικής ΤΕ E-mail: pkitsos@teimes.gr Αντίρριο 02/12/2016 1
ΔΟΜΗ ΠΑΡΟΥΣΙΑΣΗΣ Πακέτο Συστατικό στοιχείο Κώδικας με χρήση Συστατικών Στοιχείων Γενικευμένη αντιστοίχιση Παραδείγματα 2
ΣΥΝΔΥΑΣΤΙΚΗ ΚΑΙ ΑΚΟΛΟΥΘΙΑΚΗ ΛΟΓΙΚΗ Είσοδος Συνδυαστικό Λογικό Κύκλωμα Έξοδος Είσοδος Συνδυαστικό Λογικό Κύκλωμα Έξοδος Κατάσταση Συνδυαστικό Ακολουθιακό Στο συνδυαστικό κύκλωμα οι έξοδοι εξαρτώνται αποκλειστικά από τις παρούσες εισόδους Στο ακολουθιακό κύκλωμα οι έξοδοι εξαρτώνται από προηγούμενες εισόδους Οπότε απαιτείται ένα στοιχείο μνήμης το οποίο συνδέεται με το συνδυαστικό κύκλωμα μέσω ενός μονοπατιού ανάδρασης 3
ΤΡΟΠΟΙ ΠΕΡΙΓΡΑΦΗΣ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ Τύποι περιγραφής VHDL συντρέχων dataflow εκτελείται παράλληλα με χρήση υποκυκλωμάτων structural υποκυκλώματα και διασυνδέσεις ακολουθιακός behavioral (sequential) Testbenches εκτελείται ακολουθιακά Registers State machines Instruction decoders Κώδικας κατάλληλος για σύνθεση Όλα τα κυκλώματα (συνδυαστικά και ακολουθιακά) μπορούν να περιγραφούν με χρήση συστατικών στοιχείων (υποκυκλωμάτων) 4
ΘΕΜΕΛΙΩΔΕΙΣ ΜΟΝΑΔΕΣ ΚΩΔΙΚΑ VHDL 5
ΠΑΚΕΤΟ Στο πακέτο περιέχονται Συστατικά στοιχεία υποκυκλώματα (components) Συναρτήσεις (functions) Διαδικασίες (procedures) Ορισμοί τύπων δεδομένων (types) Σταθερές (constants) Με τα πακέτα επιτρέπεται η κοινοχρησία και η επαναχρησιμοποίηση του κώδικα 6
ΠΑΚΕΤΟ Το πακέτο συντάσσεται όπως παρακάτω PACKAGE όνομα_πακέτου IS (δηλώσεις) END όνομα_πακέτου; [PACKAGE BODY όνομα_πακέτου IS (περιγραφές Συναρτήσεων και Διαδικασιών) END όνομα_πακέτου;] Αποτελείται από δύο μέρη Το πακέτο Package Το σώμα του πακέτου Package Body 7
ΠΑΚΕΤΟ Το πρώτο μέρος (πακέτο) είναι υποχρεωτικό και περιέχει όλες τις δηλώσεις Το δεύτερο μέρος είναι υποχρεωτικό μόνο όταν στο πρώτο μέρος δηλώνονται ένα ή περισσότερα υποπρογράμματα (συναρτήσεις ή διαδικασίες) Τότε περιέχει τις περιγραφές («τα σώματα») των υποπρογραμμάτων Το πακέτο και το σώμα του πακέτου πρέπει να έχουν το ίδιο όνομα 8
ΠΑΡΑΔΕΙΓΜΑ ΑΠΛΟΥ ΠΑΚΕΤΟΥ Έχει όνομα my_package Και περιλαμβάνει μόνο δηλώσεις τύπων δεδομένων Και αντικείμενα τύπου constant Άρα δεν απαιτείται σώμα πακέτου 1 ------------------------------------------------ 4 ------------------------------------------------ 5 PACKAGE my_package IS 6 TYPE state IS (st1, st2, st3, st4); 7 TYPE color IS (red, green, blue); 8 CONSTANT vec: STD_LOGIC_VECTOR(7 DOWNTO 0) := "11111111"; 9 END my_package; 10 ------------------------------------------------ 9
ΠΑΡΑΔΕΙΓΜΑ ΠΑΚΕΤΟΥ ΜΕ ΣΥΝΑΡΤΗΣΗ Περιέχει μια συνάρτηση Άρα απαιτείται σώμα πακέτου 1 ------------------------------------------------- 4 ------------------------------------------------- 5 PACKAGE my_package IS 6 TYPE state IS (st1, st2, st3, st4); 7 TYPE color IS (red, green, blue); 8 CONSTANT vec: STD_LOGIC_VECTOR(7 DOWNTO 0) := "11111111"; 9 FUNCTION positive_edge(signal s: STD_LOGIC) RETURN BOOLEAN; 10 END my_package; 11 ------------------------------------------------- 12 PACKAGE BODY my_package IS 13 FUNCTION positive_edge(signal s: STD_LOGIC) RETURN BOOLEAN IS 14 BEGIN 15 RETURN (s'event AND s='1'); 16 END positive_edge; 17 END my_package; 10
ΤΡΟΠΟΣ ΧΡΗΣΗΣ ΠΑΚΕΤΟΥ Αρχικά το πακέτο μεταγλωττίζεται (στη work) Μετά προσθέτουμε μια USE στο κύριο κώδικα ------------------------------------ LIBRARY ieee; USE ieee.std_logic_1164.all; USE work.my_package.all; ------------------------------------ ENTITY...... ARCHITECTURE...... ------------------------------------ 11
ΣΥΣΤΑΤΙΚΟ ΣΤΟΙΧΕΙΟ (ΥΠΟΚΥΚΛΩΜΑ) Το συστατικό στοιχείο (υποκύκλωμα) είναι ένα τμήμα συμβατικού κώδικα Περιλαμβάνει δηλώσεις βιβλιοθηκών Οντότητες Αρχιτεκτονικές Η δήλωση αυτού του κώδικα με μορφή συστατικού επιτρέπει τη χρήση του σε ένα άλλο κύκλωμα Επιτρέπει τη δόμηση ιεραρχικών σχεδιασμών 12
ΣΥΣΤΑΤΙΚΟ ΣΤΟΙΧΕΙΟ (ΥΠΟΚΥΚΛΩΜΑ) Δίνει τη δυνατότητα επαναχρησιμοποίησης και κοινοχρησίας του κώδικα Flip-flops, πολυπλέκτες, αθροιστές, βασικά κυκλώματα τοποθετούνται μέσα σε μια βιβλιοθήκη και χρησιμοποιούνται όταν απαιτείται σε οποιαδήποτε σχεδιασμό χωρίς συγγραφή του αντίστοιχου κώδικα 13
ΧΡΗΣΗ ΣΥΣΤΑΤΙΚΟΥ ΣΤΟΙΧΕΙΟΥ Για να χρησιμοποιήσουμε ένα συστατικό στοιχείο πρέπει πρώτα να το δηλώσουμε COMPONENT όνομα_συστατικού_στοιχείου IS PORT ( port_name : signal_mode signal_type; port_name : signal_mode signal_type;...); END COMPONENT; Και μετά να δημιουργήσουμε ένα «στιγμιότυπο» του συστατικού στοιχείου ετικέτα: όνομα_συστατικού_στοιχείου PORT MAP (port_list); Η δήλωση του component είναι ακριβώς η ίδια με της process H λίστα_θυρών (port_list) είναι απλώς μια λίστα που συσχετίζει τις θύρες του συγκεκριμένου κυκλώματος με τις θύρες του προσχεδιασμένου στοιχείου που δημιουργήθηκε το στιγμιότυπο 14
ΑΝΤΙΣΤΟΙΧΙΣΗ ΛΙΣΤΑΣ ΘΥΡΩΝ Υπάρχουν δύο τρόποι για την αντιστοίχιση των θυρών Αντιστοίχιση με βάση τη θέση (positional mapping) Ονομαστική αντιστοίχιση (nomimal mapping) COMPONENT inverter IS PORT (a: IN STD_LOGIC; b: OUT STD_LOGIC); END COMPONENT;... U1: inverter PORT MAP (x, y); --positional mapping: Οι θύρες x, y του ευρύτερου κυκλώματος αντιστοιχούν στις θύρες a, b του inverter. U1: inverter PORT MAP (a=>x, b=>y); --nomimal mapping Η positional mapping είναι πιο απλή στη σύνταξη αλλά η nomimal mapping είναι λιγότερο επισφαλής στα λάθη 15
ΣΥΣΤΑΤΙΚΑ ΣΤΟΙΧΕΙΑ ΔΗΛΩΜΕΝΑ ΣΤΟ ΚΩΔΙΚΑ (1/2) 1 ------ File inverter.vhd: ------------------- 4 ENTITY inverter IS 5 PORT (a: IN STD_LOGIC; b: OUT STD_LOGIC); 6 END inverter; 7 ARCHITECTURE inverter OF inverter IS 1 ----- File nand_3.vhd: ---------------------- 8 BEGIN 9 b <= NOT a; 10 END inverter; 4 ENTITY nand_3 IS 5 PORT (a, b, c: IN STD_LOGIC; d: OUT STD_LOGIC); 6 END nand_3; 1 ------ File nand_2.vhd: --------------------- 7 ARCHITECTURE nand_3 OF nand_3 IS 8 BEGIN 9 d <= NOT (a AND b AND c); 4 ENTITY nand_2 IS 10 END nand_3; 5 PORT (a, b: IN STD_LOGIC; c: OUT STD_LOGIC); 6 END nand_2; 7 ARCHITECTURE nand_2 OF nand_2 IS 8 BEGIN 9 c <= NOT (a AND b); 10 END nand_2; 16
ΣΥΣΤΑΤΙΚΑ ΣΤΟΙΧΕΙΑ ΔΗΛΩΜΕΝΑ ΣΤΟ ΚΩΔΙΚΑ (2/2) 1 ----- File project.vhd: --------------------- 4 ENTITY project IS 5 PORT (a, b, c, d: IN STD_LOGIC; 6 x, y: OUT STD_LOGIC); 7 END project; 8 ARCHITECTURE structural OF project IS 9 ------------- 10 COMPONENT inverter IS 11 PORT (a: IN STD_LOGIC; b: OUT STD_LOGIC); 12 END COMPONENT; 13 ------------- 14 COMPONENT nand_2 IS 15 PORT (a, b: IN STD_LOGIC; c: OUT STD_LOGIC); 16 END COMPONENT; 17 ------------- 18 COMPONENT nand_3 IS 19 PORT (a, b, c: IN STD_LOGIC; d: OUT STD_LOGIC); 20 END COMPONENT; 21 ------------- 22 SIGNAL w: STD_LOGIC; 23 BEGIN 24 U1: inverter PORT MAP (b, w); -- ή U1: inverter PORT MAP (a=>b, b=>w); 25 U2: nand_2 PORT MAP (a, b, x); -- ή U2: nand_2 PORT MAP (a=>a, b=>b, c=>x); 26 U3: nand_3 PORT MAP (w, c, d, y); -- ή U3: nand_3 PORT MAP (a=>w, b=>c, c=>d, d=>y); 27 END structural; w 17
ΠΡΟΣΟΜΟΙΩΣΗ 18
ΣΥΣΤΑΤΙΚΑ ΣΤΟΙΧΕΙΑ ΔΗΛΩΜΕΝΑ ΣΕ ΠΑΚΕΤΟ (1/2) 1 ------ File inverter.vhd: ------------------- 4 ENTITY inverter IS 5 PORT (a: IN STD_LOGIC; b: OUT STD_LOGIC); 6 END inverter; 7 ARCHITECTURE inverter OF inverter IS 1 ----- File nand_3.vhd: ---------------------- 8 BEGIN 9 b <= NOT a; 10 END inverter; 4 ENTITY nand_3 IS 5 PORT (a, b, c: IN STD_LOGIC; d: OUT STD_LOGIC); 6 END nand_3; 1 ------ File nand_2.vhd: --------------------- 7 ARCHITECTURE nand_3 OF nand_3 IS 8 BEGIN 9 d <= NOT (a AND b AND c); 4 ENTITY nand_2 IS 10 END nand_3; 5 PORT (a, b: IN STD_LOGIC; c: OUT STD_LOGIC); 6 END nand_2; 7 ARCHITECTURE nand_2 OF nand_2 IS 8 BEGIN 9 c <= NOT (a AND b); 10 END nand_2; 19
ΣΥΣΤΑΤΙΚΑ ΣΤΟΙΧΕΙΑ ΔΗΛΩΜΕΝΑ ΣΕ ΠΑΚΕΤΟ (2/2) 1 ----- File my_components.vhd: --------------- 4 PACKAGE my_components IS 5 ------ inverter: ------- 6 COMPONENT inverter IS 7 PORT (a: IN STD_LOGIC; b: OUT STD_LOGIC); 8 END COMPONENT; 9 ------ 2-input nand: --- 10 COMPONENT nand_2 IS 11 PORT (a, b: IN STD_LOGIC; c: OUT STD_LOGIC); 12 END COMPONENT; 13 ------ 3-input nand: --- 14 COMPONENT nand_3 IS 15 PORT (a, b, c: IN STD_LOGIC; d: OUT STD_LOGIC); 16 END COMPONENT; 17 ------------------------ 18 END my_components; w 1 ----- File project.vhd: --------------------- 4 USE work.my_components.all; 5 --------------------------------- 6 ENTITY project IS 7 PORT ( a, b, c, d: IN STD_LOGIC; 8 x, y: OUT STD_LOGIC); 9 END project; 10 --------------------------------- 11 ARCHITECTURE structural OF project IS 12 SIGNAL w: STD_LOGIC; 13 BEGIN 14 U1: inverter PORT MAP (b, w); 15 U2: nand_2 PORT MAP (a, b, x); 16 U3: nand_3 PORT MAP (w, c, d, y); 17 END structural; 20
ΓΕΝΙΚΕΥΜΕΝΗ ΑΝΤΙΣΤΟΙΧΙΣΗ Με χρήση της εντολής Generic map είναι δυνατό να δημιουργηθεί μια γενικευμένη αντιστοίχιση Η Generic map συντάσσεται όπως παρακάτω ετικέτα: στοιχείο GENERIC MAP (λίστα_παραμ) PORT MAP (λίστα_θυρών); Όμοια σύνταξη με τα προηγούμενα Προστέθηκε η generic με τη λίστα παραμέτρων 21
ΠΑΡΑΔΕΙΓΜΑ ΧΡΗΣΗΣ ΓΕΝΙΚΕΥΜΕΝΗΣ ΑΝΤΙΣΤΟΙΧΙΣΗΣ (1/2) Γεννήτρια άρτιας ισοτιμίας: Η έξοδος πρέπει να έχει άρτιο αριθμό από 1 Προσθέτει bit 0 στην είσοδο αν ο αριθμός των 1 στην είσοδο είναι άρτιος Προσθέτει bit 1 στην είσοδο αν ο αριθμός των 1 στην είσοδο είναι περιττός 22
ΠΑΡΑΔΕΙΓΜΑ ΧΡΗΣΗΣ ΓΕΝΙΚΕΥΜΕΝΗΣ 1 ------ File parity_gen.vhd (component): ------------- 4 ENTITY parity_gen IS 5 GENERIC (n : POSITIVE := 7); -- default is 7 6 PORT ( input: IN BIT_VECTOR (n DOWNTO 0); 7 output: OUT BIT_VECTOR (n+1 DOWNTO 0)); 8 END parity_gen; 9 ----------------------------------- 10 ARCHITECTURE parity OF parity_gen IS 11 BEGIN 12 PROCESS (input) 13 VARIABLE temp1: BIT; ΑΝΤΙΣΤΟΙΧΙΣΗΣ (2/2) 1 ------ File my_code.vhd (actual project): ------------ 4 ENTITY my_code IS 5 GENERIC (n : POSITIVE := 2); -- 2 will overwrite 7 6 PORT ( inp: IN BIT_VECTOR (n DOWNTO 0); 7 outp: OUT BIT_VECTOR (n+1 DOWNTO 0)); 8 END my_code; 9 ----------------------------------- 14 VARIABLE temp2: BIT_VECTOR (output'range); 10 ARCHITECTURE my_arch OF my_code IS 15 BEGIN 11 COMPONENT parity_gen IS 16 temp1 := '0'; 12 GENERIC (n : POSITIVE); 13 PORT (input: IN BIT_VECTOR (n DOWNTO 0); 17 FOR i IN input'range LOOP 14 output: OUT BIT_VECTOR (n+1 DOWNTO 0)); 18 temp1 := temp1 XOR input(i); 15 END COMPONENT; 19 temp2(i) := input(i); 16 ------------------------ 20 END LOOP; 17 BEGIN 21 temp2(output'high) := temp1; 18 C1: parity_gen GENERIC MAP(n) PORT MAP(inp, outp); 22 output <= temp2; 19 END my_arch; 23 END PROCESS; 24 END parity; 23
ΠΡΟΣΟΜΟΙΩΣΗ 24
ΑΡΙΘΜΗΤΙΚΗ ΚΑΙ ΛΟΓΙΚΗ ΜΟΝΑΔΑ (1/6) 25
ΑΡΙΘΜΗΤΙΚΗ ΚΑΙ ΛΟΓΙΚΗ ΜΟΝΑΔΑ (2/6) 26
ΑΡΙΘΜΗΤΙΚΗ ΚΑΙ ΛΟΓΙΚΗ ΜΟΝΑΔΑ (3/6) 1 -------- COMPONENT arith_unit: -------------------- 4 USE ieee.std_logic_unsigned.all; 6 ENTITY arith_unit IS 7 PORT ( a, b: IN STD_LOGIC_VECTOR (7 DOWNTO 0); 8 sel: IN STD_LOGIC_VECTOR (2 DOWNTO 0); 9 cin: IN STD_LOGIC; 10 x: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); 11 END arith_unit; 12 ----------------------------------------- 13 ARCHITECTURE arith_unit OF arith_unit IS 14 BEGIN 15 WITH sel SELECT 16 x <= a WHEN "000", 17 a+1 WHEN "001", 18 a-1 WHEN "010", 19 b WHEN "011", 20 b+1 WHEN "100", 21 b-1 WHEN "101", 22 a+b WHEN "110", 23 a+b+cin WHEN OTHERS; 24 END arith_unit; 27
ΑΡΙΘΜΗΤΙΚΗ ΚΑΙ ΛΟΓΙΚΗ ΜΟΝΑΔΑ (4/6) 1 -------- COMPONENT logic_unit: -------------------- 4 ENTITY logic_unit IS 5 PORT ( a, b: IN STD_LOGIC_VECTOR (7 DOWNTO 0); 6 sel: IN STD_LOGIC_VECTOR (2 DOWNTO 0); 7 x: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); 8 END logic_unit; 9 ----------------------------------------- 10 ARCHITECTURE logic_unit OF logic_unit IS 11 BEGIN 12 WITH sel SELECT 13 x <= NOT a WHEN "000", 14 NOT b WHEN "001", 15 a AND b WHEN "010", 16 a OR b WHEN "011", 17 a NAND b WHEN "100", 18 a NOR b WHEN "101", 19 a XOR b WHEN "110", 20 NOT (a XOR b) WHEN OTHERS; 21 END logic_unit; 28
ΑΡΙΘΜΗΤΙΚΗ ΚΑΙ ΛΟΓΙΚΗ ΜΟΝΑΔΑ (5/6) 1 -------- COMPONENT mux: --------------------------- 4 ENTITY mux IS 5 PORT ( a, b: IN STD_LOGIC_VECTOR (7 DOWNTO 0); 6 sel: IN STD_LOGIC; 7 x: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); 8 END mux; 9 ----------------------------------------- 10 ARCHITECTURE mux OF mux IS 11 BEGIN 12 WITH sel SELECT 13 x <= a WHEN '0', 14 b WHEN OTHERS; 15 END mux; 29
ΑΡΙΘΜΗΤΙΚΗ ΚΑΙ ΛΟΓΙΚΗ ΜΟΝΑΔΑ 1 -------- Project ALU (main code): ----------------- 4 ENTITY alu IS 5 PORT ( a, b: IN STD_LOGIC_VECTOR(7 DOWNTO 0); 6 cin: IN STD_LOGIC; 7 sel: IN STD_LOGIC_VECTOR(3 DOWNTO 0); 8 y: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); 9 END alu; 10 ----------------------------------------- 11 ARCHITECTURE alu OF alu IS 12 ----------------------- 13 COMPONENT arith_unit IS 14 PORT ( a, b: IN STD_LOGIC_VECTOR(7 DOWNTO 0); 15 cin: IN STD_LOGIC; 16 sel: IN STD_LOGIC_VECTOR(2 DOWNTO 0); 17 x: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); 18 END COMPONENT; 19 ----------------------- (6/6) 20 COMPONENT logic_unit IS 21 PORT ( a, b: IN STD_LOGIC_VECTOR(7 DOWNTO 0); 22 sel: IN STD_LOGIC_VECTOR(2 DOWNTO 0); 23 x: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); 24 END COMPONENT; 25 ----------------------- 26 COMPONENT mux IS 27 PORT ( a, b: IN STD_LOGIC_VECTOR(7 DOWNTO 0); 28 sel: IN STD_LOGIC; 29 x: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); 30 END COMPONENT; 31 ----------------------- 32 SIGNAL x1, x2: STD_LOGIC_VECTOR(7 DOWNTO 0); 33 ----------------------- 34 BEGIN 35 U1: arith_unit PORT MAP (a, b, cin, sel(2 DOWNTO 0), x1); 36 U2: logic_unit PORT MAP (a, b, sel(2 DOWNTO 0), x2); 37 U3: mux PORT MAP (x1, x2, sel(3), y); 38 END alu; 30
ΠΡΟΣΟΜΟΙΩΣΗ 31
Απορίες???? 32