Gast
#1492727
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;