CPLD_Transmitter(正式).v 7.4 KB

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