Hallo, geht es integer range 0 to 1 in std_logic zu konvertieren? Hintergrund meiner Frage ist optisch einheitliche Eingabe von Konstanten in meinem Package. Vielen Dank für die Hilfe.
In numeric_std gibt es to_std_logic() und to_unsigned(). Damit sollte es gehen.
Hallo Frank, leider gibt es in meiner numeric_std.vhd (ISE9.1) keine Funktion die "to_std_logic()" heißt. Bin ich ratlos :-(
Schau mal in der Quick reference card: http://www.sm.luth.se/csee/courses/smd/150/slides/1164pkg.pdf Hier sind alle 1164packages und die darin enthaltenen Konvertierungsfunktionen aufgeführt.
Jupp, sorry. to_std_logic gibbet nicht. Allerdings ist ein unsigned auch nur ein std_logic_vector. Damit geht es garantiert.
Hallo, meine Lösung sieht etwa so aus: constant konstante : integer := 0; -- die konstante hat Wertbereich (0,1) mein_vector(15 downto 15) <= conv_std_logic_vector(konstante,1); d.h. ich habe std_logic (bit 15 in „mein_vector“) zu einem „std_logic_vector“ gemacht und eine standard conversion-function benutzt, die INTEGER zu STD_LOGIC_VECTOR konvertiert (aus der STD_LOGIC_ARITH). Ist vielleicht keine „profi“ Lösung aber funktioniert. Danke für eure Antworten.
Das ist im Prinzip vollkommen ok. Du solltest dich nur irgendwann entscheiden, ob du bei der Synopsys Bibliothek (std_logic_arith) bleiben willst oder die IEEE Bibliothek (numeric_std) verwenden willst.
Schreib dir doch eine Function die den Zuweisungsoperator überlädt!
@ Frank: welche Gründe gibt es gegen der Nutzung von beiden Bibliotheken? Irgendwo habe ich schon gelesen, dass man die numeric_std benutzen sollte aber bloß nicht die std_logic_arith. Warum stand aber nicht da. Weißt du Frank bitte warum? @Johanes Traxler: sorry, aber ich habe nicht verstanden was du meinst. Kannst du mir bitte dein Vorschlag näher erklären?
Beide definieren die "unsigned" und "signed" typen, das könnte Probleme machen, weiß ich aber nicht genau. Ansonsten unterscheiden sie sich afaik hauptsächlich durch die Konvertierungsroutinen. Es ist einfach doppelt gemoppelt und stiftet im besten Fall Verwirrung. numeric_std ist von IEEE standardisiert, std_logic_arith war mal proprietär von Synopsis und wurde dann freigegeben. Wir haben numeric_std gelernt und ich hab auch nie etwas anderes verwendet. Die Synopsis Bibliothek soll etwas freizügiger mit impliziten casts sein. Das ist bei numeric_std sehr strikt, weil es eigentlich nur explizite casts gibt (was nicht unbedingt ein Nachteil ist, höchstens Geschmacksache). Zu diesem Thema kann sich jemand, der schon beides verwendet hat sicherlich besser äußern.
Wenn Typecasts dieser Art erforderlich werden, dann stimme ich Frank voll und ganz zu: Immer nur numeric_std verwenden! Operator-Overloading: Grundlegendes hier: http://www.cs.utsa.edu/~danlo/function_overload.pdf Implementierung (kann sein das noch kleine Fehler drinnen sind):
1 | function "<=" (L: STD_LOGIC; R: INTEGER) return BOOLEAN is |
2 | begin |
3 | if (R = 0) then |
4 | L <= '0'; |
5 | return TRUE; |
6 | elsif (R = 1) then |
7 | L <= '1'; |
8 | return TRUE; |
9 | else |
10 | return FALSE; |
11 | end if; |
12 | end "<="; |
Im Package "numeric_bit" von MTI findest du mehr Beispiele zum Thema overloading.
Andreas Schwarz wrote:
> Den Zuweisungsoperator kann man leider nicht überladen.
Ich hab's selbst nur mit den mathematischen Operatoren gemacht, sollte
es für den Zuweisungoperator nicht funktionieren, dann bitte streicht
meinen Kommentar aus dem Protokoll!
stdlogic_sig <= '0' WHEN integer_sig = 0 ELSE '1'; oder... stdlogic_sig <= '0' WHEN integer_sig = 0 ELSE '1' WHEN integer_sig = 1; etc... Freundliche Grüße
Aber - meiner Meinung nach: Wer bei Code, der für die Synthese bestimmt ist, über eine Konvertierung von Integer nach Std Logic nachdenkt, hat wahrscheinlich prinzipiell einen Denkfehler. Vielleicht sollte man an so einer Stelle grundsätzlich darüber nachdenken, ob man das Problem richtig und 'HDL-mäßig' angeht.
Michael Eckl schrieb: > Aber - meiner Meinung nach: Wer bei Code, der für die Synthese bestimmt > ist, über eine Konvertierung von Integer nach Std Logic nachdenkt, hat > wahrscheinlich prinzipiell einen Denkfehler. Vielleicht sollte man an so > einer Stelle grundsätzlich darüber nachdenken, ob man das Problem > richtig und 'HDL-mäßig' angeht. Was ist falsch daran einen als Integer implementierten addresscounter für einen FIFO für das Port mapping an einen BRAM/externen Mem zu slv zu konvertieren?!
Zack - so isses schrieb: > zu slv zu konvertieren Wo steht in diesem URALTEN Thread irgendwas von einem Vektor? Michael Eckl schrieb: > oder... > stdlogic_sig <= '0' WHEN integer_sig = 0 ELSE '1' WHEN integer_sig = 1; Das ist unschön, weil es ein Latch geben könnte... Aber wenns schon sein muss hier noch ein Vorschlag:
1 | library IEEE; |
2 | use IEEE.STD_LOGIC_1164.ALL; |
3 | use IEEE.NUMERIC_STD.ALL; |
4 | |
5 | entity int2bit is |
6 | Port ( intval : in integer; |
7 | slbit : out STD_LOGIC); |
8 | end int2bit; |
9 | |
10 | architecture Behavioral of int2bit is |
11 | |
12 | function to_std_logic (I: integer) return std_logic is |
13 | begin
|
14 | if (I mod 2 = 0) then |
15 | return '0'; |
16 | end if; |
17 | return '1'; |
18 | end to_std_logic; |
19 | |
20 | begin
|
21 | |
22 | |
23 | slbit <= to_std_logic(intval); |
24 | |
25 | |
26 | end Behavioral; |
:
Bearbeitet durch Moderator
Lothar M. schrieb: > Zack - so isses schrieb: >> zu slv zu konvertieren > Wo steht in diesem URALTEN Thread irgendwas von einem Vektor? Nirgends, hab den aktuellen Teil des threads überinterpretiert. Hat ich mal lieber den ersten Teil gelesen: franz schrieb: > Hintergrund > meiner Frage ist optisch einheitliche Eingabe von Konstanten in meinem > Package So ein Schwachsinnsanliegen ("optisch einheitliche Eingabe") ignoriert man besser.
Lothar M. schrieb: >> stdlogic_sig <= '0' WHEN integer_sig = 0 ELSE '1' WHEN integer_sig = 1; > Das ist unschön, weil es ein Latch geben könnte... Hi, da haben Sie natürlich recht! So etwas sollte man für RTL-Code nicht verwenden, da die Latch-Gefahr groß ist, wenn man das letzte ELSE vergisst. VG :)
Also nur der Richtigkeit halber: stdlogic_sig <= '0' WHEN integer_sig = 0 ELSE '1' WHEN integer_sig = 1 ELSE '0';
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.