Η δημοφιλέστερη γλώσσα Hardware 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 Γιάννης Παπαευσταθίου
Entities και Architectures Modules: Ένα entity Τουλάχιστον ένα architecture Μπορεί και διάφορα άλλα… Εntity Το module απο έξω Αrchitectures Ο κώδικας 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 ... end str; Γιάννης Παπαευσταθίου
Κάποιες διαφορές με τη Verilog Case insensitive Κάποιοι βάζουν τα δεσμευμένα keywords κεφαλαία Καλύτερα όλα μικρά Διαφορετικοί τελεστές Ανάθεση με <= ή := Ισότητα και ανισότητα με = και /= Concatenation με & Σχόλια με -- Δεν έχουμε το πρόβλημα με την ακμή του ρολογιού! Γιάννης Παπαευσταθίου
Περιεχόμενα ενός architecture architecture beh of adder is begin sum_proc: process (in0, in1) 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) if (clk’event and clk = ’1’) then q <= d; end if; end process reg; end beh; Γιάννης Παπαευσταθίου
Γιάννης Παπαευσταθίου Τύποι Οι τύποι είναι πολύ μεγάλης σημασίας στη VHDL Αυστηρότατος έλεγχος Compile time Οχι αναθέσεις μεταξύ δια-φορετικών τύπων 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; Γιάννης Παπαευσταθίου
Γιάννης Παπαευσταθίου 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; H process είναι σειριακό block Eκτελείται ξανά μόλις τελειώσει… … εκτός αν έχει sensitivity list 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; 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) if (reset = '1') then int_value <= (others => '0'); elsif (clock'event and clock = '1') then if (int_wrap = '0') then int_value <= int_value + 1; else int_value <= (others => '0'); 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 downto 0); 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’; wait for 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 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 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) 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 (!) Γιάννης Παπαευσταθίου