mikrocontroller.net

Forum: FPGA, VHDL & Co. flankenerkennung für externen takt


Autor: rene (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,
ich hab da ein problem vllt kann mir da jemand helfen. Also ich hab ein 
Systemtakt von 66MHZ und ein externer takt von 3kHz ich mach eine neg 
Fankenerkennung mit folgendem prinzip
process(CLK)
 begin
   if rising_edge(CLK) then
    if RESET = '1' then
     signal_syn <= '0';
     signal_last <= '0';
    else
     signal_syn <= externtakt;
     signal_last <= signal_syn;
    signal_rising <= not signal_syn and  signal_last;
end if;
   end if;
 end process;

es funktioniert aber nicht richtig kann es sein das der externe takt zu 
schnell ist für diese prinzig???
VIELEN DANK

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@rene (Gast)

>es funktioniert aber nicht richtig

Ist Reset auf 0?

>kann es sein das der externe takt zu
>schnell ist für diese prinzig???

Nein. Lass das Reset weg, ist hier überflüssig.

MFG
Falk

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

Bewertung
0 lesenswert
nicht lesenswert
> es funktioniert aber nicht richtig
Was funktioniert nicht?
Die Simulation?
Das Design im Zielsystem?
Ist das ein FPGA oder CPLD?

BTW: die Simulation ist garantiert falsch, denn die Sensitivliste ist 
unvollständig. Wenn du schon einen asynchronen Reset beschribst, dann 
muß der auch mit rein:
process(RESET,CLK) ...

> Also ich hab ein Systemtakt von 66MHZ und ein externer takt von 3kHz
> ... kann es sein das der externe takt zu schnell ist
Nein. Eher ist der 66MHz-Takt zu schnell, wenn die Flankensteilheit des 
3kHz-Signals relativ flach ist. Dann erkennst du evtl. mehrere Flanken 
schnell hintereinander wo eigentlich nur 1 Flanke ist.

> ich mach eine neg Fankenerkennung
Und nennst dein Ergebnissignal dann rising. Das ist brutal :-o

Dein Code ist kurz und trotzdem macht er mir fast einen Knoten ins Hirn:
1. Du brauchst keinen Reset.
2. Nimm ein Schieberegister.
3. Du mußt nicht jedes Signal nochmal im Namen mit signal_ ansprechen.

Das hier mal als Vorschlag
 flankensr : std_logic_vector(1 downto 0) := "00";
 falledge  : std_logic := '0';
 :
 process (CLK) begin
   if rising_edge(CLK) then
     flankensr <= flankensr(0) & externtakt;
--     if (flankensr = "10") then falledge <= '1';  -- Entweder so....
--     else                       falledge <= '0';  -- ...
--     end if;                                      -- ...
   end if;
 end process;
 :
 falledge <= '1' when flankensr = "10" else '0';    -- ... oder so.

Autor: rene (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
erst mal vielen dank
@lothar
zur beruhigung das ist nicht der orign. code hab das nur schnell 
hingeschrieben.
1. das ist ein fpga
2.simulation geht alles nur auf der hardware nicht
3. die flanken des esternen takt sind sehr steil

frage zu deinem code
meckert der compiler nicht bei der zuweisung
flankensr <= flankensr(0) & externtakt;
da flankensr 2bit groß ist und du ihm darauf nur ein bit einfach zuweist 
ohne zu sagen wohin?? ich kenn das so nicht?? anfänger halt

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

Bewertung
0 lesenswert
nicht lesenswert
> da flankensr 2bit groß ist und du ihm darauf nur ein bit einfach zuweist
Da werden durchaus 2 Bit zugewiesen. Sieh dir mal die Funktion des & 
Operators (Concatenation, Verknüpfung) in VHDL an.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  rene (Gast)

>zur beruhigung das ist nicht der orign. code hab das nur schnell
>hingeschrieben.

Patsch

Für so ein Blödsinn KANN man nur Ohrfeigen verteilen!
Siehe Netiquette!!!

>2.simulation geht alles nur auf der hardware nicht

Wie so oft ;-)

>3. die flanken des esternen takt sind sehr steil

Ja und? Das ist der Sinn der Sache!

MfG
Falk

Autor: S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Rene,

was heisst "funktioniert nicht richtig" in HW. Immer, oder nur manchmal, 
oder manchmal nicht?

Takte das externe Signal mal 2mal nach, bevor Du die Flanke detektierts.

Sig1 <= ExtClock;
Sig2 <= Sig1;
dann erst das Signal, dass dann auf die Flanke geprüft wird.
Sig3 <= Sig2;
EdgeDetection <= (not Sig2) and Sig3;

Ist es beabsichtigt, hier nur nen 1-Takt breiten Impuls zu erzeugen?

Mit was verarbeitest Du denn dann diesen Impuls?
Ist der externe Takt glitchfrei?

Gruss,

S.



PS:

> BTW: die Simulation ist garantiert falsch, denn die Sensitivliste ist
> unvollständig. Wenn du schon einen asynchronen Reset beschribst, dann
> muß der auch mit rein:
> process(RESET,CLK) ...

Hmmm, ist das nicht ein synchroner Reset in dem Beispiel, und damit dann 
die Sensitivity Liste richtig ?   :-)
Aber ich nehm auch lieber Async Reset ...

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.