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;
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
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;
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