Dear Tricky,
Yes, you are right, I need a 19 bit result. My fault.
This is the code I'm implementing:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
ENTITY my_poly_test IS
PORT( in1 : IN SIGNED (15 DOWNTO 0);
clk,clr : IN std_logic;
result : OUT SIGNED (15 DOWNTO 0));
END ENTITY my_poly_test;
ARCHITECTURE logic OF my_poly_test IS
SIGNAL x2 : SIGNED (15 DOWNTO 0);
SIGNAL x3 : SIGNED (15 DOWNTO 0);
SIGNAL x4 : SIGNED (15 DOWNTO 0);
SIGNAL x5 : SIGNED (15 DOWNTO 0);
SIGNAL x6 : SIGNED (15 DOWNTO 0);
SIGNAL x7 : SIGNED (15 DOWNTO 0);
SIGNAL x_d : STD_LOGIC_VECTOR(15 DOWNTO 0);
SIGNAL x2_d : STD_LOGIC_VECTOR(15 DOWNTO 0);
SIGNAL x3_d : STD_LOGIC_VECTOR (15 DOWNTO 0);
SIGNAL x4_d : STD_LOGIC_VECTOR (15 DOWNTO 0);
SIGNAL x5_d : STD_LOGIC_VECTOR (15 DOWNTO 0);
SIGNAL x6_d : STD_LOGIC_VECTOR (15 DOWNTO 0);
SIGNAL x7_d : STD_LOGIC_VECTOR(15 DOWNTO 0);
SIGNAL sum : STD_LOGIC_VECTOR(18 DOWNTO 0);
COMPONENT my_signed_multiplier IS
PORT( in1, in2 : IN signed (15 DOWNTO 0);
clk,clr : IN std_logic;
result : OUT signed(15 DOWNTO 0));
END COMPONENT;
COMPONENT my_generic_dff_aclr IS
GENERIC (delay : INTEGER :=4);
PORT( d : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
clk , clr : IN STD_LOGIC;
q: OUT STD_LOGIC_VECTOR(15 DOWNTO 0));
END COMPONENT;
COMPONENT my_signed_adder IS
PORT( in1,in2 : IN SIGNED (15 DOWNTO 0);
clk,clr : IN std_logic;
result : OUT SIGNED (15 DOWNTO 0));
END COMPONENT;
BEGIN
M1 : my_signed_multiplier PORT MAP (in1,in1,clk,clr,x2);
M2 : my_signed_multiplier PORT MAP (in1,x2,clk,clr,x3);
M3 : my_signed_multiplier PORT MAP (in1,x3,clk,clr,x4);
M4 : my_signed_multiplier PORT MAP (in1,x4,clk,clr,x5);
M5 : my_signed_multiplier PORT MAP (in1,x5,clk,clr,x6);
M6 : my_signed_multiplier PORT MAP (in1,x6,clk,clr,x7);
DFF1: my_generic_dff_aclr GENERIC MAP(1) PORT MAP (std_logic_vector(x6),clk,clr,x6_d);
DFF2: my_generic_dff_aclr GENERIC MAP(2) PORT MAP (std_logic_vector(x5),clk,clr,x5_d);
DFF3: my_generic_dff_aclr GENERIC MAP(3) PORT MAP (std_logic_vector(x4),clk,clr,x4_d);
DFF4: my_generic_dff_aclr GENERIC MAP(4) PORT MAP (std_logic_vector(x3),clk,clr,x3_d);
DFF5: my_generic_dff_aclr GENERIC MAP(5) PORT MAP (std_logic_vector(x2),clk,clr,x2_d);
DFF6: my_generic_dff_aclr GENERIC MAP(6) PORT MAP (std_logic_vector(x),clk,clr,x_d);
PROCESS(clk,clr)
BEGIN
IF clr ='1' THEN
x2<=(OTHERS => '0');
x3<=(OTHERS => '0');
x4<=(OTHERS => '0');
x5<=(OTHERS => '0');
x6<=(OTHERS => '0');
x7<=(OTHERS => '0');
x2_d<=(OTHERS => '0');
x3_d<=(OTHERS => '0');
x4_d<=(OTHERS => '0');
x5_d<=(OTHERS => '0');
x6_d<=(OTHERS => '0');
x7_d<=(OTHERS => '0');
ELSIF rising_edge(clk) THEN
sum<=1+signed(x2_d)+signed(x3_d)+signed(x4_d)+signed(x5_d)+signed(x6_d)+signed(x7_d);
result<=sum(19 DOWNTO 3);
END IF;
END PROCESS;
END ARCHITECTURE logic;
Every time I take a mutiplication I take only the 16 MSbs. So at the final sum each signal is exactly 16 bits wide.
Thank you for help.