FifoCtrl.v 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. //////////////////////////////////////////////////////////////////////////////////
  2. // Company: TAIR
  3. // Engineer:
  4. //
  5. // Create Date: 10/30/2023 11:24:31 AM
  6. // Design Name:
  7. // Module Name: FifoCtrl
  8. // Project Name: S5443_V3_FPGA3
  9. // Target Devices: BOARD: BY5443v3. FPGA: xc7s25csga225-2
  10. // Tool Versions:
  11. // Description: This module generate controll signals for FIFO's
  12. //
  13. // Dependencies:
  14. //
  15. // Revision:
  16. // Revision 1.0 - File Created
  17. // Additional Comments:
  18. //
  19. //////////////////////////////////////////////////////////////////////////////////
  20. module FifoCtrl #(
  21. parameter FIFO_0_READ_MSB_ADDR = 12'h0+12'd28,
  22. parameter FIFO_1_READ_MSB_ADDR = 12'h50+12'd28,
  23. parameter FIFO_2_READ_MSB_ADDR = 12'hf0+12'd28,
  24. parameter FIFO_3_READ_MSB_ADDR = 12'h140+12'd28,
  25. parameter FIFO_4_READ_MSB_ADDR = 12'h190+12'd28,
  26. parameter FIFO_5_READ_MSB_ADDR = 12'h1e0+12'd28,
  27. parameter FIFO_6_READ_MSB_ADDR = 12'h230+12'd28,
  28. parameter STAGES = 3
  29. )
  30. (
  31. input ToFifoTxWriteVal_i,
  32. input ToFifoTxReadVal_i,
  33. input ToFifoRxWriteVal_i,
  34. input ToFifoRxReadVal_i,
  35. input FifoTxFull_i,
  36. input FifoTxEmpty_i,
  37. input FifoRxFull_i,
  38. input FifoRxEmpty_i,
  39. input [11:0] SmcAddr_i,
  40. input FifoTxWrClock_i,
  41. input FifoTxRdClock_i,
  42. input FifoRxWrClock_i,
  43. input FifoRxRdClock_i,
  44. input FifoTxRst_i,
  45. input FifoRxRst_i,
  46. input FifoTxRstWrPtr_i,
  47. input FifoRxRstRdPtr_i,
  48. output [7:0] RxFifoUpDnCnt_o,
  49. output [7:0] TxFifoUpDnCnt_o,
  50. output EmptyFlagTxForDsp_o,
  51. output FifoTxWriteEn_o,
  52. output FifoTxReadEn_o,
  53. output FifoRxWriteEn_o,
  54. output FifoRxReadEn_o
  55. );
  56. //================================================================================
  57. // REG/WIRE
  58. //================================================================================
  59. reg fifoTxWriteEn;
  60. reg fifoTxReadEn;
  61. reg fifoRxWriteEn;
  62. reg fifoRxReadEn;
  63. (* dont_touch = "true" *)reg [7:0] txFifoWrPtr;
  64. (* dont_touch = "true" *)reg [7:0] txFifoRdPtr;
  65. (* dont_touch = "true" *)reg [7:0] rxFifoWrPtr;
  66. (* dont_touch = "true" *)reg [7:0] rxFifoRdPtr;
  67. (* dont_touch = "true" *)reg [7:0] rxFifoUpDnCnt;
  68. (* dont_touch = "true" *)reg [7:0] txFifoUpDnCnt;
  69. reg [1:0] readEnCnt;
  70. reg emptyFlagTxForDsp;
  71. wire requestToFifo0 = (SmcAddr_i == FIFO_0_READ_MSB_ADDR) ? 1'b1 : 1'b0;
  72. wire requestToFifo1 = (SmcAddr_i == FIFO_1_READ_MSB_ADDR) ? 1'b1 : 1'b0;
  73. wire requestToFifo2 = (SmcAddr_i == FIFO_2_READ_MSB_ADDR) ? 1'b1 : 1'b0;
  74. wire requestToFifo3 = (SmcAddr_i == FIFO_3_READ_MSB_ADDR) ? 1'b1 : 1'b0;
  75. wire requestToFifo4 = (SmcAddr_i == FIFO_4_READ_MSB_ADDR) ? 1'b1 : 1'b0;
  76. wire requestToFifo5 = (SmcAddr_i == FIFO_5_READ_MSB_ADDR) ? 1'b1 : 1'b0;
  77. wire requestToFifo6 = (SmcAddr_i == FIFO_6_READ_MSB_ADDR) ? 1'b1 : 1'b0;
  78. wire requestToFifo = (requestToFifo0|requestToFifo1|requestToFifo2|requestToFifo3|requestToFifo4|requestToFifo5|requestToFifo6) ? 1'b1 : 1'b0;
  79. wire [7:0] rxFifoWrPtrSync;
  80. wire [7:0] txFifoWrPtrSync;
  81. wire [7:0] txFifoRdPtrSync;
  82. wire rxFifoRstSync;
  83. //================================================================================
  84. // ASSIGNMENTS
  85. //================================================================================
  86. assign FifoTxWriteEn_o = fifoTxWriteEn;
  87. assign FifoTxReadEn_o = fifoTxReadEn;
  88. assign FifoRxWriteEn_o = fifoRxWriteEn;
  89. assign FifoRxReadEn_o = fifoRxReadEn;
  90. assign RxFifoUpDnCnt_o = rxFifoUpDnCnt;
  91. assign TxFifoUpDnCnt_o = txFifoUpDnCnt;
  92. assign EmptyFlagTxForDsp_o = emptyFlagTxForDsp;
  93. //================================================================================
  94. // LOCALPARAMS
  95. //================================================================================
  96. //================================================================================
  97. // CODING
  98. //================================================================================
  99. RxFifoPtrSync #(
  100. .WIDTH (8),
  101. .STAGES (STAGES)
  102. )
  103. rxFifoPtrSync (
  104. .ClkFast_i (FifoRxWrClock_i),
  105. .ClkSlow_i (FifoRxRdClock_i),
  106. .RxFifoWrPtr_i (rxFifoWrPtr),
  107. .RxFifoWrPtr_o (rxFifoWrPtrSync)
  108. );
  109. TxFifoPtrSync #(
  110. .WIDTH (8),
  111. .STAGES (STAGES)
  112. )
  113. txFifoPtrSync (
  114. .ClkFast_i(FifoTxRdClock_i),
  115. .ClkSlow_i(FifoTxWrClock_i),
  116. .TxFifoWrPtr_i(txFifoRdPtr),
  117. .TxFifoWrPtr_o(txFifoRdPtrSync)
  118. );
  119. always @(posedge FifoRxRdClock_i) begin
  120. if (FifoRxRstRdPtr_i) begin
  121. readEnCnt <= 1'b0;
  122. end
  123. else begin
  124. if (ToFifoRxReadVal_i) begin
  125. readEnCnt <= readEnCnt + 1'b1;
  126. end
  127. else begin
  128. readEnCnt <= 1'b0;
  129. end
  130. end
  131. end
  132. always @(posedge FifoTxWrClock_i) begin
  133. if (ToFifoTxWriteVal_i && !FifoTxFull_i) begin
  134. fifoTxWriteEn <= 1'b1;
  135. end
  136. else begin
  137. fifoTxWriteEn <= 1'b0;
  138. end
  139. end
  140. always @(posedge FifoTxRdClock_i) begin
  141. if (ToFifoTxReadVal_i && !FifoTxEmpty_i) begin
  142. fifoTxReadEn <= 1'b1;
  143. end
  144. else begin
  145. fifoTxReadEn <= 1'b0;
  146. end
  147. end
  148. always @(posedge FifoRxWrClock_i) begin
  149. if (ToFifoRxWriteVal_i && !FifoRxFull_i) begin
  150. fifoRxWriteEn <= 1'b1;
  151. end
  152. else begin
  153. fifoRxWriteEn <= 1'b0;
  154. end
  155. end
  156. always @(posedge FifoRxRdClock_i) begin
  157. if (ToFifoRxReadVal_i && !FifoRxEmpty_i && requestToFifo && readEnCnt < 1 ) begin
  158. fifoRxReadEn <= 1'b1;
  159. end
  160. else begin
  161. fifoRxReadEn <= 1'b0;
  162. end
  163. end
  164. always @(posedge FifoTxWrClock_i) begin
  165. if (FifoTxRstWrPtr_i) begin
  166. txFifoWrPtr <= 8'h0;
  167. end
  168. else begin
  169. if (fifoTxWriteEn ) begin
  170. txFifoWrPtr <= txFifoWrPtr + 1'b1;
  171. end
  172. end
  173. end
  174. always @(posedge FifoTxRdClock_i) begin
  175. if (FifoTxRst_i) begin
  176. txFifoRdPtr <= 8'h0;
  177. end
  178. else begin
  179. if (fifoTxReadEn) begin
  180. txFifoRdPtr <= txFifoRdPtr + 1'b1;
  181. end
  182. end
  183. end
  184. always @(posedge FifoRxWrClock_i) begin
  185. if (FifoRxRst_i) begin
  186. rxFifoWrPtr <= 8'h0;
  187. end
  188. else begin
  189. if (fifoRxWriteEn) begin
  190. rxFifoWrPtr <= rxFifoWrPtr + 1'b1;
  191. end
  192. end
  193. end
  194. always @(posedge FifoRxRdClock_i) begin
  195. if (FifoRxRstRdPtr_i) begin
  196. rxFifoRdPtr <= 8'h0;
  197. end
  198. else begin
  199. if (fifoRxReadEn) begin
  200. rxFifoRdPtr <= rxFifoRdPtr + 1'b1;
  201. end
  202. end
  203. end
  204. always @(posedge FifoRxRdClock_i) begin
  205. if (FifoRxRstRdPtr_i) begin
  206. rxFifoUpDnCnt <= 8'h0;
  207. end
  208. else begin
  209. rxFifoUpDnCnt <= rxFifoWrPtrSync - rxFifoRdPtr;
  210. end
  211. end
  212. always @(posedge FifoTxWrClock_i) begin
  213. if (FifoTxRst_i) begin
  214. txFifoUpDnCnt <= 8'h0;
  215. end
  216. else begin
  217. txFifoUpDnCnt <= txFifoWrPtr - txFifoRdPtrSync;
  218. end
  219. end
  220. always @(*) begin
  221. if (txFifoUpDnCnt == 8'h0) begin
  222. emptyFlagTxForDsp <= 1'b1;
  223. end
  224. else begin
  225. emptyFlagTxForDsp <= 1'b0;
  226. end
  227. end
  228. endmodule