mikrocontroller.net

Forum: FPGA, VHDL & Co. VHDL / case


Autor: Mathias Braun (dedi)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Kest (Gast)
Datum:

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

Kest

Autor: noname (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Mathias Braun (dedi)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: adpat (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mathias Braun (dedi)
Datum:

Bewertung
0 lesenswert
nicht 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:
CASE n IS
  WHEN '000' => o <= '1';
  WHEN '010' => o <= '1';
  .
  .
  WHEN OTHERS => o <= '0';
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.

Autor: Stefan Hanke (stefanhanke)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: adpat (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mathias Braun (dedi)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael Niegl (bigmike47)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.