SmcInDataMux.v 7.1 KB

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