mikrocontroller.net

Forum: FPGA, VHDL & Co. bei halben Clocksignal zählen


Autor: KIT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ,
ich will bei jedem 2,5 Clocksignal das Ausgangsignal rücksetzen , ist es 
möglich ?
Bitte ergänzen Sie das folgende Programm dann. Ich kann nur bei 2 nicht 
bei 2,5.Wie ist es mit dem halben??

Vilen Dank im Voraus.


if rising_edge(clk) then
   count <= count + 1;
 IF count = "10" THEN
   signal_ausgang <= '0';
else 
  count <= count + 1;
end if;
   

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

Bewertung
0 lesenswert
nicht lesenswert
KIT schrieb:
> ich will bei jedem 2,5 Clocksignal das Ausgangsignal rücksetzen , ist es
> möglich ?
Worauf? CPLD? FPGA?
Welcher Hersteller?
Woher kommt der Takt? Welche Frequenz hat er?
Wozu brauchst du das?


Du könntest einen Clockmanager verwenden, den Takt verdoppeln und dann 
jeweils 5 Takte '1' und 5 Takte '0' ausgeben.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  KIT (Gast)

>ich will bei jedem 2,5 Clocksignal das Ausgangsignal rücksetzen , ist es
>möglich ?
>Bitte ergänzen Sie das folgende Programm dann. Ich kann nur bei 2 nicht
>bei 2,5.Wie ist es mit dem halben??

Dazu braucht man zwei Prozesse, einen auf der steigenden, einen auf der 
fallenden Flanke, das Ergebnis wird dann verodert.
-- Zaehler mit steigender FLanke
process(clk)
begin
  if rising_edge(clk) then
    if count=4 THEN
      count <= "000";
    else
      count <= count + 1;
    end if;
  end if;
end if;
end process;

-- einfache Verzögerung mit fallender FLanke

process(clk)
begin
  if falling_edge(clk) then
    clk_del <= count(1);
  end if;
end if;
end process;

clk_2_5 <= count(1) or clk_del;

In normaler Logik kann man keine halben Takte verarbeiten, ist aber auch 
nicht nötig.

MFG
Falk

Autor: KIT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ,
schon Danke für die Reaktion.
Eigentlich ist mein Siganl nicht da Clocksignal von Osci. Er ist die 
Erfassung eines Sensors(Inkrementaldrehgeber), dessen Signal rechteckig 
ist  und am Port eines FPGA angeschlossen ist. Da die Auflösung für das 
Schrittwinkel(1.8°) genau 2,5 Steigende Flanke verlangt, will ich dann 
bei jedem 2.5 Flanke, die Schrittanzahl zählen. Daraus war meine Idee 
bei jedem 2.5 clock signal zu zählen.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  KIT (Gast)

>Eigentlich ist mein Siganl nicht da Clocksignal von Osci. Er ist die
>Erfassung eines Sensors(Inkrementaldrehgeber), dessen Signal rechteckig
>ist  und am Port eines FPGA angeschlossen ist.

Ja vielen Dank, dass du SOOO zeitig mal den Mund aufkriegst und mal 
wirklich sagt, worum es geht!

Lies mal was über Netiquette!

> Da die Auflösung für das
>Schrittwinkel(1.8°) genau 2,5 Steigende Flanke verlangt, will ich dann
>bei jedem 2.5 Flanke, die Schrittanzahl zählen. Daraus war meine Idee
>bei jedem 2.5 clock signal zu zählen.

Das ist Käse. Basierend auf einem falschen Verständnis eines 
Drehgebers. Lies den Artikel und staune.

MfG
Falk

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

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner schrieb:
> Lies mal was über Netiquette!
Noch wissen wir nicht einen Bruchteil der Aufgabe:
>>> Worauf? CPLD? FPGA?
>>> Welcher Hersteller?
>>> Woher kommt der Takt? Welche Frequenz hat er?
>>> Wozu brauchst du das?

Aber ich hatte schon den Verdacht, dass da was nachkommt... :-/

> Eigentlich ist mein Siganl nicht da Clocksignal von Osci.
Dann wird auf so einem Takt nicht mit einer rising_edge() oder einer 
falling_edge() gearbeitet. Punkt. Und schon gleich überhaupt nicht, wenn 
du noch ein VHDL-Anfänger bist.

>  Er ist die Erfassung eines Sensors(Inkrementaldrehgeber),
Mach es so, wie im bereits genannten Artikel beschrieben, und sieh dir 
das auch mal an: http://www.lothar-miller.de/s9y/categories/46-Encoder
Und jetzt bitte erst mal nachvollziehen, was da gemacht wird. Und dann 
bei Unklarheiten fragen...

