You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			1076 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			VHDL
		
	
			
		
		
	
	
			1076 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			VHDL
		
	
| library ieee;
 | |
| use ieee.std_logic_1164.all;
 | |
| use ieee.numeric_std.all;
 | |
| 
 | |
| library work;
 | |
| use work.common.all;
 | |
| 
 | |
| library unisim;
 | |
| use unisim.vcomponents.all;
 | |
| 
 | |
| entity multiply is
 | |
|     port (
 | |
|         clk   : in std_logic;
 | |
| 
 | |
|         m_in  : in MultiplyInputType;
 | |
|         m_out : out MultiplyOutputType
 | |
|         );
 | |
| end entity multiply;
 | |
| 
 | |
| architecture behaviour of multiply is
 | |
|     signal m00_p, m01_p, m02_p, m03_p : std_ulogic_vector(47 downto 0);
 | |
|     signal m00_pc : std_ulogic_vector(47 downto 0);
 | |
|     signal m10_p, m11_p, m12_p, m13_p : std_ulogic_vector(47 downto 0);
 | |
|     signal m11_pc, m12_pc, m13_pc : std_ulogic_vector(47 downto 0);
 | |
|     signal m20_p, m21_p, m22_p, m23_p : std_ulogic_vector(47 downto 0);
 | |
|     signal s0_pc, s1_pc : std_ulogic_vector(47 downto 0);
 | |
|     signal product : std_ulogic_vector(127 downto 0);
 | |
|     signal addend : std_ulogic_vector(127 downto 0);
 | |
|     signal s0_carry, p0_carry : std_ulogic_vector(3 downto 0);
 | |
|     signal p0_mask : std_ulogic_vector(47 downto 0);
 | |
|     signal p0_pat, p0_patb : std_ulogic;
 | |
|     signal p1_pat, p1_patb : std_ulogic;
 | |
| 
 | |
|     signal req_32bit, r32_1 : std_ulogic;
 | |
|     signal rnot_1 : std_ulogic;
 | |
|     signal valid_1 : std_ulogic;
 | |
|     signal overflow, ovf_in : std_ulogic;
 | |
| 
 | |
| begin
 | |
|     addend <= m_in.addend;
 | |
| 
 | |
|     m00: DSP48E1
 | |
|         generic map (
 | |
|             ACASCREG => 0,
 | |
|             ALUMODEREG => 0,
 | |
|             AREG => 0,
 | |
|             BCASCREG => 0,
 | |
|             BREG => 0,
 | |
|             CARRYINREG => 0,
 | |
|             CARRYINSELREG => 0,
 | |
|             CREG => 0,
 | |
|             INMODEREG => 0,
 | |
|             MREG => 0,
 | |
|             OPMODEREG => 0,
 | |
|             PREG => 1
 | |
|             )
 | |
|         port map (
 | |
|             A => "0000000" & m_in.data1(22 downto 0),
 | |
|             ACIN => (others => '0'),
 | |
|             ALUMODE => "0000",
 | |
|             B => '0' & m_in.data2(16 downto 0),
 | |
|             BCIN => (others => '0'),
 | |
|             C => "00000000000000" & addend(33 downto 0),
 | |
|             CARRYCASCIN => '0',
 | |
|             CARRYIN => '0',
 | |
|             CARRYINSEL => "000",
 | |
|             CEA1 => '0',
 | |
|             CEA2 => '0',
 | |
|             CEAD => '0',
 | |
|             CEALUMODE => '0',
 | |
|             CEB1 => '0',
 | |
|             CEB2 => '0',
 | |
|             CEC => '0',
 | |
|             CECARRYIN => '0',
 | |
|             CECTRL => '0',
 | |
|             CED => '0',
 | |
|             CEINMODE => '0',
 | |
|             CEM => '0',
 | |
|             CEP => m_in.valid,
 | |
|             CLK => clk,
 | |
|             D => (others => '0'),
 | |
|             INMODE => "00000",
 | |
|             MULTSIGNIN => '0',
 | |
|             OPMODE => "0110101",
 | |
|             P => m00_p,
 | |
|             PCIN => (others => '0'),
 | |
|             PCOUT => m00_pc,
 | |
|             RSTA => '0',
 | |
|             RSTALLCARRYIN => '0',
 | |
|             RSTALUMODE => '0',
 | |
|             RSTB => '0',
 | |
|             RSTC => '0',
 | |
|             RSTCTRL => '0',
 | |
|             RSTD => '0',
 | |
|             RSTINMODE => '0',
 | |
|             RSTM => '0',
 | |
|             RSTP => '0'
 | |
|             );
 | |
| 
 | |
|     m01: DSP48E1
 | |
|         generic map (
 | |
|             ACASCREG => 0,
 | |
|             ALUMODEREG => 0,
 | |
|             AREG => 0,
 | |
|             BCASCREG => 0,
 | |
|             BREG => 0,
 | |
|             CARRYINREG => 0,
 | |
|             CARRYINSELREG => 0,
 | |
|             INMODEREG => 0,
 | |
|             OPMODEREG => 0,
 | |
|             PREG => 0
 | |
|             )
 | |
