std_logic oder std_ulogic?

Es scheint, dass die Welt entschieden hat, dass std_logic(und std_logic_vector) die Standardmethode zur Darstellung von Bits in VHDL sind. Die Alternative wäre std_ulogic, was nicht gelöst ist.

Das überrascht mich, weil Sie normalerweise keinen Bus beschreiben , also nicht mehrere Fahrer wollen und kein Signal auflösen müssen. Der Vorteil std_ulogicwäre, dass der Compiler Sie frühzeitig warnt, wenn Sie mehrere Treiber haben.

Frage: Ist das nur eine kulturelle/historische Sache oder gibt es noch technische Gründe, std_logic zu verwenden?

Die Welt ist falsch. Kluge Ingenieure verwenden std_ulogic as, weil es die richtige Semantik hat.
@wjl Ich interpretiere das als "es ist eine kulturelle / historische Sache". Ihre Antwort unten ist viel hilfreicher als der Kommentar hier oben.
Ich habe zuerst den Kommentar geschrieben und dachte dann, es wäre angemessener, eine genauere Antwort zu hinterlassen. Entschuldigung, ich denke, es klingt ein wenig oberflächlich. Aber mein Kommentar ist insofern wörtlich, als die meisten Leute anfangen, std_logic zu verwenden, weil sie es so gelernt haben, dann fangen sie nach einer Weile an, sich über std_ulogic zu wundern, sie schlagen es nach, erkennen seine Semantik und konvertieren dann dazu. =)

Antworten (4)

Std_logic ist ein Untertyp von std_ulogic und hat genau eine zusätzliche Eigenschaft: Es wird aufgelöst, wenn mehrere Treiber vorhanden sind.

Unabhängig von der gängigen Praxis ist std_ulogic der richtige Typ für nicht aufgelöste Signale, die eine 9-wertige Logik benötigen. (Oft ist die Verwendung von „Bit“ sogar noch richtiger – zum Beispiel bei einigen FPGA-Architekturen, die kein „X“ oder „U“ haben).

Grundsätzlich ist es am besten, den richtigen Typ für den Job zu verwenden. Oft werden schlechte Praktiken von Leuten verbreitet, die nur den Stil nachplappern, den sie bei anderen sehen, ohne zu verstehen, warum.

Die Architektur hat möglicherweise kein 'U', aber es ist oft nützlich, so zu simulieren, als ob dies der Fall wäre, da Sie falsche Initialisierungen finden können. +1 für "Am besten ist es, den richtigen Typ für den Job zu verwenden", aber wir lernen im Laufe der Zeit, was das "Beste" ist :)
Außerdem werden die Metawerte bei der Synthese zu „egal“, was weitere Optimierungen ermöglicht.

Meine Geschichte ist diese:

Ich habe angefangen (um 1999 IIRC), die std_ulogic*ganze Zeit zu benutzen - weil es das Richtige ist, aus genau den Gründen, die Sie beschreiben.

Dann musste ich eine Schnittstelle zu einer Reihe von vom Assistenten generierten Anbieter-IPs herstellen, die alle std_logicüber die gesamte Schnittstelle verfügten. Das bedeutete Konvertierungen in den Port-Mappings (für die _vectorElemente), und ich wurde faul und wechselte zur Verwendung von std_logic*.

Allerdings scheine ich sehr wenige "Doppelfahrer"-Fehler zu machen, also habe ich nicht std_ulogicso viel verpasst, wie ich gedacht hätte. Und der Befehl von Modelsim driversmacht es sehr einfach zu finden, "wer was fährt", wenn ich es gelegentlich tun muss ...

Ja, IP-Kerne (und insbesondere Dinge, die automatisch von Verilog übersetzt werden) neigen dazu, std_logic zu verwenden. Ihre Antwort scheint darauf hinzudeuten, dass der Grund hauptsächlich "kulturell / historisch" ist.
Sie müssen nie zwischen std_logic und std_ulogic auf Ports konvertieren. Meinten Sie, Sie mussten zwischen std_logic_vector und std_ulogic_vector konvertieren?
@wjl: sorry, ja das meinte ich. Ich werde den Beitrag aktualisieren.
AFAIK, std_logic und std_ulogic sind zuweisungskompatibel, da sie den gleichen Basistyp haben. Eine manuelle Konvertierung sollte also nicht erforderlich sein.
@Val: Das hat wjl gesagt (und ich stimme dem zu) - aber die Portteile *vectormüssen noch konvertiert werden
Ich lese die Spezifikation und frage mich warum. Die Arrays müssen kompatibel sein, wenn Elemente kompatibel sind. Modelsim sagt, dass alles, was Sie brauchen, vhdl2008-Kompatibilität ist!
Nur um sicherzugehen, dass ich die Probleme verstanden habe, die Sie dazu veranlasst haben, von der Verwendung std_ulogic_vectorzu std_logic_vectorzu wechseln, wenn es für Sie damals möglich gewesen wäre, VHDL-2008 zu verwenden, hätte das Problem nicht existiert, ist das richtig?
@rick - ja, es war sehr vor 2008, als ich den Wechsel vollzog.

IIRC das berühmte Reuse Methodology Manual empfohlen std_logic(_vector), also verbreiten Methodikgruppen in Unternehmen usw. das in Form von (obligatorischen) Codierungsleitfäden weiter. Persönlich +1 für die Verwendung, std_ulogicwenn möglich.

Ich weiß, es ist eine schrecklich farbige ppt-Diashow, aber es erklärt den Unterschied ziemlich gut:

http://web.archive.org/web/20151026150828/http://www.cs.auckland.ac.nz/~jmor159/reconfig/ppt/ResolutionFunctions.ppt