Case mit don't care

OP #850190
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
#850205
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...
OP #850210
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;
OP #850293
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
Admin Persönliche Seite #850310
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.
Gast #850324
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;
#850423
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.
Admin Persönliche Seite #850469
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.

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