|         port map (
 | |
|             A => "0000000" & m_in.data1(22 downto 0),
 | |
|             ACIN => (others => '0'),
 | |
|             ALUMODE => "0000",
 | |
|             B => '0' & m_in.data2(33 downto 17),
 | |
|             BCIN => (others => '0'),
 | |
|             C => (others => '0'),
 | |
|             CARRYCASCIN => '0',
 | |
|             CARRYIN => '0',
 | |
|             CARRYINSEL => "000",
 | |
|             CEA1 => '0',
 | |
|             CEA2 => '0',
 | |
|             CEAD => '0',
 | |
|             CEALUMODE => '0',
 | |
|             CEB1 => '0',
 | |
|             CEB2 => '0',
 | |
|             CEC => '1',
 | |
|             CECARRYIN => '0',
 | |
|             CECTRL => '0',
 | |
|             CED => '0',
 | |
|             CEINMODE => '0',
 | |
|             CEM => m_in.valid,
 | |
|             CEP => '0',
 | |
|             CLK => clk,
 | |
|             D => (others => '0'),
 | |
|             INMODE => "00000",
 | |
|             MULTSIGNIN => '0',
 | |
|             OPMODE => "1010101",
 | |
|             P => m01_p,
 | |
|             PCIN => m00_pc,
 | |
|             RSTA => '0',
 | |
|             RSTALLCARRYIN => '0',
 | |
|             RSTALUMODE => '0',
 | |
|             RSTB => '0',
 | |
|             RSTC => '0',
 | |
|             RSTCTRL => '0',
 | |
|             RSTD => '0',
 | |
|             RSTINMODE => '0',
 | |
|             RSTM => '0',
 | |
|             RSTP => '0'
 | |
|             );
 | |
| 
 | |
|     m02: DSP48E1
 | |
|         generic map (
 | |
|             ACASCREG => 0,
 | |
|             ALUMODEREG => 0,
 | |
|             AREG => 0,
 | |
|             BCASCREG => 0,
 | |
|             BREG => 0,
 | |
|             CARRYINREG => 0,
 | |
|             CARRYINSELREG => 0,
 | |
|             CREG => 0,
 | |
|             INMODEREG => 0,
 | |
|             MREG => 0,
 | |
|             OPMODEREG => 0,
 | |
|             PREG => 1
 | |
|             )
 | |
|         port map (
 | |
|             A => "0000000" & m_in.data1(22 downto 0),
 | |
|             ACIN => (others => '0'),
 | |
|             ALUMODE => "0000",
 | |
|             B => '0' & m_in.data2(50 downto 34),
 | |
|             BCIN => (others => '0'),
 | |
|             C => x"0000000" & "000" & addend(50 downto 34),
 | |
|             CARRYCASCIN => '0',
 | |
|             CARRYIN => '0',
 | |
|             CARRYINSEL => "000",
 | |
|             CEA1 => '0',
 | |
|             CEA2 => '0',
 | |
|             CEAD => '0',
 | |
|             CEALUMODE => '0',
 | |
|             CEB1 => '0',
 | |
|             CEB2 => '0',
 | |
|             CEC => '0',
 | |
|             CECARRYIN => '0',
 | |
|             CECTRL => '0',
 | |
|             CED => '0',
 | |
|             CEINMODE => '0',
 | |
|             CEM => '0',
 | |
|             CEP => m_in.valid,
 | |
|             CLK => clk,
 | |
|             D => (others => '0'),
 | |
|             INMODE => "00000",
 | |
|             MULTSIGNIN => '0',
 | |
|             OPMODE => "0110101",
 | |
|             P => m02_p,
 | |
|             PCIN => (others => '0'),
 | |
|             RSTA => '0',
 | |
|             RSTALLCARRYIN => '0',
 | |
|             RSTALUMODE => '0',
 | |
|             RSTB => '0',
 | |
|             RSTC => '0',
 | |
|             RSTCTRL => '0',
 | |
|             RSTD => '0',
 | |
|             RSTINMODE => '0',
 | |
|             RSTM => '0',
 | |
|             RSTP => '0'
 | |
|             );
 | |
| 
 | |
|     m03: DSP48E1
 | |
|         generic map (
 | |
|             ACASCREG => 0,
 | |
|             ALUMODEREG => 0,
 | |
|             AREG => 0,
 | |
|             BCASCREG => 0,
 | |
|             BREG => 0,
 | |
|             CARRYINREG => 0,
 | |
|             CARRYINSELREG => 0,
 | |
|             CREG => 0,
 | |
|             INMODEREG => 0,
 | |
|             MREG => 0,
 | |
|             OPMODEREG => 0,
 | |
|             PREG => 1
 | |
|             )
 | |
|         port map (
 | |
|             A => "0000000" & m_in.data1(22 downto 0),
 | |
|             ACIN => (others => '0'),
 | |
|             ALUMODE => "0000",
 | |
|             B => "00000" & m_in.data2(63 downto 51),
 | |
|             BCIN => (others => '0'),
 | |
|             C => x"000000" & '0' & addend(73 downto 51),
 | |
|             CARRYCASCIN => '0',
 | |
|             CARRYIN => '0',
 | |
|             CARRYINSEL => "000",
 | |
|             CEA1 => '0',
 | |
|             CEA2 => '0',
 | |
|             CEAD => '0',
 | |
|             CEALUMODE => '0',
 | |
|             CEB1 => '0',
 | |
|             CEB2 => '0',
 | |
|             CEC => '0',
 | |
|             CECARRYIN => '0',
 | |
|             CECTRL => '0',
 | |
|             CED => '0',
 | |
|             CEINMODE => '0',
 | |
|             CEM => '0',
 | |
|             CEP => m_in.valid,
 | |
|             CLK => clk,
 | |
|             D => (others => '0'),
 | |
|             INMODE => "00000",
 | |
|             MULTSIGNIN => '0',
 | |
|             OPMODE => "0110101",
 | |
|             P => m03_p,
 | |
|             PCIN => (others => '0'),
 | |
|             RSTA => '0',
 | |
|             RSTALLCARRYIN => '0',
 | |
|             RSTALUMODE => '0',
 | |
|             RSTB => '0',
 | |
|             RSTC => '0',
 | |
|             RSTCTRL => '0',
 | |
|             RSTD => '0',
 | |
|             RSTINMODE => '0',
 | |
|             RSTM => '0',
 | |
|             RSTP => '0'
 | |
|             );
 | |
