Forum: FPGA, VHDL & Co. Frage zu VHDL Code


von brutz (Gast)


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;

von Daniel R. (daniel_r)


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

von SSI (Gast)


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;

von Daniel R. (daniel_r)


Lesenswert?

Das Ergebnis ist das Gleiche als bei der ersten Variante.

Daniel

von Martin K. (mkohler)


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;

von Daniel R. (daniel_r)


Lesenswert?

Das gibt ein wunderschönes Latch.

von Martin K. (mkohler)


Lesenswert?

Und wo ist das Problem, solange alle Timings eingehalten werden?

von Klaus F. (kfalser)


Lesenswert?

Wo soll das ein Latch geben?

von T.M. (Gast)


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.

von Daniel R. (daniel_r)


Lesenswert?

Das Ding hat keinen Takt, also ist es pegelgesteuert, also ist es rein
hardwaretechnisch ein Latch(oder etwa nicht...wenn nicht, warum?).
Macht aber in dem Fall nichts...

von Martin K. (mkohler)


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.

von Jürgen Schuhmacher (Gast)


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

von SSI (Gast)


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;

von Klaus F. (kfalser)


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

von SSI (Gast)


Lesenswert?

Ok, alles klar. Danke!

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.