Hallo ! Ich möchte den Ablauf folgender Steuerung realisieren. Ein Schlitten soll diagonal (von links unten nach rechts oben) verfahren werden. Leider macht mir folgende if Schleife Probleme ... Hoffe Ihr könnt mal darüberschauen und mir ggf helfen. Danke & Gruß Wulf when B=> if (EO='0')then if (EL='1')then AL<='0'; AR<='0'; AO<='1'; AU<='0'; ZVNEU<=B; else AL<='1'; AR<='0'; AO<='1'; AU<='0'; ZVNEU<=B; end if; else if (EL='0')then AL<='1'; AR<='0'; AO<='0'; AU<='0'; ZVNEU<=B; else AL<='0'; AR<='0'; AO<='0'; AU<='0'; ZVNEU<=A_INIT; end if; end if; end case; end process;
was is es denn genauer für ein Problem ? Fehlermeldung ? oder abrietet es nicht so wie du es willst ?
Fehlermeldung wäre schön, liefert jedoch Error bei der Synthese. Komme nicht voran - quält mich ;( Habe schon überlegt das anders zu beschreiben, nur wie? "case" hilft leider auch nicht weiter. Siehst Du eine alternative Variante? Muss jetzt einmal grundsätzlich fragen ob die oben eingesetzte if-Struktur in dieser Art OK ist. (Error bezieht sich explizit auf s.o. Zeile 3, also genau dort wo sich das 2. if einklinkt: if ... then if...) Danke und Gruss Wulf
Ich denke hier hilft nur 1. die Fehlermeldung und 2. der komplette Code weiter. Zum Beispiel den Rest der case-Anweisung würde helfen. So an sich ist die if-Verzweigung nicht falsch.
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity KREUZTISCH is Port ( EU : in STD_LOGIC; EL : in STD_LOGIC; EO : in STD_LOGIC; ER : in STD_LOGIC; AU : out STD_LOGIC; AL : out STD_LOGIC; AO : out STD_LOGIC; AR : out STD_LOGIC; CLK : in STD_LOGIC; RESET : in STD_LOGIC); end KREUZTISCH; architecture Behavioral of KREUZTISCH is type ZV_TYPE is ( ZU_A_INIT , ZU_B ) ; signal ZV , ZVNEU : ZV_TYPE ; begin ZV_TOP : process ( CLK , RESET ) begin if ( RESET = '1' ) then ZV <= ZU_A_INIT ; else if ( CLK'event and CLK = '1' ) then ZV <= ZVNEU ; end if ; end if ; end process ; ASSIGN_PROC : process ( EL , ER , EO , EU , START ) begin case ZV is when ZU_A_INIT => if ( EU = '0' ) then AU<='1'; AL<='0'; AO<='0'; AR<='0'; ZVNEU<=ZU_INIT_A; else if ( EL = '0' ) then AU<='0'; AL<='1'; AO<='0'; AR<='0'; ZVNEU<=ZU_INIT_A; else if ( START = '0' ) then AU<='0'; AL<='0'; AO<='0'; AR<='0'; ZVNEU<=ZU_INIT_A; else AU<='0'; AL<='0'; AO<='0'; AR<='0'; ZVNEU<=ZU_B; end if; end if; end if; when ZU_B => if ( EO = '0' ) then if ( ER = '1' ) AU<='0'; AL<='0'; AO<='1'; AR<='0'; ZVNEU<=ZU_B; else AU<='0'; AL<='0'; AO<='1'; AR<='1'; ZVNEU<=ZU_B; end if; else if ( ER = '0' )then AU<='0'; AL<='0'; AO<='0'; AR<='1'; ZVNEU<=ZU_B; else AU<='0'; AL<='0'; AO<='0'; AR<='0'; ZVNEU<=ZU_A_INIT; end if; end if; end if; end case; end process; end Behavioral; Hier die Fehlermeldung: ERROR:HDLParsers:164 - "D:/Temp/xilinx/KREUZTISCH/Ablauf.vhd" Line 104. parse error, unexpected ELSIF, expecting END ERROR:HDLParsers:164 - "D:/Temp/xilinx/KREUZTISCH/Ablauf.vhd" Line 110. parse error, unexpected ELSIF, expecting END ERROR:HDLParsers:164 - "D:/Temp/xilinx/KREUZTISCH/Ablauf.vhd" Line 116. parse error, unexpected ELSIF, expecting END ERROR:HDLParsers:164 - "D:/Temp/xilinx/KREUZTISCH/Ablauf.vhd" Line 122. parse error, unexpected IF, expecting PROCESS Danke & Gruß Wulf
Bei der 2. when Bedingung ist ein end if am Ende zuviel. Und dann muss ZV mit in die Prozessliste rein.
1 "end if" zuviel, stimmt. Danke! Auch ZV habe ich in die Prozessliste eingefügt, (obwohl ich das nicht verstehe, da dies ja oben als internes Signal deklariert ist ?!) doch leider selbe Error Meldungen wie zuvor.
@ Thorsten elsif kannst du als 2. if auffassen. Wenn 1. Condition nicht zutrifft wird die 2. Condition geprüft. Theoretisch ist das möglich, weis aber nicht ob man mehrere elsif´s hintereinander schreiben kann. Probiert hatte ich das auch schon aber ... when B=> if (EO='0' and ER='0') then AL<='0'; AR<='1'; AO<='1'; AU<='0'; ZVNEU<=B; elsif (EO='0' and ER='1') then AL<='0'; AR<='0'; AO<='1'; AU<='0'; ZVNEU<=B; elsif (EO=1 and ER='0') then AL<='0'; AR<='1'; AO<='0'; AU<='0'; ZVNEU<=B; else AL<='0'; AR<='0'; AO<='0'; AU<='0'; ZVNEU<=A_INIT; end if; end case; ... etc...
Hmmm wäre es bei einer so einfachen Funktionsweise nicht enorm leichter den Schaltplan zu malen ? Ich habe auf diese Weise schon einige Male super schnell und immer au Anhieb Erfolg gehabt.
Kann man Zustand ZU_B auch mit einzelnen if Schleifen beschreiben ? Suche nach einer wasserdichten Variante ! Danke und Gruß Wulf when ZU_B=> if (EO='0' and ER='0') then AL<='0'; AR<='1'; AO<='1'; AU<='0'; ZVNEU<=ZU_B; end if; if (EO='0' and ER='1') then AL<='0'; AR<='0'; AO<='1'; AU<='0'; ZVNEU<=ZU_B; end if; if (EO=1 and ER='0') then AL<='0'; AR<='1'; AO<='0'; AU<='0'; ZVNEU<=ZU_B; end if; if (EO=1 and ER='1') then AL<='0'; AR<='0'; AO<='0'; AU<='0'; ZVNEU<=ZU_B; end if;
Mch doch einfach ne case-Verzweigung draus. In etwa so:
1 | case (E0 & ER) is |
2 | when "00" => |
3 | AL<='0'; |
4 | AR<='1'; |
5 | AO<='1'; |
6 | AU<='0'; |
7 | ZVNEU<=ZU_B; |
8 | when "01" => |
9 | AL<='0'; |
10 | AR<='0'; |
11 | AO<='1'; |
12 | AU<='0'; |
13 | ZVNEU<=ZU_B; |
14 | when "10" => |
15 | AL<='0'; |
16 | AR<='1'; |
17 | AO<='0'; |
18 | AU<='0'; |
19 | ZVNEU<=ZU_B; |
20 | when others => |
21 | AL<='0'; |
22 | AR<='0'; |
23 | AO<='0'; |
24 | AU<='0'; |
25 | ZVNEU<=ZU_B; |
26 | end case; |
Sieht übersichtlicher aus und ergibt die selbe Funktion.
Hallo Wulf, > Auch ZV habe ich in die Prozessliste eingefügt, (obwohl > ich das nicht > verstehe, da dies ja oben als internes Signal deklariert > ist ?!) doch leider selbe Error Meldungen wie zuvor. Wenn Du einen kombinatorischen Prozess hast (ohne clock), dann sollte alle Signale, die im Prozess verwendet werden auch in der Sensitivity-Liste sein. Grund: Die Synthese geht i.d.R. davon aus. Bei der Simulation würde der Prozess nicht gestartet, wenn ZV sich ändert, aber nicht in der Sensitivity-Liste ist. Daher könnte ggf. das Verhalten nach der Synthese nicht mehr zur Simulation passen. > ... doch leider selbe Error Meldungen wie zuvor. Treten jetzt noch Fehler auf? Wenn ja, poste Deinen neuen Code mit den neuen Fehlermeldungen. Du hast oben nen Prozess mit clock. Ich würde hier die Clockflanke in ein elsif schreiben anstelle else if ... Weiss nicht, ob dies für die Synthese zwingend notwendig, aber das elsif clock'event and clock=1 (oder elsif rising_edge(Clock)) ist gängige Praxis. Bzgl. der einzelnen IF's. Prinzipiell wäre das möglich, die erste Lösung hat aber den Vorteil, dass im Grunde entweder .. oder .. oder ausgeführt wird, bei den hintereinandergeschriebenen IF's könnten auch mehrere nacheinander ausgeführt werden. Abgesehen davon würd ich auch das Case von T.M. verwenden. Gruss, Alex
T.M. und Alex vielen Dank ! Bei der Synthese erhalte ich dennoch folgende Errormeldungen ERROR:HDLParsers:164 - "D:/Temp/xilinx/KREUZTISCH/Ablauf.vhd" Line 104. parse error, unexpected ELSIF, expecting END ERROR:HDLParsers:164 - "D:/Temp/xilinx/KREUZTISCH/Ablauf.vhd" Line 110. parse error, unexpected ELSIF, expecting END ERROR:HDLParsers:164 - "D:/Temp/xilinx/KREUZTISCH/Ablauf.vhd" Line 116. parse error, unexpected ELSIF, expecting END ERROR:HDLParsers:164 - "D:/Temp/xilinx/KREUZTISCH/Ablauf.vhd" Line 122. parse error, unexpected IF, expecting PROCESS Verrückter Weise beziehen sich diese Meldungen auf die Zeilen 100++, doch meine gesamte Beschreibung hat nur 97 Zeilen. Selbes Problem auch ein einem neuen Projektordner. Hier noch einmal der Code Danke & Gruß Wulf =================================================== library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity KREUZTISCH2 is Port ( EU : in STD_LOGIC; EL : in STD_LOGIC; EO : in STD_LOGIC; ER : in STD_LOGIC; AU : out STD_LOGIC; AL : out STD_LOGIC; AO : out STD_LOGIC; AR : out STD_LOGIC; CLK : in STD_LOGIC; RESET : in STD_LOGIC); end KREUZTISCH2; architecture Behavioral of KREUZTISCH2 is type ZV_TYPE is ( ZU_A_INIT , ZU_B ) ; signal ZV , ZVNEU : ZV_TYPE ; begin ZV_TOP : process (ZV, ZVNEU, CLK , RESET ) begin if ( RESET = '1' ) then ZV <= ZU_A_INIT ; elsif rising_edge(Clock) ZV <= ZVNEU ; end if ; end process ; ASSIGN_PROC : process ( ZV, EL , ER , EO , EU , START ) begin case ZV is when ZU_A_INIT => if ( EU = '0' ) then AU<='1'; AL<='0'; AO<='0'; AR<='0'; ZVNEU<=ZU_INIT_A; else if ( EL = '0' ) then AU<='0'; AL<='1'; AO<='0'; AR<='0'; ZVNEU<=ZU_INIT_A; else if ( START = '0' ) then AU<='0'; AL<='0'; AO<='0'; AR<='0'; ZVNEU<=ZU_INIT_A; else AU<='0'; AL<='0'; AO<='0'; AR<='0'; ZVNEU<=ZU_B; end if; end if; end if; when ZU_B => case (EO and ER) is when "00" => AL<='0'; AR<='1'; AO<='1'; AU<='0'; ZVNEU<=ZU_B; when "01" => AL<='0'; AR<='0'; AO<='1'; AU<='0'; ZVNEU<=ZU_B; when "10" => AL<='0'; AR<='1'; AO<='0'; AU<='0'; ZVNEU<=ZU_B; when others => AL<='0'; AR<='0'; AO<='0'; AU<='0'; ZVNEU<=ZU_A_INIT; end case; end case; end process; end Behavioral;
Bitte um Entschuldigung - letzte Beschreibung enthält einige Fehler ... war wohl zu früh am Morgen. Werde die neue Version asap posten. Danke und Gruß Wulf
Es läuft ;) if ... THEN > unterschlagen. Bitte um Entschuldigung für das lange Post. Trotzdem bitte noch eine abschliessende Frage bzgl. der Realisierung mit CASE. Müssen in diesem Fall Hilfsvariable zur Auswertung eingesetzt werden oder könnte der Code von T.M. 1:1 eingesetzt werden. case (EO and ER) is when "00" => Wird 00 direkt als Kombination der Eingangsvariablen betrachtet ? Danke & Gruß Wulf
Böse Falle: T.M. schreibt: "case (E0 & ER) is" Du schreibst: "case (EO and ER) is" Das ist nicht das Gleiche! "case (E0 & ER) is" bildet einen std_logic_vector (1 downto 0), "case (EO and ER) is" bildet das logische UND und bleibt damit std_logic, also nur '0' oder '1'. Da ist nicht das was Du willst. Viele Grüße TobiFlex
Hallo TobiFlex ! Vielen Dank für den Hinweis ! Letzte Frage: Muss dieser std_logic_vektor irgendwie deklariert werden oder ist er direkt einsetzbar ? Vielen Dank & Gruß Wulf
In diesem Fall kann er direkt in dem CASE-Struct eingesetzt werden. Ich würde ihn hier als temporär bezeichnen weil er nur im Zusammenhang mit der Fallunterscheidung durch "WHEN" eine Rolle spielt. Und ob das wirklich ein std_logic_vektor ist hängt von den Signalen in der CASE-Klammer ab. In deinem Code sind ja EO und ER vom Typ std-logic und werden somit zu einem std_logic_vektor durch den &-Operator verbunden. WHEN "00" =>... WHEN "01" =>... ... Ich hoffe das war es was Du wissen wolltest? Viele Grüße TobiFlex
da ist ein addierer mit 2 eingänge, aber ein Input ist ein koefficient ,... im dokumment ist alles dabei... salas
hallo leute , ich haette gern, dass ihr das nochmal sieht, ich warte auf den Antwort.. salas
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.