| 
 | |
|     m10: DSP48E1
 | |
|         generic map (
 | |
|             ACASCREG => 0,
 | |
|             ALUMODEREG => 0,
 | |
|             AREG => 0,
 | |
|             BCASCREG => 0,
 | |
|             BREG => 0,
 | |
|             CARRYINREG => 0,
 | |
|             CARRYINSELREG => 0,
 | |
|             CREG => 0,
 | |
|             INMODEREG => 0,
 | |
|             OPMODEREG => 0,
 | |
|             PREG => 0
 | |
|             )
 | |
|         port map (
 | |
|             A => "0000000000000" & m_in.data1(39 downto 23),
 | |
|             ACIN => (others => '0'),
 | |
|             ALUMODE => "0000",
 | |
|             B => '0' & m_in.data2(16 downto 0),
 | |
|             BCIN => (others => '0'),
 | |
|             C => x"000" & "00" & m01_p(39 downto 6),
 | |
|             CARRYCASCIN => '0',
 | |
|             CARRYIN => '0',
 | |
|             CARRYINSEL => "000",
 | |
|             CEA1 => '0',
 | |
|             CEA2 => '0',
 | |
|             CEAD => '0',
 | |
|             CEALUMODE => '0',
 | |
|             CEB1 => '0',
 | |
|             CEB2 => '0',
 | |
|             CEC => '0',
 | |
|             CECARRYIN => '0',
 | |
|             CECTRL => '0',
 | |
|             CED => '0',
 | |
|             CEINMODE => '0',
 | |
|             CEM => m_in.valid,
 | |
|             CEP => '0',
 | |
|             CLK => clk,
 | |
|             D => (others => '0'),
 | |
|             INMODE => "00000",
 | |
|             MULTSIGNIN => '0',
 | |
|             OPMODE => "0110101",
 | |
|             P => m10_p,
 | |
|             PCIN => (others => '0'),
 | |
|             RSTA => '0',
 | |
|             RSTALLCARRYIN => '0',
 | |
|             RSTALUMODE => '0',
 | |
|             RSTB => '0',
 | |
|             RSTC => '0',
 | |
|             RSTCTRL => '0',
 | |
|             RSTD => '0',
 | |
|             RSTINMODE => '0',
 | |
|             RSTM => '0',
 | |
|             RSTP => '0'
 | |
|             );
 | |
| 
 | |
|     m11: DSP48E1
 | |
|         generic map (
 | |
|             ACASCREG => 0,
 | |
|             ALUMODEREG => 0,
 | |
|             AREG => 0,
 | |
|             BCASCREG => 0,
 | |
|             BREG => 0,
 | |
|             CARRYINREG => 0,
 | |
|             CARRYINSELREG => 0,
 | |
|             CREG => 0,
 | |
|             INMODEREG => 0,
 | |
|             OPMODEREG => 0,
 | |
|             PREG => 0
 | |
|             )
 | |
|         port map (
 | |
|             A => "0000000000000" & m_in.data1(39 downto 23),
 | |
|             ACIN => (others => '0'),
 | |
|             ALUMODE => "0000",
 | |
|             B => '0' & m_in.data2(33 downto 17),
 | |
|             BCIN => (others => '0'),
 | |
|             C => x"000" & "00" & m02_p(39 downto 6),
 | |
|             CARRYCASCIN => '0',
 | |
|             CARRYIN => '0',
 | |
|             CARRYINSEL => "000",
 | |
|             CEA1 => '0',
 | |
|             CEA2 => '0',
 | |
|             CEAD => '0',
 | |
|             CEALUMODE => '0',
 | |
|             CEB1 => '0',
 | |
|             CEB2 => '0',
 | |
|             CEC => '0',
 | |
|             CECARRYIN => '0',
 | |
|             CECTRL => '0',
 | |
|             CED => '0',
 | |
|             CEINMODE => '0',
 | |
|             CEM => m_in.valid,
 | |
|             CEP => '0',
 | |
|             CLK => clk,
 | |
|             D => (others => '0'),
 | |
|             INMODE => "00000",
 | |
|             MULTSIGNIN => '0',
 | |
|             OPMODE => "0110101",
 | |
|             P => m11_p,
 | |
|             PCIN => (others => '0'),
 | |
|             PCOUT => m11_pc,
 | |
|             RSTA => '0',
 | |
|             RSTALLCARRYIN => '0',
 | |
|             RSTALUMODE => '0',
 | |
|             RSTB => '0',
 | |
|             RSTC => '0',
 | |
|             RSTCTRL => '0',
 | |
|             RSTD => '0',
 | |
|             RSTINMODE => '0',
 | |
|             RSTM => '0',
 | |
|             RSTP => '0'
 | |
|             );
 | |
| 
 | |
|     m12: DSP48E1
 | |
|         generic map (
 | |
|             ACASCREG => 0,
 | |
|             ALUMODEREG => 0,
 | |
|             AREG => 0,
 | |
|             BCASCREG => 0,
 | |
|             BREG => 0,
 | |
|             CARRYINREG => 0,
 | |
|             CARRYINSELREG => 0,
 | |
|             CREG => 0,
 | |
|             INMODEREG => 0,
 | |
|             OPMODEREG => 0,
 | |
|             PREG => 0
 | |
|             )
 | |
