Forum: FPGA, VHDL & Co. Case mit don't care


von Thomas P. (pototschnig)


Lesenswert?

Hallo,

Funktioniert sowas?
1
  case foo is
2
    when "0101" => ...
3
    when "1---" => ...
4
    when others => ...
5
  end case;

Muss foo dabei wirklich "1---" enthalten, oder kann es auch "1010" sein? 
Also eben egal sein was die hinteren 3 Bits sind?

Mfg
Thomas Pototschnig

von Thomas H. (mac4ever)


Lesenswert?

Don't cares werden doch als X bezeichnet oder ? Ob es funktioniert kann 
ich leider gerade nicht testen. Zur Not würde ich einfach
1
if foo(3) = '1' then
2
 -- mach was
3
end if;
benutzen, da bist Du auf der sicheren Seite.

von Gabriel W. (gagosoft)


Lesenswert?

Thomas Hertwig wrote:
> Don't cares werden doch als X bezeichnet oder ?
NEIN, 'X' steht für konfliktbehaftete Signal (mehrere Treiber 
beschreiben ein Signal unterschiedlich. '-' für don't care stimmt schon, 
doch ob das in einem case funktioniert weis ich nicht. ich würde auch 
eher das erste Bit auf '1' abfragen...

von Jan M. (mueschel)


Lesenswert?

Mit ISE / xst funktioniert die Synthese einwandfrei. Dabei wird 
allerdings eine Warnung "possible simulation mismatch" ausgegeben. Wo 
genau das Problem dabei liegt, weiss ich jedoch nicht.

von Thomas P. (pototschnig)


Lesenswert?

Gabriel Wegscheider wrote:
> Thomas Hertwig wrote:
>> Don't cares werden doch als X bezeichnet oder ?
> NEIN, 'X' steht für konfliktbehaftete Signal (mehrere Treiber
> beschreiben ein Signal unterschiedlich. '-' für don't care stimmt schon,
> doch ob das in einem case funktioniert weis ich nicht. ich würde auch
> eher das erste Bit auf '1' abfragen...

Das Problem ist, dass das Ding auf 100MHz in einem Spartan-III laufen 
muss und ein IF ist zu langsam ... Also gerade mal so geht es nicht. Das 
Design macht natürlich noch wesentlich mehr :-)

Sowas hier geht grad noch:
1
case foo(3) is
2
  when '1' => ...
3
  when '0' =>
4
    case foo(2 downto 0) is
5
      when "101" => ...
6
      when others => ...
7
    end case;
8
  when others => ...
9
end case;

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Thomas Pototschnig wrote:
> Das Problem ist, dass das Ding auf 100MHz in einem Spartan-III laufen
> muss und ein IF ist zu langsam ...

Wieso sollte ein case schneller als ein if sein?

von Bernd G. (Gast)


Lesenswert?

> Das Problem ist, dass das Ding auf 100MHz in einem Spartan-III laufen
> muss und ein IF ist zu langsam ...

Um Himmelwillen, VHDL ist nicht C! VHDL beschreibt keinen Ablauf, 
sondern eine Struktur!

von Jan M. (mueschel)


Lesenswert?

@Bernd / Andreas:
Logisch gibt es sicher keinen Unterschied, aber ISE ist leider so 
einiges zuzutrauen was (Fehl-)Optimierungen angeht...

von Thomas P. (pototschnig)


Lesenswert?

Andreas Schwarz wrote:
> Thomas Pototschnig wrote:
>> Das Problem ist, dass das Ding auf 100MHz in einem Spartan-III laufen
>> muss und ein IF ist zu langsam ...
>
> Wieso sollte ein case schneller als ein if sein?

Case wird meinst Wissens als Multiplexer umgesetzt, bei einem IF weiß 
ich es nicht genau, aber es hat sich öfters herausgestellt, dass das 
Syntheseergebnis langsamer ist, wenn IFs statt case verwendet werden.

Weiß da jemand mehr?

Mfg
Thomas Pototschnig

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

If wird genauso als Multiplexer umgesetzt. Wenn du die selbe Logik 
beschreibst kannst du erwarten dass das selbe rauskommt, so blöd ist XST 
wirklich nicht.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Zum ursprünglichen Problem:
> Muss foo dabei wirklich "1---" enthalten, oder kann es auch "1010" sein?
> Also eben egal sein was die hinteren 3 Bits sind?

Was die Synthese aus don't cares macht weiß ich nicht, aber der 
Simulator kann nichts damit anfangen, "-" ist einfach ein Zeichen wie 1 
oder 0 oder X und wird nicht besonders ausgewertet. Fazit: nicht für 
Vergleiche verwenden. std_match ist eine Alternative, geht aber nur bei 
if, nicht bei case.

von Bernd G. (Gast)


Lesenswert?

Irgendwo habe ich mal gelesen...
Ich würde jedenfalls die betreffenden acht Zeilen im case ausschreiben, 
dann liegt man auf der sicheren Seite:

case foo is
    when "0101" => ...
    when "1000" =>
    when "1001" =>
    when "1010" =>
    when "1011" =>
    when "1100" =>
    when "1101" =>
    when "1110" =>
    when "1111" =>
    when others =>
  end case;

von Matthias F. (flint)


Lesenswert?

Ich hab da im Xilinx code für den PCIe Endpoint folgendes:
1
  process(rd_be_o_int, req_addr_i)
2
  begin
3
4
    case rd_be_o_int(3 downto 0) is
5
6
      when "0000" => lower_addr <= req_addr_i(6 downto 2) & "00";
7
      when "---1" => lower_addr <= req_addr_i(6 downto 2) & "00";
8
      when "--10" => lower_addr <= req_addr_i(6 downto 2) & "01";
9
      when "-100" => lower_addr <= req_addr_i(6 downto 2) & "10";
10
      when "1000" => lower_addr <= req_addr_i(6 downto 2) & "11";
11
      when others => lower_addr <= req_addr_i(6 downto 2) & "00";
12
13
    end case;
14
15
  end process;

Also die verlassen sich darauf, dass es funktioniert.


Bzgl If vs Case dachte ich, dass der Unterschied ist, dass bei 
If-Elsif-Else unter Umständen Priorisierungslogik dazukommt und es daher 
in der HW langsamer ist. Um den Else-Zweig auszuführen müssen im Prinzip 
alle vorherigen If-Elsif als nicht gültig erkannt werden.

von Bernd G. (Gast)


Lesenswert?

> Also die verlassen sich darauf, dass es funktioniert.

Danke, hatte ich bei Xilinx so explizit noch nicht gesehen...

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Matthias F. wrote:
> Ich hab da im Xilinx code für den PCIe Endpoint folgendes:
>
>   process(rd_be_o_int, req_addr_i)
>   begin
>
>     case rd_be_o_int(3 downto 0) is
>
>       when "0000" => lower_addr <= req_addr_i(6 downto 2) & "00";
>       when "---1" => lower_addr <= req_addr_i(6 downto 2) & "00";

Dann kann man wohl annehmen dass es in der Synthese als don't care 
umgesetzt wird. Ich halte es für nicht sehr schlau Code zu schreiben der 
sich in Synthese und Simulation unterschiedlich verhält, aber von 
Standards scheint man bei Xilinx sowieso nicht übermäßig viel zu halten 
(std_logic_unsigned...).

> Bzgl If vs Case dachte ich, dass der Unterschied ist, dass bei
> If-Elsif-Else unter Umständen Priorisierungslogik dazukommt

Ja, wenn sich die Bedingungen überlappen. Da muss man schon aufpassen 
wenn man z.B. std_match verwendet.

Übrigens geht auch folgendes:
1
case ... is
2
  when "0000" | "0001" | "0010" => ...;
3
  when others => ...;
4
end case;

Spart ein bisschen Schreibarbeit.

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.