Main.vhd


1
----------------------------------------------------------------------------------
2
-- Company: 
3
-- Engineer: 
4
-- 
5
-- Create Date:    15:09:29 03/28/2011 
6
-- Design Name: 
7
-- Module Name:    Main - Behavioral 
8
-- Project Name: 
9
-- Target Devices: 
10
-- Tool versions: 
11
-- Description: 
12
--
13
-- Dependencies: 
14
--
15
-- Revision: 
16
-- Revision 0.01 - File Created
17
-- Additional Comments: 
18
--
19
----------------------------------------------------------------------------------
20
library IEEE;
21
use IEEE.STD_LOGIC_1164.ALL;
22
use IEEE.STD_LOGIC_UNSIGNED.all;
23
24
-- Uncomment the following library declaration if using
25
-- arithmetic functions with Signed or Unsigned values
26
--use IEEE.NUMERIC_STD.ALL;
27
28
-- Uncomment the following library declaration if instantiating
29
-- any Xilinx primitives in this code.
30
--library UNISIM;
31
--use UNISIM.VComponents.all;
32
33
entity Main is
34
--Generic( TAKT : integer := 500;
35
--      TEILER : integer := 2);
36
port(CLK, -- Taktsignal
37
    RESET, -- Reset Signal
38
    HS1, -- Hauptstraße Sensor 1
39
    HS2, -- Hauptstraße Sensor 2
40
    NS1, -- Nebenstraße Sensor 1
41
    NS2, -- Nebenstraße Sensor 2
42
    FH,  -- Fußgänger Haupstraße
43
    FN,  -- Fußgänger Nebenstraße
44
    BLINK : in bit; -- Blinkanforderung
45
    GRH, -- Grün Hauptstraße
46
    GEH, -- Gelb Haupstraße
47
    RH,  -- Rot Hauptstraße
48
    GRN, -- Grün Nebenstraße
49
    GEN, -- Gelb Nebenstraße
50
    RN,  -- Rot Nebenstraße
51
    GFH, -- Grün Fußgänger Hauptstraße
52
    RFH, -- Rot Fußgänger Hauptstraße
53
    GFN, -- Grün Fußgänger Nebenstraße
54
    RFN : out bit;
55
    CNT_OUT : out std_logic_vector(4 downto 0);  -- Hardware Debugging Signal Sekundenzähler
56
    ANZEIGE : out bit_vector(3 downto 0)); -- Rot Fußgänger Nebenstraße
57
end Main;
58
59
architecture Behavioral of Main is
60
type ZUSTANDS_TYP is (  INIT,
61
                HS_GRUEN_NS_ROT,
62
                HS_GELB_NS_ROT, 
63
                HS_ROT_NS_ROT_GELB, 
64
                HS_ROT_NS_GRUEN, 
65
                HS_ROT_NS_GELB, 
66
                HS_ROT_GELB_NS_ROT, 
67
                DAUER_GELB, 
68
                BLINK_GELB_AN,
69
                BLINK_GELB_AUS,
70
                MODUS);
71
signal ZUSTAND, FOLGEZUSTAND               : ZUSTANDS_TYP;  
72
signal ENCLK                         : bit;  -- 2 Hz Enable Signal
73
signal BLINK_S                        : bit;  -- Einsynchronisiertes Blinkanforderungssignal
74
75
signal ANFORDERUNG_HS                  : bit;  -- Grünanforderung für die Hauptstraße
76
signal ANFORDERUNG_HS_CLEAR              : bit;  -- Grünanforderung für die Hauptstraße löschen
77
signal ANFORDERUNG_NS                  : bit;  -- Grünanforderung für die Nebenstraße
78
signal ANFORDERUNG_NS_CLEAR              : bit;  -- Grünanforderung für die Nebenstraße löschen
79
80
-- Zählersignal des Taktteilers        
81
signal CNT                           : integer range 0 to 25000000;
82
83
-- COUNTER
84
signal COUNT                        : std_logic_vector(4 downto 0);
85
86
--
87
signal COUNTER_EN                      : bit;
88
89
-- Einsynchronisierte Eingangssignale
90
signal HS1_S, HS2_S, NS1_S, NS2_S, FH_S, FN_S   : bit;
91
92
-- Ausgangsvektor für die LEDs
93
signal OUTPUT                         : bit_vector(9 downto 0);
94
95
begin
96
97
ANZEIGE <= "1110";
98
99
-- Übergangs- und Ausgangsschaltnetz
100
SN: process(ZUSTAND, ANFORDERUNG_NS, ANFORDERUNG_HS, BLINK_S)
101
begin
102
  -- Defaultzuweisungen
