2 use ieee.std_logic_1164.all;
3 use ieee.numeric_std.all;
9 use unisim.vcomponents.all;
15 m_in : in MultiplyInputType;
16 m_out : out MultiplyOutputType
20 architecture behaviour of multiply is
21 signal m00_p, m01_p, m02_p, m03_p : std_ulogic_vector(47 downto 0);
22 signal m00_pc : std_ulogic_vector(47 downto 0);
23 signal m10_p, m11_p, m12_p, m13_p : std_ulogic_vector(47 downto 0);
24 signal m11_pc, m12_pc, m13_pc : std_ulogic_vector(47 downto 0);
25 signal m20_p, m21_p, m22_p, m23_p : std_ulogic_vector(47 downto 0);
26 signal s0_pc, s1_pc : std_ulogic_vector(47 downto 0);
27 signal product : std_ulogic_vector(127 downto 0);
28 signal addend : std_ulogic_vector(127 downto 0);
29 signal s0_carry, p0_carry : std_ulogic_vector(3 downto 0);
30 signal p0_mask : std_ulogic_vector(47 downto 0);
31 signal p0_pat, p0_patb : std_ulogic;
32 signal p1_pat, p1_patb : std_ulogic;
34 signal req_32bit, r32_1 : std_ulogic;
35 signal rnot_1 : std_ulogic;
36 signal valid_1 : std_ulogic;
37 signal overflow, ovf_in : std_ulogic;
40 addend <= m_in.addend;
58 A => "0000000" & m_in.data1(22 downto 0),
59 ACIN => (others => '0'),
61 B => '0' & m_in.data2(16 downto 0),
62 BCIN => (others => '0'),
63 C => "00000000000000" & addend(33 downto 0),
86 PCIN => (others => '0'),
114 A => "0000000" & m_in.data1(22 downto 0),
115 ACIN => (others => '0'),
117 B => '0' & m_in.data2(33 downto 17),
118 BCIN => (others => '0'),
119 C => (others => '0'),
137 D => (others => '0'),
144 RSTALLCARRYIN => '0',
171 A => "0000000" & m_in.data1(22 downto 0),
172 ACIN => (others => '0'),
174 B => '0' & m_in.data2(50 downto 34),
175 BCIN => (others => '0'),
176 C => x"0000000" & "000" & addend(50 downto 34),
194 D => (others => '0'),
199 PCIN => (others => '0'),
201 RSTALLCARRYIN => '0',
228 A => "0000000" & m_in.data1(22 downto 0),
229 ACIN => (others => '0'),
231 B => "00000" & m_in.data2(63 downto 51),
232 BCIN => (others => '0'),
233 C => x"000000" & '0' & addend(73 downto 51),
251 D => (others => '0'),
256 PCIN => (others => '0'),
258 RSTALLCARRYIN => '0',
284 A => "0000000000000" & m_in.data1(39 downto 23),
285 ACIN => (others => '0'),
287 B => '0' & m_in.data2(16 downto 0),
288 BCIN => (others => '0'),
289 C => x"000" & "00" & m01_p(39 downto 6),
307 D => (others => '0'),
312 PCIN => (others => '0'),
314 RSTALLCARRYIN => '0',
340 A => "0000000000000" & m_in.data1(39 downto 23),
341 ACIN => (others => '0'),
343 B => '0' & m_in.data2(33 downto 17),
344 BCIN => (others => '0'),
345 C => x"000" & "00" & m02_p(39 downto 6),
363 D => (others => '0'),
368 PCIN => (others => '0'),
371 RSTALLCARRYIN => '0',
397 A => "0000000000000" & m_in.data1(39 downto 23),
398 ACIN => (others => '0'),
400 B => '0' & m_in.data2(50 downto 34),
401 BCIN => (others => '0'),
402 C => x"0000" & '0' & m03_p(36 downto 6),
420 D => (others => '0'),
425 PCIN => (others => '0'),
428 RSTALLCARRYIN => '0',
453 A => "0000000000000" & m_in.data1(39 downto 23),
454 ACIN => (others => '0'),
456 B => "00000" & m_in.data2(63 downto 51),
457 BCIN => (others => '0'),
458 C => x"0000000" & "000" & addend(90 downto 74),
476 D => (others => '0'),
481 PCIN => (others => '0'),
484 RSTALLCARRYIN => '0',
509 A => "000000" & m_in.data1(63 downto 40),
510 ACIN => (others => '0'),
512 B => '0' & m_in.data2(16 downto 0),
513 BCIN => (others => '0'),
514 C => (others => '0'),
532 D => (others => '0'),
539 RSTALLCARRYIN => '0',
564 A => "000000" & m_in.data1(63 downto 40),
565 ACIN => (others => '0'),
567 B => '0' & m_in.data2(33 downto 17),
568 BCIN => (others => '0'),
569 C => (others => '0'),
587 D => (others => '0'),
594 RSTALLCARRYIN => '0',
619 A => "000000" & m_in.data1(63 downto 40),
620 ACIN => (others => '0'),
622 B => '0' & m_in.data2(50 downto 34),
623 BCIN => (others => '0'),
624 C => (others => '0'),
642 D => (others => '0'),
649 RSTALLCARRYIN => '0',
674 A => "000000" & m_in.data1(63 downto 40),
675 ACIN => (others => '0'),
677 B => "00000" & m_in.data2(63 downto 51),
678 BCIN => (others => '0'),
679 C => x"00" & "000" & addend(127 downto 91),
697 D => (others => '0'),
702 PCIN => (others => '0'),
704 RSTALLCARRYIN => '0',
732 A => m22_p(5 downto 0) & x"0000" & m10_p(34 downto 27),
733 ACIN => (others => '0'),
735 B => m10_p(26 downto 9),
736 BCIN => (others => '0'),
737 C => m20_p(39 downto 0) & m02_p(5 downto 0) & "00",
741 CARRYOUT => s0_carry,
756 D => (others => '0'),
760 PCIN => (others => '0'),
763 RSTALLCARRYIN => '0',
791 A => x"000" & m22_p(41 downto 24),
792 ACIN => (others => '0'),
794 B => m22_p(23 downto 6),
795 BCIN => (others => '0'),
796 C => m23_p(36 downto 0) & x"00" & "0" & m20_p(41 downto 40),
798 CARRYIN => s0_carry(3),
814 D => (others => '0'),
818 PCIN => (others => '0'),
821 RSTALLCARRYIN => '0',
832 -- mask is 0 for 32-bit ops, 0x0000ffffffff for 64-bit
833 p0_mask(47 downto 31) <= (others => '0');
834 p0_mask(30 downto 0) <= (others => not r32_1);
852 USE_PATTERN_DETECT => "PATDET"
855 A => m21_p(22 downto 0) & m03_p(5 downto 0) & '0',
856 ACIN => (others => '0'),
857 ALUMODE => "00" & rnot_1 & '0',
858 B => (others => '0'),
859 BCIN => (others => '0'),
864 CARRYOUT => p0_carry,
868 CEALUMODE => valid_1,
879 D => (others => '0'),
883 P => product(79 downto 32),
884 PATTERNDETECT => p0_pat,
885 PATTERNBDETECT => p0_patb,
888 RSTALLCARRYIN => '0',
910 MASK => x"000000000000",
915 USE_PATTERN_DETECT => "PATDET"
918 A => x"0000000" & '0' & m21_p(41),
919 ACIN => (others => '0'),
920 ALUMODE => "00" & rnot_1 & '0',
921 B => m21_p(40 downto 23),
922 BCIN => (others => '0'),
923 C => (others => '0'),
925 CARRYIN => p0_carry(3),
930 CEALUMODE => valid_1,
941 D => (others => '0'),
945 P => product(127 downto 80),
946 PATTERNDETECT => p1_pat,
947 PATTERNBDETECT => p1_patb,
950 RSTALLCARRYIN => '0',
961 mult_out: process(all)
962 variable ov : std_ulogic;
964 -- set overflow if the high bits are neither all zeroes nor all ones
965 if req_32bit = '0' then
966 ov := not ((p1_pat and p0_pat) or (p1_patb and p0_patb));
968 ov := not ((p1_pat and p0_pat and not product(31)) or
969 (p1_patb and p0_patb and product(31)));
973 m_out.result <= product;
974 m_out.overflow <= overflow;
979 if rising_edge(clk) then
981 product(31 downto 0) <= m10_p(8 downto 0) & m01_p(5 downto 0) & m00_p(16 downto 0);
983 product(31 downto 0) <= not (m10_p(8 downto 0) & m01_p(5 downto 0) & m00_p(16 downto 0));
985 m_out.valid <= valid_1;
986 valid_1 <= m_in.valid;
988 r32_1 <= m_in.is_32bit;
989 rnot_1 <= m_in.not_result;
994 end architecture behaviour;
997 use ieee.std_logic_1164.all;
998 use ieee.numeric_std.all;
1001 use unisim.vcomponents.all;
1003 entity short_multiply is
1007 a_in : in std_ulogic_vector(15 downto 0);
1008 b_in : in std_ulogic_vector(15 downto 0);
1009 m_out : out std_ulogic_vector(31 downto 0)
1011 end entity short_multiply;
1013 architecture behaviour of short_multiply is
1014 signal mshort_p : std_ulogic_vector(47 downto 0);
1032 A => std_ulogic_vector(resize(signed(a_in(15 downto 0)), 30)),
1033 ACIN => (others => '0'),
1035 B => std_ulogic_vector(resize(signed(b_in(15 downto 0)), 18)),
1036 BCIN => (others => '0'),
1040 CARRYINSEL => "000",
1055 D => (others => '0'),
1058 OPMODE => "0110101",
1060 PCIN => (others => '0'),
1062 RSTALLCARRYIN => '0',
1073 m_out <= mshort_p(31 downto 0);
1075 end architecture behaviour;