Forum: FPGA, VHDL & Co. Don't care in VHDL


von TM (Gast)


Lesenswert?

Hallo,

Ich habe momentan ein kleines Problem ich beschreibe einen Multiplexer 
mit don't care Bedingungen. Leider ist mein Ergebnis in ISIM ein anderes 
als ich haben moechte er waehlt nie einen der Pfade aus die eigentlich 
selektiert wurden. Der Code sieht wie folgt aus:
1
TickCntrl:process(INSTR_IN(7 downto 0))
2
begin
3
  case INSTR_IN(7 downto 0) is 
4
      when "1110----"=>
5
        pc_tick_int  <= '1';
6
      when "000011--"=>
7
        pc_tick_int  <= '1';
8
      when others =>
9
        pc_tick_int  <= '0';
10
  end case;
11
end process;

Oder wird dieses Konstrukt anders verwendet als ich es mir denke ?
Oder wie kann man es besser beschreiben ?

Gruss Tobias

von pc_tick_int (Gast)


Lesenswert?

pc_tick_int <= '1' when (INSTR_IN(7 downto 4)="1110" or INSTR_IN(7 
downto 2)="000011" else '0'


zu dem don't care kann ich leider nix sagen

von Duke Scarring (Gast)


Lesenswert?

Als ich das letzte Mal was mit Don't care gemacht habe, hat das der 
Synthesizer auch nicht richtig gefressen :-(
Ist aber auch schon ein paar Jahre her. Vielleicht geht es inzwischen 
besser.

Alternativ kannst Du ein if-then-elsif draus machen:
1
TickCntrl:process(INSTR_IN(7 downto 0))
2
begin
3
  if INSTR_IN(7 downto 4) = "1110" then
4
    pc_tick_int  <= '1';
5
  elsif  INSTR_IN(7 downto 2) = "000011" 
6
    pc_tick_int  <= '1';
7
  else
8
    pc_tick_int  <= '0';
9
  end if;
10
end process;
Läßt sich zwar nicht ganz so schön lesen, aber funktioniert.

Duke

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


Lesenswert?

TM schrieb:
> Leider ist mein Ergebnis in ISIM ein anderes
> als ich haben moechte er waehlt nie einen der Pfade aus die eigentlich
> selektiert wurden.
Klar, für den Simulator ist ein '-' nämlich genau ein '-'. Und 
deshalb wird er den Case "1110----" nur dann erreichen, wenn genau 
"1110----" in INSTR_IN auftritt...   :-o

Und da hilft es leider gar nichts, dass der Synthesizer das 
zwischenzeitlich tatsächlich umsetzen könnte...

von Duke Scarring (Gast)


Lesenswert?

Lothar Miller schrieb:
> Klar, für den Simulator ist ein '-' nämlich genau ein '-'.
Das ist aber ziemlich dumm, vom Simulator. Es heißt ja nicht umsonst 
"don't care"...

Duke

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


Lesenswert?

Duke Scarring schrieb:
> Das ist aber ziemlich dumm, vom Simulator.
Naja, der lässt sich ja auch kein 'X' für ein 'U' vormachen...   ;-)

von Sven P. (Gast)


Lesenswert?

Daran merkt man eigentlich ganz gut, dass VHDL streng genommen ja nur 
'zweckentfremdet' ist für die Synthese.

VHDL kennt keinen STD_LOGIC(_VECTOR), der wird selbst erst in ein einer 
Bibliothek in VHDL beschrieben. Ein VHDL-Werkzeug wird sich entsprechend 
wenig Kopf drum machen. Du könntest die Bibliothek ja auch umschreiben 
und statt '-' irgendein anderes Zeichen nehmen. Ein STD_LOGIC_VECTOR ist 
einfach nur eine Zeichenkette ohne tiefere Bedeutung. Für if-Abfragen 
gibt es für solche Fälle z.B. die std_match-Funktion. Die 
interpretiert diese Zeichenketten dann.

Im aktuellsten VHDL-Standard aber hat man das berücksichtigt. Da gibt es 
jetzt unter andrem so eine 'case?'-Statement-Krücke. Die verhält sich 
dann, wie eine lange if-Kette mit std_match in den einzelnen Abfragen.

von TM (Gast)


Lesenswert?

Hmm ok ziehmlich schade weil es wirklich uebersichtlich ausschaut. Naja 
wird es wohl eien if elsif konstruktions

von bko (Gast)


Lesenswert?

also in VDHL-2008 gibt es nun das sog. "The matching case statement":

http://www.doulos.com/knowhow/vhdl_designers_guide/vhdl_2008/vhdl_200x_small/#matchcase
oder
http://www.google.de/url?q=http://www.synthworks.com/papers/vhdl_2008_DASC_s.pdf&sa=U&ei=PlJ8UITrENPS4QTbsIH4Bw&ved=0CCwQFjAC&usg=AFQjCNH4LYzoms_9Gw0AhMWlofPR4sa-Sw

das sieht dort so aus:
>case? sel is
>  when "1---" =>
>    o <= "11";
>  when "01--" =>
>    o <= "10";
>  when "001-" =>
>    o <= "01";
>  when "0001" =>
>    o <= "00";
>  when others =>
>    null;
>  end case;

Wenn es VDHL-2008 ist muss es doch auch ein
Simulator (welcher tatsächlich VHDL-2008 kann)
als don't care simulieren oder nicht?

Nun das werde ich mal bei Gelegenheit dem teuer
 cadence-simulator vorwerfen und schauen was passiert..

von Vigo (Gast)


Lesenswert?

bko schrieb:
> Nun das werde ich mal bei Gelegenheit dem teuer
>
>  cadence-simulator vorwerfen und schauen was passiert..
Hast Du das getan? Würde mich interessieren!

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.