Frage zu VHDL Code

Gast #418085
Lesenswert?

Hallo

Beim folgenden Code wird der Takt (Takt100) geteilt, indem bei der
steigenden Taktflanke, das Signal für den halben Takt (Takt50)
invertiert wird.
Gleichzeitig wird der halbierte Takt bei der steigenden Flanke des
ursprünglichen Takts einem Ausgang zugewiesen.

Dazu eine Frage:
Welcher Wert wird ausgabe jeweils zugewiesen ?
(Der Wert von Takt50 wird ja sozusagen während der Zuweisung geändert)



architecture Behavioral of code is
signal Takt50: std_logic := '0';
begin

  process (Takt100)
  begin
    if (Takt100 = '1') and (Takt100'event) then
      Takt50 <= not Takt50;
    end if;
  end process;

  process (Takt100)
  begin
    if (Takt100 = '1') and (Takt100'event) then
      ausgabe <= Takt50;
    end if;
  end process;

end Behavioral;
#418086
Lesenswert?

ausgabe hat immer den invertierten Wert von Takt50. Das liegt daran,
dass Takt50 sich erst kurz nach der steigenden Flanke ändert. ausgabe
übernimmt den Wert von Takt50, der bei der steigenden Flanke noch
anliegt. ausgabe verpasst sozusagen die Änderung des Wertes von
Takt50.

Daniel
Gast #418087
Lesenswert?

Und wenn man so machen würde?

architecture Behavioral of code is
signal Takt50: std_logic := '0';
begin

  process (Takt100)
  begin
    if (Takt100 = '1') and (Takt100'event) then
      Takt50 <= not Takt50;
      ausgabe <= Takt50;
    end if;
  end process;

end Behavioral;
#418089
Lesenswert?

Der Takt wird sofort ausgegeben, wenn du die Ausgabe aus dem process
rausnimmst:

architecture Behavioral of code is
signal Takt50: std_logic := '0';
begin

  process (Takt100)
  begin
    if (Takt100 = '1') and (Takt100'event) then
      Takt50 <= not Takt50;
    end if;
  end process;

  ausgabe <= Takt50;

end Behavioral;
Gast #418093
Lesenswert?

Nirgendswo gibts da ein Latch. Das ist doch die normale Vorgehensweise,
interne Signale, wenn man die auch lesen will, und die werden mit
nebenläufiger Zuweisung auf einen Ausgang gelegt. Das selbe macht man
doch auch bei Zählern zB.
#418095
Lesenswert?

Nein, kein Latch.

'Takt50' wird auf auf jede steigende Flanke von 'Takt100'
invertiert, also liegt nach der Flanke 'Takt50' am Ausgang des
FlipFlops an.

Eben dieser Ausgang wird dann noch als 'ausgabe' ausgegeben. Da wird
rein gar nichts mehr gelatcht zwischendurch.

Das ganze ergibt lediglich ein D-FF mit Loopback des Ausgangs
invertiert auf den Eingang zurueck.
Gast #418096
Lesenswert?

Das Latch ist hier im Takt50 zu sehen, wobei ich nicht wüsste, wo da das
Problem ist und wie man es anders machen sollte und warum ...

Der Ausgang ist kein Problem, kommt ja doch direkt aus einem Register.
Etwas anderes wäre, wenn da noch reine Kombinatorik mit reden würde.

Wenn die Ausgabe nochmal gelatched werden soll (z.B. zusätzliches
Register, um es in die IO-Zelle zu packen) dann muss der Takt eben
invertiert ausgegeben werden. Wenn die Flanken des 100ers und des 50ers
passen sollen, dann eben nochmal durch ein FF durch:

TAKT100 : 0101010101010101
TAKT 50 : 0110011001100110
nTAKT50 : 1001100110011001 (comb
clocked : x1001100110011001 (clocked)

Ausgabe : xxx00110011001100 (50clocked nochmal mit 100er geclocked)
(Flanken passen) 2 clks delay
Gast #418097
Lesenswert?

Warum eigentlich ist das so?

zB. hier
http://www.doulos.com/knowhow/vhdl_designers_guide/processes/
steht "The statements within processes execute sequentially, not
concurrently." Also wenn diese beide Anweisungen in einem precess
sind, sollte das auch "richtig" sein, oder? :

architecture Behavioral of code is
signal Takt50: std_logic := '0';
begin

  process (Takt100)
  begin
    if (Takt100 = '1') and (Takt100'event) then
      Takt50 <= not Takt50;
      ausgabe <= Takt50;
    end if;
  end process;

end Behavioral;
#418098
Lesenswert?

Was verstehst Du unter richtig ? Es

In Deinem Beispiel oben werden 2 FF erzeugt, und Ausgabe ist zu Takt50
um eine Flanke verzögert.
Wenn du
ausgabe <= Takt50;
aus dem Process herausnimmst, dann sind "ausgabe" und "Takt50"
synchron.
Es hängt davon ab was man wünscht.

Grüße
Klaus

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren