SmcAnsMux.v 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. //////////////////////////////////////////////////////////////////////////////////
  2. // Company: TAIR
  3. // Engineer:
  4. //
  5. // Create Date: 10/30/2023 11:24:31 AM
  6. // Design Name:
  7. // Module Name: SmcAnsMux
  8. // Project Name: S5443_V3_FPGA3
  9. // Target Devices: BOARD: BY5443v3. FPGA: xc7s25csga225-2
  10. // Tool Versions:
  11. // Description: This module multiplexing the data either from FIFO or a RegMap
  12. // based on an address
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 1.0 - File Created
  18. // Additional Comments:
  19. //
  20. //////////////////////////////////////////////////////////////////////////////////
  21. module SmcAnsMux
  22. #(
  23. parameter CMD_REG_WIDTH = 32,
  24. parameter ADDR_REG_WIDTH = 12
  25. )
  26. (
  27. input Clk_i,
  28. input [ADDR_REG_WIDTH-1:0] Addr_i,
  29. input [ADDR_REG_WIDTH-1:0] ToRegMapAddr_i,
  30. input RequestToFifo_i,
  31. input FifoRxRst_i,
  32. input SmcAre_i,
  33. input [CMD_REG_WIDTH/2-1:0] DataFromRegMap_i,
  34. input [CMD_REG_WIDTH-1:0] DataFromRxFifo1_i,
  35. input [CMD_REG_WIDTH-1:0] DataFromRxFifo2_i,
  36. input [CMD_REG_WIDTH-1:0] DataFromRxFifo3_i,
  37. input [CMD_REG_WIDTH-1:0] DataFromRxFifo4_i,
  38. input [CMD_REG_WIDTH-1:0] DataFromRxFifo5_i,
  39. input [CMD_REG_WIDTH-1:0] DataFromRxFifo6_i,
  40. input [CMD_REG_WIDTH-1:0] DataFromRxFifo7_i,
  41. output [CMD_REG_WIDTH/2-1:0] AnsData_o
  42. );
  43. //================================================================================
  44. // REG/WIRE
  45. //================================================================================
  46. wire [0:31] dataFromRxFifo [6:0];
  47. wire [15:0] dataFromRegMap;
  48. reg [15:0] dataFromRxFifoR;
  49. reg [1:0] readEnCnt;
  50. (* dont_touch = "true" *)reg [CMD_REG_WIDTH/2-1:0] dataFromRxFifoR1;
  51. reg [CMD_REG_WIDTH-1:0] dataFromRxFifoR2;
  52. reg [CMD_REG_WIDTH-1:0] dataFromRxFifoR3;
  53. reg [CMD_REG_WIDTH-1:0] dataFromRxFifoR4;
  54. reg [CMD_REG_WIDTH-1:0] dataFromRxFifoR5;
  55. reg [CMD_REG_WIDTH-1:0] dataFromRxFifoR6;
  56. reg [CMD_REG_WIDTH-1:0] dataFromRxFifoR7;
  57. //================================================================================
  58. // ASSIGNMENTS
  59. //================================================================================
  60. assign dataFromRxFifo[0] = DataFromRxFifo1_i;
  61. assign dataFromRxFifo[1] = DataFromRxFifo2_i;
  62. assign dataFromRxFifo[2] = DataFromRxFifo3_i;
  63. assign dataFromRxFifo[3] = DataFromRxFifo4_i;
  64. assign dataFromRxFifo[4] = DataFromRxFifo5_i;
  65. assign dataFromRxFifo[5] = DataFromRxFifo6_i;
  66. assign dataFromRxFifo[6] = DataFromRxFifo7_i;
  67. assign dataFromRegMap = DataFromRegMap_i;
  68. assign AnsData_o = (!RequestToFifo_i) ? dataFromRegMap : dataFromRxFifoR;
  69. //================================================================================
  70. // LOCALPARAMS
  71. //================================================================================
  72. //================================================================================
  73. // CODING
  74. //================================================================================
  75. always @(posedge Clk_i) begin
  76. if (FifoRxRst_i) begin
  77. readEnCnt <= 1'b0;
  78. end
  79. else begin
  80. if (!SmcAre_i) begin
  81. readEnCnt <= readEnCnt + 1'b1;
  82. end
  83. else begin
  84. readEnCnt <= 1'b0;
  85. end
  86. end
  87. end
  88. always @(*) begin
  89. if (!SmcAre_i && readEnCnt < 1) begin
  90. case(Addr_i)
  91. 12'h1c: begin
  92. dataFromRxFifoR1 = DataFromRxFifo1_i[31:16];
  93. end
  94. 12'h6c: begin
  95. dataFromRxFifoR2 = DataFromRxFifo2_i;
  96. end
  97. 12'h10c: begin
  98. dataFromRxFifoR3 = DataFromRxFifo3_i;
  99. end
  100. 12'h15c: begin
  101. dataFromRxFifoR4 = DataFromRxFifo4_i;
  102. end
  103. 12'h1ac: begin
  104. dataFromRxFifoR5 = DataFromRxFifo5_i;
  105. end
  106. 12'h1fc: begin
  107. dataFromRxFifoR6 = DataFromRxFifo6_i;
  108. end
  109. 12'h24c: begin
  110. dataFromRxFifoR7 = DataFromRxFifo7_i;
  111. end
  112. endcase
  113. end
  114. end
  115. always @(*) begin
  116. case (Addr_i)
  117. 12'h1c: begin
  118. dataFromRxFifoR = DataFromRxFifo1_i[15:0];
  119. end
  120. 12'h1e: begin
  121. dataFromRxFifoR = dataFromRxFifoR1;
  122. end
  123. 12'h6c: begin
  124. dataFromRxFifoR = DataFromRxFifo2_i[15:0];
  125. end
  126. 12'h6e: begin
  127. dataFromRxFifoR = dataFromRxFifoR2[31:16];
  128. end
  129. 12'h10c: begin
  130. dataFromRxFifoR = DataFromRxFifo3_i[15:0];
  131. end
  132. 12'h10e: begin
  133. dataFromRxFifoR = dataFromRxFifoR3[31:16];
  134. end
  135. 12'h15c: begin
  136. dataFromRxFifoR = DataFromRxFifo4_i[15:0];
  137. end
  138. 12'h15e: begin
  139. dataFromRxFifoR = dataFromRxFifoR4[31:16];
  140. end
  141. 12'h1ac: begin
  142. dataFromRxFifoR = DataFromRxFifo5_i[15:0];
  143. end
  144. 12'h1ae: begin
  145. dataFromRxFifoR = dataFromRxFifoR5[31:16];
  146. end
  147. 12'h1fc: begin
  148. dataFromRxFifoR = DataFromRxFifo6_i[15:0];
  149. end
  150. 12'h1fe: begin
  151. dataFromRxFifoR = dataFromRxFifoR6[31:16];
  152. end
  153. 12'h24c: begin
  154. dataFromRxFifoR = DataFromRxFifo7_i[15:0];
  155. end
  156. 12'h24e: begin
  157. dataFromRxFifoR = dataFromRxFifoR7[31:16];
  158. end
  159. default: begin
  160. dataFromRxFifoR = 16'h0;
  161. end
  162. endcase
  163. end
  164. endmodule