mikrocontroller.net

Forum: FPGA, VHDL & Co. VHDL counter


Autor: sensor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,
ich will die Anzahl von positive Signalwerte eines Sensor hochzählen.
Aber ich will immer jedes mal ab 0 zählen wenn sich die richtung ändern.

Also mein System ist ein Schrittmotor an dem ich ein Inkremental 
Drehgeber auf den Rotor befestig habe. Ich will dass, wenn sich das Moto 
Rechts oder links dreht , dass das signal von dem Inkremental ab dem 
Zeitpunk wo sich die Richtung gewechsel hat gezählt wird.
wenn das counter  200  erreicht soll der Ausgang, das für mich das 
Erreichen von 200 des Counter bedeutet signalisiert ( von 0 auf 1 gehen)

Der Sensor_ink ist mein sensorsignal und der ist in andere Process schon 
deklariert und difiniert wann er 1 oder 0 ist. Also der ist genau ein 
pegelsignal das mit der schrittfrequenz des Motors läuft.


hier ist das Process dafür, aber mein counter zählt nicht hoch.
Auch wie kann ich machen, dass bein Änderung der Richtung, der Zählstand 
genau bei 0 anfängt


Danke.



PROCESS (inkr_A,Richtung)

    BEGIN

    Ausgang <='0';

    IF Richtung ='1'  then

          if Sensor_inkr = '1' then

                      --inkr_count <= inkr_count + 1;

                             IF inkr_count = "11001000" THEN

                                  inkr_count <= (others => '0');

                                  Ausgang <= not Ausgang ;
                            ELSE
                                 inkr_count <= inkr_count + 1;

                                     End IF;
           ELSE

                       inkr_count <= inkr_count ;


                            END IF;


     ELSIF Richtung ='0'  then

                        if Sensor_inkr = '1' then

                             IF inkr_count = "11001000" THEN

                                  inkr_count <= (others => '0');

                                  Ausgang <= not Ausgang ;

                             ELSE

                                 inkr_count <= inkr_count + 1;

                             End IF;

                        ELSE
                                 inkr_count <= inkr_count;

                        End IF;

    End IF;


 END PROCESS;

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> aber mein counter zählt nicht hoch.
Wie hast du das festgestellt?

> hier ist das Process dafür, aber mein counter zählt nicht hoch.
Das ist kein Zähler, sondern nur eine kombinatorische Schleife.

Zähler können in FPGAs nur aus Flipflops gebaut werden. Und Flipflops 
brauchen einen TAKT, um Daten zu übernehmen und damit den Zähler 
weiterzuschalten. Hast du dir mal angesehen, wie Andere einen Zähler 
programmieren? Hast du verstanden, warum sie das so geamcht haben?

In VHDL sieht ein Zähler immer etwa so aus:
    process (clk) begin
        if rising_edge(clk) then 
            if (dies und das...) then
                counter <= counter+1;
            end if;
            if (counter>1000) then
                counter <= 0;
            end if;
        end if;
    end process;

Autor: Alexis Sch. (seraptin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich haette hier einen 4/8Bit Zaehler mit Clear fuer dich.

http://paste.frubar.net/12545

Der Reset 'rb' und der Clear 'clr' sind low-activ. Der Reset ist 
asynchron Immer wenn der Enable auf high ist und ein Clocksignal kommt 
wird der Counter um eins hochgezaehlt.

Du muesstest jetzt nurnoch den clr immer zum richtigen Zeitpunkt 
bringen, also bei Richtungsaenderung oder erreichen von 200.

Autor: sensor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon danke Miller,
ich habe in andere Process schon definiert wann mein Signal auf 1 oder 0 
geht und zwar mit dem Tak und einem Zähler genauso wie du hier 
beschrieben hast.
aber mein Problem ist ich will nur hochzählen wenn Sensor_inkr auf eins 
geht und von vorne an anfangen zu zählen wenn sich die Richtung ändern
das heisst der sensor_ink ist hier wie mein neue CLock.

oder nehmen wir an dass der TAK genau der Clcok ist.
wie zählen ich wider von vorne an wenn Richtung sich ändern??


PROCESS (clk)

    BEGIN

    Ausgang <='0';

    IF Richtung ='1'  then

          if rising_edge(clk) then

                      --inkr_count <= inkr_count + 1;

                             IF inkr_count = "11001000" THEN

                                  inkr_count <= (others => '0');

                                  Ausgang <= not Ausgang ;
                            ELSE
                                 inkr_count <= inkr_count + 1;

                                     End IF;
           ELSE

                       inkr_count <= inkr_count ;


                            END IF;


     ELSIF Richtung ='0'  then

                        if rising_edge(clk) then

                             IF inkr_count = "11001000" THEN

                                  inkr_count <= (others => '0');

                                  Ausgang <= not Ausgang ;

                             ELSE

                                 inkr_count <= inkr_count + 1;

                             End IF;

                        ELSE
                                 inkr_count <= inkr_count;

                        End IF;

    End IF;


 END PROCESS;

Autor: Alexis Sch. (seraptin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier nochmal mit richtigem Code-Highlighting. Das musste auf der Seite 
erst nachgeruestet werden ;)

http://paste.frubar.net/12548

Autor: sensor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Alexis,
ich schaue mir das gerade.

Autor: Alexis Sch. (seraptin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
 ELSE

                       inkr_count <= inkr_count ;


                            END IF;

Was soll denn das bezwecken ??

Paste doch mal das relevante Design incl. Signaldeklaration etc. in den 
Pastebin. Mit nur dem Ausschnitt fehlen einem einige Informationen.

Wenn z.B. Richtung immer auf '1' oder auf '0' ist muesste dein Signal 
mit jedem Clock hochgezaehlt werden. Das ist ja auch nicht das was du 
willst, oder?


Btw. Meine Counter sind natuerlich etwas aufwendiger zu schreiben, 
dafuer weiss ich aber auch genau was passiert und muss mich nicht auf 
das Synthesetool verlassen :)

Autor: sensor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Alex ,
hier das comlpete code.

http://paste.frubar.net/12550

mit
ELSE
    inkr_count <= inkr_count ;
          END IF;
meinte ich ,dass es nicht hochzählt wenn die Bediegung nicht erfüllt 
ist.

mein Sensor_ink bekomme ich von der Ausgang meines Inkrementalgebers 
wenn der Motor sich dreht. der ist ein 0 - 3.5V Signal, dass ich am 
Eingangspin meines FPGA angelegt habe, das heisst mein system erkennt 
dann automatisch wenn er 0 ( für 0)oder 1 (für 3,5V) ist und bedingt 
dann meine Zählung für die drehzahlt. Also bein erreichen von 200 
hochzählen ist de sensor_out auf 1 gesetzt, dass heisst eine volle 
umdrehung des Rotor.

ich hoffe ich hätte so weit mein Sytem geklärt.

Autor: sensor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch mal Alex,
 mein FPGA- Board hat 48MHz, also sehr sehr schnell
 mit:
IF rising_edge(clk) THEN

                  IF enable_in ='0' THEN
                       IF counter ="00001000000000011111" THEN
                            counter <= (others => '0');          
                              schritt_freq <= not schritt_freq;
                          counter1 <= counter1 + '1';                        
                                ELSE
                           counter <= counter + '1';

                        END IF;

teile ich mein clock  durch 32799 und habe dann eine neue frequenze mit 
der ich meine Motoschritte ansteurn kann. und der Schritt ist hier duch 
counter1 gesteuert. Also bei
"00"
 erste Schritt  bei
"01"
 zweite Schritt und so weiter...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.