CPLD_Transmitter - 副本 (2).v 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  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//测试端口
  25. );
  26. input Clk, BckIn, LrckIn, DataIn;
  27. input StartFlag;
  28. output BckOut, LrckOut, DataOut;
  29. output DinWenOut,FifoRenOut;//测试端口
  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. ///// Out Part
  41. reg [1:0] BckOutCounter = 0;
  42. reg [5:0] LrckOutCounter = 0;
  43. reg FifoRen = 0;
  44. reg DataOut;
  45. reg [6:0] InnerInputCounter=0;
  46. reg [4:0] DoutReadCounter = 0;
  47. reg [1:0] ReadState = 0;
  48. // reg ReadStart = 0;
  49. wire [5:0] FifoWord;
  50. wire FifoEmp;
  51. wire FifoReadOut;
  52. assign BckOut = BckOutCounter[1];
  53. assign LrckOut = LrckOutCounter[5];
  54. //测试端口赋值
  55. assign DinWenOut = DinWenDelay;
  56. assign FifoRenOut = FifoRen;
  57. ///// In Part Logic
  58. always@(posedge BckIn)
  59. begin
  60. if(StartFlag == 1'b0)
  61. begin
  62. PreRegLrckIn <= 1'b0;
  63. PreRegDataIn <= 1'b0;
  64. end
  65. else
  66. begin
  67. PreRegLrckIn <= LrckIn;
  68. PreRegDataIn <= DataIn;
  69. end
  70. end
  71. always@(negedge BckIn)
  72. begin
  73. if(StartFlag == 1'b0)
  74. begin
  75. RegLrckIn <= 1'b0;
  76. RegDataIn <= 1'b0;
  77. end
  78. else
  79. begin
  80. RegLrckIn <= PreRegLrckIn;
  81. RegDataIn <= PreRegDataIn;
  82. end
  83. end
  84. always@(posedge BckIn)
  85. begin
  86. if(StartFlag == 1'b0)
  87. begin
  88. InnerInputCounter <= 7'd62;
  89. end
  90. else
  91. begin
  92. if((DinState==2'd2)||(DinState==2'd0))
  93. begin
  94. if(InnerInputCounter < 7'd62)
  95. begin
  96. InnerInputCounter <= InnerInputCounter + 7'd1;
  97. end
  98. else
  99. begin
  100. if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) )
  101. InnerInputCounter <= 7'd0;
  102. end
  103. end
  104. else
  105. InnerInputCounter <= 7'd62;
  106. end
  107. end
  108. always@(posedge BckIn)
  109. begin
  110. if(StartFlag == 1'b0)
  111. begin
  112. DinInnerCounter <= 5'd0;
  113. end
  114. else
  115. begin
  116. if(DinState==2'd2)
  117. begin
  118. if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) )
  119. DinInnerCounter <= 5'd0;
  120. else
  121. DinInnerCounter <= DinInnerCounter + 5'd1;
  122. end
  123. else
  124. DinInnerCounter <= 5'd0;
  125. end
  126. end
  127. always@(negedge BckIn)
  128. begin
  129. if(StartFlag == 1'b0)
  130. begin
  131. DinWenDelay <= 5'd0;
  132. end
  133. else
  134. begin
  135. DinWenDelay <= DinWen;
  136. end
  137. end
  138. always@(posedge BckIn)
  139. begin
  140. if(StartFlag == 1'b0)
  141. begin
  142. DinState <= 2'd0;
  143. end
  144. else
  145. begin
  146. case(DinState)
  147. 2'd0:
  148. begin
  149. if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) )
  150. begin
  151. DinState <= 2'd2;
  152. end
  153. end
  154. 2'd1:
  155. begin
  156. if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) )
  157. begin
  158. DinState <= 2'd2;
  159. end
  160. end
  161. 2'd2:
  162. begin
  163. if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) && ( DinStateCounter == 16'd45998 ) )
  164. begin
  165. DinState <= 2'd3;
  166. end
  167. end
  168. 2'd3:
  169. begin
  170. if( DinStateCounter == 16'd46000 )
  171. begin
  172. DinState <= 2'd1;
  173. end
  174. end
  175. endcase
  176. end
  177. end
  178. always@(posedge BckIn)
  179. begin
  180. if(StartFlag == 1'b0)
  181. begin
  182. DinStateCounter <= 16'd0;
  183. end
  184. else
  185. begin
  186. if(DinState == 2'd2 || DinState == 2'd3)
  187. begin
  188. if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) && (InnerInputCounter == 7'd62))
  189. begin
  190. DinStateCounter <= DinStateCounter + 16'd1;
  191. end
  192. else
  193. DinStateCounter <= DinStateCounter;
  194. end
  195. else
  196. DinStateCounter <= 16'd0;
  197. end
  198. end
  199. always@(posedge BckIn)
  200. begin
  201. if(StartFlag == 1'b0)
  202. begin
  203. DinWen <= 1'd0;
  204. end
  205. else
  206. begin
  207. case(DinState)
  208. 2'd0:
  209. begin
  210. if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) )
  211. begin
  212. DinWen <= 1'd1;
  213. end
  214. end
  215. 2'd1:
  216. begin
  217. if( (RegLrckIn == 1'b1) && (LrckIn == 1'b0) )
  218. begin
  219. DinWen <= 1'd1;
  220. end
  221. end
  222. 2'd2:
  223. begin
  224. if( ( (DinStateCounter == 16'd45998) && (RegLrckIn == 1'b1) && (LrckIn == 1'b0) ) || (DinInnerCounter > 5'd23 && DinInnerCounter < 5'd31))
  225. begin
  226. DinWen <= 1'd0;
  227. end
  228. else if((DinStateCounter <= 16'd45998) && ( ( DinInnerCounter <=5'd23 || DinInnerCounter == 5'd31 ) || ((RegLrckIn == 1'b1) && (LrckIn == 1'b0)) || ((RegLrckIn == 1'b0) && (LrckIn == 1'b1)) ) )
  229. DinWen <= 1'd1;
  230. end
  231. endcase
  232. end
  233. end
  234. IP_FIFO IP_FIFO(
  235. .aclr(!StartFlag),
  236. .data(RegDataIn),
  237. .rdclk(BckOut),
  238. .rdreq(FifoRen),
  239. .wrclk(BckIn),
  240. .wrreq(DinWenDelay),
  241. .q(FifoReadOut),
  242. // .rdempty(FifoEmp),
  243. .rdusedw(FifoWord)
  244. );
  245. ///// Out Part Logic
  246. always@(posedge Clk)
  247. begin
  248. BckOutCounter <= BckOutCounter + 2'd1;
  249. end
  250. always@(negedge BckOut)
  251. begin
  252. // if(ReadStart == 1'b0)
  253. // LrckOutCounter <= 6'd55;
  254. // else
  255. LrckOutCounter <= LrckOutCounter + 6'd1;
  256. end
  257. always@(negedge BckOut)
  258. begin
  259. if((LrckOutCounter==6'd63) || (LrckOutCounter==6'd31))
  260. DoutReadCounter <= 5'd0;
  261. else
  262. DoutReadCounter <= DoutReadCounter + 5'd1;
  263. end
  264. // always@(negedge BckOut)
  265. // begin
  266. // if(FifoWord >= 6'd16)
  267. // ReadStart <= 1'b1;
  268. // end
  269. always@(negedge BckOut)
  270. begin
  271. if( (LrckOutCounter == 6'd62) && (FifoWord >= 6'd6) && (ReadState == 2'd0) )
  272. FifoRen <= 1'd1;
  273. else if( (LrckOutCounter == 6'd62 || LrckOutCounter == 6'd30) && (ReadState == 2'd1) )
  274. FifoRen <= 1'd1;
  275. else if( (FifoWord == 6'd1) && (FifoRen == 1'd1) && (ReadState == 2'd1) )
  276. FifoRen <= 1'd0;
  277. else if( ((LrckOutCounter == 6'd55 || LrckOutCounter == 6'd23)) && (FifoRen == 1'd1) && (ReadState == 2'd1) )
  278. FifoRen <= 1'd0;
  279. end
  280. always@(negedge BckOut)
  281. begin
  282. if(StartFlag == 1'b0)
  283. begin
  284. ReadState <= 2'd0;
  285. end
  286. begin
  287. if( (LrckOutCounter == 6'd62) && (FifoWord >= 6'd6) )
  288. ReadState <= 2'd1;
  289. else if( (FifoWord == 6'd1) && (FifoRen == 1'd1) )
  290. ReadState <= 2'd0;
  291. end
  292. end
  293. always@(negedge BckOut)
  294. begin
  295. if(FifoRen == 1'b1)
  296. DataOut <= FifoReadOut;
  297. else
  298. DataOut <= 1'b0;
  299. end
  300. endmodule