CPLD_Transmitter - 副本 (4).v 8.0 KB

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