Forum: FPGA, VHDL & Co. Xst:528 Finde den Fehler nicht


von Tobboss (Gast)


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;

von Marcus W. (Gast)


Lesenswert?

Das Problem ist nicht ae, sondern ze. (ae wird wegoptimiert)

Du darfst ze nicht in zwei Prozessen neue Werte zuweisen.

Gruß

von Marcus W. (Gast)


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.

von Tobboss (Gast)


Lesenswert?

AH also hab ich die ganze Zeit das falsche gesucht. Vielen Dank! Ja 
nächstes mal als Anhang, sorry.

Problem gelöst :)

von Dr. Prof. Meu*** (Gast)


Lesenswert?

Na dann sind wir froh, dass wir ihnen helfen konnten. Immer diese 
Labore...

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.