Integer to std_logic konvertieren

Gast #646444
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.
Gast #646567
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.
Gast #646624
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?
Gast #646643
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.
#646812
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.
Gast #4481696
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.
Gast #4481710
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?!
Moderator (Firma: Titel) Persönliche Seite #4481752
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;
Angehängte Dateien:
Gast #4481760
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.
Gast #4482015
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 :)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren