FifoCtrl.v 5.3 KB

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