Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

VHDL Tutorial Η δημοφιλέστερη γλώσσα Hardware. VHDL TutorialΓιάννης Παπαευσταθίου2 Και γιατί όχι Verilog; VHDL μάλλον πιο δύσκολη αλλά… –πιο αυστηρή –πιο.

Παρόμοιες παρουσιάσεις


Παρουσίαση με θέμα: "VHDL Tutorial Η δημοφιλέστερη γλώσσα Hardware. VHDL TutorialΓιάννης Παπαευσταθίου2 Και γιατί όχι Verilog; VHDL μάλλον πιο δύσκολη αλλά… –πιο αυστηρή –πιο."— Μεταγράφημα παρουσίασης:

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

2 VHDL TutorialΓιάννης Παπαευσταθίου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; C: process (x, y) begin if (sel == 0) c = ~(a or b); else c = ~d; R(0) <= 1; R(1) <= 2; end R(0) <= 1; R(1) <= 2; end end b; 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; C: process (x, y) begin if (sel == 0) c = ~(a or b); else c = ~d; R(0) <= 1; R(1) <= 2; end R(0) <= 1; R(1) <= 2; end end b; if (sel == 0) c = ~(a or b); else c = ~d; clk) begin R[1] <= #`dh 1; R[2] <= #`dh 2’b0; end if (sel == 0) c = ~(a or b); else c = ~d; clk) begin R[1] <= #`dh 1; R[2] <= #`dh 2’b0; end if (sel == 0) c = ~(a or b); else c = ~d;

3 VHDL TutorialΓιάννης Παπαευσταθίου3 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 begin... end str; 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;

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

5 VHDL TutorialΓιάννης Παπαευσταθίου5 Περιεχόμενα ενός architecture Processes –Σειριακά statements Απλά statements –Concurrent Instantiations –Components (structural style) 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; 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;

6 VHDL TutorialΓιάννης Παπαευσταθίου6 Περιεχόμενα ενός architecture (2) 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; 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; entity adder is port (in0, in1 : in bit; sum, cout : out bit); end adder; 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 a... end a; entity b... end b; component c... end component; d: process... end process d; !

7 VHDL TutorialΓιάννης Παπαευσταθίου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; 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 VHDL TutorialΓιάννης Παπαευσταθίου8 Τύποι Οι τύποι είναι πολύ μεγάλης σημασίας στη 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; 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;

9 VHDL TutorialΓιάννης Παπαευσταθίου9 Packages Βασική οντότητα της γλώσσας Περιέχει δηλώσεις τύπων, συναρτήσεων,... Δήλωση των πακέτων που χρησιμοποιούμε library IEEE; use IEEE.std_logic_1164.all; library work; use work.my_package.all;... signal a: std_logic; signal state: my_fsm_type; library IEEE; use IEEE.std_logic_1164.all; library work; use work.my_package.all;... signal a: std_logic; signal state: my_fsm_type; package standard is type boolean is (false, true); type bit is (’0’, ’1’); end standard; package standard is type boolean is (false, true); type bit is (’0’, ’1’); end standard;

10 VHDL TutorialΓιάννης Παπαευσταθίου10 Buses Eιδικοί τύποι στη VHDL Χρήση των "to" και "downto" για εύρος Παρενθέσεις Kαλό είναι να ακολουθούνται οι συμβάσεις –msb το αριστερότερο bit –μεγαλύτερο το αριστερότερο bit signal data: bit_vector (7 downto 0); port ( address: in std_logic_vector (31 downto 0) ); signal data: bit_vector (7 downto 0); port ( address: in std_logic_vector (31 downto 0) );

11 VHDL TutorialΓιάννης Παπαευσταθίου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); library IEEE; use IEEE.std_logic_1164.all;... signal single: std_logic; signal bus : std_logic_vector (31 downto 0);

12 VHDL TutorialΓιάννης Παπαευσταθίου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 VHDL TutorialΓιάννης Παπαευσταθίου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 VHDL TutorialΓιάννης Παπαευσταθίου14 Πότε τρέχει μια 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 (clk, rst) begin if (rst = ’1’) then q <= ’0’; elsif (clk’event and clk = ’1’) then q <= d; end if; end process reg; run_once: process begin... wait; end process run_once; run_once: process begin... wait; end process run_once; reg: process begin... wait on clk, rst; end process reg; reg: process begin... wait on clk, rst; end process reg;

15 VHDL TutorialΓιάννης Παπαευσταθίου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; 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 VHDL TutorialΓιάννης Παπαευσταθίου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 '0'); elsif (clock'event and clock = '1') then if (int_wrap = '0') then int_value <= int_value + 1; else int_value '0'); end if; end process cnt_proc; int_wrap <= '1' when (int_value = " ") else '0'; value <= int_value; wrap <= int_wrap; end rtl; 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 '0'); elsif (clock'event and clock = '1') then if (int_wrap = '0') then int_value <= int_value + 1; else int_value '0'); end if; end process cnt_proc; int_wrap <= '1' when (int_value = " ") else '0'; value <= int_value; wrap <= int_wrap; end rtl;

17 VHDL TutorialΓιάννης Παπαευσταθίου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 downto 0); begin 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

18 VHDL TutorialΓιάννης Παπαευσταθίου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’; wait for 20 ns; reset <= ’0’; wait for 3 us; wait; end process test_proc; end beh; 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;

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

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

22 VHDL TutorialΓιάννης Παπαευσταθίου22 Variables Εσωτερικά στις processes Η τιμή ανατίθεται αμέσως! Ανάθεση με := O loop counter των for loops δεν χρειάζεται δήλωση 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; 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;

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

24 VHDL TutorialΓιάννης Παπαευσταθίου24 FSMs Oρίζουμε έναν καινούριο τύπο για την FSM H κωδικοποίηση των καταστάσεων γίνεται αυτόματα 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; 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;

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


Κατέβασμα ppt "VHDL Tutorial Η δημοφιλέστερη γλώσσα Hardware. VHDL TutorialΓιάννης Παπαευσταθίου2 Και γιατί όχι Verilog; VHDL μάλλον πιο δύσκολη αλλά… –πιο αυστηρή –πιο."

Παρόμοιες παρουσιάσεις


Διαφημίσεις Google