OpenCores
URL https://opencores.org/ocsvn/xucpu/xucpu/trunk

Subversion Repositories xucpu

[/] [xucpu/] [trunk/] [VHDL/] [FSMII/] [fsm.vhdl] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 lcdsgmtr
-- Copyright 2015, Jürgen Defurne
2
--
3
-- This file is part of the Experimental Unstable CPU System.
4
--
5
-- The Experimental Unstable CPU System Is free software: you can redistribute
6
-- it and/or modify it under the terms of the GNU Lesser General Public License
7
-- as published by the Free Software Foundation, either version 3 of the
8
-- License, or (at your option) any later version.
9
--
10
-- The Experimental Unstable CPU System is distributed in the hope that it will
11
-- be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
12
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser
13
-- General Public License for more details.
14
--
15
-- You should have received a copy of the GNU Lesser General Public License
16
-- along with Experimental Unstable CPU System. If not, see
17
-- http://www.gnu.org/licenses/lgpl.txt.
18
 
19
 
20
LIBRARY ieee;
21
USE ieee.std_logic_1164.ALL;
22
 
23
ENTITY FSM IS
24
END ENTITY FSM;
25
 
26
ARCHITECTURE Descriptive OF FSM IS
27
 
28
  TYPE fsm_state IS (S0, S1, S2, S3, S0a);
29
  TYPE direction IS (FORWARD, BACKWARD);
30
 
31
  SIGNAL state_reg : fsm_state := S0;
32
 
33
  -- Driving signals
34
  SIGNAL CLK : STD_LOGIC;
35
  SIGNAL RST : STD_LOGIC;
36
 
37
  -- Combinational signals
38
  SIGNAL T0 : STD_LOGIC;
39
  SIGNAL T1 : STD_LOGIC;
40
  SIGNAL T2 : STD_LOGIC;
41
  SIGNAL T3 : STD_LOGIC;
42
 
43
  SIGNAL F01 : STD_LOGIC;
44
  SIGNAL F12 : STD_LOGIC;
45
  SIGNAL F23 : STD_LOGIC;
46
 
47
  SIGNAL B32 : STD_LOGIC;
48
  SIGNAL B21 : STD_LOGIC;
49
  SIGNAL B10 : STD_LOGIC;
50
 
51
  SIGNAL LS0 : STD_LOGIC;
52
 
53
  SIGNAL next_state : fsm_state := S0;
54
  SIGNAL flow       : direction := FORWARD;
55
  SIGNAL flow_in    : direction := FORWARD;
56
 
57
BEGIN  -- ARCHITECTURE Descriptive
58
 
59
  -- Driving signals for simulation
60
  C1 : PROCESS IS
61
  BEGIN  -- PROCESS C1
62
    CLK <= '0';
63
    WAIT FOR 100 NS;
64
    CLK <= '1';
65
    WAIT FOR 100 NS;
66
  END PROCESS C1;
67
 
68
  R1 : PROCESS IS
69
  BEGIN  -- PROCESS R1
70
    RST <= '0';
71
    WAIT FOR 30 NS;
72
    RST <= '1';
73
    WAIT FOR 600 NS;
74
    RST <= '0';
75
    WAIT;
76
  END PROCESS R1;
77
 
78
  -- Sequential part of FSM
79
  SEQ : PROCESS (clk, rst) IS
80
  BEGIN  -- PROCESS SEQ
81
    IF rising_edge(CLK) THEN            -- rising clock edge
82
      IF RST = '1' THEN
83
        state_reg <= S0;
84
        flow      <= FORWARD;
85
      ELSE
86
        state_reg <= next_state;
87
 
88
        IF flow = FORWARD AND flow_in = FORWARD THEN
89
          flow <= FORWARD;
90
        ELSE
91
          flow <= BACKWARD;
92
        END IF;
93
 
94
      END IF;
95
    END IF;
96
  END PROCESS SEQ;
97
 
98
  -- Combinational part of the FSM
99
  PROCESS (state_reg, flow, next_state) IS
100
  BEGIN  -- PROCESS
101
 
102
    T0 <= '0';
103
    T1 <= '0';
104
    T2 <= '0';
105
    T3 <= '0';
106
 
107
    F01 <= '0';
108
    F12 <= '0';
109
    F23 <= '0';
110
 
111
    B32 <= '0';
112
    B21 <= '0';
113
    B10 <= '0';
114
 
115
    LS0 <= '0';
116
 
117
    CASE state_reg IS
118
      WHEN S0 =>
119
        T0 <= '1';
120
 
121
        IF flow = FORWARD THEN
122
          next_state <= S1;
123
        ELSE
124
          next_state <= S0;
125
        END IF;
126
 
127
        IF state_reg = S0 AND next_state = S1 THEN
128
          F01 <= '1';
129
        END IF;
130
 
131
      WHEN S0a =>
132
        T0 <= '1';
133
        next_state <= S0;
134
        LS0 <= '1';
135
 
136
      WHEN S1 =>
137
        T1 <= '1';
138
 
139
        IF flow = FORWARD THEN
140
          next_state <= S2;
141
        ELSE
142
          next_state <= S0a;
143
        END IF;
144
 
145
        IF state_reg = S1 AND next_state = S2 THEN
146
          F12 <= '1';
147
        ELSIF state_reg = S1 AND next_state = S0a THEN
148
          B10 <= '1';
149
        END IF;
150
 
151
      WHEN S2 =>
152
        T2 <= '1';
153
 
154
        IF flow = FORWARD THEN
155
          next_state <= S3;
156
        ELSE
157
          next_state <= S1;
158
        END IF;
159
 
160
        IF state_reg = S2 AND next_state = S3 THEN
161
          F23 <= '1';
162
        ELSIF state_reg = S2 AND next_state = S1 THEN
163
          B21 <= '1';
164
        END IF;
165
 
166
      WHEN S3 =>
167
        T3         <= '1';
168
        next_state <= S2;
169
 
170
        IF flow = FORWARD THEN
171
          flow_in <= BACKWARD;
172
        END IF;
173
 
174
        IF state_reg = S3 AND next_state = S2 THEN
175
          B32 <= '1';
176
        END IF;
177
    END CASE;
178
  END PROCESS;
179
 
180
END ARCHITECTURE Descriptive;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.