Caseanweisung kontrollierten Bereich ansteuern

#3729891
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 :)
Moderator (Firma: Titel) Persönliche Seite #3729937
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?
#3729946
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 :)
Gast #3729951
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,
Moderator (Firma: Titel) Persönliche Seite #3729965
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;

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