FifoCtrl.v 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. module FifoCtrl #(
  2. parameter Fifo0ReadMsbAddr = 12'h0+12'd28,
  3. parameter Fifo1ReadMsbAddr = 12'h50+12'd28,
  4. parameter Fifo2ReadMsbAddr = 12'hf0+12'd28,
  5. parameter Fifo3ReadMsbAddr = 12'h140+12'd28,
  6. parameter Fifo4ReadMsbAddr = 12'h190+12'd28,
  7. parameter Fifo5ReadMsbAddr = 12'h1e0+12'd28,
  8. parameter Fifo6ReadMsbAddr = 12'h230+12'd28
  9. )(
  10. input ToFifoTxWriteVal_i,
  11. input ToFifoTxReadVal_i,
  12. input ToFifoRxWriteVal_i,
  13. input ToFifoRxReadVal_i,
  14. input FifoTxFull_i,
  15. input FifoTxEmpty_i,
  16. input FifoRxFull_i,
  17. input FifoRxEmpty_i,
  18. input [11:0] SmcAddr_i,
  19. input [7:0] TxFifoWrdCnt_i,
  20. input [7:0] RxFifoWrdCnt_i,
  21. input FifoTxWrClock_i,
  22. input FifoTxRdClock_i,
  23. input FifoRxWrClock_i,
  24. input FifoRxRdClock_i,
  25. input FifoTxRst_i,
  26. input FifoRxRst_i,
  27. output [7:0] RxFifoUpDnCnt_o,
  28. output [7:0] TxFifoUpDnCnt_o,
  29. output FifoTxWriteEn_o,
  30. output FifoTxReadEn_o,
  31. output FifoRxWriteEn_o,
  32. output FifoRxReadEn_o
  33. );
  34. reg FifoTxWriteEn;
  35. reg FifoTxReadEn;
  36. reg FifoRxWriteEn;
  37. reg FifoRxReadEn;
  38. (* dont_touch = "true" *)reg [7:0] txFifoWrPtr;
  39. (* dont_touch = "true" *)reg [7:0] txFifoRdPtr;
  40. (* dont_touch = "true" *)reg [7:0] rxFifoWrPtr;
  41. (* dont_touch = "true" *)reg [7:0] rxFifoRdPtr;
  42. (* dont_touch = "true" *) reg [7:0] rxFifoUpDnCnt;
  43. (* dont_touch = "true" *) reg [7:0] txFifoUpDnCnt;
  44. reg [1:0] readEnCnt;
  45. wire requestToFifo0 =(SmcAddr_i == Fifo0ReadMsbAddr)?1'b1:1'b0;
  46. wire requestToFifo1 =(SmcAddr_i == Fifo1ReadMsbAddr)?1'b1:1'b0;
  47. wire requestToFifo2 =(SmcAddr_i == Fifo2ReadMsbAddr)?1'b1:1'b0;
  48. wire requestToFifo3 =(SmcAddr_i == Fifo3ReadMsbAddr)?1'b1:1'b0;
  49. wire requestToFifo4 =(SmcAddr_i == Fifo4ReadMsbAddr)?1'b1:1'b0;
  50. wire requestToFifo5 =(SmcAddr_i == Fifo5ReadMsbAddr)?1'b1:1'b0;
  51. wire requestToFifo6 =(SmcAddr_i == Fifo6ReadMsbAddr)?1'b1:1'b0;
  52. wire requestToFifo = (requestToFifo0|requestToFifo1|requestToFifo2|requestToFifo3|requestToFifo4|requestToFifo5|requestToFifo6)?1'b1:1'b0;
  53. // //================================================================================
  54. // // ASSIGNMENTS
  55. assign FifoTxWriteEn_o = FifoTxWriteEn;
  56. assign FifoTxReadEn_o = FifoTxReadEn;
  57. assign FifoRxWriteEn_o = FifoRxWriteEn;
  58. assign FifoRxReadEn_o = FifoRxReadEn;
  59. assign RxFifoUpDnCnt_o = rxFifoUpDnCnt;
  60. assign TxFifoUpDnCnt_o = txFifoUpDnCnt;
  61. // //================================================================================
  62. always @(posedge FifoRxRdClock_i) begin
  63. if (FifoRxRst_i) begin
  64. readEnCnt <= 1'b0;
  65. end
  66. else begin
  67. if (ToFifoRxReadVal_i) begin
  68. readEnCnt <= readEnCnt + 1'b1;
  69. end
  70. else begin
  71. readEnCnt <= 1'b0;
  72. end
  73. end
  74. end
  75. always @(posedge FifoTxWrClock_i) begin
  76. if (ToFifoTxWriteVal_i && !FifoTxFull_i) begin
  77. FifoTxWriteEn <= 1'b1;
  78. end
  79. else begin
  80. FifoTxWriteEn <= 1'b0;
  81. end
  82. end
  83. always @(posedge FifoTxRdClock_i ) begin
  84. if (ToFifoTxReadVal_i && !FifoTxEmpty_i) begin
  85. FifoTxReadEn <= 1'b1;
  86. end
  87. else begin
  88. FifoTxReadEn <= 1'b0;
  89. end
  90. end
  91. always @(posedge FifoRxWrClock_i) begin
  92. if (ToFifoRxWriteVal_i && !FifoRxFull_i) begin
  93. FifoRxWriteEn <= 1'b1;
  94. end
  95. else begin
  96. FifoRxWriteEn <= 1'b0;
  97. end
  98. end
  99. always @(posedge FifoRxRdClock_i) begin
  100. if (ToFifoRxReadVal_i && !FifoRxEmpty_i && requestToFifo && readEnCnt < 1 ) begin
  101. FifoRxReadEn <= 1'b1;
  102. end
  103. else begin
  104. FifoRxReadEn <= 1'b0;
  105. end
  106. end
  107. always @(posedge FifoTxWrClock_i ) begin
  108. if (FifoTxRst_i) begin
  109. txFifoWrPtr <= 8'h0;
  110. end
  111. else begin
  112. if (FifoTxWriteEn ) begin
  113. txFifoWrPtr <= txFifoWrPtr + 1'b1;
  114. end
  115. end
  116. end
  117. always @(posedge FifoTxRdClock_i ) begin
  118. if (FifoTxRst_i) begin
  119. txFifoRdPtr <= 8'h0;
  120. end
  121. else begin
  122. if (FifoTxReadEn ) begin
  123. txFifoRdPtr <= txFifoRdPtr + 1'b1;
  124. end
  125. end
  126. end
  127. always @(posedge FifoRxWrClock_i) begin
  128. if (FifoRxRst_i) begin
  129. rxFifoWrPtr <= 8'h0;
  130. end
  131. else begin
  132. if (FifoRxWriteEn ) begin
  133. rxFifoWrPtr <= rxFifoWrPtr + 1'b1;
  134. end
  135. end
  136. end
  137. always @(posedge FifoRxRdClock_i) begin
  138. if (FifoRxRst_i) begin
  139. rxFifoRdPtr <= 8'h0;
  140. end
  141. else begin
  142. if (FifoRxReadEn ) begin
  143. rxFifoRdPtr <= rxFifoRdPtr + 1'b1;
  144. end
  145. end
  146. end
  147. always @(posedge FifoRxRdClock_i) begin
  148. if (FifoRxRst_i) begin
  149. rxFifoUpDnCnt <= 8'h0;
  150. end
  151. else begin
  152. rxFifoUpDnCnt <= rxFifoWrPtr - rxFifoRdPtr;
  153. end
  154. end
  155. always @(posedge FifoTxRdClock_i) begin
  156. if (FifoTxRst_i) begin
  157. txFifoUpDnCnt <= 8'h0;
  158. end
  159. else begin
  160. txFifoUpDnCnt <= txFifoWrPtr - txFifoRdPtr;
  161. end
  162. end
  163. // //================================================================================
  164. endmodule