Forum: FPGA, VHDL & Co. VHDL: unsigned oder signed in entity


von Jan K. (frittenfett)


Lesenswert?

Hallo zusammen,

von verschiedenen Leuten habe ich gehört, dass man in der entity nur 
std_logic_vector verwenden soll und keine unsigned oder signed. Gibt es 
dafür einen sinnvollen Grund?

Meine Gedanke ist, dass signed oder unsigned nicht direkt auf die Pins 
des FPGAs gehen können. Ist aber nur eine Vermutung. Und das würde ja 
nur für den chip top gelten.

Hat jemand eine belastbare Quelle dazu?

Ich danke Euch.

Liebe Grüße

Jan

von FPGAzumSpass (Gast)


Lesenswert?

Top Level würde ich es wegen der Tools schon machen, aber darunter kann 
man selbstverständlich auch signed, unsigned oder integer verwenden.

Im Gegenteil halte ich das in VHDL für die wesentlich bessere Variante, 
denn dann prüft das Tool was da zugewiesen wird und ein Fehler fällt 
sofort auf.
Ohne Not alles auf SLV zu casten führt dann doch nur zu falschen 
Interpretierungen.

Bei C Code käme ja auch keiner auf die Idee alle Int32 und UInt32 bei 
jedem Funktionsaufruf auf ein 4 Byte Array zu casten, damit alle 
Parameter schön gleich aussehen.

von Duke Scarring (Gast)


Lesenswert?

Ich verwende in der top-entity nur std_logic und std_logic_vector.
In den inneren Blöcken alle Datentypen die sinnvoll sind 
(natural/integer, unsigned/signed, std_ulogic/std_ulogic_vector).

Es gibt Meinungen die sagen, mit std_logic und std_logic_vector könnte 
man die Blöcke einfacher austauschen und integrieren. Ich habe schon 
große Designs gesehen, wo dies gemacht wurde. Die Folge war: ein Block 
hat seine signed-Daten nach std_logic_vector gewandelt und der nächste 
Block hat sie dann als unsigned interpretiert. War nicht so prickelnd.

Duke

von Christoph Z. (christophz)


Lesenswert?

Duke Scarring schrieb:
> Es gibt Meinungen die sagen, mit std_logic und std_logic_vector könnte
> man die Blöcke einfacher austauschen und integrieren.

Dazu sollte man Interfaces definieren, die dann implementiert werden. In 
objektorientierten Sprachen nimmt man dazu Klassen oder spezielle 
Sprachkonstrukte. In C, Pascal oder VHDL nimmt man dazu Records (in C: 
Structs).

Dann klappts auch mit dem Austauschen :-)

Zur Klarstellung zur eigentlichen Frage:
Wir verwenden hier den Gaissler Stil, heisst, dass nur die Top Entity 
verwendet std_logic(_vector). Darunter werden alle Signale per Records 
verbunden und die enthalten wie bei Duke den sinnvollsten Datentyp (das 
darf neben signed z. B. auch ein Werteingeschränkter integer oder ein 
sinnvoller Record sein).

von Markus F. (mfro)


Lesenswert?

VHDL-Designer scheinen irgendwie in der Masse so ungefähr die 
konservativsten Menschen auf diesem Planeten zu sein.