|         port map (
 | |
|             A => "0000000000000" & m_in.data1(39 downto 23),
 | |
|             ACIN => (others => '0'),
 | |
|             ALUMODE => "0000",
 | |
|             B => '0' & m_in.data2(50 downto 34),
 | |
|             BCIN => (others => '0'),
 | |
|             C => x"0000" & '0' & m03_p(36 downto 6),
 | |
|             CARRYCASCIN => '0',
 | |
|             CARRYIN => '0',
 | |
|             CARRYINSEL => "000",
 | |
|             CEA1 => '0',
 | |
|             CEA2 => '0',
 | |
|             CEAD => '0',
 | |
|             CEALUMODE => '0',
 | |
|             CEB1 => '0',
 | |
|             CEB2 => '0',
 | |
|             CEC => '0',
 | |
|             CECARRYIN => '0',
 | |
|             CECTRL => '0',
 | |
|             CED => '0',
 | |
|             CEINMODE => '0',
 | |
|             CEM => m_in.valid,
 | |
|             CEP => '0',
 | |
|             CLK => clk,
 | |
|             D => (others => '0'),
 | |
|             INMODE => "00000",
 | |
|             MULTSIGNIN => '0',
 | |
|             OPMODE => "0110101",
 | |
|             P => m12_p,
 | |
|             PCIN => (others => '0'),
 | |
|             PCOUT => m12_pc,
 | |
|             RSTA => '0',
 | |
|             RSTALLCARRYIN => '0',
 | |
|             RSTALUMODE => '0',
 | |
|             RSTB => '0',
 | |
|             RSTC => '0',
 | |
|             RSTCTRL => '0',
 | |
|             RSTD => '0',
 | |
|             RSTINMODE => '0',
 | |
|             RSTM => '0',
 | |
|             RSTP => '0'
 | |
|             );
 | |
| 
 | |
|     m13: DSP48E1
 | |
|         generic map (
 | |
|             ACASCREG => 0,
 | |
|             ALUMODEREG => 0,
 | |
|             AREG => 0,
 | |
|             BCASCREG => 0,
 | |
|             BREG => 0,
 | |
|             CARRYINREG => 0,
 | |
|             CARRYINSELREG => 0,
 | |
|             INMODEREG => 0,
 | |
|             OPMODEREG => 0,
 | |
|             PREG => 0
 | |
|             )
 | |
|         port map (
 | |
|             A => "0000000000000" & m_in.data1(39 downto 23),
 | |
|             ACIN => (others => '0'),
 | |
|             ALUMODE => "0000",
 | |
|             B => "00000" & m_in.data2(63 downto 51),
 | |
|             BCIN => (others => '0'),
 | |
|             C => x"0000000" & "000" & addend(90 downto 74),
 | |
|             CARRYCASCIN => '0',
 | |
|             CARRYIN => '0',
 | |
|             CARRYINSEL => "000",
 | |
|             CEA1 => '0',
 | |
|             CEA2 => '0',
 | |
|             CEAD => '0',
 | |
|             CEALUMODE => '0',
 | |
|             CEB1 => '0',
 | |
|             CEB2 => '0',
 | |
|             CEC => '1',
 | |
|             CECARRYIN => '0',
 | |
|             CECTRL => '0',
 | |
|             CED => '0',
 | |
|             CEINMODE => '0',
 | |
|             CEM => m_in.valid,
 | |
|             CEP => '0',
 | |
|             CLK => clk,
 | |
|             D => (others => '0'),
 | |
|             INMODE => "00000",
 | |
|             MULTSIGNIN => '0',
 | |
|             OPMODE => "0110101",
 | |
|             P => m13_p,
 | |
|             PCIN => (others => '0'),
 | |
|             PCOUT => m13_pc,
 | |
|             RSTA => '0',
 | |
|             RSTALLCARRYIN => '0',
 | |
|             RSTALUMODE => '0',
 | |
|             RSTB => '0',
 | |
|             RSTC => '0',
 | |
|             RSTCTRL => '0',
 | |
|             RSTD => '0',
 | |
|             RSTINMODE => '0',
 | |
|             RSTM => '0',
 | |
|             RSTP => '0'
 | |
|             );
 | |
| 
 | |
|     m20: DSP48E1
 | |
|         generic map (
 | |
|             ACASCREG => 0,
 | |
|             ALUMODEREG => 0,
 | |
|             AREG => 0,
 | |
|             BCASCREG => 0,
 | |
|             BREG => 0,
 | |
|             CARRYINREG => 0,
 | |
|             CARRYINSELREG => 0,
 | |
|             INMODEREG => 0,
 | |
|             OPMODEREG => 0,
 | |
|             PREG => 0
 | |
|             )
 | |
|         port map (
 | |
|             A => "000000" & m_in.data1(63 downto 40),
 | |
|             ACIN => (others => '0'),
 | |
|             ALUMODE => "0000",
 | |
|             B => '0' & m_in.data2(16 downto 0),
 | |
|             BCIN => (others => '0'),
 | |
|             C => (others => '0'),
 | |
|             CARRYCASCIN => '0',
 | |
|             CARRYIN => '0',
 | |
|             CARRYINSEL => "000",
 | |
|             CEA1 => '0',
 | |
|             CEA2 => '0',
 | |
|             CEAD => '0',
 | |
|             CEALUMODE => '0',
 | |
|             CEB1 => '0',
 | |
|             CEB2 => '0',
 | |
|             CEC => '1',
 | |
|             CECARRYIN => '0',
 | |
|             CECTRL => '0',
 | |
|             CED => '0',
 | |
|             CEINMODE => '0',
 | |
|             CEM => m_in.valid,
 | |
|             CEP => '0',
 | |
|             CLK => clk,
 | |
|             D => (others => '0'),
 | |
|             INMODE => "00000",
 | |
|             MULTSIGNIN => '0',
 | |
|             OPMODE => "0010101",
 | |
|             P => m20_p,
 | |
|             PCIN => m11_pc,
 | |
|             RSTA => '0',
 | |
|             RSTALLCARRYIN => '0',
 | |
|             RSTALUMODE => '0',
 | |
|             RSTB => '0',
 | |
|             RSTC => '0',
 | |
|             RSTCTRL => '0',
 | |
|             RSTD => '0',
 | |
|             RSTINMODE => '0',
 | |
|             RSTM => '0',
 | |
|             RSTP => '0'
 | |
|             );
 | |