Autor: KIT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank Falk und Miller,
jetzt noch eine Frage, da ich nach jedem 2ten  Highpegelsignal des 
Drehgebers erst inkrementieren will, reicht dieses code aus??
Signal_A <= inkr_A ;  -- Zusammenfassen der Eingänge A 
    process 
        begin -- Eintakten der  Signal
            wait until rising_edge(clk);
                 in_A <= Signal_A;
                 old_A <= in_A;
    end process;
    process      -- Weiterschalten und Zählen     
        begin
    wait until rising_edge(clk);
        if old_A ='1' then
           if p = 2 then  -----nach jedem 2ten Highsignal_A, zählen
               p <= 0;
            p2 <= p2 +1;
           else 
            p <= p+1;
           end if;
        end if;
 end process;
 position <= std_logic_vector(to_signed(p2,32));

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  KIT (Gast)

>jetzt noch eine Frage, da ich nach jedem 2ten  Highpegelsignal des
>Drehgebers erst inkrementieren will, reicht dieses code aus??

Nein. Nimm einfach einen Zähler mit einem Bit mehr und ignorier das Bit 
0.

MFG
Falk

Autor: KIT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Falk,
schon mal danke für deine Idee,
was meisnt du genau mit :
>Nimm einfach einen Zähler mit einem Bit mehr und ignorier das Bit

bitte setz mal deine Ide in VHDL um,  ich bin ja nur Anfänger in VHDL.
Ich danke dir schon für deine Mühe.

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
KIT schrieb:
> Hallo Falk,
> schon mal danke für deine Idee,
> was meisnt du genau mit :
>>Nimm einfach einen Zähler mit einem Bit mehr und ignorier das Bit
>
> bitte setz mal deine Ide in VHDL um,  ich bin ja nur Anfänger in VHDL.
> Ich danke dir schon für deine Mühe.

Und du wirst auch ewig Anfänger bleiben wenn du nichts selbst machst. 
Das ist nun keine schwere Aufgabe, setz dich hin und probiere es bis es 
klappt. Von Falk wirst du wahrscheinlich keinen fertigen Code bekommen.

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

Bewertung
0 lesenswert
nicht lesenswert
>>> Signal_A <= inkr_A ;  -- Zusammenfassen der Eingänge A
Was soll denn hier zusammengefasst werden?
Später stellt sich heraus, dass das ein ordinäres einzelnes Bit ist...

Das hier ist schon falsch:
>>>> nach jedem 2ten Highsignal_A, zählen <<<<
Es müsste m.M. bestenfalls heißen:
>> jede 2. Flanke an Signal_A zählen <<
Warum denn nur jede 2.?

Seis drum. Das hier zählt jede fallende Flanke:
 process begin     -- Zählen     
     wait until rising_edge(clk);
         if old_A ='1' and in_A='0' then -- fallende Flanke am Eingangssignal
             p <= p+1;
         end if;
  end process;
  position <= std_logic_vector(to_signed(p,32));

Und wenns unbedingt nur jede 2.Flanke sein soll, dann würde ich das so 
ändern:
  position <= std_logic_vector(to_signed(p/2,32));


EDIT
D. I. schrieb:
> Und du wirst auch ewig Anfänger bleiben wenn du nichts selbst machst.
Das dient nur der Sicherung meines Arbeitsplatzes   ;-)

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wirst du von Andreas bezahlt :D

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

Bewertung
0 lesenswert
nicht lesenswert
D. I. schrieb:
> Wirst du von Andreas bezahlt :D
Nein, leider nicht... ;-)

Autor: KIT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Miller,
du bis ein Angel.
Ja du hast ja recht. Für jeden 2ten Signal , kann ich einfach der Zähler 
halbieren.
 Kurz Erklärung über mein Projekt:
Also ich benutze ein Ink-Drehgeber, der 500 (Striche)Impulse hat und ein 
H-Schriitmotor, der 1.8° pro schritt macht.Wenn die genau messwerte der 
schritten von dem Drehgeber erfassen werden sollen, mußt dann nach jedem 
2 oder 2.5 impulsen ein Schritt erfasst werden. schaut mal: der 
Drehgeber macht 360/500= 0.72° pro impuls und für 1.8°jedes mal zu 
erfassen braucht er dann immer 1.8/072 = 2.5 impulse.
Deswegen meine Idee :
>bei jedem 2ten abgetastete signal_A soll ein schritt gezält werden.
Diese gezälte Werte die ich mal 1.8° um die tasätchliche Drehwinkel zu 
berechen, werde ich dann beim Stillstand( Abbruch im Progarmm) des 
S-Motor mit dem Soll-Drehwinkel( gezählte Werte der Anzahl der 
Taktfrequenz, die die Transistor der H-Brücke von Ansteuerplatine 
ansteuern)  vergleichen und feststellen ob es Verlust entsteht oder 
nicht.

Ich glaube ich denn hier meine fasst mein Projekt verrat

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.