DataMuxer.v 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. //////////////////////////////////////////////////////////////////////////////////
  2. // Company: TAIR
  3. // Engineer:
  4. //
  5. // Create Date: 10/30/2023 11:24:31 AM
  6. // Design Name:
  7. // Module Name: SmcInDataMux
  8. // Project Name: S5443_V3_FPGA3
  9. // Target Devices: BOARD: BY5443v3. FPGA: xc7s25csga225-2
  10. // Tool Versions:
  11. // Description:
  12. //
  13. // Dependencies:
  14. //
  15. // Revision:
  16. // Revision 1.0 - File Created
  17. // Additional Comments:
  18. //
  19. //////////////////////////////////////////////////////////////////////////////////
  20. module SmcInDataMux
  21. #(
  22. parameter CMD_REG_WIDTH = 16,
  23. parameter ADDR_REG_WIDTH = 12,
  24. parameter FIFO_NUM = 7,
  25. parameter FIFO_0_WRITE_LSB_ADDR = 12'h0+12'd24,
  26. parameter FIFO_0_WRITE_MSB_ADDR = 12'h0+12'd26,
  27. parameter FIFO_1_WRITE_LSB_ADDR = 12'h50+12'd24,
  28. parameter FIFO_1_WRITE_MSB_ADDR = 12'h50+12'd26,
  29. parameter FIFO_2_WRITE_LSB_ADDR = 12'hf0+12'd24,
  30. parameter FIFO_2_WRITE_MSB_ADDR = 12'hf0+12'd26,
  31. parameter FIFO_3_WRITE_LSB_ADDR = 12'h140+12'd24,
  32. parameter FIFO_3_WRITE_MSB_ADDR = 12'h140+12'd26,
  33. parameter FIFO_4_WRITE_LSB_ADDR = 12'h190+12'd24,
  34. parameter FIFO_4_WRITE_MSB_ADDR = 12'h190+12'd26,
  35. parameter FIFO_5_WRITE_LSB_ADDR = 12'h1e0+12'd24,
  36. parameter FIFO_5_WRITE_MSB_ADDR = 12'h1e0+12'd26,
  37. parameter FIFO_6_WRITE_LSB_ADDR = 12'h230+12'd24,
  38. parameter FIFO_6_WRITE_MSB_ADDR = 12'h230+12'd26,
  39. parameter FIFO_0_READ_LSB_ADDR = 12'h0+12'd28,
  40. parameter FIFO_0_READ_MSB_ADDR = 12'h0+12'd30,
  41. parameter FIFO_1_READ_LSB_ADDR = 12'h50+12'd28,
  42. parameter FIFO_1_READ_MSB_ADDR = 12'h50+12'd30,
  43. parameter FIFO_2_READ_LSB_ADDR = 12'hf0+12'd28,
  44. parameter FIFO_2_READ_MSB_ADDR = 12'hf0+12'd30,
  45. parameter FIFO_3_READ_LSB_ADDR = 12'h140+12'd28,
  46. parameter FIFO_3_READ_MSB_ADDR = 12'h140+12'd30,
  47. parameter FIFO_4_READ_LSB_ADDR = 12'h190+12'd28,
  48. parameter FIFO_4_READ_MSB_ADDR = 12'h190+12'd30,
  49. parameter FIFO_5_READ_LSB_ADDR = 12'h1e0+12'd28,
  50. parameter FIFO_5_READ_MSB_ADDR = 12'h1e0+12'd30,
  51. parameter FIFO_6_READ_LSB_ADDR = 12'h230+12'd28,
  52. parameter FIFO_6_READ_MSB_ADDR = 12'h230+12'd30
  53. )
  54. (
  55. input Clk_i,
  56. input Rst_i,
  57. input SmcVal_i,
  58. input [CMD_REG_WIDTH-1:0] SmcData_i,
  59. input [ADDR_REG_WIDTH-1:0] SmcAddr_i,
  60. output RequestToFifo_o,
  61. output reg ToRegMapVal_o,
  62. output reg [CMD_REG_WIDTH-1:0] ToRegMapData_o,
  63. output reg [ADDR_REG_WIDTH-1:0] ToRegMapAddr_o,
  64. output reg [FIFO_NUM-1:0] ToFifoVal_o,
  65. output reg [CMD_REG_WIDTH*2*FIFO_NUM-1:0] ToFifoData_o
  66. );
  67. //================================================================================
  68. // REG/WIRE
  69. //================================================================================
  70. wire requestToFifo0 =((SmcAddr_i==FIFO_0_WRITE_LSB_ADDR||SmcAddr_i==FIFO_0_WRITE_MSB_ADDR)|| (SmcAddr_i==FIFO_0_READ_LSB_ADDR||SmcAddr_i==FIFO_0_READ_MSB_ADDR));
  71. wire requestToFifo1 =((SmcAddr_i==FIFO_1_WRITE_LSB_ADDR||SmcAddr_i==FIFO_1_WRITE_MSB_ADDR)|| (SmcAddr_i==FIFO_1_READ_LSB_ADDR||SmcAddr_i==FIFO_1_READ_MSB_ADDR));
  72. wire requestToFifo2 =((SmcAddr_i==FIFO_2_WRITE_LSB_ADDR||SmcAddr_i==FIFO_2_WRITE_MSB_ADDR)|| (SmcAddr_i==FIFO_2_READ_LSB_ADDR||SmcAddr_i==FIFO_2_READ_MSB_ADDR));
  73. wire requestToFifo3 =((SmcAddr_i==FIFO_3_WRITE_LSB_ADDR||SmcAddr_i==FIFO_3_WRITE_MSB_ADDR)|| (SmcAddr_i==FIFO_3_READ_LSB_ADDR||SmcAddr_i==FIFO_3_READ_MSB_ADDR));
  74. wire requestToFifo4 =((SmcAddr_i==FIFO_4_WRITE_LSB_ADDR||SmcAddr_i==FIFO_4_WRITE_MSB_ADDR)|| (SmcAddr_i==FIFO_4_READ_LSB_ADDR||SmcAddr_i==FIFO_4_READ_MSB_ADDR));
  75. wire requestToFifo5 =((SmcAddr_i==FIFO_5_WRITE_LSB_ADDR||SmcAddr_i==FIFO_5_WRITE_MSB_ADDR)|| (SmcAddr_i==FIFO_5_READ_LSB_ADDR||SmcAddr_i==FIFO_5_READ_MSB_ADDR));
  76. wire requestToFifo6 =((SmcAddr_i==FIFO_6_WRITE_LSB_ADDR||SmcAddr_i==FIFO_6_WRITE_MSB_ADDR)|| (SmcAddr_i==FIFO_6_READ_LSB_ADDR||SmcAddr_i==FIFO_6_READ_MSB_ADDR));
  77. wire requestToFifo = (requestToFifo0|requestToFifo1|requestToFifo2|requestToFifo3|requestToFifo4|requestToFifo5|requestToFifo6);
  78. //================================================================================
  79. // ASSIGNMENTS
  80. //================================================================================
  81. assign RequestToFifo_o = requestToFifo;
  82. //================================================================================
  83. // LOCALPARAMS
  84. //================================================================================
  85. //================================================================================
  86. // CODING
  87. //================================================================================
  88. always @(posedge Clk_i or posedge Rst_i) begin
  89. if (Rst_i) begin
  90. ToRegMapVal_o <= 1'b0;
  91. ToRegMapData_o <= 16'h0;
  92. ToRegMapAddr_o <= 12'h0;
  93. ToFifoVal_o <= 7'h0;
  94. ToFifoData_o <= 0;
  95. end else begin
  96. if (requestToFifo) begin
  97. case(SmcAddr_i)
  98. FIFO_0_WRITE_LSB_ADDR: begin
  99. ToFifoVal_o[0] <= 1'b0;
  100. ToFifoData_o[CMD_REG_WIDTH*0+:CMD_REG_WIDTH] <= SmcData_i;
  101. end
  102. FIFO_0_WRITE_MSB_ADDR: begin
  103. ToFifoVal_o[0] <= SmcVal_i;
  104. ToFifoData_o[CMD_REG_WIDTH*1+:CMD_REG_WIDTH] <= SmcData_i;
  105. end
  106. FIFO_1_WRITE_LSB_ADDR: begin
  107. ToFifoVal_o[1] <= 1'b0;
  108. ToFifoData_o[CMD_REG_WIDTH*2+:CMD_REG_WIDTH] <= SmcData_i;
  109. end
  110. FIFO_1_WRITE_MSB_ADDR: begin
  111. ToFifoVal_o[1] <= SmcVal_i;
  112. ToFifoData_o[CMD_REG_WIDTH*3+:CMD_REG_WIDTH] <= SmcData_i;
  113. end
  114. FIFO_2_WRITE_LSB_ADDR: begin
  115. ToFifoVal_o[2] <= 1'b0;
  116. ToFifoData_o[CMD_REG_WIDTH*4+:CMD_REG_WIDTH] <= SmcData_i;
  117. end
  118. FIFO_2_WRITE_MSB_ADDR: begin
  119. ToFifoVal_o[2] <= SmcVal_i;
  120. ToFifoData_o[CMD_REG_WIDTH*5+:CMD_REG_WIDTH] <= SmcData_i;
  121. end
  122. FIFO_3_WRITE_LSB_ADDR: begin
  123. ToFifoVal_o[3] <= 1'b0;
  124. ToFifoData_o[CMD_REG_WIDTH*6+:CMD_REG_WIDTH] <= SmcData_i;
  125. end
  126. FIFO_3_WRITE_MSB_ADDR: begin
  127. ToFifoVal_o[3] <= SmcVal_i;
  128. ToFifoData_o[CMD_REG_WIDTH*7+:CMD_REG_WIDTH] <= SmcData_i;
  129. end
  130. FIFO_4_WRITE_LSB_ADDR: begin
  131. ToFifoVal_o[4] <= 1'b0;
  132. ToFifoData_o[CMD_REG_WIDTH*8+:CMD_REG_WIDTH] <= SmcData_i;
  133. end
  134. FIFO_4_WRITE_MSB_ADDR: begin
  135. ToFifoVal_o[4] <= SmcVal_i;
  136. ToFifoData_o[CMD_REG_WIDTH*9+:CMD_REG_WIDTH] <= SmcData_i;
  137. end
  138. FIFO_5_WRITE_LSB_ADDR: begin
  139. ToFifoVal_o[5] <= 1'b0;
  140. ToFifoData_o[CMD_REG_WIDTH*10+:CMD_REG_WIDTH] <= SmcData_i;
  141. end
  142. FIFO_5_WRITE_MSB_ADDR: begin
  143. ToFifoVal_o[5] <= SmcVal_i;
  144. ToFifoData_o[CMD_REG_WIDTH*11+:CMD_REG_WIDTH] <= SmcData_i;
  145. end
  146. FIFO_6_WRITE_LSB_ADDR: begin
  147. ToFifoVal_o[6] <= 1'b0;
  148. ToFifoData_o[CMD_REG_WIDTH*12+:CMD_REG_WIDTH] <= SmcData_i;
  149. end
  150. FIFO_6_WRITE_MSB_ADDR: begin
  151. ToFifoVal_o[6] <= SmcVal_i;
  152. ToFifoData_o[CMD_REG_WIDTH*13+:CMD_REG_WIDTH] <= SmcData_i;
  153. end
  154. endcase
  155. ToRegMapAddr_o <= 0;
  156. ToRegMapVal_o <= 0;
  157. end else begin
  158. ToRegMapVal_o <= SmcVal_i;
  159. ToFifoVal_o <= 7'h0;
  160. ToRegMapData_o <= SmcData_i;
  161. ToRegMapAddr_o <= SmcAddr_i;
  162. ToFifoData_o <= 0;
  163. end
  164. end
  165. end
  166. endmodule