FifoCtrl.v 6.0 KB

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