Forum: FPGA, VHDL & Co. Additions Funktion mit VHDL


von Student (Gast)


Lesenswert?

ich möchte Logische( shift rotation usw.) sowie Arithmetische 
Operationen( addition, sub mult und div) ausführen. Nur ich kriege bei 
der ausführung über ghdl eine meldung :

./testbench:error: bound check failure at Rechnereinheit.vhd:207
./testbench:error: simulation failed
/usr/lib/ghdl/bin/ghdl: compilation error

da ich das ergebnis als 16 bit definiert habe (weil ich für die 
multiplikation eine grössere breite brauche) verstehe ich dass die 
zuweisung nicht korrekt ist. Ich will z.b a: 0010 1110 und b: 1101 0111 
zusammen addieren. Das Ergebnis sollte 1 0000 0101 , also 9 bit gross 
sein. Ich habe es mit y <= "0000000" &  std_logic_vector(signed(a) + 
signed(b)) versucht aber es fehlt das 1 bit, deshalb das bound failure.
Hättet ihr eine Idee wie ich es sonst machen kann?




library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
--use IEEE.STD_LOGIC_ARITH.ALL;
--use IEEE.STD_LOGIC_UNSIGNED.ALL;

use work.all;

--  Uncomment the following lines to use the declarations that are

--  provided for instantiating Xilinx primitive components.

--library UNISIM;

--use UNISIM.VComponents.all;



entity Rechnereinheit is

  Port (    Operand_1 :   in std_logic_vector(7 downto 0);

      Operand_2:  in std_logic_vector(7 downto 0);
      cin : in std_logic := '0';
      func:  in std_logic_vector(4 downto 0);
      cout: out std_logic;

      res:  out std_logic_vector(15 downto 0));

end Rechnereinheit;



architecture Behavioral of Rechnereinheit is

......

procedure Add ( signal a : in std_logic_vector(7 downto 0);
signal b: in std_logic_vector(7 downto 0);
signal y : out std_logic_vector(15 downto 0)) is

begin

  y <=  std_logic_vector(signed(a) + signed(b));

end procedure;



begin

process(func,cin,operand_1,operand_2)





 begin



  case Func is
      when "00001" =>     -- Addition
      Add(Operand_1,Operand_2,res);

      ....


      when others =>

         null;       -- leere Anweisung

      end case;

von Xenu (Gast)


Lesenswert?

y <= "0000000" & std_logic_vector(signed("0" & a) + signed("0" & b));

von Student (Gast)


Lesenswert?

Es funktioniert!
Vielen Dank!

von Valko Z. (hydravliska)


Lesenswert?

Xenu schrieb:
> y <= "0000000" & std_logic_vector(signed("0" & a) + signed("0" & b));

y(8 downto 0) <= std_logic_vector(signed(a(a'HIGH) & a) + 
signed(b(b'HIGH) & b));

for i in 15 downto 9 loop
y(i) <= y(8);
end loop

Sonst werden alle Zahlen positiv.

Gruss,
Valentin

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


Lesenswert?

Mein Vorschlag:
1
y <= std_logic_vector( to_signed( to_integer(signed(a)) + to_integer(signed(b)) ,16) );
Oder:
1
y <= std_logic_vector( resize(signed(a),16) + resize(signed(b),16) );

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.