Fragen zum VHDL Drehgeber Code

OP #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 )
OP #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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.