xilinx-mult.vhdl 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.numeric_std.all;
  4. library work;
  5. use work.common.all;
  6. library unisim;
  7. use unisim.vcomponents.all;
  8. entity multiply is
  9. port (
  10. clk : in std_logic;
  11. m_in : in MultiplyInputType;
  12. m_out : out MultiplyOutputType
  13. );
  14. end entity multiply;
  15. architecture behaviour of multiply is
  16. signal m00_p, m01_p, m02_p, m03_p : std_ulogic_vector(47 downto 0);
  17. signal m00_pc : std_ulogic_vector(47 downto 0);
  18. signal m10_p, m11_p, m12_p, m13_p : std_ulogic_vector(47 downto 0);
  19. signal m11_pc, m12_pc, m13_pc : std_ulogic_vector(47 downto 0);
  20. signal m20_p, m21_p, m22_p, m23_p : std_ulogic_vector(47 downto 0);
  21. signal s0_pc, s1_pc : std_ulogic_vector(47 downto 0);
  22. signal product_lo : std_ulogic_vector(31 downto 0);
  23. signal product : std_ulogic_vector(127 downto 0);
  24. signal addend : std_ulogic_vector(127 downto 0);
  25. signal s0_carry, p0_carry : std_ulogic_vector(3 downto 0);
  26. signal p0_mask : std_ulogic_vector(47 downto 0);
  27. signal p0_pat, p0_patb : std_ulogic;
  28. signal p1_pat, p1_patb : std_ulogic;
  29. signal req_32bit, r32_1 : std_ulogic;
  30. signal req_not, rnot_1 : std_ulogic;
  31. signal valid_1 : std_ulogic;
  32. signal overflow, ovf_in : std_ulogic;
  33. begin
  34. addend <= m_in.addend;
  35. m00: DSP48E1
  36. generic map (
  37. ACASCREG => 0,
  38. ALUMODEREG => 0,
  39. AREG => 0,
  40. BCASCREG => 0,
  41. BREG => 0,
  42. CARRYINREG => 0,
  43. CARRYINSELREG => 0,
  44. INMODEREG => 0,
  45. OPMODEREG => 0,
  46. PREG => 0
  47. )
  48. port map (
  49. A => "0000000" & m_in.data1(22 downto 0),
  50. ACIN => (others => '0'),
  51. ALUMODE => "0000",
  52. B => '0' & m_in.data2(16 downto 0),
  53. BCIN => (others => '0'),
  54. C => "00000000000000" & addend(33 downto 0),
  55. CARRYCASCIN => '0',
  56. CARRYIN => '0',
  57. CARRYINSEL => "000",
  58. CEA1 => '0',
  59. CEA2 => '0',
  60. CEAD => '0',
  61. CEALUMODE => '0',
  62. CEB1 => '0',
  63. CEB2 => '0',
  64. CEC => '1',
  65. CECARRYIN => '0',
  66. CECTRL => '0',
  67. CED => '0',
  68. CEINMODE => '0',
  69. CEM => m_in.valid,
  70. CEP => '0',
  71. CLK => clk,
  72. D => (others => '0'),
  73. INMODE => "00000",
  74. MULTSIGNIN => '0',
  75. OPMODE => "0110101",
  76. P => m00_p,
  77. PCIN => (others => '0'),
  78. PCOUT => m00_pc,
  79. RSTA => '0',
  80. RSTALLCARRYIN => '0',
  81. RSTALUMODE => '0',
  82. RSTB => '0',
  83. RSTC => '0',
  84. RSTCTRL => '0',
  85. RSTD => '0',
  86. RSTINMODE => '0',
  87. RSTM => '0',
  88. RSTP => '0'
  89. );
  90. m01: DSP48E1
  91. generic map (
  92. ACASCREG => 0,
  93. ALUMODEREG => 0,
  94. AREG => 0,
  95. BCASCREG => 0,
  96. BREG => 0,
  97. CARRYINREG => 0,
  98. CARRYINSELREG => 0,
  99. INMODEREG => 0,
  100. OPMODEREG => 0,
  101. PREG => 0
  102. )
  103. port map (
  104. A => "0000000" & m_in.data1(22 downto 0),
  105. ACIN => (others => '0'),
  106. ALUMODE => "0000",
  107. B => '0' & m_in.data2(33 downto 17),
  108. BCIN => (others => '0'),
  109. C => (others => '0'),
  110. CARRYCASCIN => '0',
  111. CARRYIN => '0',
  112. CARRYINSEL => "000",
  113. CEA1 => '0',
  114. CEA2 => '0',
  115. CEAD => '0',
  116. CEALUMODE => '0',
  117. CEB1 => '0',
  118. CEB2 => '0',
  119. CEC => '1',
  120. CECARRYIN => '0',
  121. CECTRL => '0',
  122. CED => '0',
  123. CEINMODE => '0',
  124. CEM => m_in.valid,
  125. CEP => '0',
  126. CLK => clk,
  127. D => (others => '0'),
  128. INMODE => "00000",
  129. MULTSIGNIN => '0',
  130. OPMODE => "1010101",
  131. P => m01_p,
  132. PCIN => m00_pc,
  133. RSTA => '0',
  134. RSTALLCARRYIN => '0',
  135. RSTALUMODE => '0',
  136. RSTB => '0',
  137. RSTC => '0',
  138. RSTCTRL => '0',
  139. RSTD => '0',
  140. RSTINMODE => '0',
  141. RSTM => '0',
  142. RSTP => '0'
  143. );
  144. m02: DSP48E1
  145. generic map (
  146. ACASCREG => 0,
  147. ALUMODEREG => 0,
  148. AREG => 0,
  149. BCASCREG => 0,
  150. BREG => 0,
  151. CARRYINREG => 0,
  152. CARRYINSELREG => 0,
  153. INMODEREG => 0,
  154. OPMODEREG => 0,
  155. PREG => 0
  156. )
  157. port map (
  158. A => "0000000" & m_in.data1(22 downto 0),
  159. ACIN => (others => '0'),
  160. ALUMODE => "0000",
  161. B => '0' & m_in.data2(50 downto 34),
  162. BCIN => (others => '0'),
  163. C => x"0000000" & "000" & addend(50 downto 34),
  164. CARRYCASCIN => '0',
  165. CARRYIN => '0',
  166. CARRYINSEL => "000",
  167. CEA1 => '0',
  168. CEA2 => '0',
  169. CEAD => '0',
  170. CEALUMODE => '0',
  171. CEB1 => '0',
  172. CEB2 => '0',
  173. CEC => '1',
  174. CECARRYIN => '0',
  175. CECTRL => '0',
  176. CED => '0',
  177. CEINMODE => '0',
  178. CEM => m_in.valid,
  179. CEP => '0',
  180. CLK => clk,
  181. D => (others => '0'),
  182. INMODE => "00000",
  183. MULTSIGNIN => '0',
  184. OPMODE => "0110101",
  185. P => m02_p,
  186. PCIN => (others => '0'),
  187. RSTA => '0',
  188. RSTALLCARRYIN => '0',
  189. RSTALUMODE => '0',
  190. RSTB => '0',
  191. RSTC => '0',
  192. RSTCTRL => '0',
  193. RSTD => '0',
  194. RSTINMODE => '0',
  195. RSTM => '0',
  196. RSTP => '0'
  197. );
  198. m03: DSP48E1
  199. generic map (
  200. ACASCREG => 0,
  201. ALUMODEREG => 0,
  202. AREG => 0,
  203. BCASCREG => 0,
  204. BREG => 0,
  205. CARRYINREG => 0,
  206. CARRYINSELREG => 0,
  207. INMODEREG => 0,
  208. OPMODEREG => 0,
  209. PREG => 0
  210. )
  211. port map (
  212. A => "0000000" & m_in.data1(22 downto 0),
  213. ACIN => (others => '0'),
  214. ALUMODE => "0000",
  215. B => "00000" & m_in.data2(63 downto 51),
  216. BCIN => (others => '0'),
  217. C => x"000000" & '0' & addend(73 downto 51),
  218. CARRYCASCIN => '0',
  219. CARRYIN => '0',
  220. CARRYINSEL => "000",
  221. CEA1 => '0',
  222. CEA2 => '0',
  223. CEAD => '0',
  224. CEALUMODE => '0',
  225. CEB1 => '0',
  226. CEB2 => '0',
  227. CEC => '1',
  228. CECARRYIN => '0',
  229. CECTRL => '0',
  230. CED => '0',
  231. CEINMODE => '0',
  232. CEM => m_in.valid,
  233. CEP => '0',
  234. CLK => clk,
  235. D => (others => '0'),
  236. INMODE => "00000",
  237. MULTSIGNIN => '0',
  238. OPMODE => "0110101",
  239. P => m03_p,
  240. PCIN => (others => '0'),
  241. RSTA => '0',
  242. RSTALLCARRYIN => '0',
  243. RSTALUMODE => '0',
  244. RSTB => '0',
  245. RSTC => '0',
  246. RSTCTRL => '0',
  247. RSTD => '0',
  248. RSTINMODE => '0',
  249. RSTM => '0',
  250. RSTP => '0'
  251. );
  252. m10: DSP48E1
  253. generic map (
  254. ACASCREG => 0,
  255. ALUMODEREG => 0,
  256. AREG => 0,
  257. BCASCREG => 0,
  258. BREG => 0,
  259. CARRYINREG => 0,
  260. CARRYINSELREG => 0,
  261. CREG => 0,
  262. INMODEREG => 0,
  263. OPMODEREG => 0,
  264. PREG => 0
  265. )
  266. port map (
  267. A => "0000000000000" & m_in.data1(39 downto 23),
  268. ACIN => (others => '0'),
  269. ALUMODE => "0000",
  270. B => '0' & m_in.data2(16 downto 0),
  271. BCIN => (others => '0'),
  272. C => x"000" & "00" & m01_p(39 downto 6),
  273. CARRYCASCIN => '0',
  274. CARRYIN => '0',
  275. CARRYINSEL => "000",
  276. CEA1 => '0',
  277. CEA2 => '0',
  278. CEAD => '0',
  279. CEALUMODE => '0',
  280. CEB1 => '0',
  281. CEB2 => '0',
  282. CEC => '0',
  283. CECARRYIN => '0',
  284. CECTRL => '0',
  285. CED => '0',
  286. CEINMODE => '0',
  287. CEM => m_in.valid,
  288. CEP => '0',
  289. CLK => clk,
  290. D => (others => '0'),
  291. INMODE => "00000",
  292. MULTSIGNIN => '0',
  293. OPMODE => "0110101",
  294. P => m10_p,
  295. PCIN => (others => '0'),
  296. RSTA => '0',
  297. RSTALLCARRYIN => '0',
  298. RSTALUMODE => '0',
  299. RSTB => '0',
  300. RSTC => '0',
  301. RSTCTRL => '0',
  302. RSTD => '0',
  303. RSTINMODE => '0',
  304. RSTM => '0',
  305. RSTP => '0'
  306. );
  307. m11: DSP48E1
  308. generic map (
  309. ACASCREG => 0,
  310. ALUMODEREG => 0,
  311. AREG => 0,
  312. BCASCREG => 0,
  313. BREG => 0,
  314. CARRYINREG => 0,
  315. CARRYINSELREG => 0,
  316. CREG => 0,
  317. INMODEREG => 0,
  318. OPMODEREG => 0,
  319. PREG => 0
  320. )
  321. port map (
  322. A => "0000000000000" & m_in.data1(39 downto 23),
  323. ACIN => (others => '0'),
  324. ALUMODE => "0000",
  325. B => '0' & m_in.data2(33 downto 17),
  326. BCIN => (others => '0'),
  327. C => x"000" & "00" & m02_p(39 downto 6),
  328. CARRYCASCIN => '0',
  329. CARRYIN => '0',
  330. CARRYINSEL => "000",
  331. CEA1 => '0',
  332. CEA2 => '0',
  333. CEAD => '0',
  334. CEALUMODE => '0',
  335. CEB1 => '0',
  336. CEB2 => '0',
  337. CEC => '0',
  338. CECARRYIN => '0',
  339. CECTRL => '0',
  340. CED => '0',
  341. CEINMODE => '0',
  342. CEM => m_in.valid,
  343. CEP => '0',
  344. CLK => clk,
  345. D => (others => '0'),
  346. INMODE => "00000",
  347. MULTSIGNIN => '0',
  348. OPMODE => "0110101",
  349. P => m11_p,
  350. PCIN => (others => '0'),
  351. PCOUT => m11_pc,
  352. RSTA => '0',
  353. RSTALLCARRYIN => '0',
  354. RSTALUMODE => '0',
  355. RSTB => '0',
  356. RSTC => '0',
  357. RSTCTRL => '0',
  358. RSTD => '0',
  359. RSTINMODE => '0',
  360. RSTM => '0',
  361. RSTP => '0'
  362. );
  363. m12: DSP48E1
  364. generic map (
  365. ACASCREG => 0,
  366. ALUMODEREG => 0,
  367. AREG => 0,
  368. BCASCREG => 0,
  369. BREG => 0,
  370. CARRYINREG => 0,
  371. CARRYINSELREG => 0,
  372. CREG => 0,
  373. INMODEREG => 0,
  374. OPMODEREG => 0,
  375. PREG => 0
  376. )
  377. port map (
  378. A => "0000000000000" & m_in.data1(39 downto 23),
  379. ACIN => (others => '0'),
  380. ALUMODE => "0000",
  381. B => '0' & m_in.data2(50 downto 34),
  382. BCIN => (others => '0'),
  383. C => x"0000" & '0' & m03_p(36 downto 6),
  384. CARRYCASCIN => '0',
  385. CARRYIN => '0',
  386. CARRYINSEL => "000",
  387. CEA1 => '0',
  388. CEA2 => '0',
  389. CEAD => '0',
  390. CEALUMODE => '0',
  391. CEB1 => '0',
  392. CEB2 => '0',
  393. CEC => '0',
  394. CECARRYIN => '0',
  395. CECTRL => '0',
  396. CED => '0',
  397. CEINMODE => '0',
  398. CEM => m_in.valid,
  399. CEP => '0',
  400. CLK => clk,
  401. D => (others => '0'),
  402. INMODE => "00000",
  403. MULTSIGNIN => '0',
  404. OPMODE => "0110101",
  405. P => m12_p,
  406. PCIN => (others => '0'),
  407. PCOUT => m12_pc,
  408. RSTA => '0',
  409. RSTALLCARRYIN => '0',
  410. RSTALUMODE => '0',
  411. RSTB => '0',
  412. RSTC => '0',
  413. RSTCTRL => '0',
  414. RSTD => '0',
  415. RSTINMODE => '0',
  416. RSTM => '0',
  417. RSTP => '0'
  418. );
  419. m13: DSP48E1
  420. generic map (
  421. ACASCREG => 0,
  422. ALUMODEREG => 0,
  423. AREG => 0,
  424. BCASCREG => 0,
  425. BREG => 0,
  426. CARRYINREG => 0,
  427. CARRYINSELREG => 0,
  428. INMODEREG => 0,
  429. OPMODEREG => 0,
  430. PREG => 0
  431. )
  432. port map (
  433. A => "0000000000000" & m_in.data1(39 downto 23),
  434. ACIN => (others => '0'),
  435. ALUMODE => "0000",
  436. B => "00000" & m_in.data2(63 downto 51),
  437. BCIN => (others => '0'),
  438. C => x"0000000" & "000" & addend(90 downto 74),
  439. CARRYCASCIN => '0',
  440. CARRYIN => '0',
  441. CARRYINSEL => "000",
  442. CEA1 => '0',
  443. CEA2 => '0',
  444. CEAD => '0',
  445. CEALUMODE => '0',
  446. CEB1 => '0',
  447. CEB2 => '0',
  448. CEC => '1',
  449. CECARRYIN => '0',
  450. CECTRL => '0',
  451. CED => '0',
  452. CEINMODE => '0',
  453. CEM => m_in.valid,
  454. CEP => '0',
  455. CLK => clk,
  456. D => (others => '0'),
  457. INMODE => "00000",
  458. MULTSIGNIN => '0',
  459. OPMODE => "0110101",
  460. P => m13_p,
  461. PCIN => (others => '0'),
  462. PCOUT => m13_pc,
  463. RSTA => '0',
  464. RSTALLCARRYIN => '0',
  465. RSTALUMODE => '0',
  466. RSTB => '0',
  467. RSTC => '0',
  468. RSTCTRL => '0',
  469. RSTD => '0',
  470. RSTINMODE => '0',
  471. RSTM => '0',
  472. RSTP => '0'
  473. );
  474. m20: DSP48E1
  475. generic map (
  476. ACASCREG => 0,
  477. ALUMODEREG => 0,
  478. AREG => 0,
  479. BCASCREG => 0,
  480. BREG => 0,
  481. CARRYINREG => 0,
  482. CARRYINSELREG => 0,
  483. INMODEREG => 0,
  484. OPMODEREG => 0,
  485. PREG => 0
  486. )
  487. port map (
  488. A => "000000" & m_in.data1(63 downto 40),
  489. ACIN => (others => '0'),
  490. ALUMODE => "0000",
  491. B => '0' & m_in.data2(16 downto 0),
  492. BCIN => (others => '0'),
  493. C => (others => '0'),
  494. CARRYCASCIN => '0',
  495. CARRYIN => '0',
  496. CARRYINSEL => "000",
  497. CEA1 => '0',
  498. CEA2 => '0',
  499. CEAD => '0',
  500. CEALUMODE => '0',
  501. CEB1 => '0',
  502. CEB2 => '0',
  503. CEC => '1',
  504. CECARRYIN => '0',
  505. CECTRL => '0',
  506. CED => '0',
  507. CEINMODE => '0',
  508. CEM => m_in.valid,
  509. CEP => '0',
  510. CLK => clk,
  511. D => (others => '0'),
  512. INMODE => "00000",
  513. MULTSIGNIN => '0',
  514. OPMODE => "0010101",
  515. P => m20_p,
  516. PCIN => m11_pc,
  517. RSTA => '0',
  518. RSTALLCARRYIN => '0',
  519. RSTALUMODE => '0',
  520. RSTB => '0',
  521. RSTC => '0',
  522. RSTCTRL => '0',
  523. RSTD => '0',
  524. RSTINMODE => '0',
  525. RSTM => '0',
  526. RSTP => '0'
  527. );
  528. m21: DSP48E1
  529. generic map (
  530. ACASCREG => 0,
  531. ALUMODEREG => 0,
  532. AREG => 0,
  533. BCASCREG => 0,
  534. BREG => 0,
  535. CARRYINREG => 0,
  536. CARRYINSELREG => 0,
  537. INMODEREG => 0,
  538. OPMODEREG => 0,
  539. PREG => 0
  540. )
  541. port map (
  542. A => "000000" & m_in.data1(63 downto 40),
  543. ACIN => (others => '0'),
  544. ALUMODE => "0000",
  545. B => '0' & m_in.data2(33 downto 17),
  546. BCIN => (others => '0'),
  547. C => (others => '0'),
  548. CARRYCASCIN => '0',
  549. CARRYIN => '0',
  550. CARRYINSEL => "000",
  551. CEA1 => '0',
  552. CEA2 => '0',
  553. CEAD => '0',
  554. CEALUMODE => '0',
  555. CEB1 => '0',
  556. CEB2 => '0',
  557. CEC => '1',
  558. CECARRYIN => '0',
  559. CECTRL => '0',
  560. CED => '0',
  561. CEINMODE => '0',
  562. CEM => m_in.valid,
  563. CEP => '0',
  564. CLK => clk,
  565. D => (others => '0'),
  566. INMODE => "00000",
  567. MULTSIGNIN => '0',
  568. OPMODE => "0010101",
  569. P => m21_p,
  570. PCIN => m12_pc,
  571. RSTA => '0',
  572. RSTALLCARRYIN => '0',
  573. RSTALUMODE => '0',
  574. RSTB => '0',
  575. RSTC => '0',
  576. RSTCTRL => '0',
  577. RSTD => '0',
  578. RSTINMODE => '0',
  579. RSTM => '0',
  580. RSTP => '0'
  581. );
  582. m22: DSP48E1
  583. generic map (
  584. ACASCREG => 0,
  585. ALUMODEREG => 0,
  586. AREG => 0,
  587. BCASCREG => 0,
  588. BREG => 0,
  589. CARRYINREG => 0,
  590. CARRYINSELREG => 0,
  591. INMODEREG => 0,
  592. OPMODEREG => 0,
  593. PREG => 0
  594. )
  595. port map (
  596. A => "000000" & m_in.data1(63 downto 40),
  597. ACIN => (others => '0'),
  598. ALUMODE => "0000",
  599. B => '0' & m_in.data2(50 downto 34),
  600. BCIN => (others => '0'),
  601. C => (others => '0'),
  602. CARRYCASCIN => '0',
  603. CARRYIN => '0',
  604. CARRYINSEL => "000",
  605. CEA1 => '0',
  606. CEA2 => '0',
  607. CEAD => '0',
  608. CEALUMODE => '0',
  609. CEB1 => '0',
  610. CEB2 => '0',
  611. CEC => '1',
  612. CECARRYIN => '0',
  613. CECTRL => '0',
  614. CED => '0',
  615. CEINMODE => '0',
  616. CEM => m_in.valid,
  617. CEP => '0',
  618. CLK => clk,
  619. D => (others => '0'),
  620. INMODE => "00000",
  621. MULTSIGNIN => '0',
  622. OPMODE => "0010101",
  623. P => m22_p,
  624. PCIN => m13_pc,
  625. RSTA => '0',
  626. RSTALLCARRYIN => '0',
  627. RSTALUMODE => '0',
  628. RSTB => '0',
  629. RSTC => '0',
  630. RSTCTRL => '0',
  631. RSTD => '0',
  632. RSTINMODE => '0',
  633. RSTM => '0',
  634. RSTP => '0'
  635. );
  636. m23: DSP48E1
  637. generic map (
  638. ACASCREG => 0,
  639. ALUMODEREG => 0,
  640. AREG => 0,
  641. BCASCREG => 0,
  642. BREG => 0,
  643. CARRYINREG => 0,
  644. CARRYINSELREG => 0,
  645. INMODEREG => 0,
  646. OPMODEREG => 0,
  647. PREG => 0
  648. )
  649. port map (
  650. A => "000000" & m_in.data1(63 downto 40),
  651. ACIN => (others => '0'),
  652. ALUMODE => "0000",
  653. B => "00000" & m_in.data2(63 downto 51),
  654. BCIN => (others => '0'),
  655. C => x"00" & "000" & addend(127 downto 91),
  656. CARRYCASCIN => '0',
  657. CARRYIN => '0',
  658. CARRYINSEL => "000",
  659. CEA1 => '0',
  660. CEA2 => '0',
  661. CEAD => '0',
  662. CEALUMODE => '0',
  663. CEB1 => '0',
  664. CEB2 => '0',
  665. CEC => '1',
  666. CECARRYIN => '0',
  667. CECTRL => '0',
  668. CED => '0',
  669. CEINMODE => '0',
  670. CEM => m_in.valid,
  671. CEP => '0',
  672. CLK => clk,
  673. D => (others => '0'),
  674. INMODE => "00000",
  675. MULTSIGNIN => '0',
  676. OPMODE => "0110101",
  677. P => m23_p,
  678. PCIN => (others => '0'),
  679. RSTA => '0',
  680. RSTALLCARRYIN => '0',
  681. RSTALUMODE => '0',
  682. RSTB => '0',
  683. RSTC => '0',
  684. RSTCTRL => '0',
  685. RSTD => '0',
  686. RSTINMODE => '0',
  687. RSTM => '0',
  688. RSTP => '0'
  689. );
  690. s0: DSP48E1
  691. generic map (
  692. ACASCREG => 1,
  693. ALUMODEREG => 0,
  694. AREG => 1,
  695. BCASCREG => 1,
  696. BREG => 1,
  697. CARRYINREG => 0,
  698. CARRYINSELREG => 0,
  699. CREG => 1,
  700. INMODEREG => 0,
  701. MREG => 0,
  702. OPMODEREG => 0,
  703. PREG => 0,
  704. USE_MULT => "none"
  705. )
  706. port map (
  707. A => m22_p(5 downto 0) & x"0000" & m10_p(34 downto 27),
  708. ACIN => (others => '0'),
  709. ALUMODE => "0000",
  710. B => m10_p(26 downto 9),
  711. BCIN => (others => '0'),
  712. C => m20_p(39 downto 0) & m02_p(5 downto 0) & "00",
  713. CARRYCASCIN => '0',
  714. CARRYIN => '0',
  715. CARRYINSEL => "000",
  716. CARRYOUT => s0_carry,
  717. CEA1 => '0',
  718. CEA2 => valid_1,
  719. CEAD => '0',
  720. CEALUMODE => '0',
  721. CEB1 => '0',
  722. CEB2 => valid_1,
  723. CEC => valid_1,
  724. CECARRYIN => '0',
  725. CECTRL => '0',
  726. CED => '0',
  727. CEINMODE => '0',
  728. CEM => '0',
  729. CEP => '0',
  730. CLK => clk,
  731. D => (others => '0'),
  732. INMODE => "00000",
  733. MULTSIGNIN => '0',
  734. OPMODE => "0001111",
  735. PCIN => (others => '0'),
  736. PCOUT => s0_pc,
  737. RSTA => '0',
  738. RSTALLCARRYIN => '0',
  739. RSTALUMODE => '0',
  740. RSTB => '0',
  741. RSTC => '0',
  742. RSTCTRL => '0',
  743. RSTD => '0',
  744. RSTINMODE => '0',
  745. RSTM => '0',
  746. RSTP => '0'
  747. );
  748. s1: DSP48E1
  749. generic map (
  750. ACASCREG => 1,
  751. ALUMODEREG => 0,
  752. AREG => 1,
  753. BCASCREG => 1,
  754. BREG => 1,
  755. CARRYINREG => 0,
  756. CARRYINSELREG => 0,
  757. CREG => 1,
  758. INMODEREG => 0,
  759. MREG => 0,
  760. OPMODEREG => 0,
  761. PREG => 0,
  762. USE_MULT => "none"
  763. )
  764. port map (
  765. A => x"000" & m22_p(41 downto 24),
  766. ACIN => (others => '0'),
  767. ALUMODE => "0000",
  768. B => m22_p(23 downto 6),
  769. BCIN => (others => '0'),
  770. C => m23_p(36 downto 0) & x"00" & "0" & m20_p(41 downto 40),
  771. CARRYCASCIN => '0',
  772. CARRYIN => s0_carry(3),
  773. CARRYINSEL => "000",
  774. CEA1 => '0',
  775. CEA2 => valid_1,
  776. CEAD => '0',
  777. CEALUMODE => '0',
  778. CEB1 => '0',
  779. CEB2 => valid_1,
  780. CEC => valid_1,
  781. CECARRYIN => '0',
  782. CECTRL => '0',
  783. CED => '0',
  784. CEINMODE => '0',
  785. CEM => '0',
  786. CEP => '0',
  787. CLK => clk,
  788. D => (others => '0'),
  789. INMODE => "00000",
  790. MULTSIGNIN => '0',
  791. OPMODE => "0001111",
  792. PCIN => (others => '0'),
  793. PCOUT => s1_pc,
  794. RSTA => '0',
  795. RSTALLCARRYIN => '0',
  796. RSTALUMODE => '0',
  797. RSTB => '0',
  798. RSTC => '0',
  799. RSTCTRL => '0',
  800. RSTD => '0',
  801. RSTINMODE => '0',
  802. RSTM => '0',
  803. RSTP => '0'
  804. );
  805. -- mask is 0 for 32-bit ops, 0x0000ffffffff for 64-bit
  806. p0_mask(47 downto 31) <= (others => '0');
  807. p0_mask(30 downto 0) <= (others => not r32_1);
  808. p0: DSP48E1
  809. generic map (
  810. ACASCREG => 1,
  811. ALUMODEREG => 1,
  812. AREG => 1,
  813. BCASCREG => 1,
  814. BREG => 1,
  815. CARRYINREG => 0,
  816. CARRYINSELREG => 0,
  817. CREG => 1,
  818. INMODEREG => 0,
  819. MREG => 0,
  820. OPMODEREG => 0,
  821. PREG => 0,
  822. SEL_MASK => "C",
  823. USE_MULT => "none",
  824. USE_PATTERN_DETECT => "PATDET"
  825. )
  826. port map (
  827. A => m21_p(22 downto 0) & m03_p(5 downto 0) & '0',
  828. ACIN => (others => '0'),
  829. ALUMODE => "00" & rnot_1 & '0',
  830. B => (others => '0'),
  831. BCIN => (others => '0'),
  832. C => p0_mask,
  833. CARRYCASCIN => '0',
  834. CARRYIN => '0',
  835. CARRYINSEL => "000",
  836. CARRYOUT => p0_carry,
  837. CEA1 => '0',
  838. CEA2 => valid_1,
  839. CEAD => '0',
  840. CEALUMODE => valid_1,
  841. CEB1 => '0',
  842. CEB2 => valid_1,
  843. CEC => valid_1,
  844. CECARRYIN => '0',
  845. CECTRL => '0',
  846. CED => '0',
  847. CEINMODE => '0',
  848. CEM => '0',
  849. CEP => '0',
  850. CLK => clk,
  851. D => (others => '0'),
  852. INMODE => "00000",
  853. MULTSIGNIN => '0',
  854. OPMODE => "0010011",
  855. P => product(79 downto 32),
  856. PATTERNDETECT => p0_pat,
  857. PATTERNBDETECT => p0_patb,
  858. PCIN => s0_pc,
  859. RSTA => '0',
  860. RSTALLCARRYIN => '0',
  861. RSTALUMODE => '0',
  862. RSTB => '0',
  863. RSTC => '0',
  864. RSTCTRL => '0',
  865. RSTD => '0',
  866. RSTINMODE => '0',
  867. RSTM => '0',
  868. RSTP => '0'
  869. );
  870. p1: DSP48E1
  871. generic map (
  872. ACASCREG => 1,
  873. ALUMODEREG => 1,
  874. AREG => 1,
  875. BCASCREG => 1,
  876. BREG => 1,
  877. CARRYINREG => 0,
  878. CARRYINSELREG => 0,
  879. CREG => 0,
  880. INMODEREG => 0,
  881. MASK => x"000000000000",
  882. MREG => 0,
  883. OPMODEREG => 0,
  884. PREG => 0,
  885. USE_MULT => "none",
  886. USE_PATTERN_DETECT => "PATDET"
  887. )
  888. port map (
  889. A => x"0000000" & '0' & m21_p(41),
  890. ACIN => (others => '0'),
  891. ALUMODE => "00" & rnot_1 & '0',
  892. B => m21_p(40 downto 23),
  893. BCIN => (others => '0'),
  894. C => (others => '0'),
  895. CARRYCASCIN => '0',
  896. CARRYIN => p0_carry(3),
  897. CARRYINSEL => "000",
  898. CEA1 => '0',
  899. CEA2 => valid_1,
  900. CEAD => '0',
  901. CEALUMODE => valid_1,
  902. CEB1 => '0',
  903. CEB2 => valid_1,
  904. CEC => '0',
  905. CECARRYIN => '0',
  906. CECTRL => '0',
  907. CED => '0',
  908. CEINMODE => '0',
  909. CEM => '0',
  910. CEP => '0',
  911. CLK => clk,
  912. D => (others => '0'),
  913. INMODE => "00000",
  914. MULTSIGNIN => '0',
  915. OPMODE => "0010011",
  916. P => product(127 downto 80),
  917. PATTERNDETECT => p1_pat,
  918. PATTERNBDETECT => p1_patb,
  919. PCIN => s1_pc,
  920. RSTA => '0',
  921. RSTALLCARRYIN => '0',
  922. RSTALUMODE => '0',
  923. RSTB => '0',
  924. RSTC => '0',
  925. RSTCTRL => '0',
  926. RSTD => '0',
  927. RSTINMODE => '0',
  928. RSTM => '0',
  929. RSTP => '0'
  930. );
  931. product(31 downto 0) <= product_lo xor (31 downto 0 => req_not);
  932. mult_out: process(all)
  933. variable ov : std_ulogic;
  934. begin
  935. -- set overflow if the high bits are neither all zeroes nor all ones
  936. if req_32bit = '0' then
  937. ov := not ((p1_pat and p0_pat) or (p1_patb and p0_patb));
  938. else
  939. ov := not ((p1_pat and p0_pat and not product(31)) or
  940. (p1_patb and p0_patb and product(31)));
  941. end if;
  942. ovf_in <= ov;
  943. m_out.result <= product;
  944. m_out.overflow <= overflow;
  945. end process;
  946. process(clk)
  947. begin
  948. if rising_edge(clk) then
  949. product_lo <= m10_p(8 downto 0) & m01_p(5 downto 0) & m00_p(16 downto 0);
  950. m_out.valid <= valid_1;
  951. valid_1 <= m_in.valid;
  952. req_32bit <= r32_1;
  953. r32_1 <= m_in.is_32bit;
  954. req_not <= rnot_1;
  955. rnot_1 <= m_in.not_result;
  956. overflow <= ovf_in;
  957. end if;
  958. end process;
  959. end architecture behaviour;