Forum: FPGA, VHDL & Co. conv_std_logic_vector funktion


von Dima S. (onkelbenz)


Lesenswert?

Hallo

ich versuche gerade etwas in VHDL zu schreiben, habe aber ein Problem 
mit konvertierung, wo ic hnicht weiter komme - hoffe jemand kann mir 
sagen was die sache ist.

Also ich habe 4 Komponenten, die folgendermaßen zusammengesetzt sein 
sollen:

 ______________________________________________________
|                      system_modul                      |
|                                                        |
|  __________          __________           _________  |
| |           |        |          |         |          | |
| | RX_modul  | sig_in |  my_mux  | sig_out | TX_modul | |
|_|           |________|          |_________|          |_|
| |           |        |          |         |          | |
| |___________|        |__________|         |__________| |
|________________________________________________________|

jetzt haben die RX und TX module unter anderen folgende ports
sig_in  : in   unsigned(7 downto 0); -- TX port
sig_out : out  unsigned(7 downto 0); -- RX port

während my_mux folgende schnittstelle hat:
entity my_mux is
  port
  (
    ...
    sig_in   : in   std_logic_vector(3 downto 0);
    sig_out  : out  std_logic_vector(6 downto 0)
  );
end entity my_mux;

ich möchte dabei folgende port map erstellen:
make_my_mux : my_mux
  port map
  (
    ...
    sig_in   =>   conv_std_logic_vector ( sig_out, 4 ),
    sig_out  =>   conv_std_logic_vector ( sig_in, 7 )
  );

D.h. für die konvertierung von unsigned ( 7 downto 0) möchte ich in 
std_logic_vector ( 3 downto 0) bzw ( 6 down_to 0 ) versuche ich die 
conv_std_logic_vector funktion zu verwenden, welche laut dieser 
http://www.cs.sfu.ca/~ggbaker/reference/std_logic/arith/conv_std_logic_vector.html 
Beschreibung genau das machen sollte. Habe dazu die 
ieee.std_logic_arith.ALL bibliothek eingebunden. Die überflüssige 
zeichen können ruhig abgeschnitten werden, es ist kein problem.

Jedoch erhalte ich nur fehler zurück:
2x conv_std_logic_vector can not have such operands in this context
Formal sig_in of mod_sync_sevenseg with no default value must be 
associated with an actual value

Was mache ich falsch, wieso kommen diese meldungen?

Danke

p.s. RX, TX und MUX sind nicht von mir, deswegen möchte ich da nichts 
verändern, sondern nur zusammen mappen

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


Lesenswert?

Dima Schmitt schrieb:
> Habe dazu die ieee.std_logic_arith.ALL bibliothek eingebunden.
Dir fehlt vermutlich noch die
use IEEE.STD_LOGIC_UNSIGNED.ALL;
oder die
use IEEE.STD_LOGIC_SIGNED.ALL;

!!!ABER!!!
Ich verweise da mal auf den Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"
Und dann auf die tollen und durchgängigen Konvertierungsfunktionen und 
Casts der numeric_std: 
http://www.lothar-miller.de/s9y/archives/14-Numeric_Std.html

von Heinrich H. (Firma: Ich.AG) (hhanff)


Lesenswert?

Dima Schmitt schrieb:
> Hallo
>
> ich versuche gerade etwas in VHDL zu schreiben, habe aber ein Problem
> mit konvertierung, wo ic hnicht weiter komme - hoffe jemand kann mir
> sagen was die sache ist.
Wir wollen es versuchen...

>
> Also ich habe 4 Komponenten, die folgendermaßen zusammengesetzt sein
> sollen:
>
>  ________________________________________________________
> |                      system_modul                      |
> |                                                        |
> |  __________          __________           _________  |
> | |           |        |          |         |          | |
> | | RX_modul  | sig_in |  my_mux  | sig_out | TX_modul | |
> |_|           |________|          |_________|          |_|
> | |           |        |          |         |          | |
> | |___________|        |__________|         |__________| |
> |________________________________________________________|
>
> jetzt haben die RX und TX module unter anderen folgende ports
> sig_in  : in   unsigned(7 downto 0); -- TX port
> sig_out : out  unsigned(7 downto 0); -- RX port
>
> während my_mux folgende schnittstelle hat:
> entity my_mux is
>   port
>   (
>     ...
>     sig_in   : in   std_logic_vector(3 downto 0);
>     sig_out  : out  std_logic_vector(6 downto 0)
>   );
> end entity my_mux;
>
> ich möchte dabei folgende port map erstellen:
> make_my_mux : my_mux
>   port map
>   (
>     ...
>     sig_in   =>   conv_std_logic_vector ( sig_out, 4 ),
>     sig_out  =>   conv_std_logic_vector ( sig_in, 7 )
>   );

Das geht einfacher.
make_my_mux : my_mux
  port map
  (
    ...
    sig_in   =>   sig_out(3 downto 0),
    sig_out  =>   sig_in  -- Wenn sig_out und sig_in die gleiche Laenge 
haben.
  );

>
> D.h. für die konvertierung von unsigned ( 7 downto 0) möchte ich in
> std_logic_vector ( 3 downto 0) bzw ( 6 down_to 0 ) versuche ich die
> conv_std_logic_vector funktion zu verwenden, welche laut dieser
> 
http://www.cs.sfu.ca/~ggbaker/reference/std_logic/arith/conv_std_logic_vector.html
> Beschreibung genau das machen sollte. Habe dazu die
> ieee.std_logic_arith.ALL bibliothek eingebunden. Die überflüssige
> zeichen können ruhig abgeschnitten werden, es ist kein problem.

Im Allgemeinen wird davon abgeraten die Bibliother zu verwenden die die 
Funktion conv_std_logic_vector beinhaltet (std_logic_arith). Verwende 
stattdessen, wenn mal was konvertieren/casten musst die numeric_std 
Bibliothek.

Lothar Miller hat ein schönes Diagramm dass die Wandlung zwischen den 
Typen darstellt:
http://www.lothar-miller.de/s9y/uploads/Bilder/Usage_of_numeric_std.pdf
... hoffe das ist OK den Link hier zu posten.

>
> Jedoch erhalte ich nur fehler zurück:
> 2x conv_std_logic_vector can not have such operands in this context
> Formal sig_in of mod_sync_sevenseg with no default value must be
> associated with an actual value
>
> Was mache ich falsch, wieso kommen diese meldungen?
>
> Danke
>
> p.s. RX, TX und MUX sind nicht von mir, deswegen möchte ich da nichts
> verändern, sondern nur zusammen mappen

Gruß,

     Hendrik

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


Lesenswert?

Heinrich H. schrieb:
> Lothar Miller hat ein schönes Diagramm
Dankesehr... ;-)
Aber ich darf das Lob an einen mir unbekannten Autor weitergeben, der 
diese sehr übersichtliche Darstellung herausgefunden hat. Ich habe sie 
dann nur noch ein wenig "aufpoliert".

Dima Schmitt schrieb:
> jetzt haben die RX und TX module unter anderen folgende ports
> sig_in  : in   unsigned(7 downto 0); -- TX port
> sig_out : out  unsigned(7 downto 0); -- RX port
Mein Vorschlag: nimm an den Ports std_logic und dessen Vektoren.

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.