Convert std_logic_to_integer

Gast #2081635
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.
Gast #2081955
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!
Gast #2082328
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.
#2082444
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.
#2083762
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.
Moderator (Firma: Titel) Persönliche Seite #2083945
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... ;-)
Angehängte Dateien:

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.