| 
 | |
|     m21: DSP48E1
 | |
|         generic map (
 | |
|             ACASCREG => 0,
 | |
|             ALUMODEREG => 0,
 | |
|             AREG => 0,
 | |
|             BCASCREG => 0,
 | |
|             BREG => 0,
 | |
|             CARRYINREG => 0,
 | |
|             CARRYINSELREG => 0,
 | |
|             INMODEREG => 0,
 | |
|             OPMODEREG => 0,
 | |
|             PREG => 0
 | |
|             )
 | |
|         port map (
 | |
|             A => "000000" & m_in.data1(63 downto 40),
 | |
|             ACIN => (others => '0'),
 | |
|             ALUMODE => "0000",
 | |
|             B => '0' & m_in.data2(33 downto 17),
 | |
|             BCIN => (others => '0'),
 | |
|             C => (others => '0'),
 | |
|             CARRYCASCIN => '0',
 | |
|             CARRYIN => '0',
 | |
|             CARRYINSEL => "000",
 | |
|             CEA1 => '0',
 | |
|             CEA2 => '0',
 | |
|             CEAD => '0',
 | |
|             CEALUMODE => '0',
 | |
|             CEB1 => '0',
 | |
|             CEB2 => '0',
 | |
|             CEC => '1',
 | |
|             CECARRYIN => '0',
 | |
|             CECTRL => '0',
 | |
|             CED => '0',
 | |
|             CEINMODE => '0',
 | |
|             CEM => m_in.valid,
 | |
|             CEP => '0',
 | |
|             CLK => clk,
 | |
|             D => (others => '0'),
 | |
|             INMODE => "00000",
 | |
|             MULTSIGNIN => '0',
 | |
|             OPMODE => "0010101",
 | |
|             P => m21_p,
 | |
|             PCIN => m12_pc,
 | |
|             RSTA => '0',
 | |
|             RSTALLCARRYIN => '0',
 | |
|             RSTALUMODE => '0',
 | |
|             RSTB => '0',
 | |
|             RSTC => '0',
 | |
|             RSTCTRL => '0',
 | |
|             RSTD => '0',
 | |
|             RSTINMODE => '0',
 | |
|             RSTM => '0',
 | |
|             RSTP => '0'
 | |
|             );
 | |
| 
 | |
|     m22: DSP48E1
 | |
|         generic map (
 | |
|             ACASCREG => 0,
 | |
|             ALUMODEREG => 0,
 | |
|             AREG => 0,
 | |
|             BCASCREG => 0,
 | |
|             BREG => 0,
 | |
|             CARRYINREG => 0,
 | |
|             CARRYINSELREG => 0,
 | |
|             INMODEREG => 0,
 | |
|             OPMODEREG => 0,
 | |
|             PREG => 0
 | |
|             )
 | |
|         port map (
 | |
|             A => "000000" & m_in.data1(63 downto 40),
 | |
|             ACIN => (others => '0'),
 | |
|             ALUMODE => "0000",
 | |
|             B => '0' & m_in.data2(50 downto 34),
 | |
|             BCIN => (others => '0'),
 | |
|             C => (others => '0'),
 | |
|             CARRYCASCIN => '0',
 | |
|             CARRYIN => '0',
 | |
|             CARRYINSEL => "000",
 | |
|             CEA1 => '0',
 | |
|             CEA2 => '0',
 | |
|             CEAD => '0',
 | |
|             CEALUMODE => '0',
 | |
|             CEB1 => '0',
 | |
|             CEB2 => '0',
 | |
|             CEC => '1',
 | |
|             CECARRYIN => '0',
 | |
|             CECTRL => '0',
 | |
|             CED => '0',
 | |
|             CEINMODE => '0',
 | |
|             CEM => m_in.valid,
 | |
|             CEP => '0',
 | |
|             CLK => clk,
 | |
|             D => (others => '0'),
 | |
|             INMODE => "00000",
 | |
|             MULTSIGNIN => '0',
 | |
|             OPMODE => "0010101",
 | |
|             P => m22_p,
 | |
|             PCIN => m13_pc,
 | |
|             RSTA => '0',
 | |
|             RSTALLCARRYIN => '0',
 | |
|             RSTALUMODE => '0',
 | |
|             RSTB => '0',
 | |
|             RSTC => '0',
 | |
|             RSTCTRL => '0',
 | |
|             RSTD => '0',
 | |
|             RSTINMODE => '0',
 | |
|             RSTM => '0',
 | |
|             RSTP => '0'
 | |
|             );
 | |
| 
 | |
|     m23: DSP48E1
 | |
|         generic map (
 | |
|             ACASCREG => 0,
 | |
|             ALUMODEREG => 0,
 | |
|             AREG => 0,
 | |
|             BCASCREG => 0,
 | |
|             BREG => 0,
 | |
|             CARRYINREG => 0,
 | |
|             CARRYINSELREG => 0,
 | |
|             INMODEREG => 0,
 | |
|             OPMODEREG => 0,
 | |
|             PREG => 0
 | |
|             )
 | |
