VHDL / case

Gast
Hier ist ein Beispiel aus meinem Buch:

ENTITY if_und_case IS

  PORT (i:     IN  INTEGER RANGE 0 TO 9;
        a,b,c: IN  std_ulogic_vector (7 DOWNTO 0);
        z:     OUT std_ulogic_vector (7 DOWNTO 0));

END if_und_case;

------------------------------------------------------------------------ 
------
ARCHITECTURE case_variante OF if_und_case IS

BEGIN

  p1: PROCESS (i,a,b,c)
  BEGIN
    -- alle Zweige sind gleichwertig
    CASE i IS
      WHEN 3      => z <= a;
      WHEN 0 TO 2 => z <= b;
      WHEN OTHERS => z <= c;
    END CASE;
  END PROCESS p1;

END case_variante;
OP
noname wrote:
------------------------------------------------------------------------ 
------
> ARCHITECTURE case_variante OF if_und_case IS
>
> BEGIN
>
>   p1: PROCESS (i,a,b,c)
>   BEGIN
>     -- alle Zweige sind gleichwertig
>     CASE i IS
>       WHEN 3      => z <= a;
>       WHEN 0 TO 2 => z <= b;
>       WHEN OTHERS => z <= c;
>     END CASE;
>   END PROCESS p1;
>
> END case_variante;

genau das wurde mir bei der Klausur angestrichen. Man hat mir dann 
gesagt, dass case nur außerhalb eines Prozesses verwendet werden darf. 
Deshalb verstehe ich das nicht.
Gast
Das ist absoluter Schwachsinn. Ein Case darf natürlich in einem Prozess 
stehen (und wirkt praktisch wie ein IF, nur ohne Priorisierung)

Ich glaube das solltest du deinem Professor mal anstreichen ;)
Gast
Wie war denn die Aufgabenstellung? Und was genau hast du dann als 
Antwort gegeben? Vielleicht ergibt sich ja etwas aus dem Zusammenhang 
was so nicht geht.
OP
adpat wrote:
> Wie war denn die Aufgabenstellung? Und was genau hast du dann als
> Antwort gegeben? Vielleicht ergibt sich ja etwas aus dem Zusammenhang
> was so nicht geht.

In welchem Zusammenhang kann ich denn case nicht verwenden, wo ich if 
verwenden kann?

Wie genau die Aufgabenstellung war, kann ich nicht mehr genau sagen. Ich 
hab aber ein Prozess gebaut. Und in diesem Prozess habe ich dann ein 
Signal Array verglichen.

So in etwa:
1
CASE n IS
2
  WHEN '000' => o <= '1';
3
  WHEN '010' => o <= '1';
4
  .
5
  .
6
  WHEN OTHERS => o <= '0';
7
END CASE;

angestrichen wurde das case. Der Assistent hat mir dann gesagt 
(wortwörtlich):
"case wird nicht innerhalb von Prozessen verwendet. Ich habe extra in 
die Spezifikation reingeschaut. Und außerdem haben wir case in den 
Vorlesungen garnicht eingeführt"

Rückfrage von mir: Wo wird denn case sonnst verwendet
Er: Außerhalb von Prozessen

Deshalb wollte ich mal nachfragen, ob das wirklich so stimmt, was er 
erzählt hat. Denn ich habe nichts derartiges finden können.
Gast
Versuch mal ein case außerhalb eines Prozesses zu synthetisieren, da 
wird der Compiler aber schön meckern. Geht meiner Meinung nach nur 
innerhalb eines Prozesses, vielleicht hat der Assistent da was 
verwechselt...?
Fälle wo man nur if statt case verwenden kann, naja, es kommt halt drauf 
an was man haben will. Beim case entsteht schematisch gesehen ein 
Riesenmultiplexer, bei if-else-if-else hintereinandergehangene Muxer mit 
Priorisierung. If-else ist daher eher sinnvoll wenn man nicht über die 
ganze Bitbreite abfragt oder andere Abbruchbedingungen hat oder noch 
etwas anderes ab und zu mit der Abfrage verknüpfen will oder eben 
bestimmte Priorisierungen erreichen möchte usw. . Das könnte in der 
Aufgabenstellung eventuell der Fall gewesen sein, wobei die Behauptung 
dass ein case nicht in einem prozess stehen darf dabei trotzdem falsch 
ist.
Wenn die Aufgabe wirklich nur den Vergleich gefordert hat, wie du es 
kurz beschrieben hast, ohne irgendeine Bevorzugung eines Wertes, dann 
ist dein case korrekt. Wenn dabei nur ein Bit zu setzen ist könnte man 
möglicherweise bei günstigen Zahlenkonstellationen über nur ein ein 
if-else das ganze abfragen (z.B.
if (n(2) = 1) then
  o <= '0';
else
  o <= '1';
end if;
)
oder noch ein klein wenig verschachtelter und damit gegenüber dem case 
etwas sparen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.