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;
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.
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.
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)
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.
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.
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.
<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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.