103
  OUTPUT           <= (others => '0') after 5 ns;
104
  FOLGEZUSTAND       <= ZUSTAND after 5 ns;
105
  ANFORDERUNG_HS_CLEAR  <= '0' after 5 ns;
106
  ANFORDERUNG_NS_CLEAR  <= '0' after 5 ns;
107
  
108
  case ZUSTAND is
109
    when INIT        => OUTPUT   <= "1111111111" after 5 ns;
110
                    COUNTER_EN  <= '1';
111
                    if COUNT = "01110" then
112
                      FOLGEZUSTAND <= MODUS;
113
                      COUNTER_EN  <= '0';
114
                    end if;
115
                    
116
    when MODUS         =>  OUTPUT   <= (others => '0') after 5 ns; 
117
                    if BLINK_S = '0' then 
118
                      FOLGEZUSTAND   <= HS_GRUEN_NS_ROT after 5 ns;
119
                    else
120
                      FOLGEZUSTAND   <= DAUER_GELB after 5 ns;
121
                    end if;
122
                    
123
    when DAUER_GELB    => OUTPUT  <= "0000010010" after 5 ns;
124
                    if BLINK_S = '1' then
125
                      COUNTER_EN  <=  '1' after 5 ns;
126
                      if COUNT = "00011" then    -- 1,5 Sekunden warten
127
                        FOLGEZUSTAND   <= BLINK_GELB_AN after 5 ns;
128
                        COUNTER_EN  <=  '0' after 5 ns;
129
                      end if;
130
                    else
131
                      COUNTER_EN  <=  '1' after 5 ns;
132
                      if COUNT = "00011" then    -- 1,5 Sekunden warten
133
                        FOLGEZUSTAND  <=  MODUS after 5 ns;
134
                        COUNTER_EN  <=  '0' after 5 ns;
135
                      end if;
136
                    end if;
137
                    
138
    when BLINK_GELB_AN  => OUTPUT  <= "0000010010" after 5 ns;
139
                    if BLINK_S = '1' then
140
                      COUNTER_EN  <=  '1' after 5 ns;
141
                      if COUNT = "00001" then    -- 0,5 Sekunden warten
142
                        FOLGEZUSTAND  <=  BLINK_GELB_AUS after 5 ns;
143
                        COUNTER_EN  <=  '0' after 5 ns;
144
                      end if;
145
                    else
146
                      FOLGEZUSTAND  <=  DAUER_GELB after 5 ns;
147
                    end if;
148
                    
149
    when BLINK_GELB_AUS  => OUTPUT  <=  "0000000000" after 5 ns;
150
                    if BLINK_S = '1' then
151
                      COUNTER_EN  <=  '1' after 5 ns;
152
                      if COUNT = "00001" then    -- 0,5 Sekunden warten
153
                        FOLGEZUSTAND    <=  BLINK_GELB_AN after 5 ns;
154
                        COUNTER_EN      <=  '0' after 5 ns;
155
                      end if;
156
                    else
157
                      FOLGEZUSTAND     <= DAUER_GELB after 5 ns;
158
                    end if;
159
                    
160
    when HS_GRUEN_NS_ROT  =>  OUTPUT <= "0110100001" after 5 ns;
161
                    if BLINK_S = '0' then
162
                      COUNTER_EN  <=  '1' after 5 ns;
163
                      if COUNT  > "01010" then    -- min. 5 Sekunden warten
164
                        if ANFORDERUNG_NS = '1' then
165
                          FOLGEZUSTAND       <=  HS_GELB_NS_ROT after 5 ns;
166
                          COUNTER_EN        <=  '0' after 5 ns;
167
                          ANFORDERUNG_NS_CLEAR  <= '1' after 5 ns;
168
                        end if;
169
                      end if;
170
                      if COUNT = "10110" then    -- 11 Sekunden warten
171
                        FOLGEZUSTAND       <=  HS_GELB_NS_ROT after 5 ns;
