Fragen zum VHDL Drehgeber Code

#3417000
Lesenswert?

Hallo Forum,

ich bin gerade dabei VHDL zu lernen. In meinem ersten Design will ich 
den Code des Artikels Drehgeber 
http://www.mikrocontroller.net/articles/Drehgeber  verwenden. Dort wird 
folgender process vorgeschlagen:
1
process(a_in, b_in, a_old, b_old)
2
variable state: std_logic_vector(3 downto 0);
3
begin
4
  state := a_in & b_in & a_old & b_old;
5
  case state is
6
    when "0000" => up_down <= '0'; ce <= '0'; error <= '0';
7
    when "0001" => up_down <= '1'; ce <= '1'; error <= '0';
8
    when "0010" => up_down <= '0'; ce <= '1'; error <= '0';
9
    when "0011" => up_down <= '0'; ce <= '0'; error <= '1';
10
    when "0100" => up_down <= '0'; ce <= '1'; error <= '0';
11
    when "0101" => up_down <= '0'; ce <= '0'; error <= '0';
12
    when "0110" => up_down <= '0'; ce <= '0'; error <= '1';
13
    when "0111" => up_down <= '1'; ce <= '1'; error <= '0';
14
    when "1000" => up_down <= '1'; ce <= '1'; error <= '0';
15
    when "1001" => up_down <= '0'; ce <= '0'; error <= '1';
16
    when "1010" => up_down <= '0'; ce <= '0'; error <= '0';
17
    when "1011" => up_down <= '0'; ce <= '1'; error <= '0';
18
    when "1100" => up_down <= '0'; ce <= '0'; error <= '1';
19
    when "1101" => up_down <= '0'; ce <= '1'; error <= '0';
20
    when "1110" => up_down <= '1'; ce <= '1'; error <= '0';
21
    when "1111" => up_down <= '0'; ce <= '0'; error <= '0';
22
    when others => null;
23
  end case;
24
end process;

up_down ist im Fehlerfall, bei keiner Bewegung und bei einer 
Rückwärtsbewegung '0'. Bei der Vorwärtsbewegung ist up_down '1'.

ce ist bei keiner Bewegung und im Fehlerfall '0', bei einer Rückwärts- 
oder Vorwärtsbewegung '1'.

Jetzt meine Fragen:

1. Stimmen meine Aussagen?
2. Aufgrund der sensitivity list dürfte niemals keine Bewegung 
detektiert werden, da der process nur bei Änderungen in der sensitivity 
list durchlaufen wird. Folglich werden zwei aufeinaderfolgende 
Vorwärtsschritte bzw. zwei aufeinanderfolgende Rückwärtsschritte nicht 
getrennt. Für den ersten Vorwärtsschritt liegt am Signal up_down eine 
'1' an und ce ist '1'. Beim zweiten Schritt ist das aber genau so. Wie 
soll ich die Schritte dann mit einem nachfolgenden counter zählen?

Schon jetzt vielen Dank für Eure Hilfe

Reinhard
Gast #3417184
Lesenswert?

>list durchlaufen wird. Folglich werden zwei aufeinaderfolgende
>Vorwärtsschritte bzw. zwei aufeinanderfolgende Rückwärtsschritte nicht
>getrennt. Für den ersten Vorwärtsschritt liegt am Signal up_down eine
>'1' an und ce ist '1'. Beim zweiten Schritt ist das aber genau so. Wie

man muss diesen Teil auch mit-betrachten:
1
process(clk)
2
begin
3
  if rising_edge(clk) then
4
    a_old <= a_in;
5
    a_in  <= A;
6
    b_old <= b_in;
7
    b_in  <= B;
8
  end if;
9
end process

Ändert sich z.B. A dann sind a_old und a_in genau einen Takt"clk" lang
 unterschiedlich:

 Damit:
>1. Stimmen meine Aussagen?
  genau jeweils eine Takt lang:

Da gilt einfach für eine Syncronen Zähler:
Zähle eins dazu wenn (up_down=1 und ce=1 und error=0 )
ziehe eins ab   wenn (up_down=0 und ce=1 und error=0 )
#3417195
Lesenswert?

Herzlichen Dank das hatte ich übersehen.
Meine Aussage, dass nie "keine Bewegung" detektiert wird, ist demzufolge 
falsch. Bei einer Vorwärtsbewegung erhalte ich folgende Seuquenz:

...
up_down=1 und ce=1 und error=0
up_down=0 und ce=0 und error=0
up_down=1 und ce=1 und error=0
up_down=0 und ce=0 und error=0
up_down=1 und ce=1 und error=0
...

Ist das so?
Gruß Reinhard
Gast #3417251
Lesenswert?

Ja, genauer:
up_down=1 und ce=1 und error=0 ; einen Takt lang
up_down=0 und ce=0 und error=0
       "   einige takte lang
up_down=0 und ce=0 und error=0
up_down=1 und ce=1 und error=0 ; einen Takt lang
up_down=0 und ce=0 und error=0
       "   einige takte lang
up_down=0 und ce=0 und error=0
up_down=1 und ce=1 und error=0 ; einen Takt lang

Außer die Abtastfrequenz "clk" wird zu niedrig, dann
gibts Durcheinander, bzw. "error" wird evtl '1'.
Aber ein FPGA sollte mit einigen MHz Takt (50MHz und mehr)
mechanische Drehgeber problemlos abtasten können.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren