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