172
                        COUNTER_EN        <=  '0' after 5 ns;
173
                        ANFORDERUNG_NS_CLEAR  <= '1' after 5 ns;
174
                      end if;
175
                    else
176
                      FOLGEZUSTAND     <= MODUS after 5 ns;
177
                    end if;
178
    
179
    when HS_GELB_NS_ROT    => OUTPUT <= "1010100010" after 5 ns;
180
                      ANFORDERUNG_NS_CLEAR  <= '1' after 5 ns;
181
                      ANFORDERUNG_HS_CLEAR  <= '1' after 5 ns;
182
                      if BLINK_S = '0' then
183
                        COUNTER_EN  <=  '1' after 5 ns;
184
                        if COUNT = "00010" then  -- 1 Sekunde warten
185
                          FOLGEZUSTAND   <=  HS_ROT_NS_ROT_GELB after 5 ns;
186
                          COUNTER_EN  <=  '0' after 5 ns;
187
                        end if;
188
                      else
189
                        FOLGEZUSTAND   <= MODUS after 5 ns;
190
                      end if;
191
    
192
    when HS_ROT_NS_ROT_GELB  => OUTPUT <= "1010110100" after 5 ns;
193
                      ANFORDERUNG_NS_CLEAR  <= '1' after 5 ns;
194
                      ANFORDERUNG_HS_CLEAR  <= '1' after 5 ns;
195
                      if BLINK_S = '0' then
196
                        COUNTER_EN  <=  '1' after 5 ns;
197
                        if COUNT = "00010" then    -- 1 Sekunde warten
198
                          FOLGEZUSTAND   <=  HS_ROT_NS_GRUEN after 5 ns;
199
                          COUNTER_EN  <=  '0' after 5 ns;
200
                        end if;
201
                      else
202
                        FOLGEZUSTAND  <=  MODUS after 5 ns;
203
                      end if;
204
                      
205
    when HS_ROT_NS_GRUEN    => OUTPUT <= "1001001100" after 5 ns;
206
                      if BLINK_S = '0' then
207
                        COUNTER_EN  <=  '1' after 5 ns;
208
                        if COUNT  > "00100" then    -- min. 2 Sekunden warten
209
                          if ANFORDERUNG_HS = '1' then
210
                            FOLGEZUSTAND       <=  HS_ROT_NS_GELB after 5 ns;
211
                            COUNTER_EN        <=  '0' after 5 ns;
212
                            ANFORDERUNG_HS_CLEAR  <= '1' after 5 ns;
213
                          end if;
214
                        end if;
215
                        if COUNT = "01100" then    -- 6 Sekunden warten
216
                          FOLGEZUSTAND   <=  HS_ROT_NS_GELB after 5 ns;
217
                          COUNTER_EN  <=  '0' after 5 ns;
218
                          ANFORDERUNG_HS_CLEAR  <= '1' after 5 ns;
219
                        end if;
220
                      else
221
                        FOLGEZUSTAND     <= MODUS after 5 ns;
222
                      end if;
223
224
    when HS_ROT_NS_GELB    => OUTPUT <= "1010010100" after 5 ns;
225
                      ANFORDERUNG_NS_CLEAR  <= '1' after 5 ns;
226
                      ANFORDERUNG_HS_CLEAR  <= '1' after 5 ns;
227
                      if BLINK_S = '0' then
228
                        COUNTER_EN  <=  '1' after 5 ns;
229
                        if COUNT = "00010" then    -- 1 Sekunde warten
230
                          FOLGEZUSTAND  <=  HS_ROT_GELB_NS_ROT after 5 ns;
231
                          COUNTER_EN  <=  '0' after 5 ns;
232
                        end if;
233
                      else
234
                        FOLGEZUSTAND   <= MODUS after 5 ns;
235
                      end if;
236
237
    when HS_ROT_GELB_NS_ROT  => OUTPUT <= "1010100110" after 5 ns;
238
                      ANFORDERUNG_NS_CLEAR  <= '1' after 5 ns;
239
                      ANFORDERUNG_HS_CLEAR  <= '1' after 5 ns;
240
                      if BLINK_S = '0' then
241
                        COUNTER_EN  <=  '1' after 5 ns;
242
                        if COUNT = "00010" then    -- 1 Sekunde warten
243
                          FOLGEZUSTAND  <= HS_GRUEN_NS_ROT after 5 ns;
