mikrocontroller.net

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


Autor: franz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frank (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
In numeric_std gibt es to_std_logic() und to_unsigned(). Damit sollte es 
gehen.

Autor: franz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Frank,

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

Autor: fpgaküchle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau mal in der Quick reference card:
http://www.sm.luth.se/csee/courses/smd/150/slides/...

Hier sind alle 1164packages und die darin enthaltenen 
Konvertierungsfunktionen aufgeführt.

Autor: Frank (Gast)
Datum:

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

Autor: franz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes T. (johnsn)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schreib dir doch eine Function die den Zuweisungsoperator überlädt!

Autor: franz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes T. (johnsn)
Datum:

Bewertung
-1 lesenswert
nicht 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):
function "<=" (L: STD_LOGIC; R: INTEGER) return BOOLEAN is
begin
  if (R = 0) then
    L <= '0';
    return TRUE;
  elsif (R = 1) then
    L <= '1';
    return TRUE;
  else
    return FALSE;
  end if;
end "<=";

Im Package "numeric_bit" von MTI findest du mehr Beispiele zum Thema 
overloading.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den Zuweisungsoperator kann man leider nicht überladen.

Autor: Johannes T. (johnsn)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Michael Eckl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael Eckl (Gast)
Datum:

Bewertung
-1 lesenswert
nicht 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.

Autor: Zack - so isses (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?!

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity int2bit is
    Port ( intval : in  integer;
           slbit : out  STD_LOGIC);
end int2bit;

architecture Behavioral of int2bit is

function to_std_logic (I: integer) return std_logic is
begin
  if (I mod 2 = 0) then
    return '0';
  end if;
  return '1';
end to_std_logic;

begin


   slbit  <= to_std_logic(intval);


end Behavioral;

: Bearbeitet durch Moderator
Autor: Zack - so isses (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael Eckl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Michael Eckl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also nur der Richtigkeit halber:
stdlogic_sig <= '0' WHEN integer_sig = 0
                    ELSE '1' WHEN integer_sig = 1
                    ELSE '0';

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.