250 likes | 396 Views
VHDL Tutorial. Η δημοφιλέστερη γλώσσα Hardware. Και γιατί όχι Verilog;. VHDL μάλλον πιο δύσκολη αλλά… πιο αυστηρή πιο περιγραφική πολύ περισσότερες δυνατότητες «You will grow to like it!» Όχι για χαμηλά επίπεδα.
E N D
VHDL Tutorial Η δημοφιλέστερη γλώσσα Hardware
Και γιατί όχι Verilog; • VHDL μάλλον πιο δύσκολη αλλά… • πιο αυστηρή • πιο περιγραφική • πολύ περισσότερες δυνατότητες • «You will grow to like it!» • Όχι για χαμηλά επίπεδα entity a is port ( x, y: in std_logic; a, c: out std_logic );end a; architecture b of a is C: process (x, y) begin if (sel == 0) c = ~(a or b); else c = ~d; R(0) <= 1; R(1) <= 2; end end b; if (sel == 0) c = ~(a or b);else c = ~d; always @(posedge clk) begin R[1] <= #`dh 1; R[2] <= #`dh 2’b0;end if (sel == 0) c = ~(a or b);else c = ~d; Γιάννης Παπαευσταθίου
Entities και Architectures entity adder is port (in0, in1 : in bit; sum, cout : out bit); end adder; architecture rtl of adder is begin sum <= in0 and in1; cout <= in0 xor in1; end rtl; architecture str of adder is begin ... end str; • Modules: • Ένα entity • Τουλάχιστον ένα architecture • Μπορεί και διάφορα άλλα… • Εntity • Το module απο έξω • Αrchitectures • Ο κώδικας Γιάννης Παπαευσταθίου
Κάποιες διαφορές με τη Verilog • Case insensitive • Κάποιοι βάζουν τα δεσμευμένα keywords κεφαλαία • Καλύτερα όλα μικρά • Διαφορετικοί τελεστές • Ανάθεση με <= ή := • Ισότητα και ανισότητα με = και /= • Concatenation με & • Σχόλια με -- • Δεν έχουμε το πρόβλημα με την ακμή του ρολογιού! Γιάννης Παπαευσταθίου
Περιεχόμενα ενός architecture architecture beh of adder is begin sum_proc: process (in0, in1) begin if (in0=’1’ and in1=’1’) then sum <= ’1’; else sum <= ’0’; end if; end process sum_proc; cout <= in0 xor in1; end beh; • Processes • Σειριακά statements • Απλά statements • Concurrent • Instantiations • Components(structural style) Γιάννης Παπαευσταθίου
! Περιεχόμενα ενός architecture (2) entity adder is port (in0, in1 : in bit; sum, cout : out bit); end adder; architecture a ... end a; entity b ... end b; component c ... end component; d: process ... end process d; architecture str of adder is component andgate is port (a, b : in bit; c : out bit); end component; begin a0: andgate port map (a => in0, b => in1, c => sum); cout <= in0 xor in1; end str; Γιάννης Παπαευσταθίου
Πού πήγαν οι καταχωρητές μου; • Συνδυαστικά και ακολουθιακάσή-ματα είναι ίδια • Eπιλογή του compiler! • Προσέχουμε τί γράφουμε… • Όλα είναι signals (ή variables) architecture beh of reg_ld is signal q, d : bit; begin reg: process (clk) begin if (clk’event and clk = ’1’) then q <= d; end if; end process reg; end beh; Γιάννης Παπαευσταθίου
Τύποι entity fulladd is port (a, b: in bit; c, d: out character); end fulladd; architecture beh of fulladd is signal e: boolean; signal f, g: integer; type fsm_type is (idle, go); signal state: fsm_type; begin ... end beh; • Οι τύποι είναι πολύ μεγάλης σημασίας στη VHDL • Αυστηρότατος έλεγχος • Compile time • Οχι αναθέσεις μεταξύ δια-φορετικών τύπων Γιάννης Παπαευσταθίου
Packages package standard is type boolean is (false, true); type bit is (’0’, ’1’); end standard; • Βασική οντότητα της γλώσσας • Περιέχει δηλώσεις τύπων, συναρτήσεων, ... • Δήλωση των πακέτων που χρησιμοποιούμε library IEEE; use IEEE.std_logic_1164.all; library work; use work.my_package.all; ... signal a: std_logic; signal state: my_fsm_type; Γιάννης Παπαευσταθίου
Buses signal data: bit_vector (7 downto 0); port ( address: in std_logic_vector (31 downto 0) ); • Eιδικοί τύποι στη VHDL • Χρήση των "to"και "downto" για εύρος • Παρενθέσεις • Kαλό είναι να ακολουθούνται οι συμβάσεις • msb το αριστερότερο bit • μεγαλύτερο το αριστερότερο bit Γιάννης Παπαευσταθίου
Τύποι για bits και buses • Το “standard” πακέτο είναι ελλειπές • Περιέχει ορισμούς των bit και bit_vector • Για αυτά δεν ορίζει αριθμητικές πράξεις • Δεν χρησιμοποιούνται απο κανέναν! • Όλοι χρησιμοποιούν τους τύπους “std_logic” • Πακέτο της ΙΕΕΕ library IEEE; use IEEE.std_logic_1164.all; ... signal single: std_logic; signal bus : std_logic_vector (31 downto 0); Γιάννης Παπαευσταθίου
Πράξεις • Στη VHDL δεν υπάρχει τίποτα εξ’ορισμού • Για τύπους std_logic υπάρχουν 3 πακέτα: • std_logic_unsigned • Όλα τα std_logic_vector θεωρούνται unsigned • std_logic_signed • Όλα τα std_logic_vector θεωρούνται signed (2’s compl.) • std_logic_arith • Δεν ορίζονται πράξεις για τα std_logic_vector • Ορίζονται 2 καινούριοι τύποι “signed” και “unsigned” και πράξεις μεταξύ τους Γιάννης Παπαευσταθίου
std_logic • Ορίζει πράξεις • Ορίζει resolution functions • Έχει πολλές τιμές: • u : uninitialized • x : strong uknown • 0 : strong 0 • 1 : strong 1 • z : high impedance • w : weak uknown • l : weak 0 • h : weak 1 • - : don’t care Γιάννης Παπαευσταθίου
Πότε τρέχει μια process; reg: process (clk, rst) begin if (rst = ’1’) then q <= ’0’; elsif (clk’event and clk = ’1’) then q <= d; end if; end process reg; • H process είναι σειριακό block • Eκτελείται ξανά μόλις τελειώσει… • … εκτός αν έχει sensitivity list reg: process begin ... wait on clk, rst; end process reg; run_once: process begin ... wait; end process run_once; Γιάννης Παπαευσταθίου
Μετρητής 8 bits: entity library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity counter is port ( reset : in std_logic; clock : in std_logic; value : out std_logic_vector (7 downto 0); wrap : out std_logic ); end counter; Γιάννης Παπαευσταθίου
Μετρητής 8 bits: architecture architecture rtl of counter is signal int_value : std_logic_vector (7 downto 0); signal int_wrap : std_logic; begin cnt_proc: process (clock, reset) begin if (reset = '1') then int_value <= (others => '0'); elsif (clock'eventand clock = '1') then if (int_wrap = '0') then int_value <= int_value + 1; else int_value <= (others => '0'); end if; end if; end process cnt_proc; int_wrap <= '1' when (int_value = "11111111") else '0'; value <= int_value; wrap <= int_wrap; end rtl; Γιάννης Παπαευσταθίου
Μετρητής 8 bits: Test bench 1/2 library ieee; use ieee.std_logic_1164.all; entity test_counter is end test_counter; architecture beh of test_counter is component counter port ( reset : in std_logic; clock : in std_logic; value : out std_logic_vector (7 downto 0); wrap : out std_logic; ); end component; signal reset : std_logic; signal wrap : std_logic; signal clock : std_logic := ’0’; signal value : std_logic_vector (7 downto0); begin Γιάννης Παπαευσταθίου
Μετρητής 8 bits: Test bench 2/2 counter0: counter port map ( reset => reset, clock => clock, wrap => wrap, value => value); clock <= not clock after 5 ns; test_proc: process begin reset <= ’1’; waitfor 20 ns; reset <= ’0’; wait for 3 us; wait; end process test_proc; end beh; Γιάννης Παπαευσταθίου
Βοήθεια! Δεν υπάρχει VHDL-XL! • Ναι, δεν υπάρχει. • Leapfrog ή NCSim • NCSim suite: • cds.lib: “include /cadence/tools/inca/files/cds.lib” • cds.lib: “define work .” • hdl.var: “define work work” • ncvhdl counter.vhd • ncvhdl test_counter.vhd • ncelab test_counter:beh • ncsim -gui test_counter:beh Γιάννης Παπαευσταθίου
Γιατί δουλεύουν σωστά τα signals; • Η τιμή ενός signal ανανεώνεται στο τέλος της συγκεκριμένης χρονικής στιγμής • Όποιος διαβάζει την τιμή του signal εκείνη τη στιγμή βλέπει την παλιά τιμή signal a, b : std_logic; ... a <= ’0’; ... a <= ’1’; b <= a; Γιάννης Παπαευσταθίου
Delta cycles • Ο χρόνος στη VHDL εσωτερικά οργανώνεταιμε delta cycles • Όταν γίνεται αλλαγή τιμής σε signal, προ-γραμματίζεται για το επόμενο delta cycle • O χρόνος προχωράει κατά ένα delta cycle όταν όλοι όσοι διαβάζουν τιμές σε αυτό το χρονικό διάστημα τελειώσουν Γιάννης Παπαευσταθίου
Variables check: process variable fault : boolean; begin fault := false; for i in 0 to 31 loop if (data(i) = ’u’) then fault := true; end if; end loop; if (fault) then ... end if; end process check; • Εσωτερικά στις processes • Η τιμή ανατίθεται αμέσως! • Ανάθεση με := • O loop counter των for loops δεν χρειάζεται δήλωση Γιάννης Παπαευσταθίου
Case • To γνωστό μας case • Μόνο μέσα σε process • Υποχρεωτικά default clause ή εξαντλητικό case • Προσοχή! • Ο τύπος std_logic δεν έχει μόνο 0 και 1... case (opcode) is when “000011” => ... when “110000” => ... when others => ... end case; Γιάννης Παπαευσταθίου
FSMs architecture rtl of fsm is type t_state is ( idle, go, stop); signal state : t_state; begin f: process (clk, reset) begin if (reset = ’1’) then state <= idle; elsif (clk’event and clk=’1’) then case (state) is when idle => state <= go; when go => ... when stop => ... end case; end if; end process f; end rtl; • Oρίζουμε έναν καινούριο τύπο για την FSM • H κωδικοποίηση των καταστάσεων γίνεται αυτόματα Γιάννης Παπαευσταθίου
Τεράστιες δυνατότητες • Η VHDL κάνει σχεδόν τα πάντα! • Το tutorial είναι μόνο εισαγωγικό: • χειρισμός strings • files, text & binary I/O • generics • custom types, records, arrays • custom measurement units • functions, procedures • pointers (!) Γιάννης Παπαευσταθίου