www.mikrocontroller.net

Forum: FPGA, VHDL & Co. VHDL IF Problem


Autor: Wulf (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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;

Autor: chris (Gast)
Datum:

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

Autor: Wulf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja, solltest mal den ganzen code posten ....

Autor: Wulf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: T.M. (Gast)
Datum:

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

Autor: Thorsten Fritzke (thorsten)
Datum:

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

Gruß

Autor: Wulf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Wulf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Fly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Wulf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klausurvorbereitung ... ;)

Autor: Wulf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mch doch einfach ne case-Verzweigung draus. In etwa so:
case (E0 & 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_B;
end case;

Sieht übersichtlicher aus und ergibt die selbe Funktion.

Autor: Alex H. (alex123)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Wulf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Wulf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Wulf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: TobiFlex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Wulf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: TobiFlex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Wulf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@TobiFlex 1000 Dank !
end THREAD;
;) Wulf

Autor: salas salas (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute ,

    ich bedanke mich im Voraus....

 salas

Autor: salas salas (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
da ist ein addierer mit 2 eingänge, aber ein Input ist ein

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

 salas

Autor: salas salas (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hallo leute , ich haette gern, dass ihr das nochmal sieht, ich warte auf
den Antwort..

 salas

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.