Forum: FPGA, VHDL & Co. VHDL / case


von Mathias B. (dedi)


Lesenswert?

Hallo Leute,

ich habe mal eine Frage: Wieso darf "case" nicht in einem Prozess 
verwendet werden? Wieso muss man da denn if abfragen verwenden?

von Kest (Gast)


Lesenswert?

Oh doch... es geht! Es gibt verschiedene Arten von case -- lies mal die 
Doku.

Kest

von noname (Gast)


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;

von Mathias B. (dedi)


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.

von Johannes S. (Gast)


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 ;)

von adpat (Gast)


Lesenswert?

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.

von Mathias B. (dedi)


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.

von Stefan H. (stefanhanke)


Lesenswert?

Mathias Braun wrote:
> "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"

kopf -> wand
 -- stefan

von adpat (Gast)


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.

von Mathias B. (dedi)


Lesenswert?

Mit welchem Programm kann ich denn ganz einfach den VHDL Code 
Syntetisieren? Sorry, aber VHDL war bei mir bisher nur reine 
Stift-Papier geschichte.

von Falk B. (falk)


Lesenswert?

@ Mathias Braun

>Mit welchem Programm kann ich denn ganz einfach den VHDL Code
>Syntetisieren?

Mit den Softwarepaketen der jeweiligen Hersteller der programmierbaren 
Bausteine.

Also Xilinx, Altera, Lattice & Co.

MfG
Falk

von Michael N. (bigmike47)


Lesenswert?

also case geht definitiv NUR in process. Außerhalb nennt sich das 
analoge konstrukt "with .... select".

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.