FifoCtrl.v 6.8 KB

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