DspInterface.v 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. `timescale 1ns / 1ps
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // company:
  4. // engineer:
  5. //
  6. // create date: 16:37:06 07/11/2019
  7. // design name:
  8. // module name: dsp_linkport_interface
  9. // project name:
  10. // target devices:
  11. // tool versions:
  12. // description:
  13. //
  14. // dependencies:
  15. //
  16. // revision:
  17. // revision 0.01 - file created
  18. // additional comments:
  19. //
  20. //////////////////////////////////////////////////////////////////////////////////
  21. module DspInterface
  22. #(
  23. parameter AdcDataWidth = 14,
  24. parameter ExtAdcDataWidth = 16,
  25. parameter ODataWidth = 16,
  26. parameter ResultWidth = 40,
  27. parameter ChNum = 16,
  28. parameter CmdRegWidth = 32,
  29. parameter CmdDataRegWith = 24,
  30. parameter HeaderWidth = 7,
  31. parameter DataCntWidth = 5,
  32. parameter CmdWidth = 3
  33. )
  34. (
  35. input Clk_i,
  36. input Rst_i,
  37. input OscWind_i,
  38. input StartMeasDsp_i,
  39. input DspReadyForRx_i,
  40. input [31:0] MeasNum_i,
  41. input Mosi_i,
  42. input Sck_i,
  43. input Ss_i,
  44. input Mode_i,
  45. input [CmdWidth-2:0] PortSel_i,
  46. input [CmdWidth-1:0] DecimFactor_i,
  47. input [CmdRegWidth-9:0] IfFtwL_i,
  48. input [CmdRegWidth-9:0] IfFtwH_i,
  49. output OscDataRdFlag_o,
  50. input [AdcDataWidth-1:0] Adc1ChT1Data_i,
  51. input [AdcDataWidth-1:0] Adc1ChR1Data_i,
  52. input [AdcDataWidth-1:0] Adc2ChR2Data_i,
  53. input [AdcDataWidth-1:0] Adc2ChT2Data_i,
  54. output Mosi_o,
  55. output Sck_o,
  56. output Ss0_o,
  57. output Ss1_o,
  58. input Miso_i,
  59. output Miso_o,
  60. output [CmdRegWidth-1:0] CmdDataReg_o,
  61. output CmdDataVal_o,
  62. input [CmdDataRegWith-1:0] AnsReg_i,
  63. output [HeaderWidth-1:0] AnsAddr_o,
  64. output LpOutFs_o,
  65. output LpOutClk_o,
  66. output [ODataWidth-1:0] LpOutData_o,
  67. input [ResultWidth-1:0] Adc1T1ImResult_i, //T1_FIRST_IM->T2_I_F
  68. input [ResultWidth-1:0] Adc1T1ReResult_i, //T1_FIRST_RE->T2_Q_F
  69. input [ResultWidth-1:0] Adc1R1ImResult_i,
  70. input [ResultWidth-1:0] Adc1R1ReResult_i,
  71. input [ResultWidth-1:0] Adc2R2ImResult_i,
  72. input [ResultWidth-1:0] Adc2R2ReResult_i,
  73. input [ResultWidth-1:0] Adc2T2ImResult_i, //T1_SECOND_IM->T2_I_S
  74. input [ResultWidth-1:0] Adc2T2ReResult_i, //T1_SECOND_RE->T2_Q_S
  75. input [ChNum-1:0] ServiseRegData_i,
  76. input LpOutStart_i
  77. );
  78. //================================================================================
  79. // REG/WIRE
  80. //================================================================================
  81. wire [ResultWidth*(ChNum*2)-1:0] measDataBus;
  82. wire [ResultWidth*(ChNum*2)-1:0] fftDataBus;
  83. wire [ResultWidth*(ChNum*2)-1:0] bypassDataBus;
  84. reg [ResultWidth*(ChNum*2)-1:0] dataForFifo;
  85. reg dataForFifoVal;
  86. wire fftDataBusVal;
  87. wire bypassDataBusVal;
  88. wire [ResultWidth*(ChNum*2)-1:0] measDataBusTx;
  89. wire measDataValTx;
  90. wire ppiBusy;
  91. reg signed [15:0] adc1ChT1DataExt;
  92. reg signed [15:0] adc1ChR1DataExt;
  93. reg signed [15:0] adc2ChR2DataExt;
  94. reg signed [15:0] adc2ChT2DataExt;
  95. reg signed [AdcDataWidth-1:0] currDataChannel;
  96. wire signed [AdcDataWidth-1:0] testData;
  97. wire signed [15:0] filteredDecimDataI;
  98. wire signed [15:0] filteredDecimDataQ;
  99. wire filteredDecimDataVal;
  100. reg startMeasDspReg;
  101. //================================================================================
  102. // ASSIGNMENTS
  103. //================================================================================
  104. assign startMeasDspPos = (!startMeasDspReg&StartMeasDsp_i);
  105. assign measDataBus [(ResultWidth*(ChNum*2-7))-1-:ResultWidth] = (startMeasDspPos)?32'd0:Adc1T1ImResult_i;
  106. assign measDataBus [(ResultWidth*(ChNum*2-6))-1-:ResultWidth] = (startMeasDspPos)?32'd0:Adc1T1ReResult_i;
  107. assign measDataBus [(ResultWidth*(ChNum*2-5))-1-:ResultWidth] = (startMeasDspPos)?32'd0:Adc1R1ImResult_i;
  108. assign measDataBus [(ResultWidth*(ChNum*2-4))-1-:ResultWidth] = (startMeasDspPos)?32'd0:Adc1R1ReResult_i;
  109. assign measDataBus [(ResultWidth*(ChNum*2-3))-1-:ResultWidth] = (startMeasDspPos)?32'd0:Adc2T2ImResult_i;
  110. assign measDataBus [(ResultWidth*(ChNum*2-2))-1-:ResultWidth] = (startMeasDspPos)?32'd0:Adc2T2ReResult_i;
  111. assign measDataBus [(ResultWidth*(ChNum*2-1))-1-:ResultWidth] = (startMeasDspPos)?32'd0:Adc2R2ImResult_i;
  112. assign measDataBus [(ResultWidth*(ChNum*2-0))-1-:ResultWidth] = (startMeasDspPos)?32'd0:Adc2R2ReResult_i;
  113. // assign measDataBus [(ResultWidth*(ChNum*2-7))-1-:ResultWidth] = 32'h4000_0000; //2 in float
  114. // assign measDataBus [(ResultWidth*(ChNum*2-6))-1-:ResultWidth] = 32'h4040_0000; //3 in float
  115. // assign measDataBus [(ResultWidth*(ChNum*2-5))-1-:ResultWidth] = 32'h4080_0000; //4 in float
  116. // assign measDataBus [(ResultWidth*(ChNum*2-4))-1-:ResultWidth] = 32'h4110_0000; //9 in float
  117. // assign measDataBus [(ResultWidth*(ChNum*2-3))-1-:ResultWidth] = 32'h3f80_0000; //1 in float
  118. // assign measDataBus [(ResultWidth*(ChNum*2-2))-1-:ResultWidth] = 32'h40c0_0000; //6 in float
  119. // assign measDataBus [(ResultWidth*(ChNum*2-1))-1-:ResultWidth] = 32'h40a0_0000; //5 in float
  120. // assign measDataBus [(ResultWidth*(ChNum*2-0))-1-:ResultWidth] = 32'h4000_0000; //2 in float
  121. // assign measDataBus [(ResultWidth*(ChNum*2-7))-1-:ResultWidth] = 32'h4000_0000; //2 in float
  122. // assign measDataBus [(ResultWidth*(ChNum*2-6))-1-:ResultWidth] = 32'h4040_0000; //3 in float
  123. // assign measDataBus [(ResultWidth*(ChNum*2-5))-1-:ResultWidth] = 32'h0; //4 in float
  124. // assign measDataBus [(ResultWidth*(ChNum*2-4))-1-:ResultWidth] = 32'h0; //9 in float
  125. // assign measDataBus [(ResultWidth*(ChNum*2-3))-1-:ResultWidth] = 32'h4000_0000; //2 in float
  126. // assign measDataBus [(ResultWidth*(ChNum*2-2))-1-:ResultWidth] = 32'h4040_0000; //3 in float
  127. // assign measDataBus [(ResultWidth*(ChNum*2-1))-1-:ResultWidth] = 32'h0; //5 in float
  128. // assign measDataBus [(ResultWidth*(ChNum*2-0))-1-:ResultWidth] = 32'h0; //2 in float
  129. assign OscDataRdFlag_o = measDataValTx;
  130. //================================================================================
  131. // CODING
  132. //================================================================================
  133. reg oscWindR;
  134. reg [15:0] testPatternData;
  135. wire oscWindNeg = (!OscWind_i&oscWindR);
  136. always @(posedge Clk_i) begin
  137. if (!Rst_i) begin
  138. oscWindR <= OscWind_i;
  139. startMeasDspReg <= StartMeasDsp_i;
  140. end else begin
  141. oscWindR <= 0;
  142. startMeasDspReg <= 0;
  143. end
  144. end
  145. always @(posedge Clk_i) begin
  146. if (!Rst_i) begin
  147. if (oscWindNeg) begin
  148. testPatternData <= ~testPatternData;
  149. end
  150. end else begin
  151. testPatternData <= 16'h1fff;
  152. end
  153. end
  154. always @(posedge Clk_i) begin
  155. if (!Rst_i) begin
  156. case(PortSel_i)
  157. 0: begin
  158. // currDataChannel <= testPatternData;
  159. currDataChannel <= Adc1ChT1Data_i;
  160. end
  161. 1: begin
  162. currDataChannel <= Adc1ChR1Data_i;
  163. end
  164. 2: begin
  165. currDataChannel <= Adc2ChT2Data_i;
  166. end
  167. 3: begin
  168. currDataChannel <= Adc2ChR2Data_i;
  169. end
  170. endcase
  171. end else begin
  172. currDataChannel <= 0;
  173. end
  174. end
  175. SlaveSpi
  176. #(
  177. .CmdRegWidth (CmdRegWidth),
  178. .DataCntWidth (DataCntWidth),
  179. .HeaderWidth (HeaderWidth)
  180. )
  181. DspSlaveSpi
  182. (
  183. .Clk_i (Clk_i),
  184. .Rst_i (Rst_i),
  185. .Data_o (CmdDataReg_o),
  186. .Val_o (CmdDataVal_o),
  187. .Mosi_i (Mosi_i),
  188. .Sck_i (Sck_i),
  189. .Ss_i (Ss_i),
  190. .Mosi_o (Mosi_o),
  191. .Sck_o (Sck_o),
  192. .Ss0_o (Ss0_o),
  193. .Ss1_o (Ss1_o),
  194. .AnsAddr_o (AnsAddr_o),
  195. .AnsReg_i (AnsReg_i),
  196. .Miso_i (Miso_i),
  197. .Miso_o (Miso_o)
  198. );
  199. // DecimFilterWrapper DecimFilter
  200. // (
  201. // .Clk_i (Clk_i),
  202. // .Rst_i (Rst_i),
  203. // .OscWind_i (OscWind_i),
  204. // .DecimFactor_i (DecimFactor_i),
  205. // .IfFtwL_i (IfFtwL_i),
  206. // .IfFtwH_i (IfFtwH_i),
  207. // .AdcData_i (currDataChannel),
  208. // .TestData_o (testData),
  209. // .FilteredAdcDataI_o (filteredDecimDataI),
  210. // .FilteredAdcDataQ_o (filteredDecimDataQ),
  211. // .FilteredDataVal_o (filteredDecimDataVal)
  212. // );
  213. // FftDataFormer FftDataFormerInst
  214. // (
  215. // .Clk_i (Clk_i),
  216. // .Rst_i (Rst_i),
  217. // .OscWind_i (OscWind_i),
  218. // .MeasNum_i (MeasNum_i),
  219. // .AdcData_i ({filteredDecimDataI,filteredDecimDataQ}),
  220. // .AdcData_i ({testPatternData,testPatternData}),
  221. // .AdcDataVal_i (filteredDecimDataVal),
  222. // .OscDataBus_o (fftDataBus),
  223. // .OscDataBusVal_o (fftDataBusVal)
  224. // );
  225. // OscDataFormer BypassDataFormer
  226. // (
  227. // .Clk_i (Clk_i),
  228. // .Rst_i (Rst_i),
  229. // .OscWind_i (OscWind_i),
  230. // .MeasNum_i (MeasNum_i),
  231. // .AdcData_i (currDataChannel),
  232. // .OscDataBus_o (bypassDataBus),
  233. // .OscDataBusVal_o (bypassDataBusVal)
  234. // );
  235. // always @(posedge Clk_i) begin
  236. // if (!Rst_i) begin
  237. // if (Mode_i) begin
  238. // if (DecimFactor_i == 0) begin
  239. // dataForFifo <= bypassDataBus;
  240. // dataForFifoVal <= bypassDataBusVal;
  241. // end else begin
  242. // dataForFifo <= fftDataBus;
  243. // dataForFifoVal <= fftDataBusVal;
  244. // end
  245. // end else begin
  246. // dataForFifo <= measDataBus;
  247. // dataForFifoVal <= LpOutStart_i;
  248. // end
  249. // end else begin
  250. // dataForFifo <= 0;
  251. // dataForFifoVal <= 0;
  252. // end
  253. // end
  254. MeasDataFifoWrapper
  255. #(
  256. .DataWidth (ResultWidth),
  257. .ChNum (ChNum)
  258. )
  259. MeasDataFifoInst
  260. (
  261. .Clk_i (Clk_i),
  262. .Rst_i (Rst_i|startMeasDspPos),
  263. .PpiBusy_i (ppiBusy),
  264. .MeasNum_i (MeasNum_i),
  265. .StartMeasDsp_i (StartMeasDsp_i),
  266. .DspReadyForRx_i(DspReadyForRx_i),
  267. .MeasDataBus_i (measDataBus),
  268. // .MeasDataBus_i (dataForFifo),
  269. .MeasDataVal_i (LpOutStart_i),
  270. // .MeasDataVal_i (dataForFifoVal),
  271. .MeasDataBus_o (measDataBusTx),
  272. .MeasDataVal_o (measDataValTx)
  273. );
  274. DspPpiOut
  275. #(
  276. .ODataWidth (ODataWidth),
  277. .ResultWidth (ResultWidth),
  278. .ChNum (ChNum)
  279. )
  280. MeasDataPpiOut
  281. (
  282. .Rst_i (Rst_i|startMeasDspPos),
  283. .Clk_i (Clk_i),
  284. .MeasDataBus_i (measDataBusTx),
  285. .ServiseRegData_i (ServiseRegData_i),
  286. .PpiBusy_o (ppiBusy),
  287. .LpOutStart_i (measDataValTx),
  288. .LpOutClk_o (LpOutClk_o),
  289. .LpOutFs_o (LpOutFs_o),
  290. .LpOutData_o (LpOutData_o)
  291. );
  292. endmodule