Forum: FPGA, VHDL & Co. Fragen zum VHDL Drehgeber Code


von Reinhard J. (rvj)


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

von bko (Gast)


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 )

von Reinhard J. (rvj)


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

von bko (Gast)


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.

von Reinhard J. (rvj)


Lesenswert?

Danke bko,
der Prozess wird aber während der Zeit, die Du mit "einige takte lang" 
markiert hast nur einmal durchlaufen, da sich während dieser clk-Takte 
nichts in der sensitivity list ändert. Korrekt?
Gruß Reinhard

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Die Denkweise ist falsch.
Ein (kombinatorischer) Prozess wird im.realen Leben nicht durchlaufen, 
sondern in Logik übersetzt. Und die ist immer da und berechnet aus den 
Eingangswerten ständig neue Ergebnisse.

Nur in der Simulation ist die Sensitivliste relevant.

von Reinhard J. (rvj)


Lesenswert?

Ok danke, da hat die Softwaredenke wieder zugeschlagen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.