244
                          COUNTER_EN  <=  '0' after 5 ns;
245
                        end if;
246
                      else
247
                        FOLGEZUSTAND  <= MODUS after 5 ns;
248
                      end if;                    
249
  end case;
250
end process SN;
251
252
253
-- Einsynchronisieren der Eingangssignale
254
SYNC: process(CLK)
255
begin
256
  if CLK = '1' and CLK'event then
257
    BLINK_S  <= BLINK after 5 ns;
258
    HS1_S   <= HS1 after 5 ns; 
259
    HS2_S   <= HS2 after 5 ns; 
260
    NS1_S   <= NS1 after 5 ns; 
261
    NS2_S   <= NS2 after 5 ns; 
262
    FH_S     <= FH after 5 ns; 
263
    FN_S     <= FN after 5 ns;  
264
  end if;
265
end process SYNC;
266
267
ANFORDERUNG_HAUPTS: process(CLK, HS1_S, HS2_S, FN_S)
268
begin
269
  if CLK = '1' and CLK'event then
270
    if ANFORDERUNG_HS_CLEAR = '1' then
271
      ANFORDERUNG_HS      <=  '0' after 5 ns;
272
    elsif (HS1_S or HS2_S or FN_S) = '1' then
273
      ANFORDERUNG_HS      <= '1' after 5 ns;
274
    end if;
275
  end if;
276
end process ANFORDERUNG_HAUPTS;
277
278
279
ANFORDERUNG_NEBENS: process(CLK, NS1_S, NS2_S, FH_S)
280
begin
281
  if CLK = '1' and CLK'event then
282
    if ANFORDERUNG_NS_CLEAR = '1' then
283
      ANFORDERUNG_NS      <=  '0' after 5 ns;
284
    elsif (NS1_S or NS2_S or FH_S) = '1' then
285
      ANFORDERUNG_NS      <= '1' after 5 ns;
286
    end if;
287
  end if;
288
end process ANFORDERUNG_NEBENS;
289
290
291
292
-- Taktteiler von 50 MHz auf 2 Hz
293
294
PRESCALER: process(CLK)
295
begin
296
  if CLK='1' and CLK'event then
297
    if CNT = 25000000 then
298
      CNT <= 0;
299
      ENCLK <= '1' after 5 ns;    
300
    else
301
      ENCLK <= '0';
302
      CNT <= CNT + 1  after 5 ns;
303
    end if;
304
  end if;
305
end process PRESCALER;
306
307
308
COUNTER: process(CLK, ENCLK, COUNTER_EN)
309
begin
310
  if CLK = '1' and CLK'event then
311
    if COUNTER_EN = '1' then
312
      if ENCLK = '1' then
313
        COUNT <= COUNT + '1' after 5 ns;
314
      end if;
315
    else
316
      COUNT  <= (others => '0') after 5 ns;
317
    end if;
318
  end if;
319
end process COUNTER;
320
321
CNT_OUT  <= COUNT after 5 ns;
322
323
SCHALTWERK: process(CLK)
324
begin
325
  if RESET = '1' then
326
    ZUSTAND   <= INIT after 5 ns;
327
  elsif CLK = '1' and CLK'event then
328
    ZUSTAND   <= FOLGEZUSTAND after 5 ns;
329
  end if;
330
end process SCHALTWERK;
331
332
-- Nebenläufige Signalzuweisungen
333
GRH   <= OUTPUT(0);
334
GEH   <= OUTPUT(1);
335
RH   <= OUTPUT(2);
336
337
GRN   <= OUTPUT(3);
338
GEN   <= OUTPUT(4);
339
RN   <= OUTPUT(5);
340
341
GFH   <= OUTPUT(6);
342
RFH   <= OUTPUT(7);
343
344
GFN   <= OUTPUT(8);
345
RFN   <= OUTPUT(9);
346
347
-- 0000010010
348
-- HS_GRUEN          : 0110100001
349
--  HS_GELB          : 1010100010
350
-- HS_ROT_NS_ROT_GELB   : 1010110100
351
-- HS_ROT_NS_GRUEN     : 1001001100
352
-- HS_ROT_NS_GELB      : 1010010100
353
-- HS_ROT_GELB_NS_ROT  : 1010100110
354
355
end Behavioral;