Search code examples
vhdlfpgaxilinx

2's compliment input and using vhdl library for signed input


My input data is 2's compliment and I designed the input is signed number and the all of operation is used signed number,the library i used ieee.numeric_std.all, but when i do ‘+’ an error occurred "found '0' definitions of operator "+", cannot determine exact overloaded matching definition for "+"". So I changed another to another library ieee.std_logic_arith.all ans make the add operation as a component, it works. when i simulate my code by using testbench, error occurred: Entity port xin does not match with type signed of component port. I think this error is about my library. can anyone help me ?

new

i do not use adder as a component and the below code works

adder: process(clk)
begin
  if (clk'event and clk = '1')then
   if enable1='1' then
    add1 <= (x0(7)&x0) + (x15(8)&x15);
    add2 <= (x1(7)&x1) + (x14(8)&x14);
     add3 <= (x2(7)&x2) + (x13(8)&x13);
     add4 <= (x3(7)&x3) + (x12(8)&x12);
     add5 <= (x4(7)&x4) + (x11(8)&x11);
     add6 <= (x5(7)&x5) + (x10(8)&x10);
     add7 <= (x6(7)&x6) + (x9(8)&x9);
     add8 <= (x7(7)&x7) + (x8(8)&x8);
    end if;
  end if;
 end process adder;

and the library of my testbench use use ieee.numeric_std.all;

    USE ieee.std_logic_1164.ALL;
    use ieee.numeric_std.all;
    use ieee.std_logic_textio.all;
    use std.textio.all;

    ENTITY tb_signedinput IS
    END tb_signedinput;

ARCHITECTURE behavior OF tb_signedinput IS 

  -- Component Declaration
COMPONENT signedinput is
   port(   Clk : in std_logic; 
           reset : in std_logic;
             enable1 : in std_logic;
           Xin : in signed(7 downto 0); 
           Yout : out signed(19 downto 0) 
        );
END COMPONENT;

  --Inputs
   signal Clk : std_logic := '0';
   signal reset : std_logic := '0';
   signal Xin : signed(7 downto 0) := (others => '0');
   signal enable1 : std_logic := '0';
    --Outputs
   signal Yout : signed(19 downto 0);
   -- Array
    constant MEMSIZE: integer :=99;
    type testarray is array (MEMSIZE downto 0) of signed(7 DOWNTO 0);
   signal testvectors: testarray;

   shared variable vectornum,outnum: integer;

   -- Clock period definitions
constant Clk_period : time := 10 ns;

BEGIN

  -- Component Instantiation
 uut: signedinput PORT MAP(  Clk => Clk,
                             reset => reset,
                             Xin => Xin,
                                      enable1 =>enable1,
                             Yout => Yout   );  

the error still occur:

Entity port xin does not match with type std_logic_vector of component port
Entity port yout does not match with type std_logic_vector of component port

therefore, I changed my adder again to

add1 <= resize(x0,9) + x15;

syntax good but same error in testbench..

Is error about my ISE type or library type? Thank you!


Solution

  • Your addition expression in adder1 is invalid because you're trying to index element "8" when the range of a1 and a2 is 7 downto 0.

    Assuming thet you're trying to sign extend it would look something more like this:

    q <=(a1(7)&a1 + a2(7)&a2);
    

    The "+" operator has higher precedence than "&" so you are trying to add a1 + a2(7) which is signed + std_logic. This doesn't have an overload defined in numeric_std in addition to being logically wrong.

    This works:

    q <=(a1(7)&a1) + (a2(7)&a2);
    

    But it isn't the canonical way to implement sign extension when using numeric_std. You only need the left side term to have the same size as q. The signed "+" operator will take care of sign extending its right hand side automatically.

    q <= resize(a1, q'length) + a2; -- Sign extend a1 and add
    

    This gives cleaner code that says what it's doing without relying on the non-standard std_logic_arith.

    The actual error about the type mismatch on xin isn't apparent from your code. It is possible that you have an older version of signedinput compiled with a different type on its port and haven't updated the library.