InternalDsp.v 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532
  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. parameter [8:0] MaxAddr = 9'h190
  40. )
  41. (
  42. input wire Clk_i,
  43. input wire WindCalcClk_i,
  44. input wire Rst_i,
  45. input wire NcoRst_i,
  46. output wire OscWind_o,
  47. input wire [AdcDataWidth-1:0] Adc1ChT1Data_i, //A
  48. input wire [AdcDataWidth-1:0] Adc1ChR1Data_i, //R1
  49. input wire [AdcDataWidth-1:0] Adc2ChR2Data_i, //R2
  50. input wire [AdcDataWidth-1:0] Adc2ChT2Data_i, //B
  51. input wire GatingPulse_i,
  52. input wire StartMeas_i,
  53. input wire StartMeasDsp_i,
  54. input wire OscDataRdFlag_i,
  55. input wire [32-1:0] MeasNum_i,
  56. input wire [CmdDataRegWith-1:0] MeasCtrl_i,
  57. input wire [CmdDataRegWith-1:0] FilterCorrCoefL_i,
  58. input wire [CmdDataRegWith-1:0] FilterCorrCoefH_i,
  59. output wire EndMeas_o,
  60. input wire CalModeEn_i,
  61. output wire CalModeDone_o,
  62. input wire [CmdDataRegWith-1:0] IfFtwL_i,
  63. input wire [CmdDataRegWith-1:0] IfFtwH_i,
  64. output wire [ResultWidth-1:0] Adc1ImT1Data_o,
  65. output wire [ResultWidth-1:0] Adc1ReT1Data_o,
  66. output wire [ResultWidth-1:0] Adc1ImR1Data_o,
  67. output wire [ResultWidth-1:0] Adc1ReR1Data_o,
  68. //adc2
  69. output wire [ResultWidth-1:0] Adc2ImR2Data_o,
  70. output wire [ResultWidth-1:0] Adc2ReR2Data_o,
  71. output wire [ResultWidth-1:0] Adc2ImT2Data_o,
  72. output wire [ResultWidth-1:0] Adc2ReT2Data_o,
  73. output wire [NcoWidth-1:0] NcoSin_o,
  74. output wire [NcoWidth-1:0] NcoCos_o,
  75. output wire MeasDataRdy_o,
  76. output wire MeasWind_o,
  77. output wire MeasEnd_o,
  78. output wire SampleStrobeGenRst_o
  79. );
  80. //================================================================================
  81. // REG/WIRE
  82. wire [WindNormCoefWidth-1:0] windNormCoef;
  83. wire [WindPNumWidth-1:0] windPointsNum;
  84. wire [WindPNumWidth-1:0] averageNoizeLvl;
  85. wire [WindNcoPhIncWidth-1:0] windPhInc;
  86. wire [WindNcoPhIncWidth-1:0] winPhIncStart;
  87. wire [WindWidth-1:0] wind;
  88. wire [NcoWidth-1:0] ncoCosFirstTone;
  89. wire [NcoWidth-1:0] ncoSinFirstTone;
  90. wire [NcoWidth-1:0] ncoCosSecondTone;
  91. wire [NcoWidth-1:0] ncoSinSecondTone;
  92. wire [CorrAdcDataWidth-1:0] adcDataBus [ChNum-1:0];
  93. wire [CorrAdcDataWidth-1:0] adcDataBusExt [ChNum-1:0];
  94. wire [CorrAdcDataWidth-1:0] gatedAdcDataBus [ChNum-1:0];
  95. wire [CorrAdcDataWidth-1:0] calAdcData [ChNum-1:0];
  96. wire [CorrAdcDataWidth-1:0] prngData;
  97. reg [CorrAdcDataWidth-1:0] prngDataBus [ChNum-1:0];
  98. wire [ChNum-1:0] calDone;
  99. genvar g;
  100. integer i;
  101. wire [ResultWidth-1:0] resultImBus [ChNum-1:0];
  102. wire [ResultWidth-1:0] resultReBus [ChNum-1:0];
  103. wire [ChNum-1:0] resultValBus;
  104. wire measWind;
  105. wire measWindDelayed;
  106. wire stopMeas;
  107. wire [1:0] tukeyCtrl;
  108. reg [CmdDataRegWith-1:0] measCtrlReg;
  109. reg [32-1:0] windPointsNumReg;
  110. reg [32-1:0] measNumReg;
  111. reg [WindCorrCoefWidth-1:0] filterCorrCoeffReg;
  112. reg [CmdDataRegWith-1:0] ifFtwLReg;
  113. reg [CmdDataRegWith-1:0] ifFtwHReg;
  114. reg [CmdDataRegWith-1:0] filterCorrCoefLReg;
  115. reg [CmdDataRegWith-1:0] filterCorrCoefHReg;
  116. wire [31:0] windArg;
  117. wire [CorrAdcDataWidth-1:0] adc1ChT1DataGated = (GatingPulse_i)? adcDataBusExt[ChNum-4]:{CorrAdcDataWidth{1'b0}};
  118. wire [CorrAdcDataWidth-1:0] adc1ChR1DataGated = (GatingPulse_i)? adcDataBusExt[ChNum-3]:{CorrAdcDataWidth{1'b0}};
  119. wire [CorrAdcDataWidth-1:0] adc2ChR2DataGated = (GatingPulse_i)? adcDataBusExt[ChNum-2]:{CorrAdcDataWidth{1'b0}};
  120. wire [CorrAdcDataWidth-1:0] adc2ChT2DataGated = (GatingPulse_i)? adcDataBusExt[ChNum-1]:{CorrAdcDataWidth{1'b0}};
  121. wire [WindNcoPhIncWidth-1:0] ncoPhInc = {ifFtwHReg[0+:WindNcoPhIncWidth-CmdDataRegWith],ifFtwLReg};
  122. reg [8:0] memAddrFirstTone;
  123. wire [8:0] memAddrNextFirstTone;
  124. wire [8:0] memAddrNext_pFirstTone; //аргументы для расчета следующего значения
  125. wire [9:0] memAddrNext_mFirstTone; //аргументы для расчета следующего значения
  126. reg [8:0] memAddrSecondTone;
  127. wire [8:0] memAddrNextSecondTone;
  128. wire [8:0] memAddrNext_pSecondTone; //аргументы для расчета следующего значения
  129. wire [9:0] memAddrNext_mSecondTone; //аргументы для расчета следующего значения
  130. wire [8:0] addrStepFirstTone = 9'h50;
  131. wire [8:0] addrStepSecondTone = 9'h64;
  132. wire [35:0] firstToneSinCosValues;
  133. wire [35:0] secondToneSinCosValues;
  134. wire [17:0] sinFirstTone = firstToneSinCosValues [35:18]; //выделяем из вычитаных данных, значение Cos
  135. wire [17:0] cosFirstTone = firstToneSinCosValues [17:0]; //выделяем из вычитаных данных, значение Sin
  136. wire [17:0] sinSecondTone = secondToneSinCosValues [35:18]; //выделяем из вычитаных данных, значение Cos
  137. wire [17:0] cosSecondTone = secondToneSinCosValues [17:0]; //выделяем из вычитаных данных, значение Sin
  138. reg startMeasDspR;
  139. wire startMeasDspPos = (!startMeasDspR&StartMeasDsp_i);
  140. //================================================================================
  141. // ASSIGNMENTS
  142. // assign adcDataBus [ChNum-1] = 18'h0;
  143. // assign adcDataBus [ChNum-2] = 18'h0;
  144. // assign adcDataBus [ChNum-3] = 18'h0;
  145. // assign adcDataBus [ChNum-4] = {{2{Adc1ChT1Data_i[AdcDataWidth-1]}},Adc1ChT1Data_i,4'b0}; //T2
  146. assign adcDataBus [ChNum-1] = {{2{Adc1ChR1Data_i[AdcDataWidth-1]}},Adc1ChR1Data_i,4'b0};
  147. assign adcDataBus [ChNum-2] = {{2{Adc2ChR2Data_i[AdcDataWidth-1]}},Adc2ChR2Data_i,4'b0};
  148. assign adcDataBus [ChNum-3] = {{2{Adc2ChT2Data_i[AdcDataWidth-1]}},Adc2ChT2Data_i,4'b0};
  149. assign adcDataBus [ChNum-4] = {{2{Adc1ChT1Data_i[AdcDataWidth-1]}},Adc1ChT1Data_i,4'b0};
  150. assign adcDataBusExt [ChNum-1] = calAdcData [ChNum-1]+prngDataBus[ChNum-1];
  151. assign adcDataBusExt [ChNum-2] = calAdcData [ChNum-2]+prngDataBus[ChNum-2];
  152. assign adcDataBusExt [ChNum-3] = calAdcData [ChNum-3]+prngDataBus[ChNum-3];
  153. assign adcDataBusExt [ChNum-4] = calAdcData [ChNum-4]+prngDataBus[ChNum-4];
  154. assign gatedAdcDataBus [ChNum-1] = adc2ChT2DataGated;
  155. assign gatedAdcDataBus [ChNum-2] = adc2ChR2DataGated;
  156. assign gatedAdcDataBus [ChNum-3] = adc1ChR1DataGated;
  157. assign gatedAdcDataBus [ChNum-4] = adc1ChT1DataGated;
  158. assign Adc1ImT1Data_o = resultImBus [ChNum-4]; //T1->T2_F_I
  159. assign Adc1ReT1Data_o = resultReBus [ChNum-4]; //T1->T2_F_Q
  160. assign Adc1ImR1Data_o = resultImBus [ChNum-3];
  161. assign Adc1ReR1Data_o = resultReBus [ChNum-3];
  162. //adc2
  163. assign Adc2ImR2Data_o = resultImBus [ChNum-1];
  164. assign Adc2ReR2Data_o = resultReBus [ChNum-1];
  165. assign Adc2ImT2Data_o = resultImBus [ChNum-2]; //T1->R2_S_I
  166. assign Adc2ReT2Data_o = resultReBus [ChNum-2]; //T1->R2_S_Q
  167. assign MeasDataRdy_o = &resultValBus;
  168. assign EndMeas_o = stopMeas;
  169. assign NcoCos_o = ncoSinSecondTone;
  170. assign NcoSin_o = ncoSinSecondTone;
  171. assign MeasWind_o = measWind;
  172. assign CalModeDone_o = &calDone;
  173. assign memAddrNextFirstTone = !memAddrNext_mFirstTone[9] ? memAddrNext_mFirstTone : memAddrNext_pFirstTone;
  174. assign memAddrNext_pFirstTone = memAddrFirstTone + addrStepFirstTone;
  175. assign memAddrNext_mFirstTone = memAddrFirstTone + addrStepFirstTone - MaxAddr;
  176. assign memAddrNextSecondTone = !memAddrNext_mSecondTone[9] ? memAddrNext_mSecondTone : memAddrNext_pSecondTone;
  177. assign memAddrNext_pSecondTone = memAddrSecondTone + addrStepSecondTone;
  178. assign memAddrNext_mSecondTone = memAddrSecondTone + addrStepSecondTone - MaxAddr;
  179. //================================================================================
  180. // INSTANTIATIONS
  181. //----------------------------------------------
  182. //Module generates event signals for measurement
  183. always @(posedge Clk_i) begin
  184. if (!Rst_i) begin
  185. startMeasDspR <= StartMeasDsp_i;
  186. if (!StartMeas_i) begin
  187. measCtrlReg <= MeasCtrl_i;
  188. ifFtwLReg <= IfFtwL_i;
  189. ifFtwHReg <= IfFtwH_i;
  190. filterCorrCoefLReg <= FilterCorrCoefL_i;
  191. filterCorrCoefHReg <= FilterCorrCoefH_i;
  192. measNumReg <= MeasNum_i;
  193. windPointsNumReg <= windPointsNum;
  194. end
  195. end else begin
  196. measCtrlReg <= 0;
  197. ifFtwLReg <= 0;
  198. ifFtwHReg <= 0;
  199. filterCorrCoefLReg <= 0;
  200. filterCorrCoefHReg <= 0;
  201. measNumReg <= 0;
  202. windPointsNumReg <= 0;
  203. startMeasDspR <= 0;
  204. end
  205. end
  206. MeasCtrlModule
  207. #(
  208. .WindPNumWidth (WindPNumWidth)
  209. )
  210. MeasCtrlModule
  211. (
  212. .Clk_i (Clk_i),
  213. .Rst_i (Rst_i),
  214. .OscWind_o (OscWind_o),
  215. .FilterCmd_i (measCtrlReg[15-:8]),
  216. .MeasNum_i (measNumReg),
  217. .StartMeas_i (StartMeas_i),
  218. .StartMeasDsp_i (StartMeasDsp_i),
  219. .Mode_i (measCtrlReg[0]),
  220. .OscDataRdFlag_i (OscDataRdFlag_i),
  221. .WindPointsNum_i (windPointsNumReg),
  222. .WindPhInc_i (windPhInc),
  223. .WindPhIncStart_i (winPhIncStart),
  224. .WindArg_o (windArg),
  225. .StartFpConv_o (StartFpConv),
  226. .MeasWind_o (measWind),
  227. .MeasWindDel_o (measWindDelayed),
  228. .StopMeas_o (stopMeas),
  229. .MeasEnd_o (MeasEnd_o),
  230. .WinCtrl_o (winCtrl),
  231. .TukeyCtrl_o (tukeyCtrl),
  232. .SampleStrobeGenRst_o (SampleStrobeGenRst_o)
  233. );
  234. //----------------------------------------------
  235. //Module selects settings for current window
  236. WinParameters
  237. #(
  238. .WindPhIncWidth (WindNcoPhIncWidth),
  239. .WindNormCoefWidth (WindNormCoefWidth),
  240. .WindPNumWidth (WindPNumWidth),
  241. .BandCmdWidth (BandCmdWidth)
  242. )
  243. WinParameters
  244. (
  245. .Clk_i (Clk_i),
  246. .Rst_i (Rst_i),
  247. .FilterCmd_i (measCtrlReg[15-:8]),
  248. .WinPhInc_o (windPhInc),
  249. .WinPhIncStart_o (winPhIncStart),
  250. .WinNormCoef_o (windNormCoef),
  251. .WinPointsNum_o (windPointsNum),
  252. .AverageNoiseLvl_o (averageNoizeLvl)
  253. );
  254. //----------------------------------------------
  255. //Module generates win samples
  256. Win_calc WinCalcInst
  257. (
  258. .clk_i (Clk_i),
  259. .wind_clk (WindCalcClk_i),
  260. .filterCmd_i (measCtrlReg[15-:8]),
  261. .reset_i (Rst_i),
  262. .WinCtrl_i (winCtrl),
  263. .TukeyCtrl_i (tukeyCtrl),
  264. .MeasWind_i (measWind),
  265. .win_value_i (windArg),
  266. .win_type_i (measCtrlReg[2:0]),
  267. .win_o (wind)
  268. );
  269. //----------------------------------------------
  270. //Module generates Sin and Cos for measurement
  271. CordicNco
  272. #(
  273. .ODatWidth (NcoWidth),
  274. .PhIncWidth (WindNcoPhIncWidth),
  275. .IterNum (15),
  276. .EnSinN (0)
  277. )
  278. ncoFirstTone
  279. (
  280. .Clk_i (Clk_i),
  281. .Rst_i (Rst_i|NcoRst_i),
  282. // .Rst_i (Rst_i|startMeasDspPos),
  283. .Val_i (1'b1),
  284. // .PhaseInc_i ({ifFtwHReg[0+:WindNcoPhIncWidth-CmdDataRegWith],ifFtwLReg}),
  285. // .PhaseInc_i (32'h40000000),
  286. .PhaseInc_i (32'h33333333),
  287. .WindVal_i (1'b1),
  288. .WinType_i (),
  289. .Wind_o (),
  290. .Sin_o (ncoSinFirstTone),
  291. .Cos_o (ncoCosFirstTone),
  292. .Val_o ()
  293. );
  294. CordicNco
  295. #(
  296. .ODatWidth (NcoWidth),
  297. .PhIncWidth (WindNcoPhIncWidth),
  298. .IterNum (15),
  299. .EnSinN (0)
  300. )
  301. ncoSecondTone
  302. (
  303. .Clk_i (Clk_i),
  304. .Rst_i (Rst_i|NcoRst_i),
  305. // .Rst_i (Rst_i|startMeasDspPos),
  306. .Val_i (1'b1),
  307. // .PhaseInc_i ({ifFtwHReg[0+:WindNcoPhIncWidth-CmdDataRegWith],ifFtwLReg}),
  308. // .PhaseInc_i (32'h31eb851e),
  309. // .PhaseInc_i (32'h33333333),
  310. .PhaseInc_i (32'h40000000),
  311. .WindVal_i (1'b1),
  312. .WinType_i (),
  313. .Wind_o (),
  314. .Sin_o (ncoSinSecondTone),
  315. .Cos_o (ncoCosSecondTone),
  316. .Val_o ()
  317. );
  318. always @(posedge Clk_i) begin
  319. if (!Rst_i) begin
  320. memAddrFirstTone <= memAddrNextFirstTone;
  321. end else begin
  322. memAddrFirstTone <= 9'b0;
  323. end
  324. end
  325. always @(posedge Clk_i) begin
  326. if (!Rst_i) begin
  327. memAddrSecondTone <= memAddrNextSecondTone;
  328. end else begin
  329. memAddrSecondTone <= 9'b0;
  330. end
  331. end
  332. // blk_mem_gen_0 sinCosMemFirstTone
  333. // (
  334. // .clka (Clk_i), // input wire clka
  335. // .addra (memAddrFirstTone), // input wire [8 : 0] addra
  336. // .douta (firstToneSinCosValues) // output wire [35 : 0] douta
  337. // );
  338. // blk_mem_gen_0 sinCosMemSecondTone
  339. // (
  340. // .clka (Clk_i), // input wire clka
  341. // .addra (memAddrSecondTone), // input wire [8 : 0] addra
  342. // .douta (secondToneSinCosValues) // output wire [35 : 0] douta
  343. // );
  344. ComplPrng
  345. #(
  346. .DataPrngWidth (8),
  347. .InDataWidth (CorrAdcDataWidth),
  348. .OutDataWidth (CorrAdcDataWidth)
  349. )
  350. ComplPrngAdderInst
  351. (
  352. .Clk_i (Clk_i),
  353. .Rst_i (Rst_i),
  354. .PrngData_o (prngData)
  355. );
  356. always @(posedge Clk_i) begin
  357. prngDataBus[0] <= prngData;
  358. for(i=1; i<4; i=i+1) begin
  359. prngDataBus [i]<=prngDataBus[i-1];
  360. end
  361. end
  362. //------------------------------------------------
  363. //Generating needed amount of calculating channels
  364. generate
  365. for (g=0; g<ChNum-2; g=g+1) begin :DspChannel
  366. AdcCalibration
  367. #(
  368. .AccNum (2097152),
  369. .AdcDataWidth (CorrAdcDataWidth)
  370. )
  371. AdcCalibrationInst
  372. (
  373. .Clk_i (Clk_i),
  374. .Rst_i (Rst_i),
  375. .CalModeEn_i (CalModeEn_i),
  376. .AdcData_i (adcDataBus[g]),
  377. .CalDone_o (calDone[g]),
  378. .CalibratedAdcData_o (calAdcData[g])
  379. );
  380. DspPipeline
  381. #(
  382. .AdcDataWidth (AdcDataWidth),
  383. .AccWidth (AccWidth),
  384. .WindWidth (WindWidth),
  385. .NcoWidth (NcoWidth),
  386. .ResultWidth (ResultWidth),
  387. .WindCorrCoefWidth (WindCorrCoefWidth),
  388. .WindNormCoefWidth (WindNormCoefWidth),
  389. .IntermediateWidth (IntermediateWidth)
  390. )
  391. DspFirstTone
  392. (
  393. .Clk_i (Clk_i),
  394. .Rst_i (Rst_i),
  395. .Val_i (measWind),
  396. .StartFpConv_i (StartFpConv),
  397. .FilterCorrCoef_i ({filterCorrCoefHReg[0+:WindNcoPhIncWidth-CmdDataRegWith],filterCorrCoefLReg}),
  398. .AverageNoizeLvl_i (averageNoizeLvl),
  399. .AdcData_i (gatedAdcDataBus[g]),
  400. .Wind_i (wind),
  401. .NcoSin_i (ncoSinFirstTone),
  402. .NcoCos_i (ncoCosFirstTone),
  403. // .NcoSin_i (sinFirstTone),
  404. // .NcoCos_i (cosFirstTone),
  405. .NormCoef_i (windNormCoef),
  406. .CorrResultIm_o (resultImBus[g]),
  407. .CorrResultRe_o (resultReBus[g]),
  408. .CorrResultVal_o (resultValBus[g])
  409. );
  410. DspPipeline
  411. #(
  412. .AdcDataWidth (AdcDataWidth),
  413. .AccWidth (AccWidth),
  414. .WindWidth (WindWidth),
  415. .NcoWidth (NcoWidth),
  416. .ResultWidth (ResultWidth),
  417. .WindCorrCoefWidth (WindCorrCoefWidth),
  418. .WindNormCoefWidth (WindNormCoefWidth),
  419. .IntermediateWidth (IntermediateWidth)
  420. )
  421. DspSecondTone
  422. (
  423. .Clk_i (Clk_i),
  424. .Rst_i (Rst_i),
  425. .Val_i (measWind),
  426. .StartFpConv_i (StartFpConv),
  427. .FilterCorrCoef_i ({filterCorrCoefHReg[0+:WindNcoPhIncWidth-CmdDataRegWith],filterCorrCoefLReg}),
  428. .AverageNoizeLvl_i (averageNoizeLvl),
  429. .AdcData_i (gatedAdcDataBus[g]),
  430. .Wind_i (wind),
  431. .NcoSin_i (ncoSinSecondTone),
  432. .NcoCos_i (ncoCosSecondTone),
  433. // .NcoSin_i (sinSecondTone),
  434. // .NcoCos_i (cosSecondTone),
  435. .NormCoef_i (windNormCoef),
  436. .CorrResultIm_o (resultImBus[g+2]),
  437. .CorrResultRe_o (resultReBus[g+2]),
  438. .CorrResultVal_o (resultValBus[g+2])
  439. );
  440. end
  441. endgenerate
  442. endmodule