Win_calc.v 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. `timescale 1ns / 1ps
  2. (* keep_hierarchy = "yes" *)
  3. //////////////////////////////////////////////////////////////////////////////////
  4. // Company:
  5. // Engineer: Churbanov S.
  6. //
  7. // Create Date: 15:22:20 12/08/2019
  8. // Design Name:
  9. // Module Name: Win_parameters
  10. // Project Name: Compact_main
  11. // Target Devices:
  12. // Tool versions:
  13. // Description:
  14. //
  15. // Dependencies:
  16. //
  17. // Revision:
  18. // Revision 0.01 - File Created
  19. // Additional Comments:
  20. //
  21. //////////////////////////////////////////////////////////////////////////////////
  22. module Win_calc (
  23. input clk_i,
  24. input wind_clk,
  25. input [7:0] filterCmd_i,
  26. input reset_i,
  27. input WinCtrl_i,
  28. input MeasWind_i,
  29. input [1:0] TukeyCtrl_i,
  30. input [31:0] win_value_i,
  31. input [2:0] win_type_i,
  32. output signed [17:0] win_o,
  33. output reg signed [17:0] sinWin_o
  34. );
  35. //================================================================================
  36. // PARAMETERS
  37. //================================================================================
  38. localparam signed A3_1 = 18'h15584;
  39. // ????????? ??? ?????????? SIN
  40. localparam signed [17:0] A1 = 18'h12400; // a-1
  41. localparam signed [17:0] A2 = 18'h002C0; // b
  42. localparam signed [17:0] A3 = ~A3_1 + 1'b1; // c
  43. localparam signed [17:0] A4 = 18'h0126C; // d
  44. localparam signed [17:0] A5 = 18'h01C5C; // e
  45. localparam CalcWidth = 10;
  46. localparam CalcWidthR = 18;
  47. localparam b2Width = CalcWidth*2;
  48. localparam b3Width = CalcWidth*3;
  49. localparam b4Width = CalcWidth*4;
  50. localparam b5Width = CalcWidth*5;
  51. localparam [31:0] testArg = 32'h12492492;
  52. //================================================================================
  53. // REG/WIRE
  54. //================================================================================
  55. reg signed [17:0] sinWind;
  56. reg signed [17:0] tukeyWind;
  57. reg [1:0] tukeyCtrlR;
  58. reg [1:0] tukeyCtrlRR;
  59. reg [35:0] sinWindPow2;
  60. wire sinFilterFlag = (filterCmd_i>=8'h54 & filterCmd_i<=8'h62);
  61. wire rectFilterFlag = (filterCmd_i>=8'h63 & filterCmd_i!=8'h70);
  62. wire [CalcWidth-1:0] bCurr = win_value_i[31] ? 10'h3FF - win_value_i[31-:CalcWidth] : win_value_i [31-:CalcWidth];
  63. wire [CalcWidthR-1:0] bNew = win_value_i[31] ? 18'h3FFFF - win_value_i[31:14] : win_value_i [31:14];
  64. wire signed [17:0] constOne = 18'b011111111111111111;
  65. reg signed [18:0] tukeyCorr;
  66. reg [17:0] tukeyWindOut;
  67. wire signed [17:0] windMux1;
  68. wire signed [17:0] windMux2;
  69. wire signed [b2Width-1:0] b2 = bCurr**2;
  70. wire signed [b3Width-1:0] b3 = bCurr**3;
  71. wire signed [b4Width-1:0] b4 = bCurr**4;
  72. wire signed [b5Width-1:0] b5 = bCurr**5;
  73. wire signed [CalcWidthR-1:0] b2Cut = b2[b2Width-2-:CalcWidthR];
  74. wire signed [CalcWidthR-1:0] b3Cut = b3[b3Width-3-:CalcWidthR];
  75. wire signed [CalcWidthR-1:0] b4Cut = b4[b4Width-4-:CalcWidthR];
  76. wire signed [CalcWidthR-1:0] b5Cut = b5[b5Width-5-:CalcWidthR];
  77. reg signed [CalcWidthR*2-1:0] a1b;
  78. reg signed [CalcWidthR*2-1:0] a2b2;
  79. reg signed [CalcWidthR*2-1:0] a3b3;
  80. reg signed [CalcWidthR*2-1:0] a4b4;
  81. reg signed [CalcWidthR*2-1:0] a5b5;
  82. wire signed [CalcWidthR-1:0] a1bCut = a1b [CalcWidthR*2-2-:CalcWidthR];
  83. wire signed [CalcWidthR-1:0] a2b2Cut = a2b2[CalcWidthR*2-2-:CalcWidthR];
  84. wire signed [CalcWidthR-1:0] a3b3Cut = a3b3[CalcWidthR*2-2-:CalcWidthR];
  85. wire signed [CalcWidthR-1:0] a4b4Cut = a4b4[CalcWidthR*2-2-:CalcWidthR];
  86. wire signed [CalcWidthR-1:0] a5b5Cut = a5b5[CalcWidthR*2-2-:CalcWidthR];
  87. reg signed [CalcWidthR-1:0] bPrevSh;
  88. wire signed [CalcWidthR-1:0] approxSin = a5b5Cut+a4b4Cut+a3b3Cut+a2b2Cut+a1bCut+bPrevSh;
  89. wire signed [CalcWidthR-1:0] resultSin = approxSin[17]? 18'h1ffff:approxSin;
  90. //================================================================================
  91. // ASSIGNMENTS
  92. // ================================================================================
  93. assign windMux1 = (sinFilterFlag) ? sinWindPow2[34-:18]:tukeyWindOut;
  94. assign windMux2 = (rectFilterFlag)? 18'h1ffff:windMux1;
  95. assign win_o = windMux2;
  96. // ================================================================================
  97. // CODING
  98. //================================================================================
  99. always @(posedge clk_i) begin
  100. if (!reset_i) begin
  101. a5b5 <= A5*b5Cut;
  102. a4b4 <= A4*b4Cut;
  103. a3b3 <= A3*b3Cut;
  104. a2b2 <= A2*b2Cut;
  105. a1b <= A1*bNew;
  106. bPrevSh <= bNew;
  107. end else begin
  108. a5b5 <= 0;
  109. a4b4 <= 0;
  110. a3b3 <= 0;
  111. a2b2 <= 0;
  112. a1b <= 0;
  113. bPrevSh <= 0;
  114. end
  115. end
  116. always @(posedge clk_i) begin
  117. if (!reset_i) begin
  118. tukeyCtrlR <= TukeyCtrl_i;
  119. tukeyCtrlRR <= tukeyCtrlR;
  120. end else begin
  121. tukeyCtrlR <= 0;
  122. tukeyCtrlRR <= 0;
  123. end
  124. end
  125. always @(*) begin
  126. if (!reset_i) begin
  127. tukeyCorr = (tukeyWind+constOne);
  128. sinWindPow2 = resultSin**2;
  129. end else begin
  130. tukeyCorr = 18'h0;
  131. sinWindPow2 = 18'h0;
  132. end
  133. end
  134. always @(*) begin
  135. if (!reset_i) begin
  136. case(tukeyCtrlR)
  137. 2'h0: begin
  138. tukeyWindOut = 0;
  139. end
  140. 2'h1: begin
  141. tukeyWindOut = 18'h1ffff;
  142. end
  143. 2'h2: begin
  144. tukeyWindOut = tukeyCorr[18-:18];
  145. end
  146. default: begin
  147. tukeyWindOut = 0;
  148. end
  149. endcase
  150. end else begin
  151. tukeyWindOut = 18'h0;
  152. end
  153. end
  154. always @(*) begin
  155. if (!reset_i) begin
  156. if (!win_type_i) begin
  157. if (!WinCtrl_i) begin
  158. tukeyWind = resultSin;
  159. end else begin
  160. tukeyWind = 0-resultSin;
  161. end
  162. end else begin
  163. tukeyWind = 18'h0;
  164. end
  165. end else begin
  166. tukeyWind = 18'h0;
  167. end
  168. end
  169. endmodule