CPLD_Transmitter - 副本 (3).v 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  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. DinWenOut,FifoRenOut,FifoWord5,FifoWord4,FifoWord3,FifoWord2,FifoWord1,FifoWord0,RegDataInOut,FifoReadOutOut//测试端口
  25. );
  26. input Clk, BckIn, LrckIn, DataIn;
  27. input StartFlag;
  28. output BckOut, LrckOut, DataOut;
  29. output DinWenOut,FifoRenOut,FifoWord5,FifoWord4,FifoWord3,FifoWord2,FifoWord1,FifoWord0,RegDataInOut,FifoReadOutOut;//测试端口
  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;
  39. reg [4:0] DinInnerCounter = 0;
  40. reg [15:0] DinStateCounterNeg = 0;
  41. reg [1:0] DinStateNeg;
  42. reg [4:0] DinInnerCounterNeg = 0;
  43. ///// Out Part
  44. reg [1:0] BckOutCounter = 0;
  45. reg [5:0] LrckOutCounter = 0;
  46. reg FifoRen = 0;
  47. reg [1:0] BckOutCounterPos = 0;
  48. reg [5:0] LrckOutCounterPos = 0;
  49. reg FifoRenPos = 0;
  50. reg DataOut;
  51. reg [6:0] InnerInputCounter=0;
  52. reg [4:0] DoutReadCounter = 0;
  53. reg [1:0] ReadState = 0;
  54. reg [6:0] InnerInputCounterNeg=0;
  55. reg [4:0] DoutReadCounterPos = 0;
  56. reg [1:0] ReadStatePos = 0;
  57. // reg ReadStart = 0;
  58. wire [5:0] FifoWord;
  59. wire FifoEmp;
  60. wire FifoReadOut;
  61. assign BckOut = BckOutCounter[1];
  62. assign LrckOut = LrckOutCounter[5];
  63. //测试端口赋值
  64. assign DinWenOut = DinWenDelay;
  65. assign FifoRenOut = FifoRen;
  66. assign FifoWord5 = FifoWord[5];
  67. assign FifoWord4 = FifoWord[4];
  68. assign FifoWord3 = FifoWord[3];
  69. assign FifoWord2 = FifoWord[2];
  70. assign FifoWord1 = FifoWord[1];
  71. assign FifoWord0 = FifoWord[0];
  72. assign RegDataInOut = RegDataIn;
  73. assign FifoReadOutOut = FifoReadOut;
  74. ///// In Part Logic
  75. always@(posedge BckIn)
  76. begin
  77. if(StartFlag == 1'b0)
  78. begin
  79. PreRegLrckIn <= 1'b0;
  80. PreRegDataIn <= 1'b0;
  81. end
  82. else
  83. begin
  84. PreRegLrckIn <= LrckIn;
  85. PreRegDataIn <= DataIn;
  86. end
  87. end
  88. always@(negedge BckIn)
  89. begin
  90. if(StartFlag == 1'b0)
  91. begin
  92. RegLrckIn <= 1'b0;
  93. RegDataIn <= 1'b0;
  94. end
  95. else
  96. begin
  97. RegLrckIn <= PreRegLrckIn;
  98. RegDataIn <= PreRegDataIn;
  99. end
  100. end
  101. always@(negedge BckIn)
  102. begin
  103. if(StartFlag == 1'b0)
  104. begin
  105. InnerInputCounterNeg <= 7'd62;
  106. end
  107. else
  108. begin
  109. InnerInputCounterNeg <= InnerInputCounter;
  110. end
  111. end
  112. always@(posedge BckIn)
  113. begin
  114. if(StartFlag == 1'b0)
  115. begin
  116. InnerInputCounter <= 7'd62;
  117. end
  118. else
  119. begin
  120. if((DinStateNeg==2'd2)||(DinStateNeg==2'd0))
  121. begin
  122. if(InnerInputCounterNeg < 7'd62)
  123. begin
  124. InnerInputCounter <= InnerInputCounterNeg + 7'd1;
  125. end
  126. else
  127. begin
  128. if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) )
  129. InnerInputCounter <= 7'd0;
  130. end
  131. end
  132. else
  133. InnerInputCounter <= 7'd62;
  134. end
  135. end
  136. always@(negedge BckIn)
  137. begin
  138. if(StartFlag == 1'b0)
  139. begin
  140. DinInnerCounterNeg <= 5'd0;
  141. end
  142. else
  143. begin
  144. DinInnerCounterNeg <= DinInnerCounter;
  145. end
  146. end
  147. always@(posedge BckIn)
  148. begin
  149. if(StartFlag == 1'b0)
  150. begin
  151. DinInnerCounter <= 5'd0;
  152. end
  153. else
  154. begin
  155. if(DinStateNeg==2'd2)
  156. begin
  157. if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) )
  158. DinInnerCounter <= 5'd0;
  159. else
  160. DinInnerCounter <= DinInnerCounterNeg + 5'd1;
  161. end
  162. else
  163. DinInnerCounter <= 5'd0;
  164. end
  165. end
  166. always@(negedge BckIn)
  167. begin
  168. if(StartFlag == 1'b0)
  169. begin
  170. DinWenDelay <= 5'd0;
  171. end
  172. else
  173. begin
  174. DinWenDelay <= DinWen;
  175. end
  176. end
  177. always@(negedge BckIn)
  178. begin
  179. if(StartFlag == 1'b0)
  180. begin
  181. DinStateNeg <= 2'd0;
  182. end
  183. else
  184. begin
  185. DinStateNeg <= DinState;
  186. end
  187. end
  188. always@(posedge BckIn)
  189. begin
  190. if(StartFlag == 1'b0)
  191. begin
  192. DinState <= 2'd0;
  193. end
  194. else
  195. begin
  196. case(DinStateNeg)
  197. 2'd0:
  198. begin
  199. if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) )
  200. begin
  201. DinState <= 2'd2;
  202. end
  203. end
  204. 2'd1:
  205. begin
  206. if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) )
  207. begin
  208. DinState <= 2'd2;
  209. end
  210. end
  211. 2'd2:
  212. begin
  213. if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) && ( DinStateCounterNeg == 16'd45998 ) )
  214. begin
  215. DinState <= 2'd3;
  216. end
  217. end
  218. 2'd3:
  219. begin
  220. if( DinStateCounterNeg == 16'd46000 )
  221. begin
  222. DinState <= 2'd1;
  223. end
  224. end
  225. endcase
  226. end
  227. end
  228. always@(negedge BckIn)
  229. begin
  230. if(StartFlag == 1'b0)
  231. begin
  232. DinStateCounterNeg <= 16'd0;
  233. end
  234. else
  235. begin
  236. DinStateCounterNeg <= DinStateCounter;
  237. end
  238. end
  239. always@(posedge BckIn)
  240. begin
  241. if(StartFlag == 1'b0)
  242. begin
  243. DinStateCounter <= 16'd0;
  244. end
  245. else
  246. begin
  247. if(DinStateNeg == 2'd2 || DinStateNeg == 2'd3)
  248. begin
  249. if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) && (InnerInputCounterNeg == 7'd62))
  250. begin
  251. DinStateCounter <= DinStateCounterNeg + 16'd1;
  252. end
  253. else
  254. DinStateCounter <= DinStateCounterNeg;
  255. end
  256. else
  257. DinStateCounter <= 16'd0;
  258. end
  259. end
  260. always@(posedge BckIn)
  261. begin
  262. if(StartFlag == 1'b0)
  263. begin
  264. DinWen <= 1'd0;
  265. end
  266. else
  267. begin
  268. case(DinStateNeg)
  269. 2'd0:
  270. begin
  271. if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) )
  272. begin
  273. DinWen <= 1'd1;
  274. end
  275. end
  276. 2'd1:
  277. begin
  278. if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) )
  279. begin
  280. DinWen <= 1'd1;
  281. end
  282. end
  283. 2'd2:
  284. begin
  285. if( ( (DinStateCounterNeg == 16'd45998) && (RegLrckIn == 1'b1) && (LrckIn == 1'b0) ) || (DinInnerCounterNeg > 5'd23 && DinInnerCounterNeg < 5'd31))
  286. begin
  287. DinWen <= 1'd0;
  288. end
  289. else if((DinStateCounterNeg <= 16'd45998) && ( ( DinInnerCounterNeg <=5'd23 || DinInnerCounterNeg == 5'd31 ) || ((RegLrckIn == 1'b1) && (LrckIn == 1'b0)) || ((RegLrckIn == 1'b0) && (LrckIn == 1'b1)) ) )
  290. DinWen <= 1'd1;
  291. end
  292. endcase
  293. end
  294. end
  295. IP_FIFO IP_FIFO(
  296. .aclr(!StartFlag),
  297. .data(RegDataIn),
  298. .rdclk(BckOut),
  299. .rdreq(FifoRen),
  300. .wrclk(BckIn),
  301. .wrreq(DinWenDelay),
  302. .q(FifoReadOut),
  303. // .rdempty(FifoEmp),
  304. .rdusedw(FifoWord)
  305. );
  306. ///// Out Part Logic
  307. always@(negedge Clk)
  308. begin
  309. BckOutCounterPos <= BckOutCounter;
  310. end
  311. always@(posedge Clk)
  312. begin
  313. BckOutCounter <= BckOutCounterPos + 2'd1;
  314. end
  315. always@(posedge BckOut)
  316. begin
  317. LrckOutCounterPos <= LrckOutCounter;
  318. end
  319. always@(negedge BckOut)
  320. begin
  321. LrckOutCounter <= LrckOutCounterPos + 6'd1;
  322. end
  323. always@(posedge BckOut)
  324. begin
  325. DoutReadCounterPos <= DoutReadCounter;
  326. end
  327. always@(negedge BckOut)
  328. begin
  329. if((LrckOutCounterPos==6'd63) || (LrckOutCounterPos==6'd31))
  330. DoutReadCounter <= 5'd0;
  331. else
  332. DoutReadCounter <= DoutReadCounterPos + 5'd1;
  333. end
  334. always@(posedge BckOut)
  335. begin
  336. FifoRenPos <= FifoRen;
  337. end
  338. always@(negedge BckOut)
  339. begin
  340. if( (LrckOutCounterPos == 6'd62) && (FifoWord >= 6'd6) && (ReadStatePos == 2'd0) )
  341. FifoRen <= 1'd1;
  342. else if( (LrckOutCounterPos == 6'd62 || LrckOutCounterPos == 6'd30) && (ReadStatePos == 2'd1) )
  343. FifoRen <= 1'd1;
  344. else if( (FifoWord == 6'd1) && (FifoRenPos == 1'd1) && (ReadStatePos == 2'd1) )
  345. FifoRen <= 1'd0;
  346. else if( ((LrckOutCounterPos == 6'd55 || LrckOutCounterPos == 6'd23)) && (FifoRenPos == 1'd1) && (ReadStatePos == 2'd1) )
  347. FifoRen <= 1'd0;
  348. end
  349. always@(posedge BckOut)
  350. begin
  351. if(StartFlag == 1'b0)
  352. begin
  353. ReadStatePos <= 2'd0;
  354. end
  355. else
  356. begin
  357. ReadStatePos <= ReadState;
  358. end
  359. end
  360. always@(negedge BckOut)
  361. begin
  362. if(StartFlag == 1'b0)
  363. begin
  364. ReadState <= 2'd0;
  365. end
  366. begin
  367. if( (LrckOutCounterPos == 6'd62) && (FifoWord >= 6'd6) )
  368. ReadState <= 2'd1;
  369. else if( (FifoWord == 6'd1) && (FifoRenPos == 1'd1) )
  370. ReadState <= 2'd0;
  371. end
  372. end
  373. always@(negedge BckOut)
  374. begin
  375. if(FifoRenPos == 1'b1)
  376. DataOut <= FifoReadOut;
  377. else
  378. DataOut <= 1'b0;
  379. end
  380. endmodule