2 Stimmen

VHDL - Wie erkennt man eine Änderung an std_logic_vector?

Ich habe einen std_logic_vector und muss wissen, wann sich etwas daran ändert. Bisher habe ich das geschrieben:

process (cp, l1)
begin
    if rising_edge(cp) then
        rL1 <= l1;
    end if;
end process;
tickL1 <= rL1 xor l1;

rL1 ist eine verzögerte Version von l1, und l1 ist der std_logic_vector, den ich auf Änderungen überprüfe. Das Problem ist, dass xor einen std_logic_vector zurückgibt, ich aber nur 0 oder 1 brauche. Wie kann ich das bekommen?

1 Stimmen

Das ist nicht ganz klar. Möchtest du wissen, wann es sich ändert oder was sich ändert?

0 Stimmen

Gerade wenn sich etwas ändert, ist es mir egal, was sich ändert.

9voto

Paul S Punkte 7485

Warum hat jeder eine Obsession mit XOR?

changed <= '0', wenn rL1 = l1 sonst '1';

0 Stimmen

Hahah thx :D Ich habe nur "geändert <= rL1 = l1" ausprobiert, aber das hat nicht funktioniert, weil = einen booleschen Wert zurückgibt und nicht std_logic. Außerdem habe ich "when" vergessen :)

0 Stimmen

Führt eine solche Implementierung nicht zu Frequenzverlust und erhöhtem Ressourcenverbrauch im Vergleich zur xor-Implementierung?

3 Stimmen

@AlehDouhi was denkst du, was ein Gleichheitsvergleich synthetisieren wird? Wahrscheinlich ein XOR und ein OR reduzieren. Also bekommst du wahrscheinlich dasselbe, aber du könntest eine kleinere, schnellere Methode bekommen, an die du nicht gedacht hast. Regel 1 für lesbaren Code, sag, was du meinst, und optimiere nur, wenn nötig. Regel 1 für schnellen Code, sag, was du meinst, und beschränke den Compiler / Synthesizer nicht auf eine (und nur eine) Implementierung.

3voto

Sebastian Dressler Punkte 7884

Sie können verwenden

change <= or_reduce(tickL1)

oder

change <= or_reduce(rL1 xor l1);

Was alle Signale des Ergebnisses verodert, sodass wenn eines davon 1 ist, das Signal change auch 1 sein wird.

Bearbeiten: Alle diese Reduzierungsfunktionen sind in ieee.std_logic_misc.all enthalten.

0 Stimmen

Wenn ich or_reduce verwende, erhalte ich die Meldung "Undefiniertes Symbol 'or_reduce'". Können Sie mir sagen, was ich einfügen sollte?

2 Stimmen

Du musst ieee.std_logic_misc.all verwenden.

0voto

Gustavo Vargas Punkte 2319

Sie können versuchen:

process (cp, l1)
begin
    if rising_edge(cp) then
        rL1 <= l1;
    end if;
end process;
changed <= '0' when (rL1 xor l1) = (others => '0') else '1';

In diesem Fall ist changed ein einzelnes Bit.

Ich erinnere mich nicht wirklich, ob Sie den others-Operator in einer Bedingung verwenden können... deshalb sagte ich "Sie können es versuchen"... Lassen Sie mich also wissen, ob es funktioniert....

0 Stimmen

Leider funktioniert dies nicht (Fehler: Kann die "anderen" Werte in der Aggregation nicht bestimmen. (LRM 7.3.2.2)).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X