VHDL IF Problem

Gast #389117
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;
Angehängte Dateien:
Gast #389119
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
Gast #389122
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
Gast #389125
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.
Gast #389126
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...
Gast #389129
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;
Gast #389130
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.
#389131
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
Gast #389132
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;
Gast #389134
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
Gast #389135
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
Gast #389137
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren