www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Convert std_logic_to_integer


Autor: mg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

aktuell habe ich folgendes Problemchen:
In Abhängikeit von einem einem generic als std_logic würde ich gerne ein 
Zähler mit einem Defaultwert beim Power-Up laden. Dazu bräuchte ich so 
eine Art std_logic_to_integer. Gibt es denn sowas schon irgendwie in 
einer der ieee Libs?
entity xyz is
generic
(
   cnt_max   : positive; -- höchster Zählwert
   rst_val   : std_logic -- Reset und Defaultwert
);
port (...);
end integrator;
architecture behavior of xyz is
...
   signal cnt : natural range 0 to cnt_max := std_logic_to_integer(rst_val) * cnt_max;
...
begin
Von einem std_logic_vector würde ich das mit der ieee.numeric_std.all in 
der Art und Weise lösen:
   signal cnt : natural range 0 to cnt_max := to_integer(unsigned((rst_val)) * cnt_max;
Aber bitte jetzt nicht den Tipp, dass ich rst_val im generic als integer 
deklarieren soll. rst_val wird ja noch an anderen Stellen als std_logic 
gebraucht.

Autor: mg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich werde erst mal folgenden Workaround verwenden:
   constant rst_val_slv : std_logic_vector(0 downto 0) := (others => rst_val); 
   signal cnt           : natural range 0 to cnt_max := to_integer(unsigned(rst_val_slv)) * cnt_max;
Aber irgendwie ist das krank!

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
std_logic kann nur 0 oder 1 sein (vom integralen Wert her), du musst 
schon einen std_logic_vector verwenden oder noch besser gleich 
integer/natural/positive

Autor: mg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> std_logic kann nur 0 oder 1 sein.
Das ist mir schon klar. Nun möchte ich aber in Abhängigkeit dieser 0 
oder 1 eben initial einen Zählerwert laden. Nämlich cnt_max oder 0. 
Rechentechnisch daher rst_val * cnt_max, wenn man mal die 
Typconvertierungen vernachlässigt.

Autor: T. M. (xgcfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann man doch fix selber schreiben und in einem Package ablegen.
Etwa so in der Art (bei den in std_logic anderen möglichen Zustände 
außer '0' und '1' wird eine 1 zurückgegeben, müsste man vielleicht 
anpassen, je nachdem):
function std_logic_to_integer(input : in std_logic) return integer is
begin
  if(input = '0') then
    return 0;
  else
    return 1;
  end if;
end function;

Oder man überlädt die to_integer Funktion aus dem numeric_std Package.

Autor: mg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> überlädt
Was meinst Du mit "überlädt" ?

Die Funktion selber schreiben und extra dafür in ein Package packen 
wollte ich eigentlich nicht. Daran habe ich aber auch schon gedacht.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Torsten M. schrieb:
> Oder man überlädt die to_integer Funktion aus dem numeric_std Package.
Allerdings erwartet die to_integer Funktion einen signed oder unsigned 
Wert, der seinerseits wieder als Vektor definiert ist...

Autor: T. M. (xgcfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> Allerdings erwartet die to_integer Funktion einen signed oder unsigned
> Wert, der seinerseits wieder als Vektor definiert ist...

Man könnte ja die to_integer Funktion dahingehend überladen, dass sie 
auch std_logic Inputs entgegennimmt. Ob das sinnvoll oder schlau ist, 
ist eine andere Frage.

Wie man eine Funktion/Operator in VHDL überladt, funktioniert 
wahrscheinlich wie in jeder anderen Programmiersprache: Einfach eine 
Funktion gleichen Namens mit anderen Typen als Eingangswert definieren. 
Dann müsste der Compiler die jeweilig passende Funktion selber wählen. 
Da ich das noch nie gebraucht habe, weiß ich aber nicht, ob das dann 
auch wirklich so funktioniert. Ein Blick in den Designers Guide könnte 
die Frage beantworten.

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

Bewertung
0 lesenswert
nicht lesenswert
Torsten M. schrieb:
> ob das dann auch wirklich so funktioniert.
Muss es und tut es:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity Ueberladen is
    Generic ( def : STD_LOGIC := '1');
    Port ( clk : in  STD_LOGIC;
           sel : in  STD_LOGIC;
           o   : out  std_logic_vector(7 downto 0));
end Ueberladen;

architecture Behavioral of Ueberladen is

function to_integer(input : in std_logic) return integer is
begin
  if(input = '0') then return 0;
  else                 return 1;
  end if;
end function;

signal wert : integer range 0 to 255 := 16#55#*to_integer(def);

begin
     wert <= 16#33#*to_integer(sel) when rising_edge(clk);
     o    <= std_logic_vector(to_unsigned(wert,8));
end Behavioral;
Ergibt zusammen mit der Q&D TB
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
 
ENTITY tb_ueberladen IS
END tb_ueberladen;
 
ARCHITECTURE behavior OF tb_ueberladen IS 
    COMPONENT Ueberladen
    PORT(  clk : in  STD_LOGIC;
           sel : IN  std_logic;
           o : OUT  std_logic_vector(7 downto 0)
        );
    END COMPONENT;

   signal sel : std_logic := '0';
   signal clk : std_logic := '0';
   signal o : std_logic_vector(7 downto 0);
 
BEGIN
   uut: Ueberladen PORT MAP (
          clk => clk,
          sel => sel,
          o => o
        );

   sel <= not sel after 77 ns;
   clk <= not clk after 123 ns;
END;
die angehängte Waveform.
Und auch die Umsetzung in Hardware klappt... ;-)

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Torsten M. schrieb:
> Da ich das noch nie gebraucht habe, weiß ich aber nicht, ob das dann
> auch wirklich so funktioniert. Ein Blick in den Designers Guide könnte
> die Frage beantworten.

Wahlweise hilft da auch ein Blick in die Standardbibliotheken. Siehe 
z.B. [1].

Duke

[1] http://www.cs.umbc.edu/portal/help/VHDL/packages/n...

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.