www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Frequenzteiler in VHDL funktioniert nicht!


Autor: Julian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Ich versuche einen Frequenzteiler in VHDL zu programmieren, nur bei der 
Simulation bekomme ich immer ein xxx für den Zählvektor c_freq, er 
sollte doch bei jedem clk um eins erhöt werden.
Bitte um Hilfe, komme nicht weiter.

CODE:

signal clk_n : std_logic;
signal c_freq : std_logic_vector(3 downto 0);
...
process(clk)
begin

  if rising_edge(clk) then
    c_freq <= c_freq + 1;

   if c_freq = "1111" then
    clk_n <= '1';
    c_freq <=  "0000";

    elsif c_freq /= "1111" then
                clk_n <= '0';
    end if;

  end if;
end process;

Autor: Joerg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

du musst den counter erstmal mit einem reset signal initialisieren:

process(clk, reset)
begin
  if reset='1' then
    c_freq <= "0000";
  elsif rising_edge(clk) then
    c_freq <= c_freq + 1;

    if c_freq = "1111" then
      clk_n <= '1';
      c_freq <=  "0000";
    elsif c_freq /= "1111" then
      clk_n <= '0';
    end if;
  end if;
end process;


Das sollte dann gehen.

Dir ist klar, dass die Bedingungen fuer "1111" und "0000" nicht nach der 
Addition getestet werden, sondern parallel? Signalzuweisungen werden 
erst uebernommen, wenn der Process durchgelaufen ist!

  j.

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Zählerwert wird mit jedem Takt erhöht. Wenn du das programmierst, 
dann funktioniert das auch. Es kann aber sein das dein Teiler (je nach 
Logikfamilie) eine Einlaufphase hat die bei jedem Einschalten anders 
aussieht.

Zur Anzeige eines Wertes braucht der Simulator aber einen Wert ab dem er 
hochzählen kann. Du solltest deinem Signal daher mit := noch einen 
Initialwert zuweisen. Der Simulator ist dann glücklich und zeigt den 
Wert an.

Ein externer Reset geht natürlich auch. Du brauchst dann noch etwas 
Logik die dir das Signal erzeugt.

Autor: Julian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antwort.
Wie kann ich ein Reset Signal intern erzeugen (im Programm), also ohne 
das man irgend ein Schalter oder so betätigen muss.
(Das wird später dann auf die Hardware geladen)

Autor: FPGAküchle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So


signal c_freq : std_logic_vector(3 downto 0) := "0000";


oder


signal c_freq : std_logic_vector(3 downto 0) := (others => '0');

Du müsst also nur die vorhandene Signaldeklaration erweitern.

Üblicherweise nimmt man "Alles Null" für den Initwert, du kannst aber 
gern auch einen anderen wert eintragen.

Autor: FPGAküchle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ergänzung:

Das erzeugt dir kein resetsignal sondern den Power UP -zustand für den 
Frequenzcounter. D.H. du kannst auf das reset signal verzichten und der 
Zähler ist dennoch immer definiert.

Autor: Joerg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wegen Reset ohne wirklich vorhandenes reset signal:

Ich habe die Erfahrung gemacht, dass das ISE den Reset-Fall erkennt, und 
alle
Reister entsprechend vorinitialisiert. D.h. man muss nach der 
Konfiguration des FPGA gar keinen reset anlegen.


Habe dieses Verhalten aber nie in der Doku beschieben gesehen, daher 
kann ich nicht sagen ob man sich darauf verlassen kann.

Allerdings sagt mein VHDL Buch, dass man sich auf default Werte bei 
Signalen
auch nicht verlassen kann -- zumindest nicht bei der Synthese, nur bei 
der Simulation.


Autor: FPGAküchle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
<Allerdings sagt mein VHDL Buch, dass man sich auf default Werte bei
<Signalen
<auch nicht verlassen kann -- zumindest nicht bei der Synthese, nur bei
<der Simulation.

Xilinx sagt, seit ISE 8.1 (evtl. auch früher) kann man sich auf die 
Defaultwerte auch für die Synthese verlassen. Meine Erfahrung sagt mit 
der Einschrängung FSM mit symbolischer Kodierung das selbe. Xilinx hält 
sich bis auf SDonderfälle bei Zustandsautomaten an den default wert, 
auch für die Synthese.

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.