Win_calc.v 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439
  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. );
  34. //================================================================================
  35. // REG/WIRE
  36. //================================================================================
  37. reg [3:0] calc_cycle;
  38. reg signed [17:0] a1;
  39. reg signed [17:0] b;
  40. reg signed [17:0] c1;
  41. reg signed [17:0] c2;
  42. wire [47:0] p2;
  43. wire [47:0] p1;
  44. reg signed [17:0] sinWind;
  45. reg signed [17:0] tukeyWind;
  46. reg [1:0] tukeyCtrlR;
  47. reg [1:0] tukeyCtrlRR;
  48. reg [35:0] sinWindPow2;
  49. wire sinFilterFlag = (filterCmd_i>=8'h54 & filterCmd_i<=8'h62);
  50. // wire rectFilterFlag = (filterCmd_i>=8'h63 & filterCmd_i!=8'h70)|filterCmd_i==8'h30;
  51. wire rectFilterFlag = (filterCmd_i>=8'h63 & filterCmd_i!=8'h70);
  52. wire [17:0] bSin = win_value_i[31] ? 18'h3FFFF - win_value_i[31:14] : win_value_i [31:14];
  53. wire [17:0] bTukey = win_value_i[31] ? 18'h3FFFF - win_value_i[31:14] : win_value_i [31:14];
  54. wire [17:0] bCurr = sinFilterFlag ? bSin:bTukey;
  55. wire signed [17:0] constOne = 18'b011111111111111111;
  56. reg signed [18:0] tukeyCorr;
  57. reg [17:0] tukeyWindOut;
  58. wire signed [17:0] windMux1;
  59. wire signed [17:0] windMux2;
  60. //================================================================================
  61. // PARAMETERS
  62. //================================================================================
  63. localparam signed A3_1 = 18'h15584;
  64. // ????????? ??? ?????????? SIN
  65. localparam signed [17:0] A1 = 18'h12400; // a-1
  66. localparam signed [17:0] A2 = 18'h002C0; // b
  67. localparam signed [17:0] A3 = ~A3_1 + 1'b1; // c
  68. localparam signed [17:0] A4 = 18'h0126C; // d
  69. localparam signed [17:0] A5 = 18'h01C5C; // e
  70. //================================================================================
  71. // ASSIGNMENTS
  72. // ================================================================================
  73. // assign win_o = (sinFilterFlag) ? sinWindPow2[34-:18]:tukeyWindOut;
  74. assign win_o = windMux2;
  75. assign windMux1 = (sinFilterFlag) ? sinWindPow2[34-:18]:tukeyWindOut;
  76. assign windMux2 = (rectFilterFlag)? 18'h1ffff:windMux1;
  77. // ================================================================================
  78. // CODING
  79. //================================================================================
  80. always @(posedge clk_i) begin
  81. if (!reset_i) begin
  82. tukeyCtrlR <= TukeyCtrl_i;
  83. tukeyCtrlRR <= tukeyCtrlR;
  84. end else begin
  85. tukeyCtrlR <= 0;
  86. tukeyCtrlRR <= 0;
  87. end
  88. end
  89. always @(posedge clk_i) begin
  90. if (!reset_i) begin
  91. tukeyCorr <= (tukeyWind+constOne);
  92. sinWindPow2 <= sinWind**2;
  93. end else begin
  94. tukeyCorr <= 18'h0;
  95. sinWindPow2 <= 18'h0;
  96. end
  97. end
  98. always @(*) begin
  99. if (!reset_i) begin
  100. case(tukeyCtrlRR)
  101. 2'h0: begin
  102. tukeyWindOut = 0;
  103. end
  104. 2'h1: begin
  105. tukeyWindOut = 18'h1ffff;
  106. end
  107. 2'h2: begin
  108. tukeyWindOut = tukeyCorr[18-:18];
  109. end
  110. default: begin
  111. tukeyWindOut = 0;
  112. end
  113. endcase
  114. end else begin
  115. tukeyWindOut = 18'h0;
  116. end
  117. end
  118. always @(negedge wind_clk) begin
  119. if (!reset_i) begin
  120. // if (MeasWind_i) begin
  121. case (calc_cycle)
  122. 4'd1:
  123. begin
  124. a1 <= A5;
  125. c1 <= A4;
  126. c2 <= A3;
  127. b <= bCurr;
  128. end
  129. 4'd2:
  130. begin
  131. a1 <= p2[34:17];
  132. c1 <= A2;
  133. c2 <= A1;
  134. end
  135. 4'd3:
  136. begin
  137. a1 <= p2[34:17];
  138. c1 <= b;
  139. end
  140. endcase
  141. // end else begin
  142. // a1 <= 18'b0;
  143. // c1 <= 18'b0;
  144. // c2 <= 18'b0;
  145. // b <= 18'b0;
  146. // end
  147. end else begin
  148. a1 <= 18'b0;
  149. c1 <= 18'b0;
  150. c2 <= 18'b0;
  151. b <= 18'b0;
  152. end
  153. end
  154. // always @(*) begin
  155. // if (!reset_i) begin
  156. // if (MeasWind_i) begin
  157. // case (calc_cycle)
  158. // 3'd1:
  159. // begin
  160. // a1 = A5;
  161. // c1 = A4;
  162. // c2 = A3;
  163. // b = bCurr;
  164. // end
  165. // endcase
  166. // end else begin
  167. // a1 = 18'b0;
  168. // c1 = 18'b0;
  169. // c2 = 18'b0;
  170. // b = 18'b0;
  171. // end
  172. // end else begin
  173. // a1 = 18'b0;
  174. // c1 = 18'b0;
  175. // c2 = 18'b0;
  176. // b = 18'b0;
  177. // end
  178. // end
  179. always @(posedge wind_clk) begin
  180. if (!reset_i) begin
  181. if (!win_type_i) begin
  182. if (calc_cycle == 3'd0) begin
  183. if (p1[47:34] == 0) begin
  184. sinWind <= p1[34-:18];//1.0.17
  185. end else begin
  186. sinWind <= 18'h1FFFF;
  187. end
  188. end
  189. end else begin
  190. sinWind <= 18'h0;
  191. end
  192. end else begin
  193. sinWind <= 18'h0;
  194. end
  195. end
  196. always @(posedge wind_clk) begin
  197. if (!reset_i) begin
  198. if (!win_type_i) begin
  199. if (calc_cycle == 3'd0) begin
  200. if (!WinCtrl_i) begin
  201. tukeyWind <= p1[34-:18];
  202. end else begin
  203. tukeyWind <= 0-p1[34-:18];
  204. end
  205. end
  206. end else begin
  207. tukeyWind <= 18'h0;
  208. end
  209. end else begin
  210. tukeyWind <= 18'h0;
  211. end
  212. end
  213. //??????? "????? ??????? ????????". ???????? [(b*A5+A4) = p1 ? ????????????? ?????? (b*p1+A3)=p2] == 1 ????.
  214. always @(posedge wind_clk) begin
  215. if (!reset_i) begin
  216. if (MeasWind_i) begin
  217. if (calc_cycle != 4'd3) begin
  218. calc_cycle <= calc_cycle + 4'd1;
  219. end else begin
  220. calc_cycle <= 4'd0;
  221. end
  222. end else begin
  223. calc_cycle <= 4'd0;
  224. end
  225. end else begin
  226. calc_cycle <= 4'd0;
  227. end
  228. end
  229. DSP48E1 #(
  230. // Feature Control Attributes: Data Path Selection
  231. .A_INPUT("DIRECT"), // Selects A input source, "DIRECT" (A port) or "CASCADE" (ACIN port)
  232. .B_INPUT("DIRECT"), // Selects B input source, "DIRECT" (B port) or "CASCADE" (BCIN port)
  233. .USE_DPORT("FALSE"), // Select D port usage (TRUE or FALSE)
  234. .USE_MULT("MULTIPLY"), // Select multiplier usage ("MULTIPLY", "DYNAMIC", or "NONE")
  235. .USE_SIMD("ONE48"), // SIMD selection ("ONE48", "TWO24", "FOUR12")
  236. // Pattern Detector Attributes: Pattern Detection Configuration
  237. .AUTORESET_PATDET("NO_RESET"), // "NO_RESET", "RESET_MATCH", "RESET_NOT_MATCH"
  238. .MASK(48'h3fffffffffff), // 48-bit mask value for pattern detect (1=ignore)
  239. .PATTERN(48'h000000000000), // 48-bit pattern match for pattern detect
  240. .SEL_MASK("MASK"), // "C", "MASK", "ROUNDING_MODE1", "ROUNDING_MODE2"
  241. .SEL_PATTERN("PATTERN"), // Select pattern value ("PATTERN" or "C")
  242. .USE_PATTERN_DETECT("NO_PATDET"), // Enable pattern detect ("PATDET" or "NO_PATDET")
  243. // Register Control Attributes: Pipeline Register Configuration
  244. .ACASCREG(0), // Number of pipeline stages between A/ACIN and ACOUT (0, 1 or 2)
  245. .ADREG(0), // Number of pipeline stages for pre-adder (0 or 1)
  246. .ALUMODEREG(0), // Number of pipeline stages for ALUMODE (0 or 1)
  247. .AREG(0), // Number of pipeline stages for A (0, 1 or 2)
  248. .BCASCREG(0), // Number of pipeline stages between B/BCIN and BCOUT (0, 1 or 2)
  249. .BREG(0), // Number of pipeline stages for B (0, 1 or 2)
  250. .CARRYINREG(0), // Number of pipeline stages for CARRYIN (0 or 1)
  251. .CARRYINSELREG(0), // Number of pipeline stages for CARRYINSEL (0 or 1)
  252. .CREG(0), // Number of pipeline stages for C (0 or 1)
  253. .DREG(0), // Number of pipeline stages for D (0 or 1)
  254. .INMODEREG(0), // Number of pipeline stages for INMODE (0 or 1)
  255. .MREG(0), // Number of multiplier pipeline stages (0 or 1)
  256. .OPMODEREG(0), // Number of pipeline stages for OPMODE (0 or 1)
  257. .PREG(1) // Number of pipeline stages for P (0 or 1)
  258. )
  259. FirstStage (
  260. // Cascade: 30-bit (each) output: Cascade Ports
  261. .ACOUT(), // 30-bit output: A port cascade output
  262. .BCOUT(), // 18-bit output: B port cascade output
  263. .CARRYCASCOUT(), // 1-bit output: Cascade carry output
  264. .MULTSIGNOUT(), // 1-bit output: Multiplier sign cascade output
  265. .PCOUT(), // 48-bit output: Cascade output
  266. // Control: 1-bit (each) output: Control Inputs/Status Bits
  267. .OVERFLOW(), // 1-bit output: Overflow in add/acc output
  268. .PATTERNBDETECT(), // 1-bit output: Pattern bar detect output
  269. .PATTERNDETECT(), // 1-bit output: Pattern detect output
  270. .UNDERFLOW(), // 1-bit output: Underflow in add/acc output
  271. // Data: 4-bit (each) output: Data Ports
  272. .CARRYOUT(), // 4-bit output: Carry output
  273. .P(p1), // 48-bit output: Primary data output
  274. // Cascade: 30-bit (each) input: Cascade Ports
  275. .ACIN(), // 30-bit input: A cascade data input
  276. .BCIN(), // 18-bit input: B cascade input
  277. .CARRYCASCIN(), // 1-bit input: Cascade carry input
  278. .MULTSIGNIN(), // 1-bit input: Multiplier sign input
  279. .PCIN(48'b0), // 48-bit input: P cascade input
  280. // Control: 4-bit (each) input: Control Inputs/Status Bits
  281. .ALUMODE(4'b0000), // 4-bit input: ALU control input
  282. .CARRYINSEL(3'b000), // 3-bit input: Carry select input
  283. // .CLK(1'b0), // 1-bit input: Clock input
  284. .CLK(wind_clk), // 1-bit input: Clock input
  285. .INMODE(5'b00000), // 5-bit input: INMODE control input
  286. .OPMODE(7'b0110101), // 7-bit input: Operation mode input
  287. // Data: 30-bit (each) input: Data Ports
  288. .A({{12{a1[17]}},a1}), // 30-bit input: A data input
  289. .B(b), // 18-bit input: B data input
  290. .C({ {13{c1[17]}}, c1[17:0],17'b0 }), // 48-bit input: C data input
  291. .CARRYIN(1'b0), // 1-bit input: Carry input signal
  292. .D(25'b0), // 25-bit input: D data input
  293. // Reset/Clock Enable: 1-bit (each) input: Reset/Clock Enable Inputs
  294. .CEA1(1'b1), // 1-bit input: Clock enable input for 1st stage AREG
  295. .CEA2(1'b1), // 1-bit input: Clock enable input for 2nd stage AREG
  296. .CEAD(1'b1), // 1-bit input: Clock enable input for ADREG
  297. .CEALUMODE(1'b1), // 1-bit input: Clock enable input for ALUMODE
  298. .CEB1(1'b1), // 1-bit input: Clock enable input for 1st stage BREG
  299. .CEB2(1'b1), // 1-bit input: Clock enable input for 2nd stage BREG
  300. .CEC(1'b1), // 1-bit input: Clock enable input for CREG
  301. .CECARRYIN(1'b1), // 1-bit input: Clock enable input for CARRYINREG
  302. .CECTRL(1'b1), // 1-bit input: Clock enable input for OPMODEREG and CARRYINSELREG
  303. .CED(1'b1), // 1-bit input: Clock enable input for DREG
  304. .CEINMODE(1'b1), // 1-bit input: Clock enable input for INMODEREG
  305. .CEM(1'b0), // 1-bit input: Clock enable input for MREG
  306. .CEP(1'b1), // 1-bit input: Clock enable input for PREG
  307. .RSTA(1'b0), // 1-bit input: Reset input for AREG
  308. .RSTALLCARRYIN(1'b0), // 1-bit input: Reset input for CARRYINREG
  309. .RSTALUMODE(1'b0), // 1-bit input: Reset input for ALUMODEREG
  310. .RSTB(1'b0), // 1-bit input: Reset input for BREG
  311. .RSTC(1'b0), // 1-bit input: Reset input for CREG
  312. .RSTCTRL(1'b0), // 1-bit input: Reset input for OPMODEREG and CARRYINSELREG
  313. .RSTD(1'b0), // 1-bit input: Reset input for DREG and ADREG
  314. .RSTINMODE(1'b0), // 1-bit input: Reset input for INMODEREG
  315. .RSTM(reset_i), // 1-bit input: Reset input for MREG
  316. .RSTP(reset_i) // 1-bit input: Reset input for PREG
  317. );
  318. DSP48E1 #(
  319. // Feature Control Attributes: Data Path Selection
  320. .A_INPUT("DIRECT"), // Selects A input source, "DIRECT" (A port) or "CASCADE" (ACIN port)
  321. .B_INPUT("DIRECT"), // Selects B input source, "DIRECT" (B port) or "CASCADE" (BCIN port)
  322. .USE_DPORT("FALSE"), // Select D port usage (TRUE or FALSE)
  323. .USE_MULT("MULTIPLY"), // Select multiplier usage ("MULTIPLY", "DYNAMIC", or "NONE")
  324. .USE_SIMD("ONE48"), // SIMD selection ("ONE48", "TWO24", "FOUR12")
  325. // Pattern Detector Attributes: Pattern Detection Configuration
  326. .AUTORESET_PATDET("NO_RESET"), // "NO_RESET", "RESET_MATCH", "RESET_NOT_MATCH"
  327. .MASK(48'h1), // 48-bit mask value for pattern detect (1=ignore)
  328. .PATTERN(48'h000000000000), // 48-bit pattern match for pattern detect
  329. .SEL_MASK("MASK"), // "C", "MASK", "ROUNDING_MODE1", "ROUNDING_MODE2"
  330. .SEL_PATTERN("PATTERN"), // Select pattern value ("PATTERN" or "C")
  331. .USE_PATTERN_DETECT("NO_PATDET"), // Enable pattern detect ("PATDET" or "NO_PATDET")
  332. // Register Control Attributes: Pipeline Register Configuration
  333. .ACASCREG(0), // Number of pipeline stages between A/ACIN and ACOUT (0, 1 or 2)
  334. .ADREG(0), // Number of pipeline stages for pre-adder (0 or 1)
  335. .ALUMODEREG(0), // Number of pipeline stages for ALUMODE (0 or 1)
  336. .AREG(0), // Number of pipeline stages for A (0, 1 or 2)
  337. .BCASCREG(0), // Number of pipeline stages between B/BCIN and BCOUT (0, 1 or 2)
  338. .BREG(0), // Number of pipeline stages for B (0, 1 or 2)
  339. .CARRYINREG(0), // Number of pipeline stages for CARRYIN (0 or 1)
  340. .CARRYINSELREG(0), // Number of pipeline stages for CARRYINSEL (0 or 1)
  341. .CREG(0), // Number of pipeline stages for C (0 or 1)
  342. .DREG(0), // Number of pipeline stages for D (0 or 1)
  343. .INMODEREG(0), // Number of pipeline stages for INMODE (0 or 1)
  344. .MREG(0), // Number of multiplier pipeline stages (0 or 1)
  345. .OPMODEREG(0), // Number of pipeline stages for OPMODE (0 or 1)
  346. .PREG(0) // Number of pipeline stages for P (0 or 1)
  347. )
  348. SecondStage (
  349. // Cascade: 30-bit (each) output: Cascade Ports
  350. .ACOUT(), // 30-bit output: A port cascade output
  351. .BCOUT(), // 18-bit output: B port cascade output
  352. .CARRYCASCOUT(), // 1-bit output: Cascade carry output
  353. .MULTSIGNOUT(), // 1-bit output: Multiplier sign cascade output
  354. .PCOUT(), // 48-bit output: Cascade output
  355. // Control: 1-bit (each) output: Control Inputs/Status Bits
  356. .OVERFLOW(), // 1-bit output: Overflow in add/acc output
  357. .PATTERNBDETECT(), // 1-bit output: Pattern bar detect output
  358. .PATTERNDETECT(), // 1-bit output: Pattern detect output
  359. .UNDERFLOW(), // 1-bit output: Underflow in add/acc output
  360. // Data: 4-bit (each) output: Data Ports
  361. .CARRYOUT(), // 4-bit output: Carry output
  362. .P(p2), // 48-bit output: Primary data output
  363. // Cascade: 30-bit (each) input: Cascade Ports
  364. .ACIN(), // 30-bit input: A cascade data input
  365. .BCIN(), // 18-bit input: B cascade input
  366. .CARRYCASCIN(), // 1-bit input: Cascade carry input
  367. .MULTSIGNIN(), // 1-bit input: Multiplier sign input
  368. .PCIN(48'b0), // 48-bit input: P cascade input
  369. // Control: 4-bit (each) input: Control Inputs/Status Bits
  370. .ALUMODE(4'b0000), // 4-bit input: ALU control input
  371. .CARRYINSEL(3'b000), // 3-bit input: Carry select input
  372. .CLK(1'b0), // 1-bit input: Clock input
  373. // .CLK(wind_clk), // 1-bit input: Clock input
  374. .INMODE(5'b00000), // 5-bit input: INMODE control input
  375. .OPMODE(7'b0110101), // 7-bit input: Operation mode input
  376. // Data: 30-bit (each) input: Data Ports
  377. .A({{12{p1[47]}},p1[34:17]}), // 30-bit input: A data input
  378. .B(b), // 18-bit input: B data input
  379. .C({ {13{c2[17]}}, c2[17:0],17'b0 }), // 48-bit input: C data input
  380. .CARRYIN(1'b0), // 1-bit input: Carry input signal
  381. .D(25'b0), // 25-bit input: D data input
  382. // Reset/Clock Enable: 1-bit (each) input: Reset/Clock Enable Inputs
  383. .CEA1(1'b1), // 1-bit input: Clock enable input for 1st stage AREG
  384. .CEA2(1'b1), // 1-bit input: Clock enable input for 2nd stage AREG
  385. .CEAD(1'b1), // 1-bit input: Clock enable input for ADREG
  386. .CEALUMODE(1'b1), // 1-bit input: Clock enable input for ALUMODE
  387. .CEB1(1'b1), // 1-bit input: Clock enable input for 1st stage BREG
  388. .CEB2(1'b1), // 1-bit input: Clock enable input for 2nd stage BREG
  389. .CEC(1'b1), // 1-bit input: Clock enable input for CREG
  390. .CECARRYIN(1'b1), // 1-bit input: Clock enable input for CARRYINREG
  391. .CECTRL(1'b1), // 1-bit input: Clock enable input for OPMODEREG and CARRYINSELREG
  392. .CED(1'b1), // 1-bit input: Clock enable input for DREG
  393. .CEINMODE(1'b1), // 1-bit input: Clock enable input for INMODEREG
  394. .CEM(1'b0), // 1-bit input: Clock enable input for MREG
  395. .CEP(1'b0), // 1-bit input: Clock enable input for PREG
  396. .RSTA(1'b0), // 1-bit input: Reset input for AREG
  397. .RSTALLCARRYIN(1'b0), // 1-bit input: Reset input for CARRYINREG
  398. .RSTALUMODE(1'b0), // 1-bit input: Reset input for ALUMODEREG
  399. .RSTB(1'b0), // 1-bit input: Reset input for BREG
  400. .RSTC(1'b0), // 1-bit input: Reset input for CREG
  401. .RSTCTRL(1'b0), // 1-bit input: Reset input for OPMODEREG and CARRYINSELREG
  402. .RSTD(1'b0), // 1-bit input: Reset input for DREG and ADREG
  403. .RSTINMODE(1'b0), // 1-bit input: Reset input for INMODEREG
  404. .RSTM(reset_i), // 1-bit input: Reset input for MREG
  405. .RSTP(reset_i) // 1-bit input: Reset input for PREG
  406. );
  407. endmodule