VHDL / case

Gast #544672
Lesenswert?

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 #544713
Lesenswert?

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 #544806
Lesenswert?

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 ;)
OP #544819
Lesenswert?

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 #545033
Lesenswert?

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

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