Forum: FPGA, VHDL & Co. Signalerzeugung


von Road Runner (Gast)


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!

von Rick Dangerus (Gast)


Lesenswert?

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

Rick

von Road Runner (Gast)


Lesenswert?

Danke Rick!

Das ist Super!

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

von Alex H. (alex123)


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

von T.M. (Gast)


Lesenswert?

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

von Alex H. (alex123)


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

von Alex H. (alex123)


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

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.