1 / 25

VHDL Tutorial

VHDL Tutorial. Η δημοφιλέστερη γλώσσα Hardware. Και γιατί όχι Verilog;. VHDL μάλλον πιο δύσκολη αλλά… πιο αυστηρή πιο περιγραφική πολύ περισσότερες δυνατότητες «You will grow to like it!» Όχι για χαμηλά επίπεδα.

urania
Download Presentation

VHDL Tutorial

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. VHDL Tutorial Η δημοφιλέστερη γλώσσα Hardware

  2. Και γιατί όχι 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; Γιάννης Παπαευσταθίου

  3. 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 • Ο κώδικας Γιάννης Παπαευσταθίου

  4. Κάποιες διαφορές με τη Verilog • Case insensitive • Κάποιοι βάζουν τα δεσμευμένα keywords κεφαλαία • Καλύτερα όλα μικρά • Διαφορετικοί τελεστές • Ανάθεση με <= ή := • Ισότητα και ανισότητα με = και /= • Concatenation με & • Σχόλια με -- • Δεν έχουμε το πρόβλημα με την ακμή του ρολογιού! Γιάννης Παπαευσταθίου

  5. Περιεχόμενα ενός 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) Γιάννης Παπαευσταθίου

  6. ! Περιεχόμενα ενός 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; Γιάννης Παπαευσταθίου

  7. Πού πήγαν οι καταχωρητές μου; • Συνδυαστικά και ακολουθιακάσή-ματα είναι ίδια • 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; Γιάννης Παπαευσταθίου

  8. Τύποι 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 • Οχι αναθέσεις μεταξύ δια-φορετικών τύπων Γιάννης Παπαευσταθίου

  9. 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; Γιάννης Παπαευσταθίου

  10. 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 Γιάννης Παπαευσταθίου

  11. Τύποι για 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); Γιάννης Παπαευσταθίου

  12. Πράξεις • Στη 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” και πράξεις μεταξύ τους Γιάννης Παπαευσταθίου

  13. 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 Γιάννης Παπαευσταθίου

  14. Πότε τρέχει μια 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; Γιάννης Παπαευσταθίου

  15. Μετρητής 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; Γιάννης Παπαευσταθίου

  16. Μετρητής 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; Γιάννης Παπαευσταθίου

  17. Μετρητής 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 Γιάννης Παπαευσταθίου

  18. Μετρητής 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; Γιάννης Παπαευσταθίου

  19. Βοήθεια! Δεν υπάρχει 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 Γιάννης Παπαευσταθίου

  20. Γιατί δουλεύουν σωστά τα signals; • Η τιμή ενός signal ανανεώνεται στο τέλος της συγκεκριμένης χρονικής στιγμής • Όποιος διαβάζει την τιμή του signal εκείνη τη στιγμή βλέπει την παλιά τιμή signal a, b : std_logic; ... a <= ’0’; ... a <= ’1’; b <= a; Γιάννης Παπαευσταθίου

  21. Delta cycles • Ο χρόνος στη VHDL εσωτερικά οργανώνεταιμε delta cycles • Όταν γίνεται αλλαγή τιμής σε signal, προ-γραμματίζεται για το επόμενο delta cycle • O χρόνος προχωράει κατά ένα delta cycle όταν όλοι όσοι διαβάζουν τιμές σε αυτό το χρονικό διάστημα τελειώσουν Γιάννης Παπαευσταθίου

  22. 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 δεν χρειάζεται δήλωση Γιάννης Παπαευσταθίου

  23. Case • To γνωστό μας case • Μόνο μέσα σε process • Υποχρεωτικά default clause ή εξαντλητικό case • Προσοχή! • Ο τύπος std_logic δεν έχει μόνο 0 και 1... case (opcode) is when “000011” => ... when “110000” => ... when others => ... end case; Γιάννης Παπαευσταθίου

  24. 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 κωδικοποίηση των καταστάσεων γίνεται αυτόματα Γιάννης Παπαευσταθίου

  25. Τεράστιες δυνατότητες • Η VHDL κάνει σχεδόν τα πάντα! • Το tutorial είναι μόνο εισαγωγικό: • χειρισμός strings • files, text & binary I/O • generics • custom types, records, arrays • custom measurement units • functions, procedures • pointers (!) Γιάννης Παπαευσταθίου

More Related