Een goedemorgen,
Voor school hebben wij de opdracht gekregen een looplicht te ontwerpen in VHDL die aangestuurd kan worden met een rotary encoder. Omdat die rotary encoder nogal wat contactdender heeft moeten we een 'Finite State Machine' antidender schakeling ontwerpen. Daarna verwerken we dit signaal verder etc.
Mijn code tot nu toe is als volgt:
Hoe werkt nu de antidender? Door een 'lage' klokfrequentie te nemen, zal h_t(huidige toestand) pas veranderen nadat de contactdender is geweest. Een extra antidender middeltje is om daar nog een stand tussen te nemen (s01). Eenmaal in s11 aangekomen moet hij daar blijven hangen totdat de drukknop cq. rotary encoder weer terugschakelt naar '0'. Maar eenmaal bij het testen blijkt dat het niet werkt, het volgende beeld verscheen uit de tb:

Als ik echter in de output process niet bij s11 maar s01 de uitgang 1 laat maken, dus
krijg ik het volgende beeld:

Hieruit kan ik opmaken dat hij dus in s01 blijft hangen.. maar wel netjes terugkeert naar s00 als de drukknop weer 0 wordt..
Iemand een flauw idee van wat ik verkeerd doe? Want volgens mij kan er echt niks verkeerd zijn aan het commando
Alvast bedankt!
Voor school hebben wij de opdracht gekregen een looplicht te ontwerpen in VHDL die aangestuurd kan worden met een rotary encoder. Omdat die rotary encoder nogal wat contactdender heeft moeten we een 'Finite State Machine' antidender schakeling ontwerpen. Daarna verwerken we dit signaal verder etc.
Mijn code tot nu toe is als volgt:
vhdl:
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
| library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity antidender is Port ( drukknop,reset,klok : in STD_LOGIC; uit : out STD_LOGIC); end antidender; architecture Behavioral of antidender is type stand is(s00, s11, s01, s10); signal v_t, h_t : stand; signal hulp : std_logic; begin yay: process(drukknop,reset) begin if reset = '1' then v_t <= s00; elsif h_t=s00 then if drukknop='1' then v_t <= s01; elsif drukknop='0' then v_t <= s00; end if; elsif h_t=s01 then if drukknop='1' then v_t <= s11; elsif drukknop='0' then v_t <= s00; end if; elsif h_t=s11 then if drukknop='1' then v_t <= s11; elsif drukknop='0' then v_t <= s00; end if; elsif h_t=s10 then v_t <= s00; end if; end process; klokkert : process(klok) begin if rising_edge(klok) then h_t <= v_t; end if; end process; output : process(h_t) begin if h_t=s11 then uit <='1'; else uit <= '0'; end if; end process; end Behavioral; |
Hoe werkt nu de antidender? Door een 'lage' klokfrequentie te nemen, zal h_t(huidige toestand) pas veranderen nadat de contactdender is geweest. Een extra antidender middeltje is om daar nog een stand tussen te nemen (s01). Eenmaal in s11 aangekomen moet hij daar blijven hangen totdat de drukknop cq. rotary encoder weer terugschakelt naar '0'. Maar eenmaal bij het testen blijkt dat het niet werkt, het volgende beeld verscheen uit de tb:

Als ik echter in de output process niet bij s11 maar s01 de uitgang 1 laat maken, dus
code:
1
| if h_t=s01 then uit <='1'; |
krijg ik het volgende beeld:

Hieruit kan ik opmaken dat hij dus in s01 blijft hangen.. maar wel netjes terugkeert naar s00 als de drukknop weer 0 wordt..
Iemand een flauw idee van wat ik verkeerd doe? Want volgens mij kan er echt niks verkeerd zijn aan het commando
code:
1
2
| elsif h_t=s01 then if drukknop='1' then v_t <= s11; |
Alvast bedankt!
offtopic:
dit subforum leek mij de beste plek voor deze vraag?
dit subforum leek mij de beste plek voor deze vraag?