CPLD_Transmitter - 副本 (6).v 8.2 KB

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