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;
Das Problem ist nicht ae, sondern ze. (ae wird wegoptimiert) Du darfst ze nicht in zwei Prozessen neue Werte zuweisen. Gruß
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.
AH also hab ich die ganze Zeit das falsche gesucht. Vielen Dank! Ja nächstes mal als Anhang, sorry. Problem gelöst :)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.