Hier mal ein einfacher Frequenzteiler. Ich habe irgendwo etwas geändert und jetzt fehlt mir das clock-Signal und dadurch geht nichts mehr. Seh den Wald vor lauter Bäumen nicht mehr. Zusatz: Enable wird nicht benutzt ! library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity frequenzteiler is generic (teiler : integer := 5); port (clock : in std_logic; reset : in std_logic; enable : in std_logic; cout : out std_logic ); end frequenzteiler; architecture frequenzteiler_rtl of frequenzteiler is signal positive_counter : natural range 0 to (teiler-1); signal negative_counter : natural range 0 to (teiler-1); signal hilf1 : bit; signal hilf2 : bit; begin -- Zählt die positiven Taktflanken process (clock, reset) begin if (reset = '1') then positive_counter <= 0; elsif (rising_edge(clock)) then if positive_counter < (teiler-1) then positive_counter <= positive_counter + 1; else positive_counter <= 0; end if; end if; end process; -- Zählt die negativen Taktflanken process (clock, reset) begin if (reset = '1') then negative_counter <= 0; elsif (falling_edge(clock)) then if negative_counter < (teiler-1) then negative_counter <= negative_counter + 1; else negative_counter <= 0; end if; end if; end process; -- Generisches ungerades Teilerverhältnis hilf1 <= '1' when negative_counter < ((teiler-1)/2) else '0'; hilf2 <= '1' when positive_counter < ((teiler-1)/2) else '0'; cout <= '1' when (hilf1 = '1' or hilf2 = '1') else '0'; end frequenzteiler_rtl; Eine simple Testbench zur Erzeugung des clock-Signals : LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_unsigned.all; USE ieee.numeric_std.ALL; ENTITY TestBench_vhd IS END TestBench_vhd; ARCHITECTURE behavior OF TestBench_vhd IS -- Component Declaration for the Unit Under Test (UUT) COMPONENT frequenzteiler PORT( clock : IN std_logic; reset : IN std_logic; enable : IN std_logic; cout : OUT std_logic ); END COMPONENT; --Inputs SIGNAL clock : std_logic := '0'; SIGNAL reset : std_logic := '0'; SIGNAL enable : std_logic := '0'; --Outputs SIGNAL cout : std_logic; constant clock_period: time := 20 ns; signal stop_the_clock: boolean := false; BEGIN -- Instantiate the Unit Under Test (UUT) uut: frequenzteiler PORT MAP( clock => clock, reset => reset, enable => enable, cout => cout ); stimulus:process begin reset <= '1'; wait for 10 ns; reset <= '0'; wait; end process; clocking : process begin while not stop_the_clock loop clock <= '1'; wait for clock_period / 2; clock <= '0'; wait for clock_period / 2; end loop; end process; END;
FlipFlops an fallender UND steigender Taktflanke, und die Ausgänge dann auch noch verknüpfen -> böse. Was bezweckst du damit? Schau dir mal die VHDL Grundregeln an und halte dich daran, nur so hast du gute Chancen auf einen Erfolg.
Ich nehme an du wolltest auf eine andere Mail antworten. Da hier ein ungerades Teilerverhältnis realisiert wird benötigt man zwei verschiedene Prozesse für steigende und fallende Flanken. Flip-Flops können nur auf steigende aber fallende Flanken reagieren. Mittels generic kann man dann einen Teiler für beliebige ungerade Teilerverhältnisse realisieren. Für gerade Teilerverhältnisse geht es einfacher. Das ganze hat ja bereits funktioniert, nur momentan nicht. Also bitte die VHDL Grundregeln selber lesen.
OK, damit ist es schonmal kein "einfacher Frequenzteiler". Schreib doch nächstes mal gleich dazu was du machen möchtest, es gibt hier oft genug Beiträge von Leuten die ohne Not die seltsamsten Taktkonstruktionen verwenden möchten. Und eine Fehlerbeschreibung wie "Habe irgendwie den Clock verloren" verleitet auch nicht gerade dazu darauf zu vertrauen dass der Autor weiß was er tut. Auch für einen ungeraden Teiler gilt: zwei Vergleicherausgänge, deren Eingänge sich mit unterschiedlichen Flanken ändern, zu verknüpfen ist keine gute Idee. Ein Beispiel für einen ungeraden Teiler ohne Glitches gibt es hier: Beitrag "Re: Frequenzteiler durch gerade Zahlen"
Hallo Andreas, die Simulation mit ISE Webpack funktioniert wieder. Lässt sich natürlich auch synthetisieren. Ich muss die Bedingungen hinter dem when anscheinend in Klammern setzen. Siehe unten. -- Generisches ungerades Teilerverhältnis hilf1 <= '1' when (negative_counter < ((teiler-1)/2)) else '0'; hilf2 <= '1' when (positive_counter < ((teiler-1)/2)) else '0'; cout <= '1' when ((hilf1 = '1') or (hilf2 = '1')) else '0'; Warum mir durch diesen Fehler (?) dann auch kein clock-Signal im ISE Simulator angezeigt wird ist mir noch schleierhaft. Das ISE Webpack macht auch in der Version 10.1 noch Probleme wenn es nicht auf der Partition C installiert wird. Frohes Schaffen
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.