Forum: FPGA, VHDL & Co. addition von std_logic


von dummy_none (Gast)


Lesenswert?

mein code synthetisiert nicht. was mache ich da falsch?
xst meldet: Expression in type conversion to std_logic_vector has 2 
possible definitions in this scope, for example, UNSIGNED and 
std_logic_vector.

1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.std_logic_misc.all;
4
use ieee.std_logic_arith.all;
5
use ieee.std_logic_unsigned.all;
6
use ieee.numeric_std.all;
7
8
entity gentest is
9
  generic (
10
    test              : std_logic
11
  );
12
  port(
13
    -- clk
14
    clk           : in  std_logic;
15
    -- data-input
16
    data_in1      : in std_logic_vector(2 downto 0);
17
    data_in2      : in  std_logic_vector(2 downto 0);
18
    -- output
19
    out_data      : out std_logic_vector(3 downto 0)
20
  );
21
end gentest;
22
23
architecture behav of gentest is
24
25
  signal temp : std_logic_vector(3 downto 0);
26
27
begin
28
  
29
  process(clk)
30
  begin
31
  if rising_edge(clk) then
32
    if test = '1' then 
33
      out_data <= std_logic_vector(unsigned(data_in1) + unsigned(data_in2));
34
    end if;
35
    if test = '0' then 
36
      out_data <= std_logic_vector(unsigned(data_in1) - unsigned(data_in2));
37
    end if;
38
  end if;
39
  --out_data <= temp;
40
  end process;
41
end behav;

von Duke Scarring (Gast)


Lesenswert?

dummy_none schrieb:
> Expression in type conversion to std_logic_vector has 2
> possible definitions in this scope
Ja, ist logisch.

Entweder diese Bibliotheken:
> use ieee.std_logic_arith.all;
> use ieee.std_logic_unsigned.all;

Oder besser diese verwenden:
> use ieee.numeric_std.all;

Aber nur entweder oder, aber nicht beides zusammen.
Und demnächst schaust Du mal in die Quelltexte der verschiedenen 
Bibliotheken, dann verstehst Du auch die Fehlermeldung.

Duke

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


Lesenswert?

1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.std_logic_misc.all;
4
use ieee.std_logic_arith.all;
5
use ieee.std_logic_unsigned.all;
6
use ieee.numeric_std.all;
Viel hilft viel oder wie?
Lies mal: Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"

Du hast doppelte Definitionen, die der Compiler anmault. Also schreib 
das:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
Die numeric_std bietet alles, was du brauchst:
http://www.lothar-miller.de/s9y/archives/14-Numeric_Std.html

Du hast noch einen Breitenfehler:
"line 33: Width mismatch. <out_data> has a width of 4 bits but assigned 
expression is 3-bit wide."
3Bit + 3Bit ergeben weiterhin 3 Bit, du mußt vor der Addition noch ein 
Bit anhängen:
1
  out_data <= std_logic_vector(resize(unsigned(data_in1),4) + resize(unsigned(data_in2),4));
oder gleich den Weg über Integer gehen:
1
  out_data <= std_logic_vector(to_unsigned(to_integer(unsigned(data_in1)) + to_integer(unsigned(data_in2)),4));

Übrigens:
Synplify (Lattice) bringt keinen Fehler trotz der (zu)vielen Libs... 
;-)

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.