File: digi.fsm

package info (click to toggle)
alliance 5.0-20120515-6
  • links: PTS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 70,324 kB
  • ctags: 39,977
  • sloc: ansic: 350,299; vhdl: 34,227; yacc: 27,122; sh: 12,416; cpp: 9,478; makefile: 7,057; lex: 3,684
file content (154 lines) | stat: -rw-r--r-- 2,663 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
ENTITY circuit is

PORT 
( 
   ck    : in  BIT;
   jour  : in  BIT;
   reset : in  BIT; 
   vdd   : in  BIT;
   vss   : in  BIT;
   i     : in  BIT_VECTOR(3 DOWNTO 0);
   porte : out BIT;
   alarm : out BIT
);
END circuit;


ARCHITECTURE MOORE OF circuit is

   TYPE ETAT_TYPE IS (E0, E1, E2, E3, E4, E5, EA);   

   SIGNAL EF, CS : ETAT_TYPE;

   CONSTANT digit0 : BIT_VECTOR (3 DOWNTO 0) := B"1111"  ; -- O

   CONSTANT digit1 : BIT_VECTOR (3 DOWNTO 0) := B"0101"  ; -- 5
   CONSTANT digit2 : BIT_VECTOR (3 DOWNTO 0) := B"0011"  ; -- 3
   CONSTANT digit3 : BIT_VECTOR (3 DOWNTO 0) := B"1100"  ; -- A
   CONSTANT digit4 : BIT_VECTOR (3 DOWNTO 0) := B"0001"  ; -- 1
   CONSTANT digit5 : BIT_VECTOR (3 DOWNTO 0) := B"0111"  ; -- 7

--PRAGMA CURRENT_STATE CS
--PRAGMA NEXT_STATE EF
--PRAGMA CLOCK ck
--PRAGMA FIRST_STATE E0

BEGIN

PROCESS ( CS, i)
BEGIN
  IF ( reset = '1' )
  THEN
    EF    <= E0;
    porte <= '0';
    alarm <= '0';
  ELSE
  CASE CS is
    WHEN E0 =>
      porte <= '0';
      alarm <= '0';
      IF ( i = digit0 ) 
      THEN
        IF ( jour = '1' )
        THEN
          EF <= E5;
        ELSE
          EF <= EA;
        END IF;
      ELSE
        IF ( i = digit1 )
        THEN
          EF <= E1;
        ELSE
          IF ( jour = '1' )
          THEN
             EF <= E0;
          ELSE
             EF <= EA;
          END IF;
        END IF;
      END IF;

    WHEN E1 =>
      porte <= '0';
      alarm <= '0';
      IF ( i = digit2 )
      THEN
        EF <= E2;
      ELSE
        IF ( jour = '1' )
        THEN
          EF <= E0;
        ELSE
          EF <= EA;
        END IF;
      END IF;

    WHEN E2 =>
      porte <= '0';
      alarm <= '0';
      IF ( i = digit3 )
      THEN
        EF <= E3;
      ELSE
        IF ( jour = '1' )
        THEN
          EF <= E0;
        ELSE
          EF <= EA;
        END IF;
      END IF;

    WHEN E3 =>
      porte <= '0';
      alarm <= '0';
      IF ( i = digit4 )
      THEN
        EF <= E4;
      ELSE
        IF ( jour = '1' )
        THEN
          EF <= E0;
        ELSE
          EF <= EA;
        END IF;
      END IF;

    WHEN E4 =>
      porte <= '0';
      alarm <= '0';
      IF ( i = digit5 )
      THEN
        EF <= E5;
      ELSE
        IF ( jour = '1' )
        THEN
          EF <= E0;
        ELSE
          EF <= EA;
        END IF;
      END IF;

    WHEN E5 =>
      porte <= '1';
      alarm <= '0';
      EF    <= E5;

    WHEN EA =>
      porte <= '0';
      alarm <= '1';
      EF    <= EA;

  END CASE;
  END IF;
END PROCESS;

PROCESS( ck )
BEGIN
    IF ( ck = '1' AND NOT ck'STABLE )
    THEN
      CS <= EF;
    END IF;
END PROCESS;

END MOORE;