mikrocontroller.net

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


Autor: Hans-Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hans-Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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"

Autor: Hans-Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.