FifoCtrl.v 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  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. parameter STAGES = 3
  10. )(
  11. input ToFifoTxWriteVal_i,
  12. input ToFifoTxReadVal_i,
  13. input ToFifoRxWriteVal_i,
  14. input ToFifoRxReadVal_i,
  15. input FifoTxFull_i,
  16. input FifoTxEmpty_i,
  17. input FifoRxFull_i,
  18. input FifoRxEmpty_i,
  19. input [11:0] SmcAddr_i,
  20. input [7:0] TxFifoWrdCnt_i,
  21. input [7:0] RxFifoWrdCnt_i,
  22. input FifoTxWrClock_i,
  23. input FifoTxRdClock_i,
  24. input FifoRxWrClock_i,
  25. input FifoRxRdClock_i,
  26. input FifoTxRst_i,
  27. input FifoRxRst_i,
  28. input FifoTxRstWrPtr_i,
  29. input FifoRxRstRdPtr_i,
  30. output [7:0] RxFifoUpDnCnt_o,
  31. output [7:0] TxFifoUpDnCnt_o,
  32. output FifoTxWriteEn_o,
  33. output FifoTxReadEn_o,
  34. output FifoRxWriteEn_o,
  35. output FifoRxReadEn_o
  36. );
  37. reg fifoTxWriteEn;
  38. reg fifoTxReadEn;
  39. reg fifoRxWriteEn;
  40. reg fifoRxReadEn;
  41. (* dont_touch = "true" *)reg [7:0] txFifoWrPtr;
  42. (* dont_touch = "true" *)reg [7:0] txFifoRdPtr;
  43. (* dont_touch = "true" *)reg [7:0] rxFifoWrPtr;
  44. (* dont_touch = "true" *)reg [7:0] rxFifoRdPtr;
  45. (* dont_touch = "true" *) reg [7:0] rxFifoUpDnCnt;
  46. (* dont_touch = "true" *) reg [7:0] txFifoUpDnCnt;
  47. reg [1:0] readEnCnt;
  48. wire requestToFifo0 =(SmcAddr_i == Fifo0ReadMsbAddr)?1'b1:1'b0;
  49. wire requestToFifo1 =(SmcAddr_i == Fifo1ReadMsbAddr)?1'b1:1'b0;
  50. wire requestToFifo2 =(SmcAddr_i == Fifo2ReadMsbAddr)?1'b1:1'b0;
  51. wire requestToFifo3 =(SmcAddr_i == Fifo3ReadMsbAddr)?1'b1:1'b0;
  52. wire requestToFifo4 =(SmcAddr_i == Fifo4ReadMsbAddr)?1'b1:1'b0;
  53. wire requestToFifo5 =(SmcAddr_i == Fifo5ReadMsbAddr)?1'b1:1'b0;
  54. wire requestToFifo6 =(SmcAddr_i == Fifo6ReadMsbAddr)?1'b1:1'b0;
  55. wire requestToFifo =(requestToFifo0|requestToFifo1|requestToFifo2|requestToFifo3|requestToFifo4|requestToFifo5|requestToFifo6)?1'b1:1'b0;
  56. wire [7:0] rxFifoWrPtrSync;
  57. wire [7:0] txFifoWrPtrSync;
  58. wire rxFifoRstSync;
  59. // //================================================================================
  60. // // ASSIGNMENTS
  61. assign FifoTxWriteEn_o = fifoTxWriteEn;
  62. assign FifoTxReadEn_o = fifoTxReadEn;
  63. assign FifoRxWriteEn_o = fifoRxWriteEn;
  64. assign FifoRxReadEn_o = fifoRxReadEn;
  65. assign RxFifoUpDnCnt_o = rxFifoUpDnCnt;
  66. assign TxFifoUpDnCnt_o = txFifoUpDnCnt;
  67. // //================================================================================
  68. RxFifoPtrSync #(
  69. .WIDTH(8),
  70. .STAGES(3)
  71. )
  72. rxFifoPtrSync (
  73. .ClkFast_i(FifoRxWrClock_i),
  74. .ClkSlow_i(FifoRxRdClock_i),
  75. .RxFifoWrPtr_i(rxFifoWrPtr),
  76. .RxFifoWrPtr_o(rxFifoWrPtrSync)
  77. );
  78. TxFifoPtrSync #(
  79. .WIDTH(8),
  80. .STAGES(3)
  81. )
  82. txFifoPtrSync (
  83. .ClkFast_i(FifoTxWrClock_i),
  84. .ClkSlow_i(FifoTxRdClock_i),
  85. .TxFifoWrPtr_i(txFifoWrPtr),
  86. .TxFifoWrPtr_o(txFifoWrPtrSync)
  87. );
  88. // RxFifoRstSync #(
  89. // .WIDTH(1),
  90. // .STAGES(3)
  91. // )
  92. // rxFifoRstSync (
  93. // .ClkFast_i(FifoRxWrClock_i),
  94. // .ClkSlow_i(FifoRxRdClock_i),
  95. // .RxFifoRst_i(FifoRxRst_i),
  96. // .RxFifoRst_o(rxFifoRstSync)
  97. // );
  98. always @(posedge FifoRxRdClock_i) begin
  99. if (FifoRxRstRdPtr_i) begin
  100. readEnCnt <= 1'b0;
  101. end
  102. else begin
  103. if (ToFifoRxReadVal_i) begin
  104. readEnCnt <= readEnCnt + 1'b1;
  105. end
  106. else begin
  107. readEnCnt <= 1'b0;
  108. end
  109. end
  110. end
  111. always @(posedge FifoTxWrClock_i) begin
  112. if (ToFifoTxWriteVal_i && !FifoTxFull_i) begin
  113. fifoTxWriteEn <= 1'b1;
  114. end
  115. else begin
  116. fifoTxWriteEn <= 1'b0;
  117. end
  118. end
  119. always @(posedge FifoTxRdClock_i ) begin
  120. if (ToFifoTxReadVal_i && !FifoTxEmpty_i) begin
  121. fifoTxReadEn <= 1'b1;
  122. end
  123. else begin
  124. fifoTxReadEn <= 1'b0;
  125. end
  126. end
  127. always @(posedge FifoRxWrClock_i) begin
  128. if (ToFifoRxWriteVal_i && !FifoRxFull_i) begin
  129. fifoRxWriteEn <= 1'b1;
  130. end
  131. else begin
  132. fifoRxWriteEn <= 1'b0;
  133. end
  134. end
  135. always @(posedge FifoRxRdClock_i) begin
  136. if (ToFifoRxReadVal_i && !FifoRxEmpty_i && requestToFifo && readEnCnt < 1 ) begin
  137. fifoRxReadEn <= 1'b1;
  138. end
  139. else begin
  140. fifoRxReadEn <= 1'b0;
  141. end
  142. end
  143. always @(posedge FifoTxWrClock_i ) begin
  144. if (FifoTxRstWrPtr_i) begin
  145. txFifoWrPtr <= 8'h0;
  146. end
  147. else begin
  148. if (fifoTxWriteEn ) begin
  149. txFifoWrPtr <= txFifoWrPtr + 1'b1;
  150. end
  151. end
  152. end
  153. always @(posedge FifoTxRdClock_i ) begin
  154. if (FifoTxRst_i) begin
  155. txFifoRdPtr <= 8'h0;
  156. end
  157. else begin
  158. if (fifoTxReadEn ) begin
  159. txFifoRdPtr <= txFifoRdPtr + 1'b1;
  160. end
  161. end
  162. end
  163. always @(posedge FifoRxWrClock_i) begin
  164. if (FifoRxRst_i) begin
  165. rxFifoWrPtr <= 8'h0;
  166. end
  167. else begin
  168. if (fifoRxWriteEn ) begin
  169. rxFifoWrPtr <= rxFifoWrPtr + 1'b1;
  170. end
  171. end
  172. end
  173. always @(posedge FifoRxRdClock_i) begin
  174. if (FifoRxRstRdPtr_i) begin
  175. rxFifoRdPtr <= 8'h0;
  176. end
  177. else begin
  178. if (fifoRxReadEn ) begin
  179. rxFifoRdPtr <= rxFifoRdPtr + 1'b1;
  180. end
  181. end
  182. end
  183. always @(posedge FifoRxRdClock_i) begin
  184. if (FifoRxRstRdPtr_i) begin
  185. rxFifoUpDnCnt <= 8'h0;
  186. end
  187. else begin
  188. rxFifoUpDnCnt <= rxFifoWrPtrSync - rxFifoRdPtr;
  189. end
  190. end
  191. always @(posedge FifoTxRdClock_i) begin
  192. if (FifoTxRst_i) begin
  193. txFifoUpDnCnt <= 8'h0;
  194. end
  195. else begin
  196. txFifoUpDnCnt <= txFifoWrPtrSync - txFifoRdPtr;
  197. end
  198. end
  199. // //================================================================================
  200. endmodule