Forum: FPGA, VHDL & Co. Spartan 3E STK Rotary Encoder Interface - Example VHDL Verständnisproblem


von elmsfeuer (Gast)


Lesenswert?

Hallo,

Ich versuche grad ein Design-Beispiel für ein Spartan 3E Starter-Kit 
nachzuvollziehen. Es handelt sich dabei um ein Beispiel für die 
Benutzung des Rotary-Push-Buttons. Hier das Dokument zum Beispiel:
http://www.xilinx.com/products/boards/s3estarter/files/s3esk_rotary_encoder_interface.pdf

Ich habe nun das Problem nachzuvollziehen wie der folgende Prozess im 
Zusammenhang mit dem Signal delay_rotary_q1 funktioniert. Hier der Code:
1
architecture ...
2
3
signal        rotary_q1 : std_logic;
4
signal        rotary_q2 : std_logic;
5
signal  delay_rotary_q1 : std_logic;
6
signal     rotary_event : std_logic;
7
signal      rotary_left : std_logic;
8
9
begin...
10
11
  direction: process(clk)
12
  begin
13
    if clk'event and clk='1' then
14
15
      delay_rotary_q1 <= rotary_q1;
16
      if rotary_q1='1' and delay_rotary_q1='0' then
17
        rotary_event <= '1';
18
        rotary_left <= rotary_q2;
19
       else
20
        rotary_event <= '0';
21
        rotary_left <= rotary_left;
22
      end if;
23
24
    end if;
25
  end process direction;
Hier der Gesamtcode: 
http://www.xilinx.com/products/boards/s3estarter/files/s3esk_rotary_encoder_interface.zip

Mir ist nicht ganz klar wie das ganze funktioniert. Der Name des Signals 
"delay_rotary_q1" impliziert, dass dort eine Verzögerung erzeugt wird. 
Diese Verzögerung müßte nun genau eine Clock-Periode sein. Das aber nur 
unter den Voraussetzungen, dass der Zustand des Signals im nächsten 
Aufruf des Prozesses erhalten bleibt und die Signale erst am Ende des 
Prozesses aktualisiert werden. Da die zweite Voraussetzung zutrifft, 
bleibt noch die Signalerhaltung. Passiert das in dem Beispiel, wenn ja 
wieso? Kann mir jemand helfen das zu verstehen? Vielen Dank.

MfG,
Michael

von Thomas T. (knibbel)


Lesenswert?

Encoder rechts drehen:

         v         v         v         v         v

Q1    ++++    ++++++    ++++++    ++++++    ++++++
         +    +    +    +    +    +    +    +    +
         ++++++    ++++++    ++++++    ++++++    +++

Q2    ++++++    ++++++    ++++++    ++++++    ++++++
      +    +    +    +    +    +    +    +    +
      +    ++++++    ++++++    ++++++    ++++++



Encoder links drehen:

         v         v         v         v         v

Q1    ++++    ++++++    ++++++    ++++++    ++++++
         +    +    +    +    +    +    +    +    +
         ++++++    ++++++    ++++++    ++++++    ++++

Q2   +++    ++++++    ++++++    ++++++    ++++++
       +    +    +    +    +    +    +    +    +    +
       ++++++    ++++++    ++++++    ++++++    ++++++



Hallo,

die Diagramme oben dienen nur als Prinzipdarstellungen, das kann leicht 
abweichen.

Im Prinzip ist der Algo, der sich hinter dem Quelltext verbirgt, ganz 
einfach:

A) Bei jeder steigenden Clk-Flanke wird Q1 in ein zweistufiges 
Schieberegister geschoben.

B) Wenn der Zustand der beiden Schieberegister unterschiedlich ist, sind 
wir bei einem Zeitpunkt, wo Q1 gerade einen Flankenwechsel hinter sich 
hat. Im Quelltext ist bei der if-Abfrage die negative Flanke gefordert.

C) Jetzt wird einfach nur der dann gerade aktuelle Wert von Q2 
gespeichert, der (wie oben ersichtlich) anzeigt, ob der Encoder rechts 
oder links dreht.

C1) Der else-Zweig behält bis zur nächsten negativen Flanke von Q2 den 
Zustand bei.

Gruß,
Thomas

von Falk B. (falk)


Lesenswert?

Siehe Drehgeber.

von elmsfeuer (Gast)


Lesenswert?

Hallo,

Vielen Dank für die Hinweise, ich verstehe es nun.

MfG,
Michael

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.