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