VHDL για Σχεδιασµό Συνδυαστικών και Ακολουθιακών Ψηφιακών Κυκλωµάτων Διδάσκουσα: Μαρία Κ. Μιχαήλ Πανεπιστήµιο Κύπρου Τµήµα Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών VHDL (Very high speed integrated circuits Hardware Description Language) n Γλώσσα προγραµµατισµού για την περιγραφή και προσοµοίωση υλικού (λογικών σχεδιασµών). n Επιχορηγήθηκε από ΙEEE και DoD (Department of Defense των ΗΠΑ) στις αρχές του 80. n Βασικά χαρακτηριστικά: n Ιεραρχικός σχεδιασµός n Περιγραφή Διασυνδέσεων και Συµπεριφοράς µε ακρίβεια (και ξεχωριστά) n Περιγραφή συµπεριφοράς: αλγοριθµικά ή µε δοµικό (structural) τρόπο n Μοντελοποίηση Χρονισµού (Timing) και Ταυτοχρονισµού (Concurrency) à Σχεδιασµοί µπορούν να προσοµοιωθούν µε ακρίβεια 30/01/15 MKM - 2 1
Μοντελοποίηση n Μια πλήρης περιγραφή ενός στοιχείου (component) µε VHDL απαιτεί: n Entity (Οντότητα) : καθορίζει τις διασυνδέσεις (interface) ενός στοιχείου (όνοµα, εισόδους, εξόδους). n Architecture (Αρχιτεκτονική): καθορίζει την λειτουργία/συµπεριφορά (function) ενός στοιχείου. n Σε κάθε στοιχείο αντιστοιχεί ένα µόνο entity και τουλάχιστον ένα architecture (πολλαπλά architecture είναι δυνατά). 30/01/15 MKM - 3 Απλό παράδειγµα: Entity entity My_Component is -- My_Component : όνοµα port (X,Y: in BIT; -- προδιαγραφές διασυνδέσεων Z: out BIT); end My_Component; Εντολή port καθορίζει εισόδους και εξόδους Σχόλια (comments) Y Λέξεις κλειδιά VHDL (keywords) Αναγνωριστικό (identifier) Λειτουργία θύρας (port mode) Τύπος δεδοµένων (data type) X My_Component Z 30/01/15 MKM - 4 2
Απλό παράδειγµα:αρχιτεκτονική entity My_Component is -- My_Component : όνοµα Port (X,Y: in BIT; -- προδιαγραφές διασυνδέσεων Z: out BIT); end My_Component; Architecture My_Component_Arch of My_Component is Z <= 1 when X= 1 and Y= 0 else 0 ; end My_Component_Arch; Σχόλια (comments) Λέξεις κλειδιά VHDL (keywords) Αναγνωριστικό (identifier) Λειτουργία θύρας (port mode) Τύπος δεδοµένων (data type) Αντίστοιχη οντότητα (entity) Z = X Y 30/01/15 MKM - 5 Άλλο Παράδειγµα: πύλη AND entity My_AND is Port (X,Y: in BIT; Z: out BIT); end My_END; -- My_AND : όνοµα -- προδιαγραφές διασυνδέσεων Architecture My_AND_Arch of My_AND is Z <= 1 when X= 1 and Y= 1 else 0 ; end My_AND_Arch; Σχόλια (comments) Λέξεις κλειδιά VHDL (keywords) Αναγνωριστικό (identifier) Λειτουργία θύρας (port mode) Τύπος δεδοµένων (data type) Z = X Y 30/01/15 MKM - 6 3
Στοιχεία γλώσσας VHDL n Σχόλια (Comments) n ξεκινούν µε --, ισχύουν µέχρι το τέλος της γραµµής n Δεσµευµένες Λέξεις (Keywords) n π.χ. entity, port, is, in, out, end, architecture,, end, when, else, n Αναγνωριστικά (Identifiers) n Μεταβλητές, ονόµατα στοιχείων, κτλ 30/01/15 MKM - 7 Αναγνωριστικά (Identifiers) n Μπορούν να περιέχουν A-Z, a-z, 0-9, _ n Πρέπει να ξεκινούν µε γράµµα n Δεν µπορούν να τελειώσουν µε _ n Δεν µπορούν να περιέχουν 2 συνεχόµενες _ n Η VHDL είναι case-insensitive n Sel, sel και SEL αναφέρονται στο ίδιο αντικείµενο 30/01/15 MKM - 8 4
Παραδείγµατα Αναγνωριστικών n A2G n έγκυρο n 8bit_counter n άκυρο ξεκινά µε αριθµό n _NewValue n άκυρο ξεκινά µε _ n first# n άκυρο περιέχει µη-αποδεκτό χαρακτήρα 30/01/15 MKM - 9 VHDL Αντικείµενα Δεδοµένων (Data Objects) n Σταθερές (Constants) n Μεταβλητές (Variables) n Σήµατα (Signals) n Αρχεία (Files*) * Δεν υποστηρίζονται από εργαλεία σύνθεσης 30/01/15 MKM - 10 5
Χαρακτήρες και Συµβολοσειρές n Χαρακτήρες (Characters) n A, 0, 1, $, x, * n Συµβολοσειρές (Strings) n string of characters n 00101101 n 0X110ZZ1 n Δυαδικές (Bit) Συµβολοσειρές n B 011111010110 n O 3726 n X 7D6 30/01/15 MKM - 11 n Scalar VHDL Τύποι Δεδοµένων (Data Types) n Integers n Enumerated n Reals (floating point)* n Composite (σύνθετοι) n Arrays (πίνακες/διατάξεις) n Records n Access (pointers -- δείκτες)* * Δεν υποστηρίζονται από εργαλεία σύνθεσης 30/01/15 MKM - 12 6
Τύποι Δεδοµένων Scalar: Integer n Μικρότερο εύρος για κάθε υλοποίηση, όπως καθορίζεται από σχετικό πρότυπο: - 2,147,483,647 + 2,147,483,647 n Παράδειγµα: αναθέσεις σε µεταβλητή τύπου integer : ARCHITECTURE test_int OF test IS BEGIN PROCESS (X) VARIABLE a: INTEGER; BEGIN a := 1; -- OK a := -1; -- OK a := 1.0; -- άκυρο END PROCESS; END test_int; 30/01/15 MKM - 13 Τύποι Δεδοµένων Scalar: Integer (συν.) n Μπορούµε επίσης να ορίσουµε integers µε µικρότερο εύρος (sub-ranges) n Παραδείγµατα: type CountValue is range 0 to 15; type Twenties is range 20 to 29; type Thirties is range 39 downto 30; 30/01/15 MKM - 14 7
Τύποι Δεδοµένων Scalar: Enumerated n Ο χρήστης ορίζει τη λίστα πιθανών τιµών n Παράδειγµα: TYPE binary IS ( ON, OFF );... κάποιες εντολές... ARCHITECTURE test_enum OF test IS BEGIN PROCESS (X) VARIABLE a: binary; BEGIN a := ON; -- OK... επιπρόσθετες εντολές... a := OFF; -- OK... επιπρόσθετες εντολές... END PROCESS; END test_enum; 30/01/15 MKM - 15 Τύποι Δεδοµένων Scalar: Enumerated à Boolean type boolean is (false, true);... κάποιες εντολές... variable A,B,C: boolean;... κάποιες εντολές... C := not A C := A and B C := A or B C := A nand B C := A nor B C := A xor B C := A xnor B aντικείµενο (object) VHDL Τελεστής ανάθεσης για µεταβλητές 30/01/15 MKM - 16 8
Τύποι Δεδοµένων Scalar: Enumerated à Bit type bit is ( 0, 1 );... κάποιες εντολές... signal x,y,z: bit;... κάποιες εντολές... x <= 0 ; y <= 1 ; z <= x and y; aντικείµενο (object) VHDL Τελεστής ανάθεσης για σήµατα 30/01/15 MKM - 17 Τύποι Δεδοµένων Scalar: Enumerated à Standard Logic type std_logic is ( U, -- Uninitialized (µη-αρχικοποιηµένο) X -- Unknown (άγνωστο) 0 -- Zero (µηδέν) 1 ); -- One (ένα) n std_logic είναι µέρος του πακέτου ieee n Πακέτα (Packages): ήδη-µεταγλωττισµένος κώδικας VHDL που αποθηκεύεται σε βασικό κατάλογο (library) library IEEE; use IEEE.std_logic_1164.all; Πρέπει να περιλαµβάνεται στο κώδικά σας, πριν τη δήλωση τύπων δεδοµένων std_logic 30/01/15 MKM - 18 9
Σύνθετοι Τύποι Δεδοµένων (Composite Data Types) n Array (Πίνακες/Διατάξεις): n Χρησιµοποιείται για οµαδοποίηση δεδοµένων του ιδίου τύπου σε ένα ενιαίο αντικείµενο VHDL n Το εύρος µπορεί να είναι ακαθόριστο (=απεριόριστο) στη δήλωση (declaration) à καθορίζεται µόλις ο πίνακας χρησιµοποιηθεί n Παράδειγµα: δήλωση πίνακα µίας-διάστασης (one-dimensional array (vector)) TYPE data_bus IS ARRAY(0 TO 31) OF BIT; VARIABLE X : data_bus; VARIABLE Y : BIT; 0... δείκτες 31 στοιχείων......τιμές στοιχείων πίνακα... 0 1 Y := X(12); -- το Y παίρνει την τιµή του στοιχείου µε δείκτη 12 του Χ 30/01/15 MKM - 19 Αρχιτεκτονική VHDL architecture name_arch of name is Signal assignments Ταυτόχρονες εντολές (concurrent statements) Process 1 Ταυτόχρονες εντολές (concurrent statements) Process 2 Ταυτόχρονες εντολές (concurrent statements) end name_arch; Το κάθε process περιέχει ακολουθιακές εντολές (sequential statements), αλλά όλα τα processes εκτελούνται ταυτόχρονα 30/01/15 MKM - 20 10
VHDL Process P1: process (<sensitivity list>) <variable declarations> <sequential statements> end process P1; Μέσα σε ένα process: Ανάθεση µεταβλητών (variables) Προαιρετική σήµανση µε := και άµεση ενηµέρωση. Ανάθεση σηµάτων (signals) µε <= και η ενηµέρωση γίνετε στο τέλος του process. 30/01/15 MKM - 21 Αρχιτεκτονική VHDL (συν.) n Στο κάθε entity (µοναδικό ανά στοιχείο) αντιστοιχεί τουλάχιστον µια περιγραφή αρχιτεκτονικής (architecture) n Υπάρχουν 3 τρόποι περιγραφής της αρχιτεκτονικής: n Structural (Δοµική): λεπτοµερής περιγραφή σε επίπεδο πυλών/βασικών στοιχείων n Data Flow (Ροή Δεδοµένων): περιγραφή βάση του τρόπου µεταφοράς δεδοµένων µεταξύ των στοιχείων/σηµάτων n Behavioral (Συµπεριφορά): αλγοριθµική περιγραφή υψηλό επίπεδο χωρίς λεπτοµέρειες n Θα δούµε διάφορα παραδείγµατα 30/01/15 MKM - 22 11
2-to-4 DEC σε VHDL: Διάγραµµα σε επίπεδο πυλών 30/01/15 MKM - 23 2-to-4 DEC σε VHDL: Δήλωση Οντότητας (Entity Declaration) -- 2-to-4 Line Decoder: Structural VHDL Description library ieee, lcdf_vhdl; use ieee.std_logic_1164.all, lcdf_vhdl.func_prims.all; entity decoder_2_to_4 is Είσοδοι & Έξοδοι port(e_n, A0, A1: in std_logic; D0_n, D1_n, D2_n, D3_n: out std_logic); end decoder_2_to_4; Εισαγόµενος κώδικας από βιβλιοθήκες 30/01/15 MKM - 24 12
2-to-4 DEC σε VHDL: Αρχιτεκτονική Δοµική Περιγραφή (Structural) architecture structural_1 of decoder_2_to_4 is component NOT1 port(in1: in std_logic; out1: out std_logic); end component; component NAND3 port(in1, in2, in3: in std_logic; out1: out std_logic); end component; Δήλωση απαραίτητων component (διαθέσιµα από τις βιβλιοθήκες) 30/01/15 MKM - 25 2-to-4 DEC σε VHDL: Αρχιτεκτονική Δοµική Περιγραφή (Structural) (συν.) signal E, A0_n, A1_n: std_logic; Τοπικά σήµατα g0: NOT1 port map (in1 => A0, out1 => A0_n); g1: NOT1 port map (in1 => A1, out1 => A1_n); g2: NOT1 port map (in1 => E_n, out1 => E); g2: NAND3 port map (in1 => A0_n, in2 => A1_n, in3 => E, out1 => D0); g3: NAND3 port map (in1 => A0, in2 => A1_n, in3 => E, out1 => D1); g4: NAND3 port map (in1 => A0_n, in2 => A1, in3 => E, out1 => D2); g5: NAND3 port map (in1 => A0, in2 => A1, in3 => E, out1 => D3); end structural_1; 30/01/15 MKM - 26 13
2-to-4 DEC σε VHDL: Αρχιτεκτονική Περιγραφή Ροής Δεδοµένων (Dataflow) architecture dataflow_1 of decoder_2_to_4 is signal A0_n, A1_n: std_logic; A0_n <= not A0; A1_n <= not A1; E_n <= not E; D0_n <= not (A0_n and A1_n and E); D1_n <= not (A0 and A1_n and E); D2_n <= not (A0_n and A1 and E); D3_n <= not (A0 and A1 and E); end dataflow_1; 30/01/15 MKM - 27 Άλλο Παράδειγµα: n-bit 4-σε-1 MUX a(n-1:0) b(n-1 :0) c(n-1 :0) d(n-1 :0) n n n n n-bit 4-σε-1 MUX n y(n-1 :0) Sel y 00 a 01 b 10 c 11 d 2 Sel(1:0) 30/01/15 MKM - 28 14
n-bit 4-σε-1 MUX: Δήλωση Οντότητας (Entity declaration) library IEEE; use IEEE.std_logic_1164.all; entity mux4g is generic(width:positive); port ( a: in STD_LOGIC_VECTOR (width-1 downto 0); b: in STD_LOGIC_VECTOR (width-1 downto 0); c: in STD_LOGIC_VECTOR (width-1 downto 0); d: in STD_LOGIC_VECTOR (width-1 downto 0); sel: in STD_LOGIC_VECTOR (1 downto 0); y: out STD_LOGIC_VECTOR (width-1 downto 0) ); end mux4g; 30/01/15 MKM - 29 n-bit 4-σε-1 MUX: Αρχιτεκτονική: Περιγραφή Ροής Δεδοµένων µε χρήση εντολής CASE architecture mux4g_arch of mux4g is process (sel, a, b, c, d) case sel is when "00" => y <= a; when "01" => y <= b; when "10" => y <= c; when others => y <= d; end case; end process; end mux4g_arch; Sel y 00 a 01 b 10 c 11 d Η εντολή CASE πρέπει να περιέχει ΟΛΕΣ τις πιθανότητες τιµών. 30/01/15 MKM - 30 15
Παράδειγµα απλής συνδυαστικής συνάρτησης: Περιγραφή Ροής Δεδοµένων library ieee; use ieee.std_logic_1164.all; entity func2 is port (x1,x2,x3: in std_logic; f: out std_logic ); end func2; architecture dataflow of func2 is f <= (not x1 and not x2 and x3) or (x1 and not x2 and not x3) or (x1 and not x2 and x3) or (x1 and x2 and not x3); end logicfunc; 30/01/15 MKM - 31 Ηµιαθροιστής n Πρόβληµα: Σχεδιάστε ένα ηµιαθροιστή 1-bit µε κρατούµενο (carry) και σήµα ενεργοποίησης (enable). n Προδιαγραφές n Είσοδοι και έξοδοι είναι 1-bit n Όταν το enable είναι 1, το αποτέλεσµα είναι η πρόσθεση x+y µε carry n Έξοδοι 0 όταν το enable είναι 0 x y enable carry Ημιαθροιστής result 30/01/15 MKM - 32 16
Ηµιαθροιστής: Δήλωση Οντότητας n Η οντότητα περιγράφει τις διασυνδέσεις του component -- δηλώνονται θύρες (ports) εισόδων και εξόδων ENTITY half_adder IS PORT( x, y, enable: IN bit; carry, result: OUT bit); END half_adder; x y enable Ημιαθροιστής carry result 30/01/15 MKM - 33 Ηµιαθροιστής: Αρχιτεκτονική µε Περιγραφή Συµπεριφοράς (Behavioral) n Μπορούµε να χρησιµοποιήσουµε µια περιγραφή υψηλού επιπέδου για την συνάρτηση που υλοποιεί το κύκλωµα ARCHITECTURE half_adder_a of half_adder IS BEGIN PROCESS (x, y, enable) BEGIN IF enable = 1 THEN result <= x XOR y; carry <= x AND y; ELSE END IF; END PROCESS; END half_adder_a; Αυτό το µοντέλο µπορεί να προσοµοιωθεί έτσι ώστε να επαληθευτεί η σωστή λειτουργία του κυκλώµατος 30/01/15 MKM - 34 17
Ηµιαθροιστής: Δοµική Περιγραφή Αρχιτεκτονικής (Structural) n Εναλλακτικά, µπορούµε να χρησιµοποιήσουµε µια δοµική περιγραφή (βάση διαθέσιµων components που έχουν ήδη δηλωθεί) x y enable carry result Αυτό το µοντέλο µπορεί επίσης να προσοµοιωθεί έτσι ώστε να επαληθευτεί η σωστή λειτουργία του κυκλώµατος 30/01/15 MKM - 35 Ηµιαθροιστής: Δοµική Περιγραφή Αρχιτεκτονικής (συν.) ARCHITECTURE half_adder_c of half_adder_nty IS COMPONENT and2 PORT (in0, in1 : IN BIT; out0 : OUT BIT); END COMPONENT; COMPONENT and3 PORT (in0, in1, in2 : IN BIT; out0 : OUT BIT); END COMPONENT; COMPONENT xor2 PORT (in0, in1 : IN BIT; out0 : OUT BIT); END COMPONENT; FOR ALL : and2 USE ENTITY gate_lib.and2_nty(and2_a); FOR ALL : and3 USE ENTITY gate_lib.and3_nty(and3_a); FOR ALL : xor2 USE ENTITY gate_lib.xor2_nty(xor2_a); -- η περιγραφή συνεχίζεται στην επόµενη διαφάνεια 30/01/15 MKM - 36 18
Ηµιαθροιστής: Δοµική Περιγραφή Αρχιτεκτονικής (συν.) -- συνεχιζόµενη περιγραφή half_adder_c SIGNAL xor_res : bit; -- εσωτερικό σήµα -- τα υπόλοιπα σήµατα έχουν ήδη δηλωθεί στο entity BEGIN A0 : and2 PORT MAP (enable, xor_res, result); A1 : and3 PORT MAP (x, y, enable, carry); X0 : xor2 PORT MAP (x, y, xor_res); END half_adder_c; 30/01/15 MKM - 37 Ηµιαθροιστής: Αρχιτεκτονική µε Περιγραφή Ροής Δεδοµένων (Dataflow) n Μια τρίτη µέθοδος περιγραφής της αρχιτεκτονικής ενός component χρησιµοποιεί λογικές εξισώσεις για να αναπτύξει µια περιγραφή ροής δεδοµένων ARCHITECTURE half_adder_b of half_adder_nty IS BEGIN carry <= enable AND (x AND y); result <= enable AND (x XOR y); END half_adder_b; Ξανά, το µοντέλο αυτό µπορεί να προσοµοιωθεί σε αυτό το επίπεδο για να επιβεβαιωθούν οι λογικές εξισώσεις. 30/01/15 MKM - 38 19
Παράδειγµα Αθροιστή 4ων-bit: Δήλωση Οντότητας -- Αθροιστής 4ων-bit library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity adder_4_b is port(b, A : in std_logic_vector(3 downto 0); C0 : in std_logic; S : out std_logic_vector(3 downto 0); C4 : out std_logic); end adder_4_b; 30/01/15 MKM - 39 Αθροιστής 4ων-bit:Αρχιτεκτονική µε Περιγραφή Συµπεριφοράς (Behavioral) architecture behavioral of adder_4_b is signal sum : std_logic_vector(4 downto 0); sum <= ('0' & A) + ('0' & B) + ("0000" & C0); C4 <= sum(4); S <= sum(3 downto 0); end behavioral; Είναι πλήρης αθροιστής; 0A 3 A 2 A 1 A 0 0B 3 B 2 B 1 B 0 0000C 0 30/01/15 MKM - 40 20
Αθροιστής 1-bit:Αρχιτεκτονική µε Περιγραφή Ροής Δεδοµένων (Dataflow) library ieee; use ieee.std_logic_1164.all; entity fulladd is port (Cin, x, y: in std_logic; s, Cout: out std_logic); end fulladd; architecture logicfunc of fulladd is s <= x xor y xor Cin; Cout <= (x and y) or (Cin and x) or (Cin and y); end logicfunc; 30/01/15 MKM - 41 Αθροιστής 4ων-bit: Δήλωση Οντότητας library ieee; use ieee.std_logic_1164.all; entity adder4 is -- s = x+y port ( Cin: in std_logic; x3,x2,x1,x0: in std_logic; y3,y2,y1,y0: in std_logic; s3,s2,s1,s0: out std_logic; Cout: out std_logic ); end adder4; 30/01/15 MKM - 42 21
Αθροιστής 4ων-bit: Δοµική Περιγραφή Αρχιτεκτονικής (Structural) architecture structural of adder4 is signal c1,c2,c3: std_logic; component fulladd port (Cin,x,y: in std_logic; s,cout: out std_logic); end component; Ίδια σειρά όπως στη δήλωση του entity stage0: fulladd port map (Cin,x0,y0,s0,c1); stage1: fulladd port map (c1,x1,y1,s1,c2); stage2: fulladd port map (c2,x2,y2,s2,c3); Προσαρµοσµένη σειρά stage3: fulladd port map (Cin=>c3,Cout=cout,x=>x3,y=>y3,s=>s3); end structural; 30/01/15 MKM - 43 2-σε-1 MUX library ieee; use ieee.std_logic_1164.all; entity mux2to1 is port (d0,d1,s: in std_logic; y: out std_logic); end mux2to1; architecture behavioral of mux2to1 is with s select y <= d0 when 0, d1 when others; end behavioral; 30/01/15 MKM - 44 22
Αποκωδικοποιητής 2-σε-4 library ieee; use ieee.std_logic_1164.all; entity dec2to4 is port (w: in std_logic_vector(1 downto 0); e: in std_logic; y: out std_logic_vector(0 to 3)); end dec2to4; 30/01/15 MKM - 45 Αποκωδικοποιητής 2-σε-4 (συν.) architecture behavioral of dec2to4 is signal ew: std_logic_vector(2 downto 0); ew <= e & w; -- concatenation! with ew select y <= 1000 when 100, 0100 when 101, 0010 when 110, 0001 when 111, 0000 when others; end behavioral; 30/01/15 MKM - 46 23
Ακολουθιακά Κυκλώµατα n VHDL Processes n Εντολές If-Then-Else και CASE n Περιγραφή Flip-Flop µε VHDL n Περιγραφή Ακολουθιακού Κυκλώµατος (βάσει πίνακα/διαγράµµατος καταστάσεων) µε VHDL n Συγχρονισµός µεταξύ Processes 30/01/15 MKM - 47 VHDL Process n Ένα σύνολο από εντολές VHDL το οποίο «εκτελείται» όταν ένα signal (από ένα συγκεκριµένο σύνολο) αλλάζει τιµή. n Ο «κορµός» ( body ) ενός process υλοποιεί ένα σειριακό (sequential) πρόγραµµα, δηλ. οι τιµές των signals ανανεώνονται µόνο όταν ολοκληρωθεί η εκτέλεση του προγράµµατος. n Μπορεί επίσης να χρησιµοποιήσει variables, των οποίων η τιµή ανανεώνεται αµέσως. 30/01/15 MKM - 48 24
Αρχιτεκτονική VHDL architecture name_arch of name is Signal/Variable declaration Component declaration Ταυτόχρονες εντολές (concurrent statements) Process 1 Ταυτόχρονες εντολές (concurrent statements) Process 2 Ταυτόχρονες εντολές (concurrent statements) end name_arch; Το κάθε process περιέχει ακολουθιακές εντολές (sequential statements), αλλά όλα τα processes εκτελούνται ταυτόχρονα 30/01/15 MKM - 49 VHDL Process P1: process (<sensitivity list>) <variable declarations> <sequential statements> end process P1; Μέσα σε ένα process: Ανάθεση µεταβλητών (variables) Προαιρετική σήµανση µε := και άµεση ενηµέρωση. Ανάθεση σηµάτων (signals) µε <= και η ενηµέρωση γίνετε στο τέλος του process. 30/01/15 MKM - 50 25
Signals Vs Variables σε ένα Process Θεωρείστε ότι A, B, και C είναι ακέραιοι µε A=1, B=5, και C=10. A, B, C: signals A, B, C: variables process process B <= A; B := A; C <= B; C := B; end process; end process; B = 1 και C = 5 B = 1 και C = 1 ( χρησιµοποιεί την ( χρησιµοποιεί την αρχική τιµή του νέα τιµή B (=5) όταν του B (=1) όταν υπολογίζει το C ) υπολογίζει το C ) 30/01/15 MKM - 51 Εντολή If-Then-Else [if_label:] if boolean_expression then { sequential_statement; } { elsif boolean_expression then { sequential_statement; } } [ else { sequential_statement; } ] end if [ if_label ]; Σύµβαση: [ ] -- προαιρετικό { } επανάληψη δυνατή 30/01/15 MKM - 52 26
Εντολή CASE [case_label:] case expression is { when choice => { sequential statement; } } [ when others => { sequential statement; } ] end case [case_label]; 30/01/15 MKM - 53 Περιγραφή Flip-Flop µε VHDL: Θετικά Ακµοπυροδοτούµενο D-FF µε Ασύγχρονη Αρχικοποίηση n Δήλωση Οντότητας: -- Positive Edge-Triggered D Flip-Flop with Reset: -- VHDL Process Description library ieee; use ieee.std_logic_1164.all; entity dff is port(clk, RESET, D: in std_logic; Q, Q_n: out std_logic); end dff; RESET D dff Q Q_n CLK 30/01/15 MKM - 54 27
Περιγραφή Flip-Flop µε VHDL: Θετικά Ακµοπυροδοτούµενο D-FF µε Ασύγχρονη Αρχικοποίηση n Αρχιτεκτονική: architecture pet_pr of dff is -- Implements positive edge-triggered bit state storage -- with asynchronous reset. signal state: std_logic; Q <= state; Q_n <= not state; process (CLK, RESET) if (RESET = '1') then state <= '0'; else Καθορίζει τον τύπο πυροδότησης του FF RESET if (CLK'event and CLK = '1') then state <= D; end if; CLK end if; end process; Q(t+1) = D(t).RESET end pet_pr; 30/01/15 MKM - 55 D dff Q Q_n Ακολουθιακό Κύκλωµα σε VHDL Ανιχνευτής Ακολουθίας n Θυµηθείτε το παράδειγµα του ανιχνευτή της ακολουθίας 0101, µε µία είσοδο (X) και µία έξοδο (Z). Διάγραµµα Καταστάσεων: 1/0 0/0 1/1 0/0 1/0 0/0 Α Β C D 1/0 0/0 30/01/15 MKM - 56 28
Ανιχνευτής Ακολουθίας σε VHDL (συν.) n Χρησιµοποιούµε 3 ξεχωριστά processes, τα οποία εκτελούνται παράλληλα. n Ο συγχρονισµός µεταξύ των διαφόρων processes επιτυγχάνεται από την αλληλοεπίδραση κοινών signals. n 3 processes: n Στοιχεία Μνήµης (storage cct) state_register n Λογική Εισόδων FFs (next state logic) next_state_func n Λογική Εξόδων (primary output logic) output_func 30/01/15 MKM - 57 Ανιχνευτής Ακολουθίας σε VHDL (συν.) n Ορίζουµε ένα scalar enumeration type για αναπαράσταση των 4 ων καταστάσεων: n type state_type is (A, B, C, D); n Ακολούθως, δηλώνουµε signals ή variables για την παρούσα και την επόµενη κατάσταση: n signal state, next_state : state_type; n state και next_state µπορούν να πάρουν µόνο την τιµή A, B, C, ή D. Προσπάθεια ανάθεσης οποιασδήποτε άλλης τιµής θα δώσει λάθος στην συµβολοµετάφραση. 30/01/15 MKM - 58 29
Δήλωση Οντότητας & Αρχιτεκτονικής -- Sequence Recognizer: VHDL Process Description library ieee; use ieee.std_logic_1164.all; entity seq_rec is port(clk, RESET, X: in std_logic; Z: out std_logic); end seq_rec; architecture process_3 of seq_rec is type state_type is (A, B, C, D); signal state, next_state : state_type; end; 30/01/15 MKM - 59 Process για Στοιχεία Μνήµης (State Register) -- Process 1 - state_register: implements positive edge-triggered -- state storage with asynchronous reset. state_register: process (CLK, RESET) if (RESET = '1') then state <= A; else if (CLK'event and ClK = '1') then state <= next_state; end if; end if; end process; n Πόσα FFs; Εξαρτάται από τον αριθµό των τιµών που µπορούν να πάρουν τα signals state & next_state! Για αυτή την περίπτωση, υπάρχουν 4 δυνατές καταστάσεις (A, B, C, D) και, εποµένως, θα χρησιµοποιηθούν 2 FFs. 30/01/15 MKM - 60 30
Process για Συναρτήσεις Επόµενης Κατάστασης (Next State Functions) -- Process 2 - next_state_function: implements -- next state as function of input X and state. next_state_func: process (X, state) case state is when A => if X = '1' then next_state <= B; else next_state <= A; end if; when B => if X = '1' then next_state <= C; else next_state <= A; end if; when C => if X = '1' then next_state <= C; else next_state <= D; end if; when D => if X = '1' then next_state <= B; else next_state <= A; end if; end case; end process; Πίνακας Καταστάσεων next_state Z state X=1 X=0 X=1 X=0 A B A 0 0 B C A 0 0 C C D 0 0 D B A 1 0 30/01/15 MKM - 61 Process για Συνάρτηση Εξόδου (Output State Function) -- Process 3 - output_function: -- implements output as function of -- input X and state. output_func: process (X, state) case state is when A => Z <= '0'; when B => Z <= '0'; when C => Z <= '0'; when D => if X = '1' then Z <= '1'; else Z <= '0'; end if; end case; end process; Υπονοεί µοντέλο Mealy Πίνακας Καταστάσεων next_state Z state X=1 X=0 X=1 X=0 A B A 0 0 B C A 0 0 C C D 0 0 D B A 1 0 30/01/15 MKM - 62 31
Συγχρονισµός µεταξύ των processes n state_register: process (CLK, RESET) n state ανανεώνεται βάσει των CLK και RESET n next_state_func: process (X, state) n next_state ανανεώνεται βάσει των X και state n output_func: process (X, state) n Z ανανεώνεται βάσει των X και state 30/01/15 MKM - 63 Συγχρονισµός (συν.) n Θεωρείστε την ακόλουθη περίπτωση: χρόνος t 0 χρόνος t 1 χρόνος t 2 state = D X=0 X=1 X=1 Z=1 next_state = A next_state =? RESET=0 Z=0 Z=? CLK=0 RESET=0 RESET=0 CLK=0 CLK=0 Χρησιµοποιεί τις τιµές των state και X στον χρόνο t 0 για να υπολογίσει το next_state 30/01/15 MKM - 64 32
Συγχρονισµός (συν.) n Θεωρείστε την ακόλουθη περίπτωση : χρόνος t 0 χρόνος t 1 χρόνος t 2 state = D X=0 X=1 X=1 Z=1 next_state = A next_state = A RESET=0 Z=0 Z=0 CLK=0 RESET=0 RESET=0 CLK=0 CLK=0 Χρησιµοποιεί τις τιµές των state και X στον χρόνο t 0 για να υπολογίσει το next_state αφού CLK 30/01/15 MKM - 65 33