FPMultiplier.v.html 848 B

12345678910111213141516171819202122232425262728293031323334
  1. `timescale 1ns / 1ps // NW 15.9.2015 8.8.2016
  2. module FPMultiplier(
  3. input clk, run,
  4. input [31:0] x, y,
  5. output stall,
  6. output [31:0] z);
  7. reg [4:0] S; // state
  8. reg [47:0] P; // product
  9. wire sign;
  10. wire [7:0] xe, ye;
  11. wire [8:0] e0, e1;
  12. wire [24:0] w1, z0;
  13. wire [23:0] w0;
  14. assign sign = x[31] ^ y[31];
  15. assign xe = x[30:23];
  16. assign ye = y[30:23];
  17. assign e0 = xe + ye;
  18. assign e1 = e0 - 127 + P[47];
  19. assign stall = run & ~(S == 25);
  20. assign w0 = P[0] ? {1'b1, y[22:0]} : 0;
  21. assign w1 = {1'b0, P[47:24]} + {1'b0, w0};
  22. assign z0 = P[47] ? P[47:23]+1 : P[46:22]+1; // round and normalize
  23. assign z = (xe == 0) | (ye == 0) ? 0 :
  24. (~e1[8]) ? {sign, e1[7:0], z0[23:1]} :
  25. (~e1[7]) ? {sign, 8'b11111111, z0[23:1]} : 0;
  26. always @ (posedge(clk)) begin
  27. P <= (S == 0) ? {24'b0, 1'b1, x[22:0]} : {w1, P[23:1]};
  28. S <= run ? S+1 : 0;
  29. end
  30. endmodule