FifoCtrl.v 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  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(FifoTxWrClock_i),
  86. // .ClkSlow_i(FifoTxRdClock_i),
  87. // .TxFifoWrPtr_i(txFifoWrPtr),
  88. // .TxFifoWrPtr_o(txFifoWrPtrSync)
  89. // );
  90. // RxFifoRstSync #(
  91. // .WIDTH(1),
  92. // .STAGES(3)
  93. // )
  94. // rxFifoRstSync (
  95. // .ClkFast_i(FifoRxWrClock_i),
  96. // .ClkSlow_i(FifoRxRdClock_i),
  97. // .RxFifoRst_i(FifoRxRst_i),
  98. // .RxFifoRst_o(rxFifoRstSync)
  99. // );
  100. TxFifoPtrSync #(
  101. .WIDTH(8),
  102. .STAGES(3)
  103. )
  104. txFifoPtrSync (
  105. .ClkFast_i(FifoTxRdClock_i),
  106. .ClkSlow_i(FifoTxWrClock_i),
  107. .TxFifoWrPtr_i(txFifoRdPtr),
  108. .TxFifoWrPtr_o(txFifoRdPtrSync)
  109. );
  110. always @(posedge FifoRxRdClock_i) begin
  111. if (FifoRxRstRdPtr_i) begin
  112. readEnCnt <= 1'b0;
  113. end
  114. else begin
  115. if (ToFifoRxReadVal_i) begin
  116. readEnCnt <= readEnCnt + 1'b1;
  117. end
  118. else begin
  119. readEnCnt <= 1'b0;
  120. end
  121. end
  122. end
  123. always @(posedge FifoTxWrClock_i) begin
  124. if (ToFifoTxWriteVal_i && !FifoTxFull_i) begin
  125. fifoTxWriteEn <= 1'b1;
  126. end
  127. else begin
  128. fifoTxWriteEn <= 1'b0;
  129. end
  130. end
  131. always @(posedge FifoTxRdClock_i ) begin
  132. if (ToFifoTxReadVal_i && !FifoTxEmpty_i) begin
  133. fifoTxReadEn <= 1'b1;
  134. end
  135. else begin
  136. fifoTxReadEn <= 1'b0;
  137. end
  138. end
  139. always @(posedge FifoRxWrClock_i) begin
  140. if (ToFifoRxWriteVal_i && !FifoRxFull_i) begin
  141. fifoRxWriteEn <= 1'b1;
  142. end
  143. else begin
  144. fifoRxWriteEn <= 1'b0;
  145. end
  146. end
  147. always @(posedge FifoRxRdClock_i) begin
  148. if (ToFifoRxReadVal_i && !FifoRxEmpty_i && requestToFifo && readEnCnt < 1 ) begin
  149. fifoRxReadEn <= 1'b1;
  150. end
  151. else begin
  152. fifoRxReadEn <= 1'b0;
  153. end
  154. end
  155. always @(posedge FifoTxWrClock_i ) begin
  156. if (FifoTxRstWrPtr_i) begin
  157. txFifoWrPtr <= 8'h0;
  158. end
  159. else begin
  160. if (fifoTxWriteEn ) begin
  161. txFifoWrPtr <= txFifoWrPtr + 1'b1;
  162. end
  163. end
  164. end
  165. always @(posedge FifoTxRdClock_i ) begin
  166. if (FifoTxRst_i) begin
  167. txFifoRdPtr <= 8'h0;
  168. end
  169. else begin
  170. if (fifoTxReadEn ) begin
  171. txFifoRdPtr <= txFifoRdPtr + 1'b1;
  172. end
  173. end
  174. end
  175. always @(posedge FifoRxWrClock_i) begin
  176. if (FifoRxRst_i) begin
  177. rxFifoWrPtr <= 8'h0;
  178. end
  179. else begin
  180. if (fifoRxWriteEn ) begin
  181. rxFifoWrPtr <= rxFifoWrPtr + 1'b1;
  182. end
  183. end
  184. end
  185. always @(posedge FifoRxRdClock_i) begin
  186. if (FifoRxRstRdPtr_i) begin
  187. rxFifoRdPtr <= 8'h0;
  188. end
  189. else begin
  190. if (fifoRxReadEn ) begin
  191. rxFifoRdPtr <= rxFifoRdPtr + 1'b1;
  192. end
  193. end
  194. end
  195. always @(posedge FifoRxRdClock_i) begin
  196. if (FifoRxRstRdPtr_i) begin
  197. rxFifoUpDnCnt <= 8'h0;
  198. end
  199. else begin
  200. rxFifoUpDnCnt <= rxFifoWrPtrSync - rxFifoRdPtr;
  201. end
  202. end
  203. always @(posedge FifoTxWrClock_i) begin
  204. if (FifoTxRst_i) begin
  205. txFifoUpDnCnt <= 8'h0;
  206. end
  207. else begin
  208. txFifoUpDnCnt <= txFifoWrPtr - txFifoRdPtrSync;
  209. end
  210. end
  211. // always @(posedge FifoTxWrClock_i) begin
  212. // if (FifoTxRstWrPtr_i) begin
  213. // emptyFlagTxForDsp <= 1'b1;
  214. // end
  215. // else begin
  216. // if (txFifoWrPtr == txFifoRdPtr) begin
  217. // emptyFlagTxForDsp <= 1'b1;
  218. // end
  219. // else begin
  220. // emptyFlagTxForDsp <= 1'b0;
  221. // end
  222. // end
  223. // end
  224. always @(*) begin
  225. if (txFifoUpDnCnt == 8'h0) begin
  226. emptyFlagTxForDsp <= 1'b1;
  227. end
  228. else begin
  229. emptyFlagTxForDsp <= 1'b0;
  230. end
  231. end
  232. // //================================================================================
  233. endmodule