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
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.
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
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).
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.
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
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; |
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.
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.
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. ;-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.