Mult_calc.v 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. `timescale 1ns / 1ps
  2. module Mult_calc (
  3. input clk_i,
  4. input reset_i,
  5. input [13:0] adc_i,
  6. input [17:0] sin_i,
  7. input [17:0] cos_i,
  8. input [17:0] win_i,
  9. input sum_en_i,
  10. output [39:0] sum_re_o,
  11. output [39:0] sum_im_o
  12. );
  13. //================================================================================
  14. // REG/WIRE
  15. //================================================================================
  16. wire [47:0] sum_cos;
  17. wire [47:0] sum_sin;
  18. wire ovfl_sum_cos; // Check For Overflow
  19. wire ovfl_sum_sin;
  20. reg[9:0] null_corr = 10'b0; // Êîððåêòèðîâêà íóëÿ
  21. //================================================================================
  22. // ASSIGNMENTS
  23. //================================================================================
  24. assign ovfl_sum_cos = (sum_cos[41]^sum_cos[42])|(sum_cos[42]^sum_cos[43]); // Check For Overflow
  25. assign ovfl_sum_sin = (sum_sin[41]^sum_sin[42])|(sum_sin[42]^sum_sin[43]); // Check For Overflow
  26. assign sum_re_o = (ovfl_sum_cos) ? { sum_cos[41],{39{~sum_cos[41]}}} : {sum_cos[40:1]};
  27. assign sum_im_o = (ovfl_sum_sin) ? { sum_sin[41],{39{~sum_sin[41]}}} : {sum_sin[40:1]};
  28. //works for now
  29. //======================================
  30. wire [35:0] adc_wind;
  31. //================================================================================
  32. // CODING
  33. //================================================================================
  34. //Null correction * Window
  35. Dsp48Mult NullCorrWind
  36. (
  37. .CLK (clk_i),
  38. .A ({{8{null_corr[9]}},null_corr[9:0]}),
  39. .B (win_i),
  40. .C (40'd0),
  41. .D ({adc_i[13:0],4'b0}),
  42. .P (adc_wind)
  43. );
  44. DSP48A1 #(
  45. .A0REG(0), // First stage A input pipeline register (0/1)
  46. .A1REG(0), // Second stage A input pipeline register (0/1)
  47. .B0REG(0), // First stage B input pipeline register (0/1)
  48. .B1REG(0), // Second stage B input pipeline register (0/1)
  49. .CARRYINREG(0), // CARRYIN input pipeline register (0/1)
  50. .CARRYINSEL("OPMODE5"), // Specify carry-in source, "CARRYIN" or "OPMODE5"
  51. .CARRYOUTREG(0), // CARRYOUT output pipeline register (0/1)
  52. .CREG(1), // C input pipeline register (0/1)
  53. .DREG(0), // D pre-adder input pipeline register (0/1)
  54. .MREG(0), // M pipeline register (0/1)
  55. .OPMODEREG(1), // Enable=1/disable=0 OPMODE input pipeline registers
  56. .PREG(1), // P output pipeline register (0/1)
  57. .RSTTYPE("SYNC") // Specify reset type, "SYNC" or "ASYNC"
  58. )
  59. DSP48A1_wind_cos (
  60. // Cascade Ports: No Cascade
  61. .BCOUT(), // 18-bit output: B port cascade output
  62. .PCOUT(), // 48-bit output: P cascade output
  63. // Data Ports: 1-bit (each) output: Data input and output ports
  64. .CARRYOUT(), // 1-bit output: carry output
  65. .CARRYOUTF(), // 1-bit output: fabric carry output
  66. .M(), // 36-bit output: fabric multiplier data output
  67. .P(sum_cos), // 48-bit output: data output
  68. // Cascade Ports: 48-bit (each) input: No Cascade
  69. .PCIN(48'b0), // 48-bit input: P cascade input
  70. // Control Input Ports: 1-bit (each) input: Clocking and operation mode
  71. .CLK(clk_i),
  72. .OPMODE({4'b0000,sum_en_i,3'b001}),// 8-bit input: operation mode input
  73. // .OPMODE({4'b0000,sum_en_i,sum_en_i,2'b01}),// 8-bit input: operation mode input
  74. // Data Ports: 18-bit (each) input: Data input and output ports
  75. .A(adc_wind[34:17]), // 18-bit input: A data input
  76. .B(cos_i), // 18-bit input: B data input
  77. .C(sum_cos), // 48-bit input: C data input
  78. .CARRYIN(1'b0), // 1-bit input: carry input signal
  79. .D(18'b0), // 18-bit input: B pre-adder data input
  80. // Reset/Clock Enable Input Ports: 1-bit (each) input: Reset and enable input ports
  81. .CEA(1'b1), // 1-bit input: clock enable input for A registers
  82. .CEB(1'b1), // 1-bit input: clock enable input for B registers
  83. .CEC(1'b1), // 1-bit input: clock enable input for C registers
  84. .CECARRYIN(1'b1), // 1-bit input: clock enable input for CARRYIN registers
  85. .CED(1'b1), // 1-bit input: clock enable input for D registers
  86. .CEM(1'b1), // 1-bit input: clock enable input for multiplier registers
  87. .CEOPMODE(1'b1), // 1-bit input: clock enable input for OPMODE registers
  88. .CEP(1'b1), // 1-bit input: clock enable input for P registers
  89. .RSTA(1'b0), // 1-bit input: reset input for A pipeline registers
  90. .RSTB(1'b0), // 1-bit input: reset input for B pipeline registers
  91. .RSTC(1'b0), // 1-bit input: reset input for C pipeline registers
  92. .RSTCARRYIN(1'b0), // 1-bit input: reset input for CARRYIN pipeline registers
  93. .RSTD(1'b0), // 1-bit input: reset input for D pipeline registers
  94. .RSTM(1'b0), // 1-bit input: reset input for M pipeline registers
  95. .RSTOPMODE(1'b0), // 1-bit input: reset input for OPMODE pipeline registers
  96. .RSTP(1'b0) // 1-bit input: reset input for P pipeline registers
  97. );
  98. endmodule