|         port map (
 | |
|             A => "000000" & m_in.data1(63 downto 40),
 | |
|             ACIN => (others => '0'),
 | |
|             ALUMODE => "0000",
 | |
|             B => "00000" & m_in.data2(63 downto 51),
 | |
|             BCIN => (others => '0'),
 | |
|             C => x"00" & "000" & addend(127 downto 91),
 | |
|             CARRYCASCIN => '0',
 | |
|             CARRYIN => '0',
 | |
|             CARRYINSEL => "000",
 | |
|             CEA1 => '0',
 | |
|             CEA2 => '0',
 | |
|             CEAD => '0',
 | |
|             CEALUMODE => '0',
 | |
|             CEB1 => '0',
 | |
|             CEB2 => '0',
 | |
|             CEC => '1',
 | |
|             CECARRYIN => '0',
 | |
|             CECTRL => '0',
 | |
|             CED => '0',
 | |
|             CEINMODE => '0',
 | |
|             CEM => m_in.valid,
 | |
|             CEP => '0',
 | |
|             CLK => clk,
 | |
|             D => (others => '0'),
 | |
|             INMODE => "00000",
 | |
|             MULTSIGNIN => '0',
 | |
|             OPMODE => "0110101",
 | |
|             P => m23_p,
 | |
|             PCIN => (others => '0'),
 | |
|             RSTA => '0',
 | |
|             RSTALLCARRYIN => '0',
 | |
|             RSTALUMODE => '0',
 | |
|             RSTB => '0',
 | |
|             RSTC => '0',
 | |
|             RSTCTRL => '0',
 | |
|             RSTD => '0',
 | |
|             RSTINMODE => '0',
 | |
|             RSTM => '0',
 | |
|             RSTP => '0'
 | |
|             );
 | |
| 
 | |
|     s0: DSP48E1
 | |
|         generic map (
 | |
|             ACASCREG => 0,
 | |
|             ALUMODEREG => 0,
 | |
|             AREG => 0,
 | |
|             BCASCREG => 0,
 | |
|             BREG => 0,
 | |
|             CARRYINREG => 0,
 | |
|             CARRYINSELREG => 0,
 | |
|             CREG => 0,
 | |
|             INMODEREG => 0,
 | |
|             MREG => 0,
 | |
|             OPMODEREG => 0,
 | |
|             PREG => 1,
 | |
|             USE_MULT => "none"
 | |
|             )
 | |
|         port map (
 | |
|             A => m22_p(5 downto 0) & x"0000" & m10_p(34 downto 27),
 | |
|             ACIN => (others => '0'),
 | |
|             ALUMODE => "0000",
 | |
|             B => m10_p(26 downto 9),
 | |
|             BCIN => (others => '0'),
 | |
|             C => m20_p(39 downto 0) & m02_p(5 downto 0) & "00",
 | |
|             CARRYCASCIN => '0',
 | |
|             CARRYIN => '0',
 | |
|             CARRYINSEL => "000",
 | |
|             CARRYOUT => s0_carry,
 | |
|             CEA1 => '0',
 | |
|             CEA2 => '0',
 | |
|             CEAD => '0',
 | |
|             CEALUMODE => '0',
 | |
|             CEB1 => '0',
 | |
|             CEB2 => '0',
 | |
|             CEC => '0',
 | |
|             CECARRYIN => '0',
 | |
|             CECTRL => '0',
 | |
|             CED => '0',
 | |
|             CEINMODE => '0',
 | |
|             CEM => '0',
 | |
|             CEP => valid_1,
 | |
|             CLK => clk,
 | |
|             D => (others => '0'),
 | |
|             INMODE => "00000",
 | |
|             MULTSIGNIN => '0',
 | |
|             OPMODE => "0001111",
 | |
|             PCIN => (others => '0'),
 | |
|             PCOUT => s0_pc,
 | |
|             RSTA => '0',
 | |
|             RSTALLCARRYIN => '0',
 | |
|             RSTALUMODE => '0',
 | |
|             RSTB => '0',
 | |
|             RSTC => '0',
 | |
|             RSTCTRL => '0',
 | |
|             RSTD => '0',
 | |
|             RSTINMODE => '0',
 | |
|             RSTM => '0',
 | |
|             RSTP => '0'
 | |
|             );
 | |
| 
 | |
|     s1: DSP48E1
 | |
|         generic map (
 | |
|             ACASCREG => 1,
 | |
|             ALUMODEREG => 0,
 | |
|             AREG => 1,
 | |
|             BCASCREG => 1,
 | |
|             BREG => 1,
 | |
|             CARRYINREG => 0,
 | |
|             CARRYINSELREG => 0,
 | |
|             CREG => 1,
 | |
|             INMODEREG => 0,
 | |
|             MREG => 0,
 | |
|             OPMODEREG => 0,
 | |
|             PREG => 0,
 | |
|             USE_MULT => "none"
 | |
|             )
 | |
|         port map (
 | |
|             A => x"000" & m22_p(41 downto 24),
 | |
|             ACIN => (others => '0'),
 | |
|             ALUMODE => "0000",
 | |
|             B => m22_p(23 downto 6),
 | |
|             BCIN => (others => '0'),
 | |
|             C => m23_p(36 downto 0) & x"00" & "0" & m20_p(41 downto 40),
 | |
|             CARRYCASCIN => '0',
 | |
|             CARRYIN => s0_carry(3),
 | |
|             CARRYINSEL => "000",
 | |
|             CEA1 => '0',
 | |
|             CEA2 => valid_1,
 | |
|             CEAD => '0',
 | |
|             CEALUMODE => '0',
 | |
|             CEB1 => '0',
 | |
|             CEB2 => valid_1,
 | |
|             CEC => valid_1,
 | |
|             CECARRYIN => '0',
 | |
|             CECTRL => '0',
 | |
|             CED => '0',
 | |
|             CEINMODE => '0',
 | |
|             CEM => '0',
 | |
|             CEP => '0',
 | |
|             CLK => clk,
 | |
|             D => (others => '0'),
 | |
|             INMODE => "00000",
 | |
|             MULTSIGNIN => '0',
 | |
|             OPMODE => "0001111",
 | |
|             PCIN => (others => '0'),
 | |
|             PCOUT => s1_pc,
 | |
|             RSTA => '0',
 | |
|             RSTALLCARRYIN => '0',
 | |
|             RSTALUMODE => '0',
 | |
|             RSTB => '0',
 | |
|             RSTC => '0',
 | |
|             RSTCTRL => '0',
 | |
|             RSTD => '0',
 | |
|             RSTINMODE => '0',
 | |
|             RSTM => '0',
 | |
|             RSTP => '0'
 | |
|             );
 | |
