Forum: FPGA, VHDL & Co. kurzer Code zum überprüfen BITTE


von Gerhard L. (gerhard494)


Lesenswert?

Habe hier dieses kleine Programm geschrieben.
Es soll über einen Taster auf dem Actel Development Board
eine LED-Reihe zählen lassen. wir haben auf dem Board nur eine
25 MHz Quelle und diese hätte ich zum entprellen benutzt.
Dadurch musste ich sie sehr stark herunterteilen.
Dieses Programm funktioniert jedoch nicht.

Das einzige das Funktioniert ist der reset.
Hätte jmd ne idee was da falsch ist.
Bin kein vhdl Profi ;-)

########################################################

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;


entity ledrei is
port(leds: out std_logic_vector(7 downto 0);
     keyleft, reset, clk: in std_logic);
end ledrei;


architecture steuerung of ledrei is

signal x: std_logic_vector(7 downto 0) := (others=>'0');
signal cntres: std_logic_vector (2 downto 0);
signal clkslow: std_logic := '0';
signal cnt1: integer := 1;
signal cnt2: integer := 1;

begin
      leds <= x;

    clock: process (clk)
    begin

        if (clk'event and clk = '1') then
            if (cnt1 <= 0) then
                cnt2 <= cnt2 - 1;
                cnt1 <= 5;
            else
                cnt1 <= cnt1 - 1;
            end if;

            if (cnt2 <= 0) then
                cnt2 <= 5;
                clkslow <= '1';
            else
                clkslow <= '0';
            end if;
        end if;
    end process clock;


    entprellen: process (clkslow)
  begin

        if (reset = '1') then
            cntres <= (others =>'0');
        elsif (clkslow = '1' ) then
            cntres(2) <= cntres(1);
            cntres(1) <= cntres(0);
            cntres(0) <= keyleft;
        end if;


    end process entprellen;


    gleicherWert: process (clkslow)
    begin

    if (reset = '1') then
            x<= (others => '0');

    elsif (clkslow = '1') then

      if (cntres = "111") then
                x <= x + '1';
            end if;

        end if;

    end process gleicherWert;

    leds <= x;

end steuerung;

#######################################################################

von Matthias F. (flint)


Lesenswert?

Bin auch kein Profi aber ein, zwei Tipps kann ich dir geben:

Das keyleft ist ein asynchroner Eingang, das heißt, dass du ihn 
einsynchronisieren musst, damit es nicht zu Metastabilität kommen kann.

Du solltest dir auch anschauen, wie ein getakteter Prozess auszusehen 
hat, der gleicherWert macht nur getaktet Sinn, so wie er dasteht wird 
das Synthesetool das aber nicht erkennen und daraus kombinatorische 
Logik bauen.

Und eine eigene Clock sollte man auch nicht so erzeugen sondern 
stattdessen ein Clock Enable verwenden. Dazu gibts hier meines Wissens 
einen guten Artikel, der auch mir das Ganze damals begreifbar gemacht 
hat.

von gast (Gast)


Lesenswert?

Deine "Entprelltimeout" ist wohl zu kurz, oder?

von gerh (Gast)


Lesenswert?

könnte mir wer die linkd zu den Threads geben die oben beschrieben sind

von Gast (Gast)


Lesenswert?

Taktung FPGA/CPLD

Grundsätzlich solltest du in diesem Fall dein gesamtes Design synchron 
machen.
Das heißt, du lässt alle Prozesse nur auf clk (und reset) reagieren, 
nicht auf clkslow. Diesen fragst du nur bei clk'event... ab.

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.