mikrocontroller.net

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


Autor: Thomas Pototschnig (pototschnig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Funktioniert sowas?
  case foo is
    when "0101" => ...
    when "1---" => ...
    when others => ...
  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

Autor: Thomas Hertwig (mac4ever)
Datum:

Bewertung
0 lesenswert
nicht 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
if foo(3) = '1' then
 -- mach was
end if;
benutzen, da bist Du auf der sicheren Seite.

Autor: Gabriel Wegscheider (gagosoft)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas Pototschnig (pototschnig)
Datum:

Bewertung
0 lesenswert
nicht 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:
case foo(3) is
  when '1' => ...
  when '0' =>
    case foo(2 downto 0) is
      when "101" => ...
      when others => ...
    end case;
  when others => ...
end case;

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Bernd G. (Firma: LWL flex SSI) (berndg)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Jan M. (mueschel)
Datum:

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

Autor: Thomas Pototschnig (pototschnig)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernd G. (Firma: LWL flex SSI) (berndg)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Matthias F. (flint)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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";
      when "--10" => lower_addr <= req_addr_i(6 downto 2) & "01";
      when "-100" => lower_addr <= req_addr_i(6 downto 2) & "10";
      when "1000" => lower_addr <= req_addr_i(6 downto 2) & "11";
      when others => lower_addr <= req_addr_i(6 downto 2) & "00";

    end case;

  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.

Autor: Bernd G. (Firma: LWL flex SSI) (berndg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Also die verlassen sich darauf, dass es funktioniert.

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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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:
case ... is
  when "0000" | "0001" | "0010" => ...;
  when others => ...;
end case;

Spart ein bisschen Schreibarbeit.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.