| 
 | |
|     -- mask is 0 for 32-bit ops, 0x0000ffffffff for 64-bit
 | |
|     p0_mask(47 downto 31) <= (others => '0');
 | |
|     p0_mask(30 downto 0) <= (others => not r32_1);
 | |
| 
 | |
|     p0: DSP48E1
 | |
|         generic map (
 | |
|             ACASCREG => 1,
 | |
|             ALUMODEREG => 1,
 | |
|             AREG => 1,
 | |
|             BCASCREG => 1,
 | |
|             BREG => 1,
 | |
|             CARRYINREG => 0,
 | |
|             CARRYINSELREG => 0,
 | |
|             CREG => 1,
 | |
|             INMODEREG => 0,
 | |
|             MREG => 0,
 | |
|             OPMODEREG => 0,
 | |
|             PREG => 0,
 | |
|             SEL_MASK => "C",
 | |
|             USE_MULT => "none",
 | |
|             USE_PATTERN_DETECT => "PATDET"
 | |
|             )
 | |
|         port map (
 | |
|             A => m21_p(22 downto 0) & m03_p(5 downto 0) & '0',
 | |
|             ACIN => (others => '0'),
 | |
|             ALUMODE => "00" & rnot_1 & '0',
 | |
|             B => (others => '0'),
 | |
|             BCIN => (others => '0'),
 | |
|             C => p0_mask,
 | |
|             CARRYCASCIN => '0',
 | |
|             CARRYIN => '0',
 | |
|             CARRYINSEL => "000",
 | |
|             CARRYOUT => p0_carry,
 | |
|             CEA1 => '0',
 | |
|             CEA2 => valid_1,
 | |
|             CEAD => '0',
 | |
|             CEALUMODE => valid_1,
 | |
|             CEB1 => '0',
 | |
|             CEB2 => valid_1,
 | |
|             CEC => valid_1,
 | |
|             CECARRYIN => '0',
 | |
|             CECTRL => '0',
 | |
|             CED => '0',
 | |
|             CEINMODE => '0',
 | |
|             CEM => '0',
 | |
|             CEP => '0',
 | |
|             CLK => clk,
 | |
|             D => (others => '0'),
 | |
|             INMODE => "00000",
 | |
|             MULTSIGNIN => '0',
 | |
|             OPMODE => "0010011",
 | |
|             P => product(79 downto 32),
 | |
|             PATTERNDETECT => p0_pat,
 | |
|             PATTERNBDETECT => p0_patb,
 | |
|             PCIN => s0_pc,
 | |
|             RSTA => '0',
 | |
|             RSTALLCARRYIN => '0',
 | |
|             RSTALUMODE => '0',
 | |
|             RSTB => '0',
 | |
|             RSTC => '0',
 | |
|             RSTCTRL => '0',
 | |
|             RSTD => '0',
 | |
|             RSTINMODE => '0',
 | |
|             RSTM => '0',
 | |
|             RSTP => '0'
 | |
|             );
 | |
| 
 | |
|     p1: DSP48E1
 | |
|         generic map (
 | |
|             ACASCREG => 1,
 | |
|             ALUMODEREG => 1,
 | |
|             AREG => 1,
 | |
|             BCASCREG => 1,
 | |
|             BREG => 1,
 | |
|             CARRYINREG => 0,
 | |
|             CARRYINSELREG => 0,
 | |
|             CREG => 0,
 | |
|             INMODEREG => 0,
 | |
|             MASK => x"000000000000",
 | |
|             MREG => 0,
 | |
|             OPMODEREG => 0,
 | |
|             PREG => 0,
 | |
|             USE_MULT => "none",
 | |
|             USE_PATTERN_DETECT => "PATDET"
 | |
|             )
 | |
|         port map (
 | |
|             A => x"0000000" & '0' & m21_p(41),
 | |
|             ACIN => (others => '0'),
 | |
|             ALUMODE => "00" & rnot_1 & '0',
 | |
|             B => m21_p(40 downto 23),
 | |
|             BCIN => (others => '0'),
 | |
|             C => (others => '0'),
 | |
|             CARRYCASCIN => '0',
 | |
|             CARRYIN => p0_carry(3),
 | |
|             CARRYINSEL => "000",
 | |
|             CEA1 => '0',
 | |
|             CEA2 => valid_1,
 | |
|             CEAD => '0',
 | |
|             CEALUMODE => valid_1,
 | |
|             CEB1 => '0',
 | |
|             CEB2 => valid_1,
 | |
|             CEC => '0',
 | |
|             CECARRYIN => '0',
 | |
|             CECTRL => '0',
 | |
|             CED => '0',
 | |
|             CEINMODE => '0',
 | |
|             CEM => '0',
 | |
|             CEP => '0',
 | |
|             CLK => clk,
 | |
|             D => (others => '0'),
 | |
|             INMODE => "00000",
 | |
|             MULTSIGNIN => '0',
 | |
|             OPMODE => "0010011",
 | |
|             P => product(127 downto 80),
 | |
|             PATTERNDETECT => p1_pat,
 | |
|             PATTERNBDETECT => p1_patb,
 | |
|             PCIN => s1_pc,
 | |
|             RSTA => '0',
 | |
|             RSTALLCARRYIN => '0',
 | |
|             RSTALUMODE => '0',
 | |
|             RSTB => '0',
 | |
|             RSTC => '0',
 | |
|             RSTCTRL => '0',
 | |
|             RSTD => '0',
 | |
|             RSTINMODE => '0',
 | |
|             RSTM => '0',
 | |
|             RSTP => '0'
 | |
|             );
 | |
