Boolescher Wert in VHDL? Wann schlägt '0/1' fehl?

7

Ich habe mich gefragt, warum VHDL einen booleschen Datentyp hat. Wann schneidet '0' oder '1' es nicht? Ist Boolean anders implementiert?

Mikhail
quelle

Antworten:

4

Es gibt viele Möglichkeiten, Ihre Frage zu beantworten, aber das Wichtigste ist, dass VHDL von einem Ausschuss des US-Verteidigungsministeriums entwickelt wurde. Daher sollten wir keine Dinge wie Logik oder Vernunft erwarten - was ironisch ist, weil wir darüber sprechen Logik.

VHDL ist eine "stark typisierte" Sprache. Normalerweise gibt es in einer stark typisierten Sprache viele verschiedene Datentypen, die einander ähnlich sind, sich jedoch nur in der Verwendung unterscheiden. Beispielsweise könnten Sie für eine Zustandsmaschinenvariable einen Integer-, SLV- oder Aufzählungsdatentyp verwenden. In den meisten Situationen funktioniert jedoch nur eine Aufzählung "optimal".

Diese Methode verhindert, dass der Programmierer Fehler einführt, und gibt dem Compiler die größte Freiheit, optimierten Code / Logik zu erstellen. Mit einer Statusvariablen kann der Compiler die optimalste Statuscodierung auswählen (One-Hot, Binär usw.). Wenn die Statusvariable als Ganzzahl oder SLV implementiert wäre, hätte der Compiler diese Fähigkeit nicht. Mit Integer oder SLV können Sie der Statusvariablen auch leicht versehentlich ungültige Zustände zuweisen, wodurch Fehler entstehen, die schwer zu diagnostizieren sind.

Gleiches gilt für Boolean, obwohl es schwieriger ist, den Nutzen zu erkennen. Es zwingt den Schreiber, explizit zu sein, wo der Code ohne starke Datentypisierung weniger "offensichtlich" wäre. Grundsätzlich ist es schwieriger, mit Boolean einen Fehler zu machen.

Der Nebeneffekt starker Datentypen besteht darin, dass einige Dinge in VHDL "wortreicher" sind. Es ist der Preis, den wir zahlen.

Aber um Ihre Fragen direkt zu beantworten ...

"Wann schneidet 0/1 es nicht?" Technisch würde 0/1 funktionieren. Das Hauptproblem bei 0/1 ist, dass es Ihnen nicht sagt, welcher Zustand "wahr" ist. Ist das Signal aktiv niedrig oder aktiv hoch? Sie können nicht mit dem Booleschen Wert TRUE / FALSE verwechselt werden. In allen anderen Fällen wäre 0/1 vollkommen in Ordnung. Boolean gibt es nicht aus technischen Gründen, sondern aus logistischen Programmiergründen.

"Ist Boolean anders implementiert?" Nicht wirklich. Die generierte Logik unterscheidet sich nicht von der gut geschriebenen Alternative. Auch hier ist es meistens da, um den Programmierer davon abzuhalten, versehentlich etwas Dummes zu tun.

Ich sollte auch darauf hinweisen, dass bei der Diskussion von stark oder schwach typisierten Programmiersprachen die Dinge schnell zu einer philosophischen Debatte ausarten - und die Nuancen dieser Debatte können nicht vollständig verstanden werden, wenn Sie nicht viel Code geschrieben haben (1+ Millionen Codezeilen). . Eine andere Sache, die häufig übersehen wird, ist, dass es Ebenen von stark und schwach typisierten Daten gibt. Ich würde C als schwach typisiert und C ++ als stark typisiert beschreiben, obwohl Tabellen auf Wikipedia fast jede Sprache als stark typisiert anzeigen.


quelle
5

Es ist Geschmackssache, um ehrlich zu sein.

Im LRM von 1993 gibt es einen Hinweis BOOLEANauf Seite 36, der besagt, dass

Der Typ BOOLEAN kann verwendet werden, um abhängig von den speziellen Konvertierungsfunktionen, die für und vom Typ BIT ausgewählt wurden, entweder eine aktive hohe oder eine aktive niedrige Logik zu modellieren

Die Implikation ist, dass BOOLEANzur Beschreibung der Funktionalität verwendet und später auf eine "Logikebene" konvertiert werden sollte.

Martin Thompson
quelle
4

Es ist aus Gründen der Klarheit getan

Ich bin mir sicher, dass Sie in jedem Fall, wenn Sie einen Booleschen Wert verwenden, einen '0/1' verwenden könnten. Persönlich (wenn treffend benannte Variablen verwendet werden) denke ich, dass es nur für saubereren / aussagekräftigeren Code sorgt, etwas zu schreiben wie:

signal OutputEnabled : boolean;

und später als

if ( not(OutputEnabled) ) then
    Output <= 'Z';
else
    Output <= Input;
end if;

anstatt

signal OutputEnabled : std_logic;

und später als

if ( OutputEnabled /= '1' ) then
    Output <= 'Z';
else
    Output <= Input;
end if;

Eine gute Verwendung für Boolesche Werte besteht darin, Aktiv-Niedrig-Signale zu abstrahieren, damit ich nicht den Code durchsuchen muss, um nach jedem Ort zu suchen, an dem ich einen Vergleich durchführe, wenn ich die Polarität ändern muss.

Neu für VHDL-2008

Interessanterweise führt der neue VHDL 2008-Standard implizite Konvertierungen von Bedingungen in Boolesche Werte für Sie ohne Casting durch, sodass Sie Folgendes schreiben können:

signal OutputEnabled : std_logic;

und später als

if ( not(OutputEnabled) ) then

Ziemlich gute Aufnahme meiner Meinung nach!

Joel B.
quelle
Gutes Zitieren von Beispielen.
Enthusiastgeek
-2

Der boolesche Typ ist für Variablen, wobei 0/1 für Signale steht . Ich kenne den Unterschied zwischen Signalen und Variablen nicht speziell, aber ich glaube, dass Variablen nur intern verwendet und nicht an externe Pins weitergeleitet werden können. Mit Variablen können Sie jedoch Aufgaben auf höherer Ebene ausführen, für die Bits nicht ausreichen.

AngryEE
quelle
1
Nichts, was verhindern könnte, dass Signale boolesch sind
Martin Thompson