Forum: FPGA, VHDL & Co. VHDL IF Problem


von Wulf (Gast)


Angehängte Dateien:

Lesenswert?

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;

von chris (Gast)


Lesenswert?

was is es denn genauer für ein Problem ?  Fehlermeldung ? oder abrietet
es nicht so wie du es willst ?

von Wulf (Gast)


Lesenswert?

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

von T.M. (Gast)


Lesenswert?

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.

von chris (Gast)


Lesenswert?

ja, solltest mal den ganzen code posten ....

von Wulf (Gast)


Lesenswert?

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

von T.M. (Gast)


Lesenswert?

Bei der 2. when Bedingung ist ein end if am Ende zuviel.
Und dann muss ZV mit in die Prozessliste rein.

von Thorsten F. (thorsten)


Lesenswert?

Ich möchte mich als VHDL Neuling nicht festlegen, aber heisst es statt
"else" nicht "elsif"?

Gruß

von Wulf (Gast)


Lesenswert?

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.

von Wulf (Gast)


Lesenswert?

@ 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...

von Fly (Gast)


Lesenswert?

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.

von Wulf (Gast)


Lesenswert?

Klausurvorbereitung ... ;)

von Wulf (Gast)


Lesenswert?

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;

von T.M. (Gast)


Lesenswert?

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.

von Alex H. (alex123)


Lesenswert?

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

von Wulf (Gast)


Lesenswert?

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;

von Wulf (Gast)


Lesenswert?

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

von Wulf (Gast)


Lesenswert?

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

von TobiFlex (Gast)


Lesenswert?

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

von Wulf (Gast)


Lesenswert?

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

von TobiFlex (Gast)


Lesenswert?

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

von Wulf (Gast)


Lesenswert?

@TobiFlex 1000 Dank !
end THREAD;
;) Wulf

von salas salas (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute ,

    ich bedanke mich im Voraus....

 salas

von salas salas (Gast)


Angehängte Dateien:

Lesenswert?

da ist ein addierer mit 2 eingänge, aber ein Input ist ein

     koefficient ,... im dokumment ist alles dabei...

 salas

von salas salas (Gast)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.