www.mikrocontroller.net

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


Autor: brutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Daniel R. (daniel_r)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: SSI (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Daniel R. (daniel_r)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Ergebnis ist das Gleiche als bei der ersten Variante.

Daniel

Autor: Martin Kohler (mkohler)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Daniel R. (daniel_r)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das gibt ein wunderschönes Latch.

Autor: Martin Kohler (mkohler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wo ist das Problem, solange alle Timings eingehalten werden?

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo soll das ein Latch geben?

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Daniel R. (daniel_r)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Martin Kohler (mkohler)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jürgen Schuhmacher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: SSI (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum eigentlich ist das so?

zB. hier
http://www.doulos.com/knowhow/vhdl_designers_guide...
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;

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: SSI (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, alles klar. Danke!

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.