Während z.B. C++ - Programmierer sich auf jedes neue Sprachfeature (und 
sei es noch so ofenwarm) stürzen wie die sprichwörtliche Gans auf den 
Apfelstrunk (Gos uff' dr Äpflbutza, sagt man bei uns), scheinen die 
VHDL-Designer "neue" Sachen höchstens dann verwenden zu wollen, wenn sie 
mindestens zehn oder mehr Jahre auf dem Buckel haben, weil es könnte ja 
sein, daß das Synthesetool das Feature "noch nicht" beherrscht.

Verwende alles, was dein Werkzeug kann (durchaus auch im Toplevel) und 
für dein Design nützlich ist.

von Duke Scarring (Gast)


Lesenswert?

Markus F. schrieb:
> Verwende alles, was dein Werkzeug kann
Genau daher kommt das konservative Verhalten. Es dauert doch immer ewig, 
bis die Features des Standards von den Toolherstellern umgesetzt werden.

Duke

von Jan K. (frittenfett)


Lesenswert?

Vielen Dank an Euch. Das hat mir schon sehr geholfen.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

FPGAzumSpass schrieb:
> Bei C Code käme ja auch keiner auf die Idee alle Int32 und UInt32 bei
> jedem Funktionsaufruf auf ein 4 Byte Array zu casten, damit alle
> Parameter schön gleich aussehen.

Sag niemals nie!

Solch einen Mist habe ich schon einmal in Kundencode gesehen. Eigentlich 
war es sogar noch schlimmer, d.h. in der Funktion waren alle Variable 
mittels Makro als UNSIGNED32 oder so deklariert, einschließlich Zeigern. 
Es wurde immer an Ort und Stelle gecastet und teilweise Pseudo-FORTRAN 
verwendet:
1
UNSIGNED32 zeiger;
2
UNSIGNED32 character;
3
4
character = (UNSIGNED32)((char)(*(char *)zeiger));
5
6
if (character EQU 42) goto x_42;
7
if (character EQU 117) goto x_117;
8
if (character EQU 4711) goto x_117;
9
10
switch (character) {
11
  case 42:
12
x_42:
13
    blabla();
14
    goto x_exit;
15
  case 117:
16
x_117:
17
    blabla();
18
    goto x_exit;
19
  case 42:
20
x_4711:
21
    blabla();
22
    goto x_exit;
23
}
24
25
x_exit:
26
27
return;

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Duke Scarring schrieb:
> Markus F. schrieb:
>> Verwende alles, was dein Werkzeug kann
> Genau daher kommt das konservative Verhalten. Es dauert doch immer ewig,
> bis die Features des Standards von den Toolherstellern umgesetzt werden.

Exakt!

Vivado war lange Zeit sogar wieder ein deutlicher Rückschritt gegenüber 
ISE in Sachen VHDL-2008-Kompatibilität. Und auch heute muss man gewaltig 
aufpassen, wenn man VHDL 2008 in eigenen IPs verwenden will.

von Markus F. (mfro)


Lesenswert?

Duke Scarring schrieb:
> Genau daher kommt das konservative Verhalten. Es dauert doch immer ewig,
> bis die Features des Standards von den Toolherstellern umgesetzt werden.


Da bin ich manchmal nicht so sicher, ob das Ursache oder Wirkung ist.

Quartus unterstützt seit Jahren zwar relativ umfangreich, aber eben 
nicht komplett VHDL 2008. Trotzdem sehe ich das in öffentlich 
zugänglichem Code so gut wie nie.

von Da D. (dieter)


Lesenswert?

Duke Scarring schrieb:
> Markus F. schrieb:
>> Verwende alles, was dein Werkzeug kann
> Genau daher kommt das konservative Verhalten. Es dauert doch immer ewig,
> bis die Features des Standards von den Toolherstellern umgesetzt werden.

Die Toolhersteller behaupt genau das Gegenteil. Auf Nachfrage heißt es 
immer, für die neuen Sprachstandards gibts bei den Nutzern zu wenig 
Nachfrage, um die zeitnah zu implementieren.

Seit dem frage ich immer bei jedem Treffen mit FAEs und anderen 
Kontakten zu Intel und Xilinx, wann denn der aktuelle Sprachstandard 
implementiert wird. ;-)

von Dussel (Gast)


Lesenswert?

Kann es sein, dass die Regel aus der Zeit kommt, als es für Signed und 
Unsigned nur die Synopsys-Bilbiotheken gab? Da konnte es Probleme geben, 
wenn man gemischt hat.
Heute sehe ich kein Problem damit, Signed und Unsigned aus der 
numeric_std zu verwenden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.