[VHDL] FSM antidender schakeling blijft 'hangen'..

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • IceBlackz
  • Registratie: Maart 2011
  • Laatst online: 19-09 14:08
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:

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:

Afbeeldingslocatie: http://img338.imageshack.us/img338/5346/antidendernietwerkends1.png

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:

Afbeeldingslocatie: http://img341.imageshack.us/img341/2986/antidendernietwerkends0.png

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?

Acties:
  • 0 Henk 'm!

  • Devil
  • Registratie: Oktober 2001
  • Niet online

Devil

King of morons

Ik zou even googelen op de Engelse term 'debounce' dan vind je denk ik een hoop informatie.

After all, we are nothing more or less than what we choose to reveal.


Acties:
  • 0 Henk 'm!

  • IceBlackz
  • Registratie: Maart 2011
  • Laatst online: 19-09 14:08
Na uren van alles uit te proberen ben ik er toch achter gekomen..
code:
1
yay: process(drukknop,reset)
moest zijn
code:
1
yay: process(drukknop,reset,klok)
..

Kan iemand mij verklaren waarom hij wel in de sensitivity list moet staan terwijl ik er in dat process helemaal geen gebruik van maak? :/

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 00:16

Matis

Rubber Rocket

Je wijzigt drukknop of reset toch niet? Dus dat proces zal nooit afgevuurd worden. Hij stapt telkens door het proces als er op de knop gedrukt wordt.

Ik zou het persoonlijk anders aanpakken. Simpel countertje (STD_LOGIC_VECTOR) aanmaken dat iedere klokslag kijkt of de knop ingedrukt is; indien nee, zet counter op 0, indien ja, hoog counter 1 op. Als counter groter is dan waarde X je waarde van de drukknop doorKLOKKEN en niet latchen (zoals je nu doet). Anders de 'uit'stand.
Dat proces hoeft alleen van de klok sesitief te zijn en moet op een klokflank (stijgend of dalend) afgaan.

Moeilijker hoef je het niet te maken.

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • IceBlackz
  • Registratie: Maart 2011
  • Laatst online: 19-09 14:08
Matis schreef op zondag 04 december 2011 @ 00:07:
Je wijzigt drukknop of reset toch niet? Dus dat proces zal nooit afgevuurd worden. Hij stapt telkens door het proces als er op de knop gedrukt wordt.
Ahaaaa, nu zie en snap ik het, bedankt!
Matis schreef op zondag 04 december 2011 @ 00:07:
Ik zou het persoonlijk anders aanpakken. Simpel countertje (STD_LOGIC_VECTOR) aanmaken dat iedere klokslag kijkt of de knop ingedrukt is; indien nee, zet counter op 0, indien ja, hoog counter 1 op. Als counter groter is dan waarde X je waarde van de drukknop doorKLOKKEN en niet latchen (zoals je nu doet). Anders de 'uit'stand.
Dat proces hoeft alleen van de klok sesitief te zijn en moet op een klokflank (stijgend of dalend) afgaan.

Moeilijker hoef je het niet te maken.
Helaas was het 'verplicht' om het op deze manier uit te voeren (FSM diagram was gegeven). En waarom beter klokken dan latchen?

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 00:16

Matis

Rubber Rocket

Door te klokken kan de "compiler" er beter mee rekenen. Daarnaast kun je nu in een ongedefinieerde toestand raken.
Dat is overigens alleen van belang als je op een echte fysieke FPGA jouw code wilt gaan runnen. Voor simulatie is het niet van belang, maar in een real time systeem kun je je lelijk verkijken op een latchend signaal.
As a general rule avoid using Latches in the design.
Als je het fijne er van wilt weten, kun je dat artikel eens doornemen :)

Edit; Daarnaast blijf ik het een vreemde requirement vinden; een Finite-state machine voor een anti-dender regeling.

[ Voor 10% gewijzigd door Matis op 05-12-2011 11:02 ]

If money talks then I'm a mime
If time is money then I'm out of time

Pagina: 1