InternalDsp.v 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  1. `timescale 1ns / 1ps
  2. (* keep_hierarchy = "yes" *)
  3. //////////////////////////////////////////////////////////////////////////////////
  4. // Company:
  5. // Engineer:
  6. //
  7. // Create Date: 18:00:25 07/10/2019
  8. // Design Name:
  9. // Module Name: internal_dsp
  10. // Project Name:
  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 InternalDsp
  23. #(
  24. parameter AdcDataWidth = 14,
  25. parameter WindWidth = 18,
  26. parameter WindNcoPhIncWidth = 32,
  27. parameter NcoWidth = 18,
  28. parameter ChNum = 4,
  29. parameter ResultWidth = 32,
  30. parameter WinTypeWidth = 3,
  31. parameter BandCmdWidth = 8,
  32. parameter WindPNumWidth = 32,
  33. parameter WindNormCoefWidth = 32,
  34. parameter WindCorrCoefWidth = 32,
  35. parameter CmdDataRegWith = 24,
  36. parameter IntermediateWidth = 18,
  37. parameter CorrAdcDataWidth = 20,
  38. parameter AccWidth = 80
  39. )
  40. (
  41. input wire Clk_i,
  42. input wire WindCalcClk_i,
  43. input wire Rst_i,
  44. input wire NcoRst_i,
  45. output wire OscWind_o,
  46. input wire [AdcDataWidth-1:0] Adc1ChT1Data_i, //A
  47. input wire [AdcDataWidth-1:0] Adc1ChR1Data_i, //R1
  48. input wire [AdcDataWidth-1:0] Adc2ChR2Data_i, //R2
  49. input wire [AdcDataWidth-1:0] Adc2ChT2Data_i, //B
  50. input wire GatingPulse_i,
  51. input wire StartMeas_i,
  52. input wire StartMeasDsp_i,
  53. input wire OscDataRdFlag_i,
  54. input wire [32-1:0] MeasNum_i,
  55. input wire [CmdDataRegWith-1:0] MeasCtrl_i,
  56. input wire [CmdDataRegWith-1:0] FilterCorrCoefL_i,
  57. input wire [CmdDataRegWith-1:0] FilterCorrCoefH_i,
  58. output wire EndMeas_o,
  59. input wire CalModeEn_i,
  60. output wire CalModeDone_o,
  61. input wire [CmdDataRegWith-1:0] IfFtwL_i,
  62. input wire [CmdDataRegWith-1:0] IfFtwH_i,
  63. output wire [ResultWidth-1:0] Adc1ImT1Data_o,
  64. output wire [ResultWidth-1:0] Adc1ReT1Data_o,
  65. output wire [ResultWidth-1:0] Adc1ImR1Data_o,
  66. output wire [ResultWidth-1:0] Adc1ReR1Data_o,
  67. //adc2
  68. output wire [ResultWidth-1:0] Adc2ImR2Data_o,
  69. output wire [ResultWidth-1:0] Adc2ReR2Data_o,
  70. output wire [ResultWidth-1:0] Adc2ImT2Data_o,
  71. output wire [ResultWidth-1:0] Adc2ReT2Data_o,
  72. output wire [NcoWidth-1:0] NcoSin_o,
  73. output wire [NcoWidth-1:0] NcoCos_o,
  74. output wire MeasDataRdy_o,
  75. output wire MeasWind_o,
  76. output wire MeasEnd_o,
  77. output wire SampleStrobeGenRst_o
  78. );
  79. //================================================================================
  80. // REG/WIRE
  81. wire [WindNormCoefWidth-1:0] windNormCoef;
  82. wire [WindPNumWidth-1:0] windPointsNum;
  83. wire [WindPNumWidth-1:0] averageNoizeLvl;
  84. wire [WindNcoPhIncWidth-1:0] windPhInc;
  85. wire [WindNcoPhIncWidth-1:0] winPhIncStart;
  86. wire [WindWidth-1:0] wind;
  87. wire [NcoWidth-1:0] ncoCos;
  88. wire [NcoWidth-1:0] ncoSin;
  89. wire [CorrAdcDataWidth-1:0] adcDataBus [ChNum-1:0];
  90. // wire [AdcDataWidth-1:0] adcDataBus [ChNum-1:0];
  91. wire [CorrAdcDataWidth-1:0] adcDataBusExt [ChNum-1:0];
  92. wire [CorrAdcDataWidth-1:0] gatedAdcDataBus [ChNum-1:0];
  93. wire [CorrAdcDataWidth-1:0] calAdcData [ChNum-1:0];
  94. wire [CorrAdcDataWidth-1:0] prngData;
  95. reg [CorrAdcDataWidth-1:0] prngDataBus [ChNum-1:0];
  96. wire [ChNum-1:0] calDone;
  97. genvar g;
  98. integer i;
  99. wire [ResultWidth-1:0] resultImBus [ChNum-1:0];
  100. wire [ResultWidth-1:0] resultReBus [ChNum-1:0];
  101. wire [ChNum-1:0] resultValBus;
  102. wire measWind;
  103. wire measWindDelayed;
  104. wire stopMeas;
  105. wire [1:0] tukeyCtrl;
  106. reg [CmdDataRegWith-1:0] measCtrlReg;
  107. reg [32-1:0] windPointsNumReg;
  108. reg [32-1:0] measNumReg;
  109. reg [WindCorrCoefWidth-1:0] filterCorrCoeffReg;
  110. reg [CmdDataRegWith-1:0] ifFtwLReg;
  111. reg [CmdDataRegWith-1:0] ifFtwHReg;
  112. reg [CmdDataRegWith-1:0] filterCorrCoefLReg;
  113. reg [CmdDataRegWith-1:0] filterCorrCoefHReg;
  114. wire [31:0] windArg;
  115. // wire [CorrAdcDataWidth-1:0] adc1ChT1DataGated = (GatingPulse_i)? calAdcData[ChNum-4]:{CorrAdcDataWidth{1'b0}};
  116. // wire [CorrAdcDataWidth-1:0] adc1ChR1DataGated = (GatingPulse_i)? calAdcData[ChNum-3]:{CorrAdcDataWidth{1'b0}};
  117. // wire [CorrAdcDataWidth-1:0] adc2ChR2DataGated = (GatingPulse_i)? calAdcData[ChNum-2]:{CorrAdcDataWidth{1'b0}};
  118. // wire [CorrAdcDataWidth-1:0] adc2ChT2DataGated = (GatingPulse_i)? calAdcData[ChNum-1]:{CorrAdcDataWidth{1'b0}};
  119. wire [CorrAdcDataWidth-1:0] adc1ChT1DataGated = (GatingPulse_i)? adcDataBusExt[ChNum-4]:{CorrAdcDataWidth{1'b0}};
  120. wire [CorrAdcDataWidth-1:0] adc1ChR1DataGated = (GatingPulse_i)? adcDataBusExt[ChNum-3]:{CorrAdcDataWidth{1'b0}};
  121. wire [CorrAdcDataWidth-1:0] adc2ChR2DataGated = (GatingPulse_i)? adcDataBusExt[ChNum-2]:{CorrAdcDataWidth{1'b0}};
  122. wire [CorrAdcDataWidth-1:0] adc2ChT2DataGated = (GatingPulse_i)? adcDataBusExt[ChNum-1]:{CorrAdcDataWidth{1'b0}};
  123. wire [WindNcoPhIncWidth-1:0] ncoPhInc = {ifFtwHReg[0+:WindNcoPhIncWidth-CmdDataRegWith],ifFtwLReg};
  124. //================================================================================
  125. // ASSIGNMENTS
  126. // assign adcDataBus [ChNum-1] = Adc2ChT2Data_i;
  127. // assign adcDataBus [ChNum-2] = Adc2ChR2Data_i;
  128. // assign adcDataBus [ChNum-3] = Adc1ChR1Data_i;
  129. // assign adcDataBus [ChNum-4] = Adc1ChT1Data_i;
  130. assign adcDataBus [ChNum-1] = {{2{Adc2ChT2Data_i[AdcDataWidth-1]}},Adc2ChT2Data_i,4'b0};
  131. assign adcDataBus [ChNum-2] = {{2{Adc2ChR2Data_i[AdcDataWidth-1]}},Adc2ChR2Data_i,4'b0};
  132. assign adcDataBus [ChNum-3] = {{2{Adc1ChR1Data_i[AdcDataWidth-1]}},Adc1ChR1Data_i,4'b0};
  133. assign adcDataBus [ChNum-4] = {{2{Adc1ChT1Data_i[AdcDataWidth-1]}},Adc1ChT1Data_i,4'b0};
  134. assign adcDataBusExt [ChNum-1] = calAdcData [ChNum-1]+prngDataBus[ChNum-1];
  135. assign adcDataBusExt [ChNum-2] = calAdcData [ChNum-2]+prngDataBus[ChNum-2];
  136. assign adcDataBusExt [ChNum-3] = calAdcData [ChNum-3]+prngDataBus[ChNum-3];
  137. assign adcDataBusExt [ChNum-4] = calAdcData [ChNum-4]+prngDataBus[ChNum-4];
  138. assign gatedAdcDataBus [ChNum-1] = adc2ChT2DataGated;
  139. assign gatedAdcDataBus [ChNum-2] = adc2ChR2DataGated;
  140. assign gatedAdcDataBus [ChNum-3] = adc1ChR1DataGated;
  141. assign gatedAdcDataBus [ChNum-4] = adc1ChT1DataGated;
  142. assign Adc1ImT1Data_o = resultImBus [ChNum-4];
  143. assign Adc1ReT1Data_o = resultReBus [ChNum-4];
  144. assign Adc1ImR1Data_o = resultImBus [ChNum-3];
  145. assign Adc1ReR1Data_o = resultReBus [ChNum-3];
  146. //adc2
  147. assign Adc2ImR2Data_o = resultImBus [ChNum-2];
  148. assign Adc2ReR2Data_o = resultReBus [ChNum-2];
  149. assign Adc2ImT2Data_o = resultImBus [ChNum-1];
  150. assign Adc2ReT2Data_o = resultReBus [ChNum-1];
  151. assign MeasDataRdy_o = &resultValBus;
  152. assign EndMeas_o = stopMeas;
  153. assign NcoCos_o = ncoCos;
  154. assign NcoSin_o = ncoSin;
  155. assign MeasWind_o = measWind;
  156. assign CalModeDone_o = &calDone;
  157. //================================================================================
  158. // INSTANTIATIONS
  159. //----------------------------------------------
  160. //Module generates event signals for measurement
  161. always @(posedge Clk_i) begin
  162. if (!Rst_i) begin
  163. if (!StartMeas_i) begin
  164. measCtrlReg <= MeasCtrl_i;
  165. ifFtwLReg <= IfFtwL_i;
  166. ifFtwHReg <= IfFtwH_i;
  167. filterCorrCoefLReg <= FilterCorrCoefL_i;
  168. filterCorrCoefHReg <= FilterCorrCoefH_i;
  169. measNumReg <= MeasNum_i;
  170. windPointsNumReg <= windPointsNum;
  171. end
  172. end else begin
  173. measCtrlReg <= 0;
  174. ifFtwLReg <= 0;
  175. ifFtwHReg <= 0;
  176. filterCorrCoefLReg <= 0;
  177. filterCorrCoefHReg <= 0;
  178. measNumReg <= 0;
  179. windPointsNumReg <= 0;
  180. end
  181. end
  182. // PseudoRandomGenerator RandomGenInst
  183. // (
  184. // .Rst_i (Rst_i),
  185. // .Clk_i (Clk_i),
  186. // .Data_o ()
  187. // );
  188. MeasCtrlModule
  189. #(
  190. .WindPNumWidth (WindPNumWidth)
  191. )
  192. MeasCtrlModule
  193. (
  194. .Clk_i (Clk_i),
  195. .Rst_i (Rst_i),
  196. .OscWind_o (OscWind_o),
  197. .FilterCmd_i (measCtrlReg[15-:8]),
  198. .MeasNum_i (measNumReg),
  199. .StartMeas_i (StartMeas_i),
  200. .StartMeasDsp_i (StartMeasDsp_i),
  201. .Mode_i (measCtrlReg[0]),
  202. .OscDataRdFlag_i (OscDataRdFlag_i),
  203. .WindPointsNum_i (windPointsNumReg),
  204. .WindPhInc_i (windPhInc),
  205. .WindPhIncStart_i (winPhIncStart),
  206. .WindArg_o (windArg),
  207. .StartFpConv_o (StartFpConv),
  208. .MeasWind_o (measWind),
  209. .MeasWindDel_o (measWindDelayed),
  210. .StopMeas_o (stopMeas),
  211. .MeasEnd_o (MeasEnd_o),
  212. .WinCtrl_o (winCtrl),
  213. .TukeyCtrl_o (tukeyCtrl),
  214. .SampleStrobeGenRst_o (SampleStrobeGenRst_o)
  215. );
  216. //----------------------------------------------
  217. //Module selects settings for current window
  218. WinParameters
  219. #(
  220. .WindPhIncWidth (WindNcoPhIncWidth),
  221. .WindNormCoefWidth (WindNormCoefWidth),
  222. .WindPNumWidth (WindPNumWidth),
  223. .BandCmdWidth (BandCmdWidth)
  224. )
  225. WinParameters
  226. (
  227. .Clk_i (Clk_i),
  228. .Rst_i (Rst_i),
  229. .FilterCmd_i (measCtrlReg[15-:8]),
  230. .WinPhInc_o (windPhInc),
  231. .WinPhIncStart_o (winPhIncStart),
  232. .WinNormCoef_o (windNormCoef),
  233. .WinPointsNum_o (windPointsNum),
  234. .AverageNoiseLvl_o (averageNoizeLvl)
  235. );
  236. //----------------------------------------------
  237. //Module generates win samples
  238. Win_calc WinCalcInst
  239. (
  240. .clk_i (Clk_i),
  241. .wind_clk (WindCalcClk_i),
  242. .filterCmd_i (measCtrlReg[15-:8]),
  243. .reset_i (Rst_i),
  244. .WinCtrl_i (winCtrl),
  245. .TukeyCtrl_i (tukeyCtrl),
  246. .MeasWind_i (measWind),
  247. .win_value_i (windArg),
  248. .win_type_i (measCtrlReg[2:0]),
  249. .win_o (wind),
  250. .sinWin_o (sinwind)
  251. );
  252. //----------------------------------------------
  253. //Module generates Sin and Cos for measurement
  254. CordicNco
  255. #(
  256. .ODatWidth (NcoWidth),
  257. .PhIncWidth (WindNcoPhIncWidth),
  258. .IterNum (15),
  259. .EnSinN (1)
  260. )
  261. ncoInst
  262. (
  263. .Clk_i (Clk_i),
  264. .Rst_i (Rst_i|NcoRst_i),
  265. .Val_i (1'b1),
  266. .PhaseInc_i ({ifFtwHReg[0+:WindNcoPhIncWidth-CmdDataRegWith],ifFtwLReg}),
  267. .WindVal_i (1'b1),
  268. .WinType_i (),
  269. .Wind_o (),
  270. .Sin_o (ncoSin),
  271. .Cos_o (ncoCos),
  272. .Val_o ()
  273. );
  274. ComplPrng
  275. #(
  276. .DataPrngWidth (8),
  277. .InDataWidth (CorrAdcDataWidth),
  278. .OutDataWidth (CorrAdcDataWidth)
  279. )
  280. ComplPrngAdderInst
  281. (
  282. // .Data_i (calAdcData[g]),
  283. .Clk_i (Clk_i),
  284. .Rst_i (Rst_i),
  285. // .DataAndPrng_o (adcDataBusExt[g]),
  286. .PrngData_o (prngData)
  287. );
  288. always @(posedge Clk_i) begin
  289. prngDataBus[0] <= prngData;
  290. for(i=1; i<4; i=i+1) begin
  291. prngDataBus [i]<=prngDataBus[i-1];
  292. end
  293. end
  294. //------------------------------------------------
  295. //Generating needed amount of calculating channels
  296. generate
  297. for (g=0; g<ChNum; g=g+1) begin :DspChannel
  298. AdcCalibration
  299. #(
  300. // .AccNum (32),
  301. .AccNum (2097152),
  302. .AdcDataWidth (CorrAdcDataWidth)
  303. )
  304. AdcCalibrationInst
  305. (
  306. .Clk_i (Clk_i),
  307. .Rst_i (Rst_i),
  308. .CalModeEn_i (CalModeEn_i),
  309. // .AdcData_i (adcDataBusExt[g]),
  310. .AdcData_i (adcDataBus[g]),
  311. .CalDone_o (calDone[g]),
  312. .CalibratedAdcData_o (calAdcData[g])
  313. );
  314. DspPipeline
  315. #(
  316. .AdcDataWidth (AdcDataWidth),
  317. .AccWidth (AccWidth),
  318. .WindWidth (WindWidth),
  319. .NcoWidth (NcoWidth),
  320. .ResultWidth (ResultWidth),
  321. .WindCorrCoefWidth (WindCorrCoefWidth),
  322. .WindNormCoefWidth (WindNormCoefWidth),
  323. .IntermediateWidth (IntermediateWidth)
  324. )
  325. DspPipelineInst
  326. (
  327. .Clk_i (Clk_i),
  328. .Rst_i (Rst_i),
  329. .Val_i (measWind),
  330. .StartFpConv_i (StartFpConv),
  331. .FilterCorrCoef_i ({filterCorrCoefHReg[0+:WindNcoPhIncWidth-CmdDataRegWith],filterCorrCoefLReg}),
  332. .AverageNoizeLvl_i (averageNoizeLvl),
  333. .AdcData_i (gatedAdcDataBus[g]),
  334. .Wind_i (wind),
  335. .NcoSin_i (ncoCos),
  336. .NcoCos_i (ncoSin),
  337. .NormCoef_i (windNormCoef),
  338. .CorrResultIm_o (resultImBus[g]),
  339. .CorrResultRe_o (resultReBus[g]),
  340. .CorrResultVal_o (resultValBus[g])
  341. );
  342. end
  343. endgenerate
  344. endmodule