CPLD_Transmitter.v 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517
  1. `timescale 1ns / 1ps
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 2022/05/17 23:16:57
  7. // Design Name:
  8. // Module Name: CounterTest
  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 CPLD_Transmitter(
  22. Clk, BckIn, LrckIn, DataIn,
  23. BckOut, LrckOut, DataOut, StartFlag
  24. );
  25. input Clk, BckIn, LrckIn, DataIn;
  26. input StartFlag;
  27. output BckOut, LrckOut, DataOut;
  28. ///// In Part
  29. reg RegLrckIn = 0;
  30. reg RegDataIn = 0;
  31. reg DinWen = 0;
  32. reg DinWenDelay = 0;
  33. reg [19:0] DinStateCounter = 0;
  34. reg [1:0] DinState = 0;
  35. reg [5:0] DinInnerCounter = 0;
  36. ///// Out Part
  37. reg [1:0] BckOutCounter = 0;
  38. reg [5:0] LrckOutCounter = 0;
  39. reg FifoRen = 0;
  40. reg FifoRenPos = 0;
  41. reg DataOut = 0;
  42. reg [6:0] InnerInputCounter=0;
  43. reg [4:0] DoutReadCounter = 0;
  44. reg [1:0] ReadState = 0;
  45. reg [1:0] ReadStatePos = 0;
  46. reg [31:0] FifoShifter = 0;
  47. reg [19:0] FifiReadOutterCounter = 0;
  48. reg CaptureTrigState = 0;
  49. reg CaptureTrigStateOut = 0;
  50. // reg ReadStart = 0;
  51. wire [5:0] FifoWord;
  52. wire FifoEmp;
  53. wire FifoReadOut;
  54. wire [22:0] WireForTrig;
  55. assign BckOut = BckOutCounter[1];
  56. assign LrckOut = LrckOutCounter[5];
  57. assign WireForTrig = 23'b 10011011001000100100001 ;
  58. //系统常量
  59. parameter LrckCounter99 = (1006000 - 1);
  60. parameter LrckCounter98 = (1006000 - 2);
  61. parameter LrckCounter97 = (1006000 - 3);
  62. ///// In Part Logic
  63. always@(posedge BckIn)
  64. begin
  65. if(StartFlag == 1'b0)
  66. begin
  67. RegLrckIn <= 1'b0;
  68. RegDataIn <= 1'b0;
  69. end
  70. else
  71. begin
  72. RegLrckIn <= LrckIn;
  73. RegDataIn <= DataIn;
  74. end
  75. end
  76. always@(posedge BckIn)
  77. begin
  78. if(StartFlag == 1'b0)
  79. begin
  80. InnerInputCounter <= 7'd62;
  81. end
  82. else
  83. begin
  84. if((DinState==2'd2)||(DinState==2'd0))
  85. begin
  86. if(InnerInputCounter < 7'd62)
  87. begin
  88. InnerInputCounter <= InnerInputCounter + 7'd1;
  89. end
  90. else
  91. begin
  92. if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) )
  93. InnerInputCounter <= 7'd0;
  94. end
  95. end
  96. else
  97. InnerInputCounter <= 7'd62;
  98. end
  99. end
  100. always@(posedge BckIn)
  101. begin
  102. if(StartFlag == 1'b0)
  103. begin
  104. DinInnerCounter <= 6'd0;
  105. end
  106. else
  107. begin
  108. if(DinState==2'd2)
  109. begin
  110. if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) )
  111. DinInnerCounter <= 6'd0;
  112. else
  113. DinInnerCounter <= DinInnerCounter + 5'd1;
  114. end
  115. else
  116. DinInnerCounter <= 6'd0;
  117. end
  118. end
  119. always@(negedge BckIn)
  120. begin
  121. if(StartFlag == 1'b0)
  122. begin
  123. DinWenDelay <= 5'd0;
  124. end
  125. else
  126. begin
  127. DinWenDelay <= DinWen;
  128. end
  129. end
  130. always@(posedge BckIn)
  131. begin
  132. if(StartFlag == 1'b0)
  133. begin
  134. DinState <= 2'd0;
  135. end
  136. else
  137. begin
  138. case(DinState)
  139. 2'd0:
  140. begin
  141. if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) )
  142. begin
  143. DinState <= 2'd2;
  144. end
  145. end
  146. 2'd1:
  147. begin
  148. if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) )
  149. begin
  150. DinState <= 2'd2;
  151. end
  152. end
  153. 2'd2:
  154. begin
  155. if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) && ( DinStateCounter >= LrckCounter98 ) )
  156. begin
  157. DinState <= 2'd3;
  158. end
  159. end
  160. 2'd3:
  161. begin
  162. if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) && ( DinStateCounter >= LrckCounter99 ) )
  163. begin
  164. DinState <= 2'd1;
  165. end
  166. end
  167. endcase
  168. end
  169. end
  170. always@(posedge BckIn)
  171. begin
  172. if(StartFlag == 1'b0)
  173. begin
  174. DinStateCounter <= 20'd0;
  175. end
  176. else
  177. begin
  178. if(DinState == 2'd2 || DinState == 2'd3)
  179. begin
  180. if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) && ( DinStateCounter >= LrckCounter99 ) )
  181. DinStateCounter <= 20'd0;
  182. else if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) && (InnerInputCounter == 7'd62))
  183. begin
  184. DinStateCounter <= DinStateCounter + 20'd1;
  185. end
  186. else
  187. DinStateCounter <= DinStateCounter;
  188. end
  189. else
  190. DinStateCounter <= 20'd0;
  191. end
  192. end
  193. always@(posedge BckIn)
  194. begin
  195. if(StartFlag == 1'b0)
  196. begin
  197. DinWen <= 1'd0;
  198. end
  199. else
  200. begin
  201. case(DinState)
  202. 2'd0:
  203. begin
  204. if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) )
  205. begin
  206. DinWen <= 1'd1;
  207. end
  208. else if( (DinStateCounter >= LrckCounter98) )
  209. begin
  210. DinWen <= 1'd0;
  211. end
  212. end
  213. 2'd1:
  214. begin
  215. if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) )
  216. begin
  217. DinWen <= 1'd1;
  218. end
  219. else if( (DinStateCounter >= LrckCounter98) )
  220. begin
  221. DinWen <= 1'd0;
  222. end
  223. end
  224. 2'd2:
  225. begin
  226. if( (DinStateCounter >= LrckCounter98) || (DinInnerCounter == 5'd24))
  227. begin
  228. DinWen <= 1'd0;
  229. end
  230. else if((DinStateCounter <= LrckCounter98) && ( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) ) )
  231. DinWen <= 1'd1;
  232. end
  233. 2'd3:
  234. begin
  235. if( (DinStateCounter >= LrckCounter98) )
  236. begin
  237. DinWen <= 1'd0;
  238. end
  239. end
  240. endcase
  241. end
  242. end
  243. IP_FIFO IP_FIFO(
  244. .aclr(!StartFlag),
  245. .data(RegDataIn),
  246. .rdclk(BckOut),
  247. .rdreq(FifoRen),
  248. .wrclk(BckIn),
  249. .wrreq(DinWenDelay),
  250. .q(FifoReadOut),
  251. // .rdempty(FifoEmp),
  252. .rdusedw(FifoWord)
  253. );
  254. ///// Out Part Logic
  255. always@(posedge Clk)
  256. begin
  257. BckOutCounter <= BckOutCounter + 2'd1;
  258. end
  259. always@(negedge BckOut)
  260. begin
  261. LrckOutCounter <= LrckOutCounter + 6'd1;
  262. end
  263. always@(negedge BckOut)
  264. begin
  265. if((LrckOutCounter==6'd63) || (LrckOutCounter==6'd31))
  266. DoutReadCounter <= 5'd0;
  267. else
  268. DoutReadCounter <= DoutReadCounter + 5'd1;
  269. end
  270. always@(posedge BckOut)
  271. begin
  272. FifoRenPos <= FifoRen;
  273. end
  274. always@(negedge BckOut)
  275. begin
  276. if( (LrckOutCounter == 6'd62) && (FifoWord >= 6'd6) && (ReadStatePos == 2'd0) )
  277. FifoRen <= 1'd1;
  278. else if( (LrckOutCounter == 6'd62) && (ReadStatePos == 2'd1) )
  279. FifoRen <= 1'd1;
  280. else if( (LrckOutCounter == 6'd23) && (FifoRenPos == 1'd1) ) // && (ReadStatePos == 2'd1)
  281. FifoRen <= 1'd0;
  282. end
  283. always@(posedge BckOut)
  284. begin
  285. if(StartFlag == 1'b0)
  286. begin
  287. ReadStatePos <= 2'd0;
  288. end
  289. else
  290. begin
  291. ReadStatePos <= ReadState;
  292. end
  293. end
  294. always@(posedge BckOut)
  295. begin
  296. if(StartFlag == 1'b0)
  297. begin
  298. FifiReadOutterCounter <= 20'd0;
  299. end
  300. else
  301. begin
  302. if(ReadStatePos == 1'b0)
  303. FifiReadOutterCounter <= 20'd0;
  304. else
  305. begin
  306. if( (LrckOutCounter == 6'd62) && (FifiReadOutterCounter < LrckCounter99))
  307. FifiReadOutterCounter <= FifiReadOutterCounter + 20'd1;
  308. else
  309. FifiReadOutterCounter <= FifiReadOutterCounter;
  310. end
  311. end
  312. end
  313. always@(negedge BckOut)
  314. begin
  315. if(StartFlag == 1'b0)
  316. begin
  317. ReadState <= 2'd0;
  318. end
  319. begin
  320. if( (LrckOutCounter == 6'd62) && (FifoWord >= 6'd6) )
  321. ReadState <= 2'd1;
  322. else if( (FifoWord <= 6'd1) && (ReadState == 2'd1) && (FifiReadOutterCounter >= LrckCounter99 ) )
  323. ReadState <= 2'd0;
  324. end
  325. end
  326. always@(negedge BckOut)
  327. begin
  328. FifoShifter <= {FifoShifter[29:0], DataOut};
  329. end
  330. always@(negedge BckOut)
  331. begin
  332. if(ReadStatePos == 1'b0)
  333. DataOut <= 1'b0;
  334. else
  335. begin
  336. if(FifoRenPos == 1'b1)
  337. DataOut <= FifoReadOut;
  338. else
  339. DataOut <= FifoShifter[30];
  340. end
  341. end
  342. always@(posedge BckOut)
  343. begin
  344. if(StartFlag == 1'b0)
  345. begin
  346. CaptureTrigState <= 1'd0;
  347. end
  348. begin
  349. if(FifoRen == 1'b1)
  350. begin
  351. case(LrckOutCounter)
  352. 6'd0:
  353. begin
  354. CaptureTrigState <= 1'd0;
  355. end
  356. 6'd1:
  357. begin
  358. if(DataOut!=WireForTrig[22])
  359. CaptureTrigState <= 1'd1;
  360. end
  361. 6'd2:
  362. begin
  363. if(DataOut!=WireForTrig[21])
  364. CaptureTrigState <= 1'd1;
  365. end
  366. 6'd3:
  367. begin
  368. if(DataOut!=WireForTrig[20])
  369. CaptureTrigState <= 1'd1;
  370. end
  371. 6'd4:
  372. begin
  373. if(DataOut!=WireForTrig[19])
  374. CaptureTrigState <= 1'd1;
  375. end
  376. 6'd5:
  377. begin
  378. if(DataOut!=WireForTrig[18])
  379. CaptureTrigState <= 1'd1;
  380. end
  381. 6'd6:
  382. begin
  383. if(DataOut!=WireForTrig[17])
  384. CaptureTrigState <= 1'd1;
  385. end
  386. 6'd7:
  387. begin
  388. if(DataOut!=WireForTrig[16])
  389. CaptureTrigState <= 1'd1;
  390. end
  391. 6'd8:
  392. begin
  393. if(DataOut!=WireForTrig[15])
  394. CaptureTrigState <= 1'd1;
  395. end
  396. 6'd9:
  397. begin
  398. if(DataOut!=WireForTrig[14])
  399. CaptureTrigState <= 1'd1;
  400. end
  401. 6'd10:
  402. begin
  403. if(DataOut!=WireForTrig[13])
  404. CaptureTrigState <= 1'd1;
  405. end
  406. 6'd11:
  407. begin
  408. if(DataOut!=WireForTrig[12])
  409. CaptureTrigState <= 1'd1;
  410. end
  411. 6'd12:
  412. begin
  413. if(DataOut!=WireForTrig[11])
  414. CaptureTrigState <= 1'd1;
  415. end
  416. 6'd13:
  417. begin
  418. if(DataOut!=WireForTrig[10])
  419. CaptureTrigState <= 1'd1;
  420. end
  421. 6'd14:
  422. begin
  423. if(DataOut!=WireForTrig[9])
  424. CaptureTrigState <= 1'd1;
  425. end
  426. 6'd15:
  427. begin
  428. if(DataOut!=WireForTrig[8])
  429. CaptureTrigState <= 1'd1;
  430. end
  431. 6'd16:
  432. begin
  433. if(DataOut!=WireForTrig[7])
  434. CaptureTrigState <= 1'd1;
  435. end
  436. 6'd17:
  437. begin
  438. if(DataOut!=WireForTrig[6])
  439. CaptureTrigState <= 1'd1;
  440. end
  441. 6'd18:
  442. begin
  443. if(DataOut!=WireForTrig[5])
  444. CaptureTrigState <= 1'd1;
  445. end
  446. 6'd19:
  447. begin
  448. if(DataOut!=WireForTrig[4])
  449. CaptureTrigState <= 1'd1;
  450. end
  451. 6'd20:
  452. begin
  453. if(DataOut!=WireForTrig[3])
  454. CaptureTrigState <= 1'd1;
  455. end
  456. 6'd21:
  457. begin
  458. if(DataOut!=WireForTrig[2])
  459. CaptureTrigState <= 1'd1;
  460. end
  461. 6'd22:
  462. begin
  463. if(DataOut!=WireForTrig[1])
  464. CaptureTrigState <= 1'd1;
  465. end
  466. endcase
  467. end
  468. else
  469. CaptureTrigState <= 1'd0;
  470. end
  471. end
  472. always@(posedge BckOut)
  473. begin
  474. if(StartFlag == 1'b0)
  475. begin
  476. CaptureTrigStateOut <= 1'd0;
  477. end
  478. else
  479. begin
  480. if( (FifoRen == 1'b1) && (LrckOutCounter == 6'd23) && (CaptureTrigState == 1'b1) && (FifiReadOutterCounter<=LrckCounter97) && (FifiReadOutterCounter > 20'd0))
  481. CaptureTrigStateOut <= 1'd1;
  482. else
  483. CaptureTrigStateOut <= 1'd0;
  484. end
  485. end
  486. endmodule