Εργαστήριο Οργάνωσης Η/Υ Δαδαλιάρης Αντώνιος dadaliaris@uth.gr
Χρησιμοποιούμε τις μηχανές πεπερασμένων καταστάσεων (finite state machines FSMs) για την μοντελοποίηση της συμπεριφοράς ενός κυκλώματος, η οποία καθορίζεται από έναν αριθμό πεπερασμένων καταστάσεων, ένα σύνολο συμβάντων εισόδου και μια σειρά μεταβάσεων μεταξύ των παραπάνω καταστάσεων. Η υλοποίηση σε hardware μιας FSM απαιτεί έναν καταχωρητή για την αποθήκευση των καταστάσεων, ένα block συνδυαστικής λογικής το οποίο καθορίζει την μετάβαση μεταξύ των καταστάσεων και ένα block συνδυαστικής λογικής το οποίο καθορίζει την έξοδο της μηχανής.
Mealy: Οι έξοδοι είναι συνάρτηση και της κατάστασης και των εισόδων (οι έξοδοι εξαρτώνται από την κατάσταση στην οποία βρίσκεται η μηχανή και από την τιμή της εισόδου). Moore: Οι έξοδοι είναι συνάρτηση μόνο της κατάστασης (οι έξοδοι εξαρτώνται μόνο από την κατάσταση στην οποία βρίσκεται η μηχανή).
1. Περιγραφή / ορισμός της λειτουργίας του κυκλώματος (functional specification). 2. Διάγραμμα μετάβασης καταστάσεων (state transition diagram). 3. Πίνακας καταστάσεων (state transition table). 4. Κωδικοποίηση καταστάσεων (state encoding). 5. Εξαγωγή λογικών συναρτήσεων. 6. Διάγραμμα κυκλώματος.
ENTITY moore IS PORT( tin: IN std_logic; clk: IN std_logic; areset: IN std_logic; tout: OUT std_logic_vector(3 downto 0) ); END moore; ARCHITECTURE arch OF moore IS -- state declaration (define a type for state and a signal of that type TYPE state_type IS (s0, s1, s2, s3); SIGNAL state: state_type; -- clocked process PROCESS(clk, areset) IF areset = '1' THEN state = s0; ELSIF (clk'event AND clk = '1') THEN CASE state IS WHEN s0 => IF tin = '1' THEN state <= s1; WHEN s1 => IF tin = '0' THEN state <= s2; WHEN s2=> IF tin = '1' THEN state<=s3; WHEN s3=> IF tin = '0' THEN state<=s4; END CASE; --combinational process PROCESS(state) CASE state IS WHEN s0=> res<="0000"; WHEN s1=> res<="1001"; WHEN s2=> res<="1100"; WHEN s3=> res<="1111"; END CASE; END arch;
ENTITY mealy IS PORT( clock: IN STD_LOGIC; test: IN STD_LOGIC; areset: IN STD_LOGIC; res: OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END mealy; ARCHITECTURE arch OF mealy IS -- state declaration -- define a type for states and a signal of that type TYPE state_type IS (s0, s1, s2, s3); SIGNAL state: state_type; --clocked process PROCESS(clk, areset) IF areset='1' THEN state<=s0; ELSIF(clk'EVENT AND clk='1') THEN CASE state IS WHEN s0=> IF test='1' THEN state<=s1; WHEN s1=> IF test='0' THEN state<=s2; WHEN s2=> IF test='1' THEN state<=s3; WHEN s3=> IF test='0' THEN state<=s4; END CASE; PROCESS(state, test) CASE state IS WHEN s0=> IF test='1' THEN res<="1001"; ELSE re<="0000"; WHEN s1=> IF test='0' THEN res<="1100"; ELSE res<="1001"; WHEN s2=> IF test='1' THEN res<="1111"; ELSE res<="1100"; WHEN s3=> IF test='1' THEN res<="0000"; ELSE res<="1111"; END CASE; END arc;
ENTITY MEALY IS PORT(A, CLK, RST: INSTD_LOGIC; F: OUT STD_LOGIC); END MEALY; ARCHITECTURE FSM OF MEALY IS SUBTYPE STATE_TYPE IS STD_LOGIC_VECTOR (2 DOWNTO 0); SIGNAL STATE : STATE_TYPE; CONSTANT S0: STATE_TYPE:="001"; CONSTANT S1: STATE_TYPE:="010"; CONSTANT S2: STATE_TYPE:="100"; SIGNAL CURRENT_STATE, NEXT_STATE : STATE_TYPE; FF: PROCESS (CLK, RST) IF (RST= 1 ) THEN CURRENT_STATE <= S0 ; ELSIF (CLK EVENT AND CLK='1') THEN CURRENT_STATE<= NEXT_STATE; END IF ; LOGIC:PROCESS (A, CURRENT_STATE) CASE CURRENT_STATE IS WHEN S0 => IF (A= 0 ) THEN F <= 0 ; NEXT_STATE <= S0; ELSE F <= 0 ; NEXT_STATE <= S1; WHEN S1 => IF (A= 0 ) THEN F <= 0 ; NEXT_STATE <= S2; ELSE F<= 0 ; NEXT_STATE<=S1; WHEN S2 => IF (A= 0 ) THEN F<= 1 ; NEXT_STATE<=S0; ELSE F<= 0 ; NEXT_STATE<=S1; WHEN OTHERS => CURRENT_STATE <= S0; END CASE; END FSM;
Τα testbench είναι αρχεία VHDL τα οποία χρησιμοποιούνται κατά την προσομοίωση της σχεδίασης για τον έλεγχο της ορθότητας της λειτουργίας της. Δεν περιγράφουν κύκλωμα αλλά τον τρόπο απόδοσης τιμών στις εισόδους ενός κυκλώματος.
ARCHITECTURE behavioral OF counter IS SIGNAL c: STD_LOGIC_VECTOR(3 DOWNTO 0) :=(OTHERS => '0'); -- :="0000" count<=c; PROCESS(clk, reset) IF(clk'EVENT AND clk='1') THEN IF(reset='1') THEN c<="0000"; ELSIF(c="1111") THEN c<="0000"; ELSE c<=c+1; END behavioral;
ENTITY tb IS END tb; ARCHITECTURE behavioral OF tb IS --component declaration / copy & paste port list COMPONENT counter PORT( clk: IN STD_LOGIC; reset: IN STD_LOGIC; count: OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END COMPONENT; dut: counter PORT MAP(clk, reset, reset); PROCESS clk<='0'; WAIT FOR clk_period/2; clk<='1'; WAIT FOR clk_period/2; --declare inputs and initialize them SIGNAL clk: STD_LOGIC:= '0'; SIGNAL reset: STD_LOGIC:= '0'; --declare outputs and initialize them SIGNAL count: STD_LOGIC_VECTOR(3 DOWNTO 0); --define clock period CONSTANT clk_period: TIME:= 1 ns; --stimulus PROCESS WAIT FOR 7 ns; reset<='1'; WAIT FOR 3 ns; reset<='0'; WAIT; END behavioral;
6η Ανάθεση Υλοποιείστε ένα testbench για κάθε μία σχεδίαση από τις προηγούμενες εργασία και πραγματοποιείστε μια επιτυχημένη προσμοιώση. Υλοποιείστε και προσομοιώστε τις παρακάτω μηχανές πεπερασμένων καταστάσεων:
6η Ανάθεση
6η Ανάθεση
6η Ανάθεση