Don't care in VHDL

Gast #2873384
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
Gast #2873415
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
Moderator (Firma: Titel) Persönliche Seite #2873731
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...
Gast #2873786
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.
Gast #2874047
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..

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren