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


von KIT (Gast)


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.
1
if rising_edge(clk) then
2
   count <= count + 1;
3
 IF count = "10" THEN
4
   signal_ausgang <= '0';
5
else 
6
  count <= count + 1;
7
end if;

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


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.

von Falk B. (falk)


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.
1
-- Zaehler mit steigender FLanke
2
process(clk)
3
begin
4
  if rising_edge(clk) then
5
    if count=4 THEN
6
      count <= "000";
7
    else
8
      count <= count + 1;
9
    end if;
10
  end if;
11
end if;
12
end process;
13
14
-- einfache Verzögerung mit fallender FLanke
15
16
process(clk)
17
begin
18
  if falling_edge(clk) then
19
    clk_del <= count(1);
20
  end if;
21
end if;
22
end process;
23
24
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

von KIT (Gast)


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.

von Falk B. (falk)


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

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


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...

von KIT (Gast)


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??
1
Signal_A <= inkr_A ;  -- Zusammenfassen der Eingänge A 
2
    process 
3
        begin -- Eintakten der  Signal
4
            wait until rising_edge(clk);
5
                 in_A <= Signal_A;
6
                 old_A <= in_A;
7
    end process;
8
    process      -- Weiterschalten und Zählen     
9
        begin
10
    wait until rising_edge(clk);
11
        if old_A ='1' then
12
           if p = 2 then  -----nach jedem 2ten Highsignal_A, zählen
13
               p <= 0;
14
            p2 <= p2 +1;
15
           else 
16
            p <= p+1;
17
           end if;
18
        end if;
19
 end process;
20
 position <= std_logic_vector(to_signed(p2,32));

von Falk B. (falk)


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

von KIT (Gast)


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.

von D. I. (Gast)


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.

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


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:
1
 process begin     -- Zählen     
2
     wait until rising_edge(clk);
3
         if old_A ='1' and in_A='0' then -- fallende Flanke am Eingangssignal
4
             p <= p+1;
5
         end if;
6
  end process;
7
  position <= std_logic_vector(to_signed(p,32));

Und wenns unbedingt nur jede 2.Flanke sein soll, dann würde ich das so 
ändern:
1
  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   ;-)

von D. I. (Gast)


Lesenswert?

Wirst du von Andreas bezahlt :D

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


Lesenswert?

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

von KIT (Gast)


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

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.