S5443TopSpectrumTb.v 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483
  1. `timescale 1ns / 1ps
  2. //=============================================================================================================
  3. // Тестовая конфигурация:
  4. //
  5. // Режим измерения "Точка в импульсе".
  6. // Количество измерений = 1.
  7. // Выбраный фильтр = 2МГц.
  8. //
  9. // PG1 -> Reference Sequense Generator. | Шаблон 1 имп.
  10. // PG2 -> модулятор. | Шаблон 1 имп.
  11. // PG3 -> Sample Strobe Generator. | Шаблон 1 имп.
  12. // PG4 -> Gating Generator. | Шаблон 1 имп.
  13. //
  14. // Настройки мультиплексоров генераторов:
  15. // PG1MUX_OUT -> INT_TRIG.
  16. // PG2MUX_OUT -> PG1. Для всех генераторов кроме PG1 сигналом начала работы является выход PG1.
  17. // PG3MUX_OUT -> PG1.
  18. // PG4MUX_OUT -> PG1.
  19. // PG5MUX_OUT -> PG1.
  20. // PG6MUX_OUT -> PG1.
  21. // PG7MUX_OUT -> PG1.
  22. //
  23. // Настройки остальных мультиплексоров:
  24. // MODMUX_OUT -> PG2.
  25. // GATINGMUX_OUT -> PG4.
  26. // SAMPLSTROBEMUX_OUT -> PG3.
  27. // EXTSTARTMUX -> DSPSTART.
  28. //=============================================================================================================
  29. module S5443TopSpectrumTb;
  30. localparam [4:0] EXTTRIGMUXCMD = 5'd15;
  31. localparam [4:0] DSPTRIGINCMD = 5'h8;
  32. localparam [4:0] MUXSLOWMODCMD = 5'd1;
  33. localparam [4:0] MUXFASTMODCMD = 5'd1;
  34. localparam [4:0] GATINGMUXCMD = 5'd2;
  35. localparam [4:0] SMPLSTRBMUXCMD = 5'd3;
  36. localparam [1:0] CURRADCCHANNEL = 2'b0;
  37. //COMMANDS FOR REG_MAP
  38. parameter [31:0] MeasCmdBypass = {8'h11,8'h0,8'h63,7'h1,1'h1};
  39. // parameter [31:0] MeasCmdFft = {8'h11,8'h0,8'h63,7'h1,1'b1};
  40. parameter [31:0] AdcCtrl = {8'h12,24'h2};
  41. parameter [31:0] SensCtrlCmd = {1'b0,21'h0,CURRADCCHANNEL,4'h0,4'b1};
  42. parameter [31:0] DitherCmd = {8'h0E,8'd9,4'h0,4'h1,4'd11,4'h3};
  43. parameter [31:0] IfFtwH = {8'h15,16'h0,8'h40};
  44. parameter [31:0] IfFtwL = {8'h16,24'h000000};
  45. parameter [31:0] FilterCorrCmdH = {8'h17,24'hD70A3D};
  46. parameter [31:0] FilterCorrCmdL = {8'h18,24'hD70A3D};
  47. parameter [31:0] MeasNum0RegCmd = {8'h58,24'd10};
  48. parameter [31:0] MeasNum1RegCmd = {8'h59,MUXSLOWMODCMD,MUXFASTMODCMD,DSPTRIGINCMD,25'd0};
  49. //===========================================================================================
  50. reg Clk41;
  51. reg Clk50;
  52. reg Clk70;
  53. reg [31:0] tb_cnt=4'd0;
  54. reg rst;
  55. reg mosi_i = 1'b0;
  56. reg Miso_i = 1'b0;
  57. reg ss_i;
  58. reg clk_i = 1'b0;
  59. reg [31:0] DspSpiData;
  60. reg startCalcCmdReg;
  61. wire [17:0] cos_value;
  62. wire [17:0] sin_value;
  63. wire ExtDspTrigPos0 = (tb_cnt >= 180 && tb_cnt <= 181)? 1'b1:1'b0;
  64. wire ExtDspTrigNeg0 = (tb_cnt >= 180 && tb_cnt <= 181)? 1'b0:1'b1;
  65. wire ExtTrigger0 = ExtDspTrigNeg0;
  66. wire TrigFromDsp = (tb_cnt >= 1100 && tb_cnt <= 1101)? 1'b1:1'b0;
  67. wire endMeas;
  68. reg [31:0] cmdCnt;
  69. reg trig0;
  70. reg trig1;
  71. wire trig0R;
  72. wire trig1R;
  73. // wire [13:0] DelpaPulse = (tb_cnt>=4508 & tb_cnt <= 4518) ? 14'h1fff:14'h0;
  74. wire [13:0] DelpaPulse = (tb_cnt==4508) ? 14'h1fff:14'h0;
  75. assign trig0R = trig0;
  76. assign trig1R = trig1;
  77. wire signed [13:0] ncoSin1;
  78. wire signed [13:0] ncoCos1;
  79. wire signed [13:0] ncoSin2;
  80. wire signed [13:0] ncoCos2;
  81. wire signed [13:0] sinAdd = (ncoSin1>>>1)+(ncoSin2>>>1);
  82. //==========================================================================================
  83. //clocks gen
  84. always #10 Clk50 = ~Clk50;
  85. always #(14.285714285714/2) Clk70 = ~Clk70;
  86. always #10 clk_i = ~clk_i;
  87. always #(24.390243902439/2) Clk41 = ~Clk41;
  88. wire sck_i;
  89. //==========================================================================================
  90. initial begin
  91. Clk50 = 1'b1;
  92. Clk70 = 1'b1;
  93. rst = 1'b1;
  94. Clk41 = 1'b0;
  95. trig0 = 1'b0;
  96. trig1 = 1'b0;
  97. #100;
  98. rst = 1'b0;
  99. #400;
  100. Clk41 = 1'b0;
  101. end
  102. reg endMeasReg;
  103. always @(posedge Clk41) begin
  104. endMeasReg <= endMeas;
  105. end
  106. wire endMeasNeg = !endMeas&endMeasReg;
  107. always @(posedge Clk70) begin
  108. if (!rst) begin
  109. if (!endMeas) begin
  110. if (tb_cnt == 4505) begin
  111. startCalcCmdReg <= 1'b1;
  112. end
  113. end else begin
  114. startCalcCmdReg <= 1'b0;
  115. end
  116. end else begin
  117. startCalcCmdReg <= 1'b0;
  118. end
  119. end
  120. always @(negedge Clk41) begin
  121. if (!rst) begin
  122. tb_cnt <= tb_cnt+1;
  123. end else begin
  124. tb_cnt <= 0;
  125. end
  126. end
  127. wire Adc1DataDa0P;
  128. wire Adc1DataDa1P;
  129. reg [13:0] Data_i;
  130. real pi = 3.14159265358;
  131. real phase = 0;
  132. real phaseInc = 0.001;
  133. real signal;
  134. always @ (posedge Clk50)
  135. begin
  136. if (tb_cnt >= 4505)
  137. begin
  138. phase = phase + phaseInc;
  139. phaseInc <= phaseInc + 0.0005;
  140. signal = $sin(2*pi*phase);
  141. Data_i = 2**12 * signal;
  142. end
  143. else
  144. Data_i = 0;
  145. end
  146. wire [31:0] test = 32'h2351eb85;
  147. // wire [31:0] test = 32'h40000000;
  148. CordicNco
  149. #(
  150. .ODatWidth (14),
  151. .PhIncWidth (32),
  152. .IterNum (10),
  153. .EnSinN (1)
  154. )
  155. ncoInst1
  156. (
  157. .Clk_i (Clk50),
  158. .Rst_i (rst),
  159. .Val_i (1'b1),
  160. .PhaseInc_i (32'h51eb851),
  161. .WindVal_i (1'b1),
  162. .WinType_i (),
  163. .Wind_o (),
  164. .Sin_o (ncoSin1),
  165. .Cos_o (ncoCos1),
  166. .Val_o ()
  167. );
  168. CordicNco
  169. #(
  170. .ODatWidth (14),
  171. .PhIncWidth (32),
  172. .IterNum (10),
  173. .EnSinN (1)
  174. )
  175. ncoInst2
  176. (
  177. .Clk_i (Clk50),
  178. .Rst_i (rst),
  179. .Val_i (1'b1),
  180. .PhaseInc_i (32'h33333333),
  181. .WindVal_i (1'b1),
  182. .WinType_i (),
  183. .Wind_o (),
  184. .Sin_o (ncoSin2),
  185. .Cos_o (ncoCos2),
  186. .Val_o ()
  187. );
  188. CordicNco
  189. #( .ODatWidth (18),
  190. .PhIncWidth (32),
  191. .IterNum (10),
  192. .EnSinN (0))
  193. ncoInst
  194. (
  195. .Clk_i (Clk50),
  196. .Rst_i (rst),
  197. .Val_i (1'b1),
  198. .PhaseInc_i (test),
  199. .WindVal_i (1'b1),
  200. .WinType_i (),
  201. .Wind_o (),
  202. .Sin_o (sin_value),
  203. .Cos_o (cos_value),
  204. .Val_o ()
  205. );
  206. S5443Top MasterFpga
  207. (
  208. .Clk_i (Clk50),
  209. .Led_o (),
  210. //------------------------------------------
  211. .Adc1FclkP_i (),
  212. .Adc1FclkN_i (),
  213. .Adc1DataDa0P_i (Adc1DataDa0P),
  214. .Adc1DataDa0N_i (~Adc1DataDa0P),
  215. .Adc1DataDa1P_i (Adc1DataDa1P),
  216. .Adc1DataDa1N_i (~Adc1DataDa1P),
  217. .Adc1DataDb0P_i (Adc1DataDa0P),
  218. .Adc1DataDb0N_i (~Adc1DataDa0P),
  219. .Adc1DataDb1P_i (Adc1DataDa1P),
  220. .Adc1DataDb1N_i (~Adc1DataDa1P),
  221. //------------------------------------------
  222. .Adc2FclkP_i (),
  223. .Adc2FclkN_i (),
  224. .Adc2DataDa0P_i (1'b1),
  225. .Adc2DataDa0N_i (1'b0),
  226. .Adc2DataDa1P_i (1'b1),
  227. .Adc2DataDa1N_i (1'b0),
  228. .Adc2DataDb0P_i (1'b1),
  229. .Adc2DataDb0N_i (1'b0),
  230. .Adc2DataDb1P_i (1'b1),
  231. .Adc2DataDb1N_i (1'b0),
  232. //------------------------------------------
  233. .AdcInitMosi_o (),
  234. .AdcInitClk_o (),
  235. .Adc1InitCs_o (),
  236. .Adc2InitCs_o (),
  237. .AdcInitRst_o (),
  238. //------------------------------------------
  239. .Mosi_i (mosi_i),
  240. .Sck_i (~sck_i),
  241. .Ss_i (ss_i),
  242. .LpOutClk_o (),
  243. .LpOutFs_o (),
  244. .LpOutData_o (),
  245. //fpga-dsp signals
  246. .StartMeas_i (startCalcCmdReg),
  247. .StartMeasEvent_o (startMeasS),
  248. .EndMeas_o (endMeas),
  249. .TimersClk_o (),
  250. .Trig6to1_io (),
  251. .Trig6to1Dir_o (),
  252. .DspTrigOut_i (Clk41), //Trig from DSP
  253. .DspTrigIn_o (), //Trig To DSP
  254. .OverloadS_i (1'b0),
  255. .Overload_o (),
  256. .PortSel_o (),
  257. .PortSelDir_o (),
  258. //mod out line
  259. .Mod_o (),
  260. //gain lines
  261. .DspReadyForRx_i (1'b0),
  262. .DspReadyForRxToFpgaS_o (),
  263. .AmpEn_o (), // 0-adc1ChA 1-adc1ChB 2-adc2ChA 3-adc2ChB
  264. // .AdcData_i (sin_value[17-:14])
  265. // .AdcData_i (DelpaPulse)
  266. .AdcData_i (sinAdd)
  267. );
  268. parameter IDLE = 2'h0;
  269. parameter CMD = 2'h1;
  270. parameter TX = 2'h2;
  271. parameter PAUSE = 2'h3;
  272. reg [1:0] txCurrState;
  273. reg [1:0] txNextState;
  274. wire txWork = tb_cnt >= 23;
  275. // wire txStop = (cmdCnt >= 90) & (cmdCnt >= 70) & (cmdCnt >= 71);
  276. wire txStop = (cmdCnt >= 251);
  277. reg [6:0] txCnt;
  278. reg [3:0] pauseCnt;
  279. always @(posedge Clk41) begin
  280. if (!rst) begin
  281. if (txCurrState == CMD) begin
  282. if (!txStop) begin
  283. cmdCnt <= cmdCnt+1;
  284. end
  285. end
  286. end else begin
  287. cmdCnt <= 0;
  288. end
  289. end
  290. always @(posedge Clk41) begin
  291. if (!rst) begin
  292. if (txCurrState == TX) begin
  293. txCnt <= txCnt+1;
  294. end else begin
  295. txCnt <= 0;
  296. end
  297. end else begin
  298. txCnt <= 0;
  299. end
  300. end
  301. always @(posedge Clk41) begin
  302. if (!rst) begin
  303. if (txCurrState == PAUSE) begin
  304. pauseCnt <= pauseCnt+1;
  305. end else begin
  306. pauseCnt <= 0;
  307. end
  308. end else begin
  309. pauseCnt <= 0;
  310. end
  311. end
  312. always @(posedge Clk41) begin
  313. if (txCurrState == CMD) begin
  314. if (cmdCnt == 0) begin
  315. DspSpiData <= MeasCmdBypass;
  316. end else if (cmdCnt == 1) begin
  317. DspSpiData <= MeasNum0RegCmd;
  318. end else if (cmdCnt == 2) begin
  319. DspSpiData <= MeasNum1RegCmd;
  320. end
  321. end else if (txCurrState == TX) begin
  322. DspSpiData <= DspSpiData<<1;
  323. end
  324. end
  325. always @(posedge Clk41) begin
  326. if (txCurrState == TX) begin
  327. if (txCnt >= 7'd0) begin
  328. mosi_i <= DspSpiData[31];
  329. end else begin
  330. mosi_i <= 1'b1;
  331. end
  332. end else begin
  333. mosi_i <= 1'b1;
  334. end
  335. end
  336. always @(posedge Clk41) begin
  337. if (txCurrState == TX) begin
  338. ss_i <= 1'b0;
  339. end else begin
  340. ss_i <= 1'b1;
  341. end
  342. end
  343. assign sck_i = Clk41;
  344. always @(posedge Clk41) begin
  345. if (rst) begin
  346. txCurrState <= IDLE;
  347. end else begin
  348. txCurrState <= txNextState;
  349. end
  350. end
  351. always @(*) begin
  352. txNextState = IDLE;
  353. case(txCurrState)
  354. IDLE : begin
  355. if (txWork) begin
  356. txNextState = CMD;
  357. end else begin
  358. txNextState = IDLE;
  359. end
  360. end
  361. CMD : begin
  362. if (!txStop) begin
  363. txNextState = TX;
  364. end else begin
  365. txNextState = IDLE;
  366. end
  367. end
  368. TX : begin
  369. if (txCnt==6'd31) begin
  370. txNextState = PAUSE;
  371. end else begin
  372. txNextState = TX;
  373. end
  374. end
  375. PAUSE : begin
  376. if (pauseCnt==4'd10) begin
  377. txNextState = CMD;
  378. end else begin
  379. txNextState = PAUSE;
  380. end
  381. end
  382. endcase
  383. end
  384. endmodule