Caseanweisung kontrollierten Bereich ansteuern

OP #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?
OP #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

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.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.