S5443TopTb.v 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517
  1. `timescale 1ns / 1ps
  2. module S5443TopTb;
  3. //=================================================================================================================================================================================================================
  4. //COMMANDS FOR REG_MAP
  5. parameter [31:0] SensAutoPattern = 32'h1;
  6. parameter [31:0] SensLowThreshT1 = {8'h01,24'h3BD080};
  7. parameter [31:0] SensHighThreshT1 = {8'h02,24'h401640};
  8. parameter [31:0] SensLowThreshR1 = {8'h03,24'h3BD080};
  9. parameter [31:0] SensHighThreshR1 = {8'h04,24'h401640};
  10. parameter [31:0] SensLowThreshT2 = {8'h05,24'h3BD080};
  11. parameter [31:0] SensHighThreshT2 = {8'h06,24'h401640};
  12. parameter [31:0] SensLowThreshR2 = {8'h07,24'h3BD080};
  13. parameter [31:0] SensHighThreshR2 = {8'h08,24'h401640};
  14. parameter [31:0] OverloadCtrlCmd = {8'h89,24'h000000};
  15. parameter [31:0] OverloadThresh = {8'h0A,24'h000400};
  16. parameter [31:0] DitherCmd = {8'h0E,24'h100192};
  17. parameter [31:0] MeasCmd = {8'h11,8'h0,8'h62,8'h0};
  18. parameter [31:0] AdcCtrl = {8'h12,24'h0};
  19. //-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  20. parameter [31:0] DirectWrite0Cmd = {8'h13,24'h5};
  21. parameter [31:0] DirectWrite1Cmd = {8'h14,24'h5};
  22. parameter [31:0] NotDirectWriteCmd = {1'b0,7'h9,24'h5};
  23. parameter [31:0] DirectReadCmd = {1'b1,7'h11,24'h0};
  24. parameter [31:0] NotDirectReadCmd = {1'b1,7'h0,24'b1};
  25. parameter [31:0] DirectReadAns = {1'b0,7'h1b,24'h5};
  26. //-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  27. parameter [31:0] IfFtwH = {8'h15,16'h0,8'h23};
  28. parameter [31:0] IfFtwL = {8'h16,24'h51eb85};
  29. parameter [31:0] FilterCorrCmdH = {8'h17,24'hD70A3D};
  30. parameter [31:0] FilterCorrCmdL = {8'h18,24'hD70A3D};
  31. parameter [31:0] ExtPosTrig0Cmd = {8'h19,16'h32,8'h7}; //триггер приходит положительной полярности от внешнего устройства к DSP. Триггер к DSP всегда выдаётся как импульс положительной полярности.
  32. parameter [31:0] ExtPosTrig1Cmd = {8'h1a,16'h32,8'h6}; //триггер приходит положительной полярности от внешнего устройства к DSP. Триггер к DSP всегда выдаётся как импульс положительной полярности.
  33. parameter [31:0] ExtNegTrig0Cmd = {8'h19,16'h32,8'h5}; //триггер приходит отрицательной полярности от внешнего устройства к DSP. Триггер к DSP всегда выдаётся как импульс положительной полярности.
  34. parameter [31:0] ExtNegTrig1Cmd = {8'h1a,16'h32,8'h4}; //триггер приходит отрицательной полярности от внешнего устройства к DSP. Триггер к DSP всегда выдаётся как импульс положительной полярности.
  35. parameter [31:0] IntPosTrig0Cmd = {8'h19,16'h32,8'h3}; //триггер приходит от DSP к внешнему устройству
  36. parameter [31:0] IntPosTrig1Cmd = {8'h1a,16'h32,8'h3}; //триггер приходит от DSP к внешнему устройству
  37. parameter [31:0] IntNegTrig0Cmd = {8'h19,16'h32,8'h1}; //триггер приходит от DSP к внешнему устройству
  38. parameter [31:0] IntNegTrig1Cmd = {8'h1a,16'h32,8'h0}; //триггер приходит от DSP к внешнему устройству
  39. //-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  40. parameter [31:0] PulseMeasCtrlCmd = {8'h1b,16'h0,8'h11};
  41. parameter [31:0] Pg1Mode = {8'h1c,16'h0,8'h0};
  42. parameter [31:0] Pg1P123DelH = {8'h1c,16'h0,8'h0};
  43. parameter [31:0] Pg1P1DelL = {8'h1c,16'h0,8'h0};
  44. parameter [31:0] Pg2P1DelL = {8'h1c,16'h0,8'h0};
  45. parameter [31:0] Pg3P1DelL = {8'h1c,16'h0,8'h0};
  46. parameter [31:0] Pg1P123WidthH = {8'h1c,16'h0,8'h0};
  47. parameter [31:0] Pg1P1WidthL = {8'h1c,16'h0,8'h0};
  48. parameter [31:0] Pg1P2WidthL = {8'h1c,16'h0,8'h0};
  49. parameter [31:0] Pg1P3WidthL = {8'h1c,16'h0,8'h0};
  50. //=================================================================================================================================================================================================================
  51. reg Clk41;
  52. reg Clk82;
  53. reg Clk50;
  54. reg Fclk25;
  55. reg Dclk175;
  56. reg Clk350;
  57. reg Clk125;
  58. reg [31:0] tb_cnt=4'd0;
  59. reg rst;
  60. reg mosi_i = 1'b0;
  61. reg Miso_i = 1'b0;
  62. reg ss_i;
  63. reg clk_i = 1'b0;
  64. reg [31:0] DspSpiData;
  65. reg startCalcCmdReg;
  66. wire startCalcCmdRegO;
  67. wire [13:0] cos_value;
  68. wire [13:0] sin_value;
  69. wire ExtDspTrigPos0 = (tb_cnt >= 180 && tb_cnt <= 181)? 1'b1:1'b0;
  70. wire ExtDspTrigNeg0 = (tb_cnt >= 180 && tb_cnt <= 181)? 1'b0:1'b1;
  71. // wire ExtTrigger0 = (tb_cnt <= 150)? ExtDspTrigPos0:ExtDspTrigNeg0;
  72. wire ExtTrigger0 = ExtDspTrigNeg0;
  73. wire TrigFromDsp = (tb_cnt >= 1100 && tb_cnt <= 1101)? 1'b1:1'b0;
  74. //==========================================================================================
  75. //clocks gen
  76. always #10 Clk50 = ~Clk50;
  77. always #8 Clk125 = ~Clk125;
  78. always #20 Fclk25 = ~Fclk25;
  79. always #10 clk_i = ~clk_i;
  80. always #(24.390243902439/2) Clk41 = ~Clk41;
  81. reg Dclk175Reg;
  82. wire sck_i;
  83. //==========================================================================================
  84. initial begin
  85. Clk50 = 1'b1;
  86. Fclk25 = 1'b1;
  87. Clk125 = 1'b1;
  88. rst = 1'b1;
  89. Clk41 = 1'b0;
  90. startCalcCmdReg = 1'b0;
  91. #100;
  92. rst = 1'b0;
  93. #400;
  94. Clk41 = 1'b0;
  95. end
  96. reg endMeasReg;
  97. always @(posedge Clk41) begin
  98. endMeasReg <= endMeas;
  99. end
  100. wire endMeasNeg = !endMeas&endMeasReg;
  101. always @(posedge Clk41) begin
  102. if (tb_cnt == 1700) begin
  103. startCalcCmdReg <= 1'b1;
  104. end else if (endMeasNeg) begin
  105. startCalcCmdReg <= 1'b0;
  106. end
  107. end
  108. always @(negedge Clk41) begin
  109. if (!rst) begin
  110. tb_cnt <= tb_cnt+1;
  111. end else begin
  112. tb_cnt <= 0;
  113. end
  114. end
  115. reg startMeasSync;
  116. always @(posedge Clk41) begin
  117. startMeasSync <= startCalcCmdRegO;
  118. end
  119. wire Adc1DataDa0P;
  120. wire Adc1DataDa1P;
  121. wire [31:0] test = 32'h2351eb85;
  122. CordicNco
  123. #( .ODatWidth (14),
  124. .PhIncWidth (32),
  125. .IterNum (10),
  126. .EnSinN (0))
  127. ncoInst
  128. (
  129. .Clk_i (Clk50),
  130. .Rst_i (rst),
  131. .Val_i (1'b1),
  132. .PhaseInc_i (test>>1),
  133. .WindVal_i (1'b1),
  134. .WinType_i (),
  135. .Wind_o (),
  136. .Sin_o (sin_value),
  137. .Cos_o (cos_value),
  138. .Val_o ()
  139. );
  140. wire [13:0] TPSK1 = 14'h1;
  141. wire [13:0] TPSKN1 = 14'b11111111111111;
  142. wire [13:0] I = (tb_cnt >= 300 && tb_cnt <= 500)? TPSK1:TPSKN1;
  143. wire [13:0] Q = (tb_cnt >= 200 && tb_cnt <= 500)? TPSKN1:TPSK1;
  144. // ExtMult
  145. // #(
  146. // .FactorAWidth (14),
  147. // .FactorBWidth (14),
  148. // .OutputWidth (17)
  149. // )
  150. // Mixer
  151. // (
  152. // .Rst_i (rst),
  153. // .Clk_i (Clk50),
  154. // .Val_i (1'b1),
  155. // .FactorC_i (sin_value),
  156. // .FactorD_i (cos_value),
  157. // .FactorA_i (I),
  158. // .FactorB_i (Q),
  159. // .Result_o (),
  160. // .ResultVal_o()
  161. // );
  162. // IQModulatorWrapper IQModulatorInst
  163. // (
  164. // .Rst_i (rst),
  165. // .Clk_i (Clk125),
  166. // .Val_i (1'b1),
  167. // .Result_o ()
  168. // );
  169. S5443Top uut (
  170. .Clk_i (Clk50),
  171. .Led_o (),
  172. //------------------------------------------
  173. .Adc1FclkP_i (Fclk25),
  174. .Adc1FclkN_i (~Fclk25),
  175. .Adc1DataDa0P_i (Adc1DataDa0P),
  176. .Adc1DataDa0N_i (~Adc1DataDa0P),
  177. .Adc1DataDa1P_i (Adc1DataDa1P),
  178. .Adc1DataDa1N_i (~Adc1DataDa1P),
  179. .Adc1DataDb0P_i (Adc1DataDa0P),
  180. .Adc1DataDb0N_i (~Adc1DataDa0P),
  181. .Adc1DataDb1P_i (Adc1DataDa1P),
  182. .Adc1DataDb1N_i (~Adc1DataDa1P),
  183. //------------------------------------------
  184. .Adc2FclkP_i (Fclk25),
  185. .Adc2FclkN_i (~Fclk25),
  186. .Adc2DataDa0P_i (1'b1),
  187. .Adc2DataDa0N_i (1'b0),
  188. .Adc2DataDa1P_i (1'b1),
  189. .Adc2DataDa1N_i (1'b0),
  190. .Adc2DataDb0P_i (1'b1),
  191. .Adc2DataDb0N_i (1'b0),
  192. .Adc2DataDb1P_i (1'b1),
  193. .Adc2DataDb1N_i (1'b0),
  194. //------------------------------------------
  195. .AdcInitMosi_o (),
  196. .AdcInitClk_o (),
  197. .Adc1InitCs_o (),
  198. .Adc2InitCs_o (),
  199. .AdcInitRst_o (),
  200. //------------------------------------------
  201. .Mosi_i (mosi_i),
  202. .Sck_i (~sck_i),
  203. .Ss_i (ss_i),
  204. .LpOutClk_o (),
  205. .LpOutFs_o (),
  206. .LpOutData_o (),
  207. //fpga-dsp signals
  208. .StartMeas_i (startCalcCmdReg),
  209. .StartMeas_o (),
  210. .EndMeas_o (endMeas),
  211. .TimersClk_o (),
  212. //trigger's
  213. .TrigExtDev0_io (),
  214. .TrigExtDev0Dir_o (),
  215. .TrigExtDev1_io (),
  216. .TrigExtDev1Dir_o (),
  217. .TrigFromDsp_i (TrigFromDsp), //Trig from DSP
  218. .TrigToDsp_o (), //Trig To DSP
  219. //overload lines
  220. .OverloadS_i (1'b0),
  221. .Overload_o (),
  222. //gain lines
  223. .SensEnS_i (1'b0),
  224. .AmpEn_o (), // 0-adc1ChA 1-adc1ChB 2-adc2ChA 3-adc2ChB
  225. .AdcData_i (sin_value)
  226. );
  227. localparam IDLE = 2'h0;
  228. localparam CMD = 2'h1;
  229. localparam TX = 2'h2;
  230. localparam PAUSE = 2'h3;
  231. reg [1:0] txCurrState;
  232. reg [1:0] txNextState;
  233. wire txWork = tb_cnt >= 23;
  234. wire txStop = cmdCnt >= 23;
  235. reg [8:0] cmdCnt;
  236. reg [6:0] txCnt;
  237. reg [3:0] pauseCnt;
  238. always @(posedge Clk41) begin
  239. if (!rst) begin
  240. if (txCurrState == CMD) begin
  241. if (!txStop) begin
  242. cmdCnt <= cmdCnt+1;
  243. end
  244. end
  245. end else begin
  246. cmdCnt <= 0;
  247. end
  248. end
  249. always @(posedge Clk41) begin
  250. if (!rst) begin
  251. if (txCurrState == TX) begin
  252. txCnt <= txCnt+1;
  253. end else begin
  254. txCnt <= 0;
  255. end
  256. end else begin
  257. txCnt <= 0;
  258. end
  259. end
  260. always @(posedge Clk41) begin
  261. if (!rst) begin
  262. if (txCurrState == PAUSE) begin
  263. pauseCnt <= pauseCnt+1;
  264. end else begin
  265. pauseCnt <= 0;
  266. end
  267. end else begin
  268. pauseCnt <= 0;
  269. end
  270. end
  271. always @(posedge Clk41) begin
  272. if (txCurrState == CMD) begin
  273. if (cmdCnt == 0) begin
  274. DspSpiData <= SensAutoPattern;
  275. end else if (cmdCnt == 1) begin
  276. DspSpiData <= SensLowThreshT1;
  277. end else if (cmdCnt == 2) begin
  278. DspSpiData <= SensHighThreshT1;
  279. end else if (cmdCnt == 3) begin
  280. DspSpiData <= SensLowThreshR1;
  281. end else if (cmdCnt == 4) begin
  282. DspSpiData <= SensHighThreshR1;
  283. end else if (cmdCnt == 5) begin
  284. DspSpiData <= SensLowThreshT2;
  285. end else if (cmdCnt == 6) begin
  286. DspSpiData <= SensHighThreshT2;
  287. end else if (cmdCnt == 7) begin
  288. DspSpiData <= SensLowThreshR2;
  289. end else if (cmdCnt == 8) begin
  290. DspSpiData <= SensHighThreshR2;
  291. end else if (cmdCnt == 9) begin
  292. DspSpiData <= SensLowThreshR2;
  293. end else if (cmdCnt == 10) begin
  294. DspSpiData <= OverloadCtrlCmd;
  295. end else if (cmdCnt == 11) begin
  296. DspSpiData <= OverloadThresh;
  297. end else if (cmdCnt == 12) begin
  298. DspSpiData <= DitherCmd;
  299. end else if (cmdCnt == 13) begin
  300. DspSpiData <= MeasCmd;
  301. end else if (cmdCnt == 14) begin
  302. DspSpiData <= AdcCtrl;
  303. end else if (cmdCnt == 15) begin
  304. DspSpiData <= DirectWrite0Cmd;
  305. end else if (cmdCnt == 16) begin
  306. DspSpiData <= DirectWrite1Cmd;
  307. end else if (cmdCnt == 17) begin
  308. DspSpiData <= IfFtwH;
  309. end else if (cmdCnt == 18) begin
  310. DspSpiData <= IfFtwL;
  311. end else if (cmdCnt == 19) begin
  312. DspSpiData <= FilterCorrCmdH;
  313. end else if (cmdCnt == 20) begin
  314. DspSpiData <= FilterCorrCmdL;
  315. end else if (cmdCnt == 21) begin
  316. DspSpiData <= IntPosTrig0Cmd;
  317. end else if (cmdCnt == 22) begin
  318. DspSpiData <= IntPosTrig1Cmd;
  319. end else if (cmdCnt == 23) begin
  320. DspSpiData <= PulseMeasCtrlCmd;
  321. end else if (cmdCnt == 24) begin
  322. DspSpiData <= PNumHCmd;
  323. end else if (cmdCnt == 25) begin
  324. DspSpiData <= PNumLCmd;
  325. end else if (cmdCnt == 26) begin
  326. DspSpiData <= ModDelHCmd;
  327. end else if (cmdCnt == 27) begin
  328. DspSpiData <= ModDelLCmd;
  329. end else if (cmdCnt == 28) begin
  330. DspSpiData <= ModWidthHCmd;
  331. end else if (cmdCnt == 29) begin
  332. DspSpiData <= ModWidthLCmd;
  333. end else if (cmdCnt == 30) begin
  334. DspSpiData <= PGenDelHCmd;
  335. end else if (cmdCnt == 31) begin
  336. DspSpiData <= PGenDelLCmd;
  337. end else if (cmdCnt == 32) begin
  338. DspSpiData <= Trig0Timing1Cmd;
  339. end else if (cmdCnt == 33) begin
  340. DspSpiData <= Trig0Timing2Cmd;
  341. end else if (cmdCnt == 34) begin
  342. DspSpiData <= Trig1Timing1Cmd;
  343. end else if (cmdCnt == 35) begin
  344. DspSpiData <= Trig1Timing2Cmd;
  345. end
  346. end else if (txCurrState == TX) begin
  347. DspSpiData <= DspSpiData<<1;
  348. end
  349. end
  350. always @(posedge Clk41) begin
  351. if (txCurrState == TX) begin
  352. if (txCnt >= 7'd0) begin
  353. mosi_i <= DspSpiData[31];
  354. end else begin
  355. mosi_i <= 1'b1;
  356. end
  357. end else begin
  358. mosi_i <= 1'b1;
  359. end
  360. end
  361. always @(posedge Clk41) begin
  362. if (txCurrState == TX) begin
  363. ss_i <= 1'b0;
  364. end else begin
  365. ss_i <= 1'b1;
  366. end
  367. end
  368. assign sck_i = Clk41;
  369. always @(posedge Clk41) begin
  370. if (rst) begin
  371. txCurrState <= IDLE;
  372. end else begin
  373. txCurrState <= txNextState;
  374. end
  375. end
  376. always @(*) begin
  377. txNextState = IDLE;
  378. case(txCurrState)
  379. IDLE : begin
  380. if (txWork) begin
  381. txNextState = CMD;
  382. end else begin
  383. txNextState = IDLE;
  384. end
  385. end
  386. CMD : begin
  387. if (!txStop) begin
  388. txNextState = TX;
  389. end else begin
  390. txNextState = IDLE;
  391. end
  392. end
  393. TX : begin
  394. if (txCnt==6'd31) begin
  395. txNextState = PAUSE;
  396. end else begin
  397. txNextState = TX;
  398. end
  399. end
  400. PAUSE : begin
  401. if (pauseCnt==4'd10) begin
  402. txNextState = CMD;
  403. end else begin
  404. txNextState = PAUSE;
  405. end
  406. end
  407. endcase
  408. end
  409. endmodule