Forum: FPGA, VHDL & Co. Convert std_logic_to_integer


von mg (Gast)


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?
1
entity xyz is
2
generic
3
(
4
   cnt_max   : positive; -- höchster Zählwert
5
   rst_val   : std_logic -- Reset und Defaultwert
6
);
7
port (...);
8
end integrator;
9
architecture behavior of xyz is
10
...
11
   signal cnt : natural range 0 to cnt_max := std_logic_to_integer(rst_val) * cnt_max;
12
...
13
begin
Von einem std_logic_vector würde ich das mit der ieee.numeric_std.all in 
der Art und Weise lösen:
1
   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.

von mg (Gast)


Lesenswert?

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

von D. I. (Gast)


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

von mg (Gast)


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.

von T. M. (xgcfx)


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):
1
function std_logic_to_integer(input : in std_logic) return integer is
2
begin
3
  if(input = '0') then
4
    return 0;
5
  else
6
    return 1;
7
  end if;
8
end function;

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

von mg (Gast)


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.

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


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...

von T. M. (xgcfx)


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.

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


Angehängte Dateien:

Lesenswert?

Torsten M. schrieb:
> ob das dann auch wirklich so funktioniert.
Muss es und tut es:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
5
entity Ueberladen is
6
    Generic ( def : STD_LOGIC := '1');
7
    Port ( clk : in  STD_LOGIC;
8
           sel : in  STD_LOGIC;
9
           o   : out  std_logic_vector(7 downto 0));
10
end Ueberladen;
11
12
architecture Behavioral of Ueberladen is
13
14
function to_integer(input : in std_logic) return integer is
15
begin
16
  if(input = '0') then return 0;
17
  else                 return 1;
18
  end if;
19
end function;
20
21
signal wert : integer range 0 to 255 := 16#55#*to_integer(def);
22
23
begin
24
     wert <= 16#33#*to_integer(sel) when rising_edge(clk);
25
     o    <= std_logic_vector(to_unsigned(wert,8));
26
end Behavioral;
Ergibt zusammen mit der Q&D TB
1
LIBRARY ieee;
2
USE ieee.std_logic_1164.ALL;
3
USE ieee.numeric_std.ALL;
4
 
5
ENTITY tb_ueberladen IS
6
END tb_ueberladen;
7
 
8
ARCHITECTURE behavior OF tb_ueberladen IS 
9
    COMPONENT Ueberladen
10
    PORT(  clk : in  STD_LOGIC;
11
           sel : IN  std_logic;
12
           o : OUT  std_logic_vector(7 downto 0)
13
        );
14
    END COMPONENT;
15
16
   signal sel : std_logic := '0';
17
   signal clk : std_logic := '0';
18
   signal o : std_logic_vector(7 downto 0);
19
 
20
BEGIN
21
   uut: Ueberladen PORT MAP (
22
          clk => clk,
23
          sel => sel,
24
          o => o
25
        );
26
27
   sel <= not sel after 77 ns;
28
   clk <= not clk after 123 ns;
29
END;
die angehängte Waveform.
Und auch die Umsetzung in Hardware klappt... ;-)

von Duke Scarring (Gast)


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/numeric_std.vhd

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.