| 
 | |
|     mult_out: process(all)
 | |
|         variable ov : std_ulogic;
 | |
|     begin
 | |
|         -- set overflow if the high bits are neither all zeroes nor all ones
 | |
|         if req_32bit = '0' then
 | |
|             ov := not ((p1_pat and p0_pat) or (p1_patb and p0_patb));
 | |
|         else
 | |
|             ov := not ((p1_pat and p0_pat and not product(31)) or
 | |
|                        (p1_patb and p0_patb and product(31)));
 | |
|         end if;
 | |
|         ovf_in <= ov;
 | |
| 
 | |
|         m_out.result <= product;
 | |
|         m_out.overflow <= overflow;
 | |
|     end process;
 | |
| 
 | |
|     process(clk)
 | |
|     begin
 | |
|         if rising_edge(clk) then
 | |
|             if rnot_1 = '0' then
 | |
|                 product(31 downto 0) <= m10_p(8 downto 0) & m01_p(5 downto 0) & m00_p(16 downto 0);
 | |
|             else
 | |
|                 product(31 downto 0) <= not (m10_p(8 downto 0) & m01_p(5 downto 0) & m00_p(16 downto 0));
 | |
|             end if;
 | |
|             m_out.valid <= valid_1;
 | |
|             valid_1 <= m_in.valid;
 | |
|             req_32bit <= r32_1;
 | |
|             r32_1 <= m_in.is_32bit;
 | |
|             rnot_1 <= m_in.not_result;
 | |
|             overflow <= ovf_in;
 | |
|         end if;
 | |
|     end process;
 | |
| 
 | |
| end architecture behaviour;
 | |
| 
 | |
| library ieee;
 | |
| use ieee.std_logic_1164.all;
 | |
| use ieee.numeric_std.all;
 | |
| 
 | |
| library unisim;
 | |
| use unisim.vcomponents.all;
 | |
| 
 | |
| entity short_multiply is
 | |
|     port (
 | |
|         clk   : in std_logic;
 | |
| 
 | |
|         a_in  : in std_ulogic_vector(15 downto 0);
 | |
|         b_in  : in std_ulogic_vector(15 downto 0);
 | |
|         m_out : out std_ulogic_vector(31 downto 0)
 | |
|         );
 | |
| end entity short_multiply;
 | |
| 
 | |
| architecture behaviour of short_multiply is
 | |
|     signal mshort_p : std_ulogic_vector(47 downto 0);
 | |
| begin
 | |
|     mshort: DSP48E1
 | |
|         generic map (
 | |
|             ACASCREG => 0,
 | |
|             ALUMODEREG => 0,
 | |
|             AREG => 0,
 | |
|             BCASCREG => 0,
 | |
|             BREG => 0,
 | |
|             CARRYINREG => 0,
 | |
|             CARRYINSELREG => 0,
 | |
|             CREG => 0,
 | |
|             INMODEREG => 0,
 | |
|             MREG => 0,
 | |
|             OPMODEREG => 0,
 | |
|             PREG => 0
 | |
|             )
 | |
|         port map (
 | |
|             A => std_ulogic_vector(resize(signed(a_in(15 downto 0)), 30)),
 | |
|             ACIN => (others => '0'),
 | |
|             ALUMODE => "0000",
 | |
|             B => std_ulogic_vector(resize(signed(b_in(15 downto 0)), 18)),
 | |
|             BCIN => (others => '0'),
 | |
|             C => 48x"0",
 | |
|             CARRYCASCIN => '0',
 | |
|             CARRYIN => '0',
 | |
|             CARRYINSEL => "000",
 | |
|             CEA1 => '0',
 | |
|             CEA2 => '0',
 | |
|             CEAD => '0',
 | |
|             CEALUMODE => '0',
 | |
|             CEB1 => '0',
 | |
|             CEB2 => '0',
 | |
|             CEC => '0',
 | |
|             CECARRYIN => '0',
 | |
|             CECTRL => '0',
 | |
|             CED => '0',
 | |
|             CEINMODE => '0',
 | |
|             CEM => '0',
 | |
|             CEP => '0',
 | |
|             CLK => clk,
 | |
|             D => (others => '0'),
 | |
|             INMODE => "00000",
 | |
|             MULTSIGNIN => '0',
 | |
|             OPMODE => "0110101",
 | |
|             P => mshort_p,
 | |
|             PCIN => (others => '0'),
 | |
|             RSTA => '0',
 | |
|             RSTALLCARRYIN => '0',
 | |
|             RSTALUMODE => '0',
 | |
|             RSTB => '0',
 | |
|             RSTC => '0',
 | |
|             RSTCTRL => '0',
 | |
|             RSTD => '0',
 | |
|             RSTINMODE => '0',
 | |
|             RSTM => '0',
 | |
|             RSTP => '0'
 | |
|             );
 | |
| 
 | |
|     m_out <= mshort_p(31 downto 0);
 | |
| 
 | |
| end architecture behaviour;
 |