Hallo, Funktioniert sowas?
1 | |
2 | |
3 | |
4 | |
5 | |
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
|
Anzeige
|
Case mit don't careHallo, Funktioniert sowas?
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 Don't cares werden doch als X bezeichnet oder ? Ob es funktioniert kann ich leider gerade nicht testen. Zur Not würde ich einfach
benutzen, da bist Du auf der sicheren Seite. 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...
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. 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:
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?
Gast
#850234
> 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! @Bernd / Andreas: Logisch gibt es sicher keinen Unterschied, aber ISE ist leider so einiges zuzutrauen was (Fehl-)Optimierungen angeht... 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 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. 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
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;
Ich hab da im Xilinx code für den PCIe Endpoint folgendes:
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.
Gast
#850439
> Also die verlassen sich darauf, dass es funktioniert.
Danke, hatte ich bei Xilinx so explizit noch nicht gesehen...
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:
Spart ein bisschen Schreibarbeit. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|