Forum: FPGA, VHDL & Co. Integer to std_logic konvertieren


von franz (Gast)


Lesenswert?

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.

von Frank (Gast)


Lesenswert?

In numeric_std gibt es to_std_logic() und to_unsigned(). Damit sollte es 
gehen.

von franz (Gast)


Lesenswert?

Hallo Frank,

leider gibt es in meiner numeric_std.vhd (ISE9.1) keine Funktion die 
"to_std_logic()" heißt. Bin ich ratlos :-(

von fpgaküchle (Gast)


Lesenswert?

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.

von Frank (Gast)


Lesenswert?

Jupp, sorry. to_std_logic gibbet nicht. Allerdings ist ein unsigned auch 
nur ein std_logic_vector. Damit geht es garantiert.

von franz (Gast)


Lesenswert?

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.

von Frank (Gast)


Lesenswert?

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.

von Johannes T. (johnsn)


Lesenswert?

Schreib dir doch eine Function die den Zuweisungsoperator überlädt!

von franz (Gast)


Lesenswert?

@ 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?

von Frank (Gast)


Lesenswert?

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.

von Johannes T. (johnsn)


Lesenswert?

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.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Den Zuweisungsoperator kann man leider nicht überladen.

von Johannes T. (johnsn)


Lesenswert?

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!

von Michael Eckl (Gast)


Lesenswert?

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

von Michael Eckl (Gast)


Lesenswert?

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.

von Zack - so isses (Gast)


Lesenswert?

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?!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

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
von Zack - so isses (Gast)


Lesenswert?

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.

von Michael Eckl (Gast)


Lesenswert?

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 :)

von Michael Eckl (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.