Xst:528 Finde den Fehler nicht

Gast #1492727
Lesenswert?
• ▲
▼
Guten Tag.
Ich habe eine Parkhausschaltung programmiert, die bei Ein- und Ausfahrt 
die Zahl der freien Plätze hoch und runterzählt. Nun bekomme ich 
folgenden Fehler:
ERROR:Xst:528 - Multi-source in Unit <Parkhaus> on signal <ae<3>>; this 
signal is connected to multiple drivers.
Das gleiche halt noch für <ae<2>>, 1 und 0.
Mein ae (Ausgangsbus für die Einerstelle an LEDs) taucht nur in der 
entity und in einer Nebenläufigen Bedingung auf mit ae<=ze; wobei ze 
mein internes Ausgangssignal des niederwertigen BCD-Zählers ist.
Ich kopier euch mal den ganzen Quelltext, hoffe ihr könnt mir da helfen.

Ich bedanke mich im vorraus!



entity Parkhaus is
    Port ( clk : in  STD_LOGIC;
           north : in  STD_LOGIC;
           east : in  STD_LOGIC;
           south : in  STD_LOGIC;
           west : in  STD_LOGIC;
           e : in  STD_LOGIC_VECTOR (3 downto 0);
           az : out  STD_LOGIC_VECTOR (3 downto 0);
           ae : out  STD_LOGIC_VECTOR (3 downto 0);
           led_rot : out  STD_LOGIC;
           led_gruen : out  STD_LOGIC;
        --Testbench Flankenerkennung
        flanke_e : out std_logic;
        test_x : out std_logic;
        test_vr : out std_logic);

end Parkhaus;

architecture Verhalten of Parkhaus is
-- Signaldeklarationen
    signal x, ci_e, ze_zl, vr, zz_zl, ci_z : STD_LOGIC :='0';
    signal ze, zz : STD_LOGIC_VECTOR (3 downto 0) :="0000";

-- Deklaration für Flankenerkennung
type ZUSTAENDE is (A,B,C);
signal ZUSTAND, FOLGEZUSTAND : ZUSTAENDE;


begin
-- Pinbelegung Eingänge
  ze_zl <= south;
  zz_zl <= north;
  vr   <= east;        --bei vr=0 vorwärts, bei vr=1 rückwärts
  x    <= east xor west; --Signal für die Flankenerkennung

-- Flankenerkennung des ci_e am niederwertigen Zähler
    FLANKENERKENNUNG:  process (x, ZUSTAND)
    begin
      case ZUSTAND is
          when A=> if x='1' then FOLGEZUSTAND <=A;
                      else FOLGEZUSTAND <=B;
                      end if;
                      ci_e <= '0';
          when B=> if x='1' then FOLGEZUSTAND <=C;
                      else FOLGEZUSTAND <=B;
                      end if;
                      ci_e <= '0';
          when C=> if x='1' then FOLGEZUSTAND <=A;
                      else FOLGEZUSTAND <=B;
                      end if;
                      ci_e <= '1';
      end case;
    end process FLANKENERKENNUNG;

    ZUSTANDSWECHSEL: process (clk)
    begin
        if rising_edge(clk) then ZUSTAND<=FOLGEZUSTAND;
        end if;
    end process ZUSTANDSWECHSEL;

-- Niederwertiger BCD Zähler (Einer)
    BCD_LOW: process (clk, ci_e, ze_zl, e, vr, ze)
    begin

        if rising_edge(clk) then
          if ze_zl='1' then
              if e>9 then ze<="0000";
              else ze<=e;
              end if;
          else
              if ci_e='0' then ze<=ze;
              else
                  if vr='1' then
                      if ze=0 then ze<="1001";
                      else ze<=ze-1;
                      end if;
                  else
                      if ze=9 then ze<="0000";
                      else ze<=ze+1;
                      end if;
                  end if;
              end if;
          end if;
        end if;
    end process BCD_LOW;

-- Übertrag und Ausgabe
    ci_z<='1' when (ze="1001" and vr='0') or (ze="0000" and vr='1') else 
'0';
    ae<=ze;

-- Höherwertiger BCD Zähler (Zehner)
    BCD_HIGH: process (clk, ci_z, zz_zl, e, vr, zz)
    begin

        if rising_edge(clk) then
          if zz_zl='1' then
              if e>9 then ze<="0000";
              else zz<=e;
              end if;
          else
              if ci_z='0' then zz<=zz;
              else
                  if vr='1' then
                      if zz=0 then zz<="1001";
                      else zz<=zz-1;
                      end if;
                  else
                      if zz=9 then zz<="0000";
                      else zz<=zz+1;
                      end if;
                  end if;
              end if;
          end if;
        end if;
    end process BCD_HIGH;

-- Ampel

led_rot  <='1' when (zz="0000" and ze<"0101") else '0';
led_gruen<='1' when (zz/="0000" or ze>="0101") else '0';


-- Anzahl freier Plätze Zehnerstelle
  az<=zz;

-- Testbench
flanke_e<=ci_e;
test_x<=x;
test_vr<=vr;


end Verhalten;
Gast #1492752
Lesenswert?
• ▲
▼
Ach, ich seh grad, das ist nur ein Tippfehler :)
1
if e>9 then ze<="0000";

Sollte vermutlich so heißen:
1
if e>9 then zz<="0000";

Und in Zukunft solch langen Code bitte als Anhang, ist übersichtlicher.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren