Forum: FPGA, VHDL & Co. Caseanweisung kontrollierten Bereich ansteuern


von Max K. (mku)


Lesenswert?

hi

ich möchte gerne bei mir eine Case-Anweisung so steuer, dass deren 
Bereich nur unter Bedingungen angesteuert werden kann. Wenn diese 
Bedingung nicht aktiv ist, soll es halt automatisch in die "when others" 
springen.

ist das möglich?

ich habe es so programmiert, aber Quartus akzeptiert das so in der Form 
leider nicht so ganz (davor sind auch schon "when" anweisungen):
1
if (anzahl = 2 or anzahl = 3 or anzahl = 4 or anzahl = 5 or anzahl = 6 or anzahl = 7 or anzahl = 8 or anzahl = 9) then
2
      when 32 => data_out <= x"1B";  
3
      when 33 => data_out <= x"E2";  
4
      when 34 => data_out <= x"00";  
5
      when 35 => data_out <= x"F0";  
6
      when 36 => data_out <= x"09";  
7
      when 37 => data_out <= x"06";   
8
      when 38 => data_out <= x"E2";  
9
      when 39 => data_out <= x"10";  
10
      when 40 => data_out <= x"F0";  
11
      when 41 => data_out <= x"07";
12
      when 42 => data_out <= x"06";  
13
      when 43 => data_out <= x"E2";  
14
      when 44 => data_out <= x"01";  
15
      when 45 => data_out <= x"F0";  
16
      when 46 => data_out <= x"00";
17
    end if;

Muss ich viel aufwendiger bei jedem einzelnen "when" die IF-Anweisung 
einfügen?

Danke :)

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Max K. schrieb:
> aber Quartus akzeptiert das so in der Form leider nicht so ganz
Ja, das ist ein klarer Syntaxfehler. Du vermischt hier Kraut (if) und 
Rüben (case)...

von Max K. (mku)


Lesenswert?

also bleibt mir wohl nur der weg, es so zu programmieren, da dies 
funktioniert?
1
when 7 => 
2
              if anzahl = 1 then
3
                data_out <= x"1C";  
4
              elsif anzahl = 2 then
5
                data_out <= x"2B";
6
--.....

von user (Gast)


Lesenswert?

Du kannst das ganze in einer Schleife schreiben, also i von 2 bis 9 
iterieren und mit anzahl vergleichen

for i in 2 to 9 loop
  if i = anzahl then
    case wert
      when 32 => ...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

user schrieb:
> Du kannst ...
... das eben nicht, weil vor dem "when 32" noch ein "when 31" kommt.

Ich würde da einfach die case-Abfrage beim "when 31" abbrechen, und dann 
mit einer if-Abfrage die "when 32" bis "when 46" abhandeln.

Das hier:
1
if (anzahl = 2 or anzahl = 3 or anzahl = 4 or anzahl = 5 or anzahl = 6 or anzahl = 7 or anzahl = 8 or anzahl = 9) then
könnte man auch so schreiben:
1
if (anzahl >= 2 and anzahl <= 9) then
dann wirds auch schon leserlicher...

Was passiert mit data_out eigentlich, wenn keine der Bedingungen 
zutrifft?

: Bearbeitet durch Moderator
von Max K. (mku)


Lesenswert?

bei dem data_out soll, wenn keine case zutrifft immer das ausgegeben 
werden:
1
when others => data_out <= x"00";

Also statt in eine große Case, diese immer beenden und die Bedingungen, 
die ich mit If habe in eine separate neue Case case.

mit dem:
1
if (anzahl >= 2 and anzahl <= 9) then

hast du recht :)

von Punkt Setzer (Gast)


Lesenswert?

Max K. schrieb:


> ich habe es so programmiert, aber Quartus akzeptiert das so in der Form
> leider nicht so ganz (davor sind auch schon "when" anweisungen):
> if (anzahl = 2 or anzahl = 3 or anzahl = 4 or anzahl = 5 or anzahl = 6
> or anzahl = 7 or anzahl = 8 or anzahl = 9) then
>       when 32 => data_out <= x"1B";
>       when 33 => data_out <= x"E2";
>       when 34 => data_out <= x"00";
>       when 35 => data_out <= x"F0";
>       when 36 => data_out <= x"09";
>       when 37 => data_out <= x"06";
>       when 38 => data_out <= x"E2";
>       when 39 => data_out <= x"10";
>       when 40 => data_out <= x"F0";
>       when 41 => data_out <= x"07";
>       when 42 => data_out <= x"06";
>       when 43 => data_out <= x"E2";
>       when 44 => data_out <= x"01";
>       when 45 => data_out <= x"F0";
>       when 46 => data_out <= x"00";
>     end if;
>
> Muss ich viel aufwendiger bei jedem einzelnen "when" die IF-Anweisung
> einfügen?

Nicht programmieren, sondern als ROM-Tabelle beschreiben.
1
--schnipsel start
2
constant ROM : T_ROM_64x8:= (X"00", X"00",
3
--schnipsel ende

dann
1
dataout <= Rom_table(anzahl);

Greeting Earthlings,

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Punkt Setzer schrieb:
> Nicht programmieren, sondern als ROM-Tabelle beschreiben.
Es geht nicht, weil der originale Quellcode etwa so aussieht:
1
      when 30 => data_out <= x"05";  
2
      when 31 => data_out <= x"15";  
3
if (anzahl = 2 or anzahl = 3 or anzahl = 4 or anzahl = 5 or anzahl = 6 or anzahl = 7 or anzahl = 8 or anzahl = 9) then
4
      when 32 => data_out <= x"1B";  
5
      when 33 => data_out <= x"E2";  
6
      when 34 => data_out <= x"00";  
7
      when 35 => data_out <= x"F0";  
8
      when 36 => data_out <= x"09";  
9
      when 37 => data_out <= x"06";   
10
      when 38 => data_out <= x"E2";  
11
      when 39 => data_out <= x"10";  
12
      when 40 => data_out <= x"F0";  
13
      when 41 => data_out <= x"07";
14
      when 42 => data_out <= x"06";  
15
      when 43 => data_out <= x"E2";  
16
      when 44 => data_out <= x"01";  
17
      when 45 => data_out <= x"F0";  
18
      when 46 => data_out <= x"00";
19
    end if;
20
      when 47 => data_out <= x"02";
21
      when 48 => data_out <= x"20";
Diese Info ist versteckt in dem, was Max K. schrieb:
>>>> (davor sind auch schon "when" anweisungen)


Max K. schrieb:
> Also statt in eine große Case, diese immer beenden und die Bedingungen,
> die ich mit If habe in eine separate neue Case case.
Oder so:
1
      when 32 => if (anzahl >= 2 and anzahl <= 9) then data_out <= x"1B"; end if;  
2
      when 33 => if (anzahl >= 2 and anzahl <= 9) then data_out <= x"E2"; end if;  
3
      when 34 => if (anzahl >= 2 and anzahl <= 9) then data_out <= x"00"; end if;

: Bearbeitet durch Moderator
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.