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


von Julian (Gast)


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;

von Joerg (Gast)


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.

von Mike (Gast)


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.

von Julian (Gast)


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)

von FPGAküchle (Gast)


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.

von FPGAküchle (Gast)


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.

von Joerg (Gast)


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.


von FPGAküchle (Gast)


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.

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.