CPLD_Transmitter - 副本 (7).v 11 KB

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