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;
|