1 | library IEEE;
|
2 | use IEEE.STD_LOGIC_1164.ALL;
|
3 | use ieee.numeric_std.all;
|
4 | use ieee.std_logic_arith.all;
|
5 | use ieee.std_logic_unsigned.all;
|
6 |
|
7 |
|
8 | entity taster_flanken_binaer_new is
|
9 |
|
10 | Port ( a : in STD_LOGIC;
|
11 | b : in STD_LOGIC;
|
12 | pb: in std_logic;
|
13 | clk : in STD_LOGIC;
|
14 | reset : in STD_LOGIC;
|
15 | Ton : out STD_LOGIC:='0';
|
16 | Led : out STD_LOGIC_VECTOR(7 downto 0));
|
17 | ----SIMULATIONSZWECKE-----
|
18 | -- stateb : out std_logic_vector (3 downto 0);
|
19 | -- a_out : inout STD_LOGIC:='0';
|
20 | -- a_up: inout std_logic:='0';
|
21 | -- b_down:inout std_logic:='0';
|
22 |
|
23 | --zaehl : out STD_LOGIC_VECTOR (3 downto 0):="0000"); --Ausgang Zähler 4 bit
|
24 | end taster_flanken_binaer_new;
|
25 |
|
26 | architecture Behavioral of taster_flanken_binaer_new is
|
27 | signal a_out:std_logic:='0';
|
28 | signal a_up:std_logic:='0';
|
29 | signal b_down:std_logic:='0';
|
30 |
|
31 |
|
32 | ---------------A--------------------
|
33 | type zustanda is(za1,za2,za3,za4); --Deklarierung der Zustände
|
34 | signal zalta, zneua: zustanda;
|
35 | signal takt10hza: std_logic:='0';
|
36 | signal t10hza:std_logic:='0';
|
37 | signal ausgabe: std_logic:='0';
|
38 | constant t10hz_a :integer:=5000000; --Setzte Zähler auf wert für 100 ms
|
39 | signal counta : integer range 0 to t10hz_a :=0; --setzte Zähler Anfang auf 0
|
40 | signal clkout: std_logic:='0'; --Setze Ausgangssignal auf 0
|
41 | signal freigabetimer : std_logic:='0'; --Setzte freigabe auf 0
|
42 | signal t10hzab : std_logic:='0';
|
43 | signal impulsa:std_logic:='0';
|
44 | signal qint: std_logic_vector(3 downto 0):="0000";
|
45 | signal za:std_logic:='0';
|
46 | signal xa:std_logic:='0';
|
47 |
|
48 | --------------B------------------
|
49 | type zustandb is(zb1,zb2,zb3,zb4); --Deklarierung der Zustände
|
50 | constant t10hzb :integer:=5000000; --Setzte Zähler auf wert für 100 ms
|
51 | signal zaltb, zneub : zustandb;
|
52 | signal ausgabeb: std_logic:='0';
|
53 | signal countb : integer range 0 to t10hzb :=0; --setzte Zähler Anfang auf 0
|
54 | signal clkoutb: std_logic:='0'; --Setze Ausgangssignal auf 0
|
55 | signal freigabetimerb : std_logic:='0'; --Setzte freigabe auf 0
|
56 | signal takt10hzb : std_logic;
|
57 | signal b_out: std_logic;
|
58 | signal state: std_logic_vector (3 downto 0);
|
59 | signal impulsb: std_logic:='0';
|
60 | signal t10hzb1: std_logic:='0';
|
61 |
|
62 |
|
63 | -------FLANKENERKENNUNG-----------
|
64 | type ZUSTAENDE_fl is (A_fl, B_fl, C_fl);
|
65 | signal ZUSTAND_fl, FOLGEZUSTAND_fl: ZUSTAENDE_fl;
|
66 |
|
67 | type ZUSTAENDE_fl_b is (A_fl_b, B_fl_b, C_fl_b);
|
68 | signal ZUSTAND_fl_b, FOLGEZUSTAND_fl_b: ZUSTAENDE_fl_b;
|
69 |
|
70 | --PB
|
71 | type zustand is(z1,z2,z3,z4,z5,z6,z7,z8); --Deklarierung der Zustände
|
72 | constant t10hz:integer:=25000000; --Setzte Zähler auf wert für 500 ms
|
73 | signal zalt, zneu: zustand;
|
74 | signal ausgabe1: std_logic:='0'; --Signale werden auf 0 gesetzt
|
75 | signal ausgabe2: std_logic:='0';
|
76 | signal ausgabe3: std_logic:='0';
|
77 | signal ausgabe4: std_logic:='0';
|
78 | signal count : integer range 0 to t10hz :=0; --setzte Zähler Anfang auf 0
|
79 | signal clkoutpb: std_logic:='0'; --Setze Ausgangssignal auf 0
|
80 | signal takt10hzpb : std_logic;
|
81 | signal PB_Balken : STD_LOGIC:='0';
|
82 | signal TonF1K: std_logic;
|
83 | signal TonF05K: std_logic;
|
84 | signal blabla: std_logic_vector (3 downto 0);
|
85 | signal impulspb: std_logic:='0';
|
86 | signal t10hzpb1: std_logic:='0';
|
87 |
|
88 |
|
89 |
|
90 | --ERZEUGUN TON
|
91 | signal c : integer range 0 to 99999 := 0; -- 500 Hz
|
92 | signal d : integer range 0 to 49999 := 0; -- 1000 Hz
|
93 | signal x : std_logic := '0';
|
94 | signal y : std_logic := '0';
|
95 | signal Ton1000 : std_logic;
|
96 | signal Ton0500 : std_logic;
|
97 |
|
98 |
|
99 |
|
100 | begin
|
101 |
|
102 | takta:process (clk,freigabetimer)
|
103 | begin
|
104 | if reset='1' then counta<=0;
|
105 | elsif freigabetimer='1' then
|
106 | if (rising_edge(clk))then --wenn steigene Flange von Clock dann zählen
|
107 | if(counta < t10hz_a) then --vergleiche zähler mit maximalen wert
|
108 | counta <= counta+1; --addiere 1 auf zähler
|
109 | elsif counta=t10hz_a then
|
110 | clkout <= not clkout;
|
111 | counta <=0;
|
112 | end if;
|
113 | end if;
|
114 | end if;
|
115 | end process takta;
|
116 |
|
117 | process (takt10hza,impulsa)
|
118 | begin
|
119 | if impulsa='1' then t10hza<='0';
|
120 | elsif falling_edge (takt10hza) then t10hza<=not t10hza; end if;
|
121 | end process;
|
122 |
|
123 | -----------------
|
124 | process(clk,reset)
|
125 | begin
|
126 |
|
127 | if reset='1' then zalta <=za1; --Setzen bei reset Zustand z1
|
128 | elsif clk='1' and clk'event then zalta<=zneua; --weiterschaltung bei clock
|
129 | end if;
|
130 | end process;
|
131 |
|
132 |
|
133 | process (a, zalta, t10hza)
|
134 | begin
|
135 |
|
136 | case zalta is
|
137 | when za1 => if a='0'
|
138 | then zneua <=za1;
|
139 | else zneua <=za2;
|
140 | end if;
|
141 | ausgabe<='0';
|
142 | state<="0001";
|
143 | freigabetimer<='0';
|
144 | impulsa<='1';
|
145 |
|
146 |
|
147 |
|
148 |
|
149 | when za2 =>
|
150 | if t10hza='1'
|
151 | then zneua <=za3;
|
152 | else zneua <=za2;
|
153 | end if;
|
154 | ausgabe<='1';
|
155 | state<="0010";
|
156 | freigabetimer<='1';
|
157 | impulsa<='0';
|
158 |
|
159 |
|
160 | when za3 => if a='1'
|
161 | then zneua <=za3;
|
162 | else zneua <=za4;
|
163 | end if;
|
164 | ausgabe<='1';
|
165 | state<="0011";
|
166 | freigabetimer<='0';
|
167 | impulsa<='1';
|
168 |
|
169 |
|
170 | when za4 => if t10hza='1'
|
171 | then zneua <=za1;
|
172 | else zneua <=za4;
|
173 | end if;
|
174 | ausgabe<='0';
|
175 | state<="0100";
|
176 | freigabetimer<='1';
|
177 | impulsa<='0';
|
178 |
|
179 | end case;
|
180 | end process;
|
181 |
|
182 | --TASTE B
|
183 | process(clk,reset)
|
184 | begin
|
185 | if reset='1' then zaltb <=zb1; --Setzen bei reset Zustandb z1
|
186 | elsif clk='1' and clk'event then zaltb<=zneub; --weiterschaltung bei clock
|
187 | end if;
|
188 | end process;
|
189 |
|
190 | process (b, zaltb, t10hzb1)
|
191 | begin
|
192 |
|
193 | case zaltb is
|
194 | when zb1 => if b='0'
|
195 | then zneub <=zb1;
|
196 | else zneub <=zb2;
|
197 | end if;
|
198 | ausgabeb<='0';
|
199 | --stateb<="0001";
|
200 | freigabetimerb<='0';
|
201 | impulsb<='1';
|
202 |
|
203 |
|
204 | when zb2 =>
|
205 | if t10hzb1='1'
|
206 | then zneub <=zb3;
|
207 | else zneub <=zb2;
|
208 | end if;
|
209 | ausgabeb<='1';
|
210 | --stateb<="0010";
|
211 | freigabetimerb<='1';
|
212 | impulsb<='0';
|
213 |
|
214 |
|
215 | when zb3 => if b='1'
|
216 | then zneub <=zb3;
|
217 | else zneub <=zb4;
|
218 | end if;
|
219 | ausgabeb<='1';
|
220 | --stateb<="0011";
|
221 | freigabetimerb<='0';
|
222 | impulsb<='1';
|
223 |
|
224 |
|
225 |
|
226 | when zb4 => if t10hzb1='1'
|
227 | then zneub <=zb1;
|
228 | else zneub <=zb4;
|
229 | end if;
|
230 | ausgabeb<='0';
|
231 | --stateb<="0100";
|
232 | freigabetimerb<='1';
|
233 | impulsb<='0';
|
234 |
|
235 | end case;
|
236 |
|
237 | end process;
|
238 |
|
239 |
|
240 | taktb:process (clk)
|
241 | begin
|
242 |
|
243 | if reset='1' then countb<=0;
|
244 |
|
245 | elsif freigabetimerb='1' then
|
246 | if (rising_edge(clk))then --wenn steigene Flange von Clock dann zählen
|
247 | if(countb < t10hzb) then --vergleiche zähler mit maximalen wert
|
248 | countb <= countb+1; --addiere 1 auf zähler
|
249 | else
|
250 | clkoutb <=not clkoutb; --
|
251 | countb <=0; -- setze zähler auf 0
|
252 | end if;
|
253 | end if;
|
254 | end if;
|
255 | end process taktb;
|
256 |
|
257 | process (takt10hzb,impulsb)
|
258 | begin
|
259 | if impulsb='1' then t10hzb1<='0';
|
260 | elsif falling_edge (takt10hzb) then t10hzb1<=not t10hzb1; end if;
|
261 | end process;
|
262 |
|
263 |
|
264 | -------------------------
|
265 |
|
266 | ZUSTANDSAKTUALISIERUNG_fl: process (clk,RESET)
|
267 | begin
|
268 | if RESET = '1' then ZUSTAND_fl <= A_fl;
|
269 | elsif clk = '1' and clk'event then ZUSTAND_fl <= FOLGEZUSTAND_fl;
|
270 | end if;
|
271 | end process ZUSTANDSAKTUALISIERUNG_fl;
|
272 |
|
273 | FOLGEZUSTANDSBERECHNUNG_fl: process (a_out,ZUSTAND_fl)
|
274 | begin
|
275 | case ZUSTAND_fl is
|
276 | when A_fl => if a_out = '1' THEN FOLGEZUSTAND_fl <= A_fl;
|
277 | else FOLGEZUSTAND_fl <= B_fl;
|
278 | end if ;
|
279 | za <= '0';
|
280 | when B_fl => if a_out = '1' THEN FOLGEZUSTAND_fl <= C_fl;
|
281 | else FOLGEZUSTAND_fl <= B_fl;
|
282 | end if;
|
283 | za <= '0';
|
284 | when C_fl => if a_out = '1' THEN FOLGEZUSTAND_fl <= A_fl;
|
285 | else FOLGEZUSTAND_fl <= B_fl;
|
286 | end if;
|
287 | za <= '1';
|
288 | end case;
|
289 | end process FOLGEZUSTANDSBERECHNUNG_fl;
|
290 |
|
291 | ZUSTANDSAKTUALISIERUNG_fl_b: process (clk,RESET)
|
292 | begin
|
293 | if RESET = '1' then ZUSTAND_fl_b <= A_fl_b;
|
294 | elsif clk = '1' and clk'event then ZUSTAND_fl_b <= FOLGEZUSTAND_fl_b;
|
295 | end if;
|
296 | end process ZUSTANDSAKTUALISIERUNG_fl_b;
|
297 |
|
298 | FOLGEZUSTANDSBERECHNUNG_fl_b: process (ausgabeb,ZUSTAND_fl_b)
|
299 | begin
|
300 | case ZUSTAND_fl_b is
|
301 | when A_fl_b => if ausgabeb = '1' THEN FOLGEZUSTAND_fl_b <= A_fl_b;
|
302 | else FOLGEZUSTAND_fl_b <= B_fl_b;
|
303 | end if ;
|
304 | xa <= '0';
|
305 | when B_fl_b => if ausgabeb = '1' THEN FOLGEZUSTAND_fl_b <= C_fl_b;
|
306 | else FOLGEZUSTAND_fl_b <= B_fl_b;
|
307 | end if;
|
308 | xa <= '0';
|
309 | when C_fl_b => if ausgabeb = '1' THEN FOLGEZUSTAND_fl_b <= A_fl_b;
|
310 | else FOLGEZUSTAND_fl_b <= B_fl_b;
|
311 | end if;
|
312 | xa <= '1';
|
313 | end case;
|
314 | end process FOLGEZUSTANDSBERECHNUNG_fl_b;
|
315 |
|
316 |
|
317 | hoch:process(reset,clk,za)
|
318 | begin
|
319 | if reset='1' then qint<="0000"; -- Setze Zähler auf 0 wenn reset
|
320 | elsif clk='1' and clk'event -- wenn Takt anliegt und weiterläuft dann
|
321 | then --qint<=qint; -- ausgabe wird gleich ausgabe gesetzt
|
322 | if za='1'--a_up='1'--Fallende Flanke von a zählt hoch
|
323 | then
|
324 | if qint="1000" then qint<="1000"; -- zählerbegrenzung auf 8
|
325 | else qint<=qint+1; -- addition um 1 wenn 8 noch nicht erreicht
|
326 | end if;
|
327 | end if;
|
328 | if xa='1' then -- Fallende Flanke von b zählt runterthen
|
329 | if qint="0000" then qint<="1000"; -- wenn Zähler vorher 0 ist wird auf 8 gesetzt
|
330 | else qint<=qint-1; -- subtraktion um 1 wenn 0 noch nicht erreicht ist
|
331 | end if;
|
332 | end if;
|
333 | end if;
|
334 | end process;
|
335 |
|
336 | --PB
|
337 | process(clk,reset)
|
338 | begin
|
339 | if reset='1' then zalt <=z1; --Setzen bei reset Zustand z1
|
340 | elsif clk='1' and clk'event then zalt<=zneu; --weiterschaltung bei clock
|
341 | end if;
|
342 | end process;
|
343 |
|
344 | process (takt10hzpb,impulspb)
|
345 | begin
|
346 | if impulspb='1' then t10hzpb1<='0';
|
347 | elsif falling_edge (takt10hzpb) then t10hzpb1<=not t10hzpb1; end if;
|
348 | end process;
|
349 |
|
350 | process (pb, zalt, t10hzpb1)
|
351 | begin
|
352 |
|
353 | case zalt is
|
354 | when z1 => if pb='0' --Zustand 1
|
355 | then zneu <=z1;
|
356 | else zneu <=z2;
|
357 | end if;
|
358 | ausgabe1<='0'; -- Zuweisung der Ausgänge
|
359 | ausgabe2<='0';
|
360 | ausgabe3<='0';
|
361 | ausgabe4<='0';
|
362 | blabla<="0001";
|
363 | impulspb<='1';
|
364 |
|
365 |
|
366 | when z2 =>
|
367 | if t10hzpb1 ='1'
|
368 | then zneu <=z3;
|
369 | else zneu <=z2;
|
370 | end if;
|
371 | ausgabe1<='1'; -- Zuweisung der Ausgänge
|
372 | ausgabe2<='1';
|
373 | ausgabe3<='0';
|
374 | ausgabe4<='1';
|
375 | blabla<="0010";
|
376 | impulspb<='0';
|
377 |
|
378 | when z3 => if pb='1'
|
379 | then zneu <=z3;
|
380 | else zneu <=z4;
|
381 | end if;
|
382 | ausgabe1<='1';-- Zuweisung der Ausgänge
|
383 | ausgabe2<='0';
|
384 | ausgabe3<='0';
|
385 | ausgabe4<='0';
|
386 | blabla<="0011";
|
387 | impulspb<='1';
|
388 |
|
389 |
|
390 | when z4 => if t10hzpb1='1' --statt a freigabe von 100ms !!!!
|
391 | then zneu <=z5;
|
392 | else zneu <=z4;
|
393 | end if;
|
394 | ausgabe1<='1';-- Zuweisung der Ausgänge
|
395 | ausgabe2<='0';
|
396 | ausgabe3<='0';
|
397 | ausgabe4<='1';
|
398 | blabla<="0100";
|
399 | impulspb<='0';
|
400 |
|
401 | when z5 => if pb='1' --statt a freigabe von 100ms !!!!
|
402 | then zneu <=z6;
|
403 | else zneu <=z5;
|
404 | end if;
|
405 | ausgabe1<='1';-- Zuweisung der Ausgänge
|
406 | ausgabe2<='0';
|
407 | ausgabe3<='0';
|
408 | ausgabe4<='0';
|
409 | blabla<="0101";
|
410 | impulspb<='1';
|
411 |
|
412 | when z6 => if t10hzpb1='1' --statt a freigabe von 100ms !!!!
|
413 | then zneu <=z7;
|
414 | else zneu <=z6;
|
415 | end if;
|
416 | ausgabe1<='0';-- Zuweisung der Ausgänge
|
417 | ausgabe2<='0';
|
418 | ausgabe3<='1';
|
419 | ausgabe4<='1';
|
420 | blabla<="0110";
|
421 | impulspb<='0';
|
422 |
|
423 | when z7 => if pb='1' --statt a freigabe von 100ms !!!!
|
424 | then zneu <=z7;
|
425 | else zneu <=z8;
|
426 | end if;
|
427 | ausgabe1<='0';-- Zuweisung der Ausgänge
|
428 | ausgabe2<='0';
|
429 | ausgabe3<='0';
|
430 | ausgabe4<='0';
|
431 | blabla<="0111";
|
432 | impulspb<='1';
|
433 |
|
434 | when z8 => if t10hzpb1='1' --statt a freigabe von 100ms !!!!
|
435 | then zneu <=z1;
|
436 | else zneu <=z8;
|
437 | end if;
|
438 | ausgabe1<='0';-- Zuweisung der Ausgänge
|
439 | ausgabe2<='0';
|
440 | ausgabe3<='0';
|
441 | ausgabe4<='1';
|
442 | blabla<="1000";
|
443 | impulspb<='0';
|
444 |
|
445 |
|
446 | end case;
|
447 | end process;
|
448 | -----------------------------------------------------------------------------------------------
|
449 |
|
450 | takt:process (clk) --Erzeugung des Taktes für die Entprellung
|
451 | begin
|
452 | if reset='1' then count<=0;
|
453 |
|
454 | elsif ausgabe4 ='1' then
|
455 | if (rising_edge(clk))then --wenn steigene Flange von Clock dann zählen
|
456 | if(count < t10hz ) then --vergleiche zähler mit maximalen wert
|
457 | count <= count+1; --addiere 1 auf zähler
|
458 | else
|
459 | clkoutpb <=not clkoutpb ; --
|
460 | count <=0; -- setze zähler auf 0
|
461 | end if;
|
462 | end if;
|
463 | end if;
|
464 | end process takt;
|
465 |
|
466 | --ERZEUGUNG TON
|
467 | process begin
|
468 | wait until rising_edge(clk); -- kommenden Takt abwarten
|
469 | if(c < 99999)then
|
470 | c <= c + 1; -- solange 99999 nicht erreicht, weiter zählen
|
471 | else -- wenn Zählerende erreicht:
|
472 | c <= 0; -- Zähler zurücksetzen
|
473 | x <= not x; -- Signal x togglen
|
474 | end if;
|
475 | if( d < 49999) then
|
476 | d <= d + 1; -- solange 49999 nicht erreicht, weiter zählen
|
477 | else -- wenn Zählerende erreicht:
|
478 | d <= 0; -- Zähler zurücksetzen
|
479 | y <= not y; -- Signal y togglen
|
480 | end if;
|
481 | end process;
|
482 |
|
483 |
|
484 | --VERKNÜPFUNG
|
485 | process (TonF1K,TonF05K,Ton1000,Ton0500 )
|
486 | begin
|
487 |
|
488 | if
|
489 | TonF1K='1' and TonF05k='0' then
|
490 | Ton <= Ton1000 after 1 ns, '0' after 1000 ms;
|
491 | elsif
|
492 | TonF1K='0' and TonF05k='1' then
|
493 | Ton <= Ton0500 after 1 ns, '0' after 1000 ms;
|
494 | else
|
495 | Ton <='0';
|
496 | end if;
|
497 |
|
498 |
|
499 | end process;
|
500 |
|
501 | --DEKODER
|
502 | process (qint, PB_Balken)
|
503 | begin
|
504 | Led <= "00000000";
|
505 | if(PB_Balken = '1')then -- Punkt-Betrieb
|
506 | case qint is
|
507 | when "0000" => Led <= "00000001"; -- Nur erste Led an
|
508 | when "0001" => Led <= "00000010"; -- Nur zweite Led an
|
509 | when "0010" => Led <= "00000100"; -- Nur dritte Led an
|
510 | when "0011" => Led <= "00001000"; -- Nur vierte Led an
|
511 | when "0100" => Led <= "00010000"; -- Nur fünfte Led an
|
512 | when "0101" => Led <= "00100000"; -- Nur sechste Led an
|
513 | when "0110" => Led <= "01000000"; -- Nur siebte Led an
|
514 | when "0111" => Led <= "10000000"; -- Nur achte Led an
|
515 | when others => Led <= "00000000"; -- Alle Led's aus
|
516 | end case;
|
517 |
|
518 | else -- Balken-Betrieb
|
519 | case qint is
|
520 | when "0000" => Led <= "00000001"; -- Erste Led an
|
521 | when "0001" => Led <= "00000011"; -- Zweite Led an
|
522 | when "0010" => Led <= "00000111"; -- Dritte Led an
|
523 | when "0011" => Led <= "00001111"; -- Vierte Led an
|
524 | when "0100" => Led <= "00011111"; -- Fünfte Led an
|
525 | when "0101" => Led <= "00111111"; -- Sechste Led an
|
526 | when "0110" => Led <= "01111111"; -- Siebte Led an
|
527 | when "0111" => Led <= "11111111"; -- Achte Led an
|
528 | when others => Led <= "00000000"; -- Alle Led's aus
|
529 | end case;
|
530 |
|
531 | end if;
|
532 | end process;
|
533 |
|
534 |
|
535 |
|
536 |
|
537 | takt10hzb <= clkoutb;
|
538 | a_out <= ausgabe;
|
539 | takt10hza <= clkout;
|
540 | PB_Balken <= ausgabe1 ;
|
541 | TonF1k <= ausgabe2 ;
|
542 | TonF05k <= ausgabe3 ;
|
543 | takt10hzpb <= clkoutpb ;
|
544 | Ton0500 <= x; -- Signal x an Ton0500 übergeben
|
545 | Ton1000 <= y; -- Signal y an Ton1000 übergeben
|
546 | end Behavioral;
|