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


von mikrofriendly (Gast)


Lesenswert?

Hallo,

folgendes codeschniplsel funktioniert nicht so wie ich es will :)
1
  imp_det_process:process(clk)
2
    variable vec:vector(1 to 5);
3
  begin
4
    vec(1)   := y0;
5
    vec(2)   := sw0;
6
    vec(3)   := clk;
7
    vec(4)   := y1;
8
    vec(5)   := sw1;
9
    
10
    case vec is
11
      when "--100" => y0     <= '1'; start <= '1';
12
      when "--1-1" => start  <= '0';
13
      when "---1-" => y0     <= '0';
14
      when "001--" => y0     <= '1'; start <= '1';
15
      when "101--" => start  <= '0';
16
      when "-1---" => y0     <= '0';
17
  end case;
18
  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

von mikrofriendly (Gast)


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 :/

von mikrofriendly (Gast)


Lesenswert?

eindeutig:
1
  imp_det_process:process(clk)
2
  begin
3
    if(clk='1' and sw0='0' and y0='0') then
4
         start  <= '1'; 
5
         y0     <= '1'; 
6
    elsif(clk='1' and y0='1') then 
7
        start  <= '0';
8
    elsif(sw0='1') then
9
        y0     <= '0';
10
    elsif(clk='1' and sw1='0' and y1='0') then 
11
        y1     <= '1'; 
12
        stop  <= '1';
13
    elsif(clk='1' and y1='1') then
14
        stop   <= '0';
15
    elsif(sw1='1') then
16
        y1     <= '0';
17
    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

von berndl (Gast)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Case wählt 1 Zustand aus einer Liste von Möglichkeiten aus. Was sollte 
Case denn hier machen, wenn vect "00100" ist:
1
    case vec is
2
      when "--100" => y0     <= '1'; start <= '1'; -- Ja, was denn? Das hier ...
3
      :
4
      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/1164/std_logic.html

Und deshalb wird das hier
1
    case vec is
2
      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.

von mikrofriendly (Gast)


Lesenswert?

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

MFG

von D. I. (Gast)


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

von SuperWilly (Gast)


Lesenswert?

Hi,

ein Auszug aus dem neuen VHDL-2008 Standard:
1
There is a new version of case which allows don't care behaviour, case?. Here is an example:
2
3
4
  case? sel is
5
  when "1---" =>
6
    o <= "11";
7
  when "-1--" =>
8
    o <= "10";
9
  when "--1-" =>
10
    o <= "01";
11
  when "---1" =>
12
    o <= "00";
13
  when others =>
14
    null;
15
  end case;
16
17
18
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'.
19
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

von SuperWilly (Gast)


Lesenswert?

Noch etwas:
http://www.doulos.com/knowhow/vhdl_designers_guide/vhdl_2008/

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

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.