FifoCtrl.v 7.4 KB

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