dsp48.v 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. `timescale 1 ns / 1 ps
  2. module dsp48 #
  3. (
  4. parameter integer A_WIDTH = 24,
  5. parameter integer B_WIDTH = 16,
  6. parameter integer P_WIDTH = 24
  7. )
  8. (
  9. input wire CLK,
  10. input wire [A_WIDTH-1:0] A,
  11. input wire [B_WIDTH-1:0] B,
  12. output wire [P_WIDTH-1:0] P
  13. );
  14. localparam integer SHIFT = A_WIDTH + B_WIDTH - P_WIDTH - 1;
  15. localparam integer ONES = SHIFT - 1;
  16. wire [47:0] int_p_wire;
  17. wire int_pbd_wire;
  18. DSP48E1 #(
  19. .ALUMODEREG(0), .CARRYINSELREG(0), .INMODEREG(0), .OPMODEREG(0),
  20. .CREG(0), .CARRYINREG(0), .MREG(1), .PREG(1),
  21. .USE_PATTERN_DETECT("PATDET"), .SEL_MASK("ROUNDING_MODE1")
  22. ) dsp_0 (
  23. .CLK(CLK),
  24. .RSTA(1'b0), .RSTB(1'b0), .RSTM(1'b0), .RSTP(1'b0),
  25. .CEA2(1'b1), .CEB2(1'b1), .CED(1'b0), .CEAD(1'b0), .CEM(1'b1), .CEP(1'b1),
  26. .ALUMODE(4'b0000), .CARRYINSEL(3'b000), .INMODE(5'b00000), .OPMODE(7'b0110101),
  27. .A({{(30-A_WIDTH){A[A_WIDTH-1]}}, A}),
  28. .B({{(18-B_WIDTH){B[B_WIDTH-1]}}, B}),
  29. .C({{(48-ONES){1'b0}}, {(ONES){1'b1}}}),
  30. .CARRYIN(1'b0),
  31. .PATTERNBDETECT(int_pbd_wire),
  32. .P(int_p_wire)
  33. );
  34. assign P = {int_p_wire[SHIFT+P_WIDTH-1:SHIFT+1], int_p_wire[SHIFT] | int_pbd_wire};
  35. endmodule