mikrocontroller.net

Forum: FPGA, VHDL & Co. Signalerzeugung


Autor: Road Runner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich erhalte eine kontinuierliche Signalfolge -> 00, 01, 11, 00, ...

Jedes Signal liegt eine bestimmte Zeit(20-30 Taktperionden) an, bevor
es sofort von dem drauffolgenden Signal abgelöst wird.

Wie kann ich diese Signalfolge benützend einen "Takt" daraus
ableiten?
Als Ergebnis möchte ich, jedesmal wenn sich das anliegende Signal
ändert, einen Impuls von 1-Clk-Takt Länge erhalten.

so etwa:

   00               01              11             00      01
XXXXXXXXXXXXXyyyyyyyyyyyyyyyyyyZZZZZZZZZZZZZZZZXXXXXXXXXXyyyyyy
|-|__________|-|_______________|-|_____________|-|_______|-|___


Danke!


Die Signalfolge sind die Zustaände eines Automaten!

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Differenz zwischen zwei Signalen bilden, falls die ungleich Null
ist, deinen Takt auslösen.

Rick

Autor: Road Runner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Rick!

Das ist Super!

(Ich hatte eine kompliziertere Lösung :( Bleibt aber erspart! :) )

Autor: Alex H. (alex123)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Die Differenz ... bilden

Bzw. hier reicht ein einfacher Vergleich aus.

Sig1 ist Dein Input.
...
if Reset ...
elsif rising_edge (clock) .....
  Pulse <= '0';
  Sig2 <= Sig1;
  if Sig1 = Sig2 then
    Pulse <= '1'
  end if;
end if;
(Setzt voraus, dass Sich Sig1 nicht 2mal hintereinander
ändert, aber das hast Du oben ja geschrieben.)

Gruss,

Alex

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein XOR kann hier wertvolle Dienste leisten.
Da kann man auch auf das IF Konstrukt verzichten.

Autor: Alex H. (alex123)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ein XOR kann hier wertvolle Dienste leisten

... 00, 01, 11 ist aber ein Bus und kein Signal ...

Alex

PS: Wenn ich 2 XORs nehme und ein OR Gatter, dann
ist das auch wie ein IF ...

Autor: Alex H. (alex123)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es geht auch ein "ungleich"-Vergleich, also
Pulse <= (To_unsigned(Sig1) /= To_unsigned(Sig2));
Hab die genaue Syntax gerade nicht im Kopf, weiss nicht
ob to_unsigned das auf std_logic oder bit_vector geht,
ggf. auch direkt als Type-cast, /= kann leider kein
std_logic_vector oder bit_vector.

Oder ein XOR auf den Vector und danach OR_REDUCE (wenn
man die entsprechenden Packages hat) oder so ... ;-)
Pulse <= OR_REDUCE(XOR(Sig1, Sig2));
(Weiss die Schreibweise gerade nicht auswendig.)

Viele Wege führen nach Rom.

Alex

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.