Forum: FPGA, VHDL & Co. Habe irgendwie den Clock verloren


von Hans-Werner (Gast)


Lesenswert?

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;

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

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.

von Hans-Werner (Gast)


Lesenswert?

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.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

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"

von Hans-Werner (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.