CPLD_Transmitter - 副本.v 6.5 KB

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