0
\$\begingroup\$

Given an array of N elements, element is M bits vector. I am going to sum them up.

For example, given an array of 12 bits vectors.

type data_array is array (integer range 0 to 68)  of std_logic_vector( 11 downto 0); --69s 12-bits-vectors 

To sum up, I use two loops:

  • first loop: create an array data_array_sum_1 of 6 elements: sum each 10 vectors ( 10 * 6) + sum 9 vectors up.
  • second loop: sum 6 elements up, data_array_sum_2

data_array_sum_1 will be created as:

 type data_array_sum_1 is array (integer range 0 to 6)  of signed ( 11+3 downto 0);

I add log2(10)=3 additional bits.

data_array_sum_2 will be created as:

 type data_array_sum_2 is  std_logic_vector ( 11+ 5 downto 0);

I add log2(6)=2 additional bits to data_array_sum_1. data_array_sum_2 is the result of addition of 69 elements.

If I don't use loops and sum them up, I should add log2(69)=6, that means the result of addition of 69 elements are 18 bits vector.

I think, I should get the same length of the resultant vector and the length doesn't depend on the algorithm of addition, right? Have I mistaken?

EDIT 1

I am checking different options to sum up two std_logic_vectors. I have read in this forum you suggest to use signed or unsigned type to add them.

My design file:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity test is
port (
    a       : in std_logic_vector (11 downto 0);     
    b       : in std_logic_vector (11 downto 0);    

    result1 : out unsigned (12 downto 0);    
    result2 : out std_logic_vector (11 downto 0);
    result3 : out std_logic_vector (11 downto 0)
);

end test;

architecture Behavioral of test is 
signal f: std_logic_vector(12 downto 0);
begin
    result1 <= '0'& unsigned(a) + unsigned(b);
    f <=  std_logic_vector(unsigned(a) + unsigned(b));
    result3 <= f(12 downto 1);
    result2 <= std_logic_vector(signed(a) + signed(b));    

    --result3 <= std_logic_vector(('0'& a) + ( '0' & b)); 
    --result3 <= std_logic_vector(resize( a, a'length+1) + resize(b, b'length+1));

end Behavioral;

My test bench file:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
 
ENTITY testtb IS
END testtb;
 
ARCHITECTURE behavior OF testtb IS 
 
    COMPONENT test
    PORT(
         a : IN  std_logic_vector(11 downto 0);
         b : IN  std_logic_vector(11 downto 0);
         result1 : OUT  unsigned(12 downto 0);
         result3 : OUT  std_logic_vector(11 downto 0);
         result2 : OUT  std_logic_vector(11 downto 0)
        );
    END COMPONENT;
    

   --Inputs
   signal a : std_logic_vector(11 downto 0) := (others => '0');
   signal b : std_logic_vector(11 downto 0) := (others => '0');

    --Outputs
   signal result1 : unsigned(12 downto 0);
   signal result2 : std_logic_vector(11 downto 0);
   signal result3 : std_logic_vector(11 downto 0);

 
BEGIN
 

   uut: test PORT MAP (
          a => a,
          b => b,
          result1 => result1,
          result2 => result2
        );


   stim_proc: process
   begin        

       a <= "001001010001";
       b <= "110110101111";
       wait for 10 ns;
       b <= "001001010001";
       a <= "110110101111";

    wait;
 end process;

 END;

I found the correct answer gives result1. Then I have added result3 with f and smth is wrong with f.

ERROR: Array sizes do not match.

Why has it happend? I add two vectors, it means I have one additional bit.

\$\endgroup\$
5
  • \$\begingroup\$ In system verilog, we do clog2, not log2 cz it's almost useless, must be something like that in VHDL as well. \$\endgroup\$ – Mitu Raj 2 days ago
  • \$\begingroup\$ @MituRaj if i define all vectors as signed or unsigned ( using numeric- library), will be it important for me ( add additional bits)? \$\endgroup\$ – user176070 2 days ago
  • \$\begingroup\$ Yea VHDL is strictly typed language. \$\endgroup\$ – Mitu Raj 2 days ago
  • \$\begingroup\$ @MituRaj Why is preferred using the signed/unsigned format in addition two std_logic_vectors? \$\endgroup\$ – user176070 yesterday
  • \$\begingroup\$ Std logic vectors don't support addition (at least not with the standard librariesbin VHDL I know). That's why unsigned or signed conversion. Numeric-std library supports it. \$\endgroup\$ – Mitu Raj yesterday
1
\$\begingroup\$

You are underestimating the number of bits when you ignore the fractional part of the log2 function. What you really want is ceiling(log2()), sometimes called clog2() because it is so commonly used in this type of situation.

So:

  • clog2(10) = 4 (not 3)
  • clog2(7) = 3 (not 2)
  • clog2(69) = 7 (not 6)

Since 4 + 3 = 7, now the results are self-consistent.

\$\endgroup\$
3
  • \$\begingroup\$ if i define all vectors as signed or unsigned ( using numeric- library), will be it important for me ( add additional bits)? \$\endgroup\$ – user176070 2 days ago
  • \$\begingroup\$ Yes, with signed and unsigned, you still need to explicitly specify the width. \$\endgroup\$ – Dave Tweed 2 days ago
  • \$\begingroup\$ Why is preferred using the signed/unsigned format in addition two std_logic_vectors? \$\endgroup\$ – user176070 yesterday

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.