www.mikrocontroller.net

Forum: FPGA, VHDL & Co. vhdl kontrollstruktur case mit vektoren


Autor: mikrofriendly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

folgendes codeschniplsel funktioniert nicht so wie ich es will :)
  imp_det_process:process(clk)
    variable vec:vector(1 to 5);
  begin
    vec(1)   := y0;
    vec(2)   := sw0;
    vec(3)   := clk;
    vec(4)   := y1;
    vec(5)   := sw1;
    
    case vec is
      when "--100" => y0     <= '1'; start <= '1';
      when "--1-1" => start  <= '0';
      when "---1-" => y0     <= '0';
      when "001--" => y0     <= '1'; start <= '1';
      when "101--" => start  <= '0';
      when "-1---" => y0     <= '0';
  end case;
  end process imp_det_process;

Es soll sich hierbei um eine Flankenerkennung handeln, bei dem wie bei 
einem monoflop das ausgangsignal nur eine taktperiode an bleibt, 
unabhängig davon wie die eingänge stehen.

die logik ist auch richtig, zumindest, wenn es dies diskret mit if 
strukturen aufbaue funktionert es.. warum nicht mit einer casestruktur ?
ist der vektorenzugriff überhaupt gültig?

MFG

Autor: mikrofriendly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm ich noch noch ein bisschen herumprobiert und durch modelsim konnte 
ich jedenfalls gut sehen, das case mit con care anscheinend nichts 
anfangen kann.
case abfragen ohen dont care funktioniere :/

Autor: mikrofriendly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
eindeutig:
  imp_det_process:process(clk)
  begin
    if(clk='1' and sw0='0' and y0='0') then
         start  <= '1'; 
         y0     <= '1'; 
    elsif(clk='1' and y0='1') then 
        start  <= '0';
    elsif(sw0='1') then
        y0     <= '0';
    elsif(clk='1' and sw1='0' and y1='0') then 
        y1     <= '1'; 
        stop  <= '1';
    elsif(clk='1' and y1='1') then
        stop   <= '0';
    elsif(sw1='1') then
        y1     <= '0';
    end if;

so funktioniert es :)
aber ich finde gebirge aus if steukturen nicht so schön wie case 
strukturen.. wie würdet ihr das realisieren, wenn dont care mit 
vorkommen?

MFG

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und du bist sicher, dass dein case oben dem if-elsif (also mit 
Prioritaetserkennung) entspricht? Die case oben in beliebiger 
Reihenfolge sollen identisch zu dem if-elsif sein?

Ich kenne don't cares nur von Verilog (mit casex) und habe es nur fuer 
one-hot verwendet.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Case wählt 1 Zustand aus einer Liste von Möglichkeiten aus. Was sollte 
Case denn hier machen, wenn vect "00100" ist:
    case vec is
      when "--100" => y0     <= '1'; start <= '1'; -- Ja, was denn? Das hier ...
      :
      when "001--" => y0     <= '1'; start <= '1'; -- ... oder das hier?

Dabei ist es in erster Näherung irrelevant, dass hinterher das selbe 
passieren soll. Es geht bereits die Auswahl schief...

Zudem ist "don't care" nicht das, was es übersetzt heißt, sondern ein 
definierter Wert im Datentyp std_logic.
http://www.cs.sfu.ca/~ggbaker/reference/std_logic/...

Und deshalb wird das hier
    case vec is
      when "--100" => y0     <= '1'; start <= '1';
nur dann wahr, wenn vec genau "--100" ist!!!

Nur, wenn z.B. einem Signal ein Wert '-' und parallel ein anderer Wert 
zugeweisen wird, kann das Signal mit der Resolution-Table aufgelöst 
werden.
[vdhl]
   a <= '0';
   a <= '-';
[/vhdl]
wird also a='0' ergeben.

Autor: mikrofriendly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja verzeihung ich habe mich bei den ausgängen verschrieben.. dennoch 
funktioniert dieses Dont care bei case anweisungen nicht.

MFG

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mikrofriendly schrieb:
> Ja verzeihung ich habe mich bei den ausgängen verschrieben.. dennoch
> funktioniert dieses Dont care bei case anweisungen nicht.
>
> MFG

und Lothar hat dir gesagt warum

Autor: SuperWilly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ein Auszug aus dem neuen VHDL-2008 Standard:

There is a new version of case which allows don't care behaviour, case?. Here is an example:


  case? sel is
  when "1---" =>
    o <= "11";
  when "-1--" =>
    o <= "10";
  when "--1-" =>
    o <= "01";
  when "---1" =>
    o <= "00";
  when others =>
    null;
  end case;


The comparison is carried out using the matching equality operator ?= which means that the don't care character - is truly treated as don't care, and also that (for instance) 'H' matches '1'.
Allow '-' in case? choice provided all choices are non-overlapping.


Dies bedeutet: Wenn man nicht überlappende Case-Zweige voraussetzen 
kann, ist die Verwendung von Don't Cares in Ordnung.
Das einzige Problem: noch sehr magere Unterstützung von VHDL-2008 durch 
Synthese-Tools, kommt aber bestimmt noch ;-)

Gruß,
SuperWilly

Autor: SuperWilly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch etwas:
http://www.doulos.com/knowhow/vhdl_designers_guide...

Support for some of these changes has begun to appear in simulators. 
Widespread support is only expected once the IEEE standard is published, 
and tool vendors consider that there is sufficient demand for the 
changes from their customers.


In diesem Sinne: Fröhliches Nachfragen bei den Tool-Herstellern :O)

Gruß,
SuperWilly

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.