DataMuxer.v 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. module SmcDataMux
  2. #(
  3. parameter CmdRegWidth = 16,
  4. parameter AddrRegWidth= 12,
  5. parameter FifoNum = 7,
  6. // parameter Fifo0WriteLsbAddr = 12'h0+12'h24,
  7. // parameter Fifo0WriteMsbAddr = 12'h0+12'h26,
  8. // parameter Fifo1WriteLsbAddr = 12'h50+12'h24,
  9. // parameter Fifo2WriteMsbAddr = 12'hF0+12'h26,
  10. // parameter Fifo3WriteLsbAddr = 12'h140+12'h24,
  11. // parameter Fifo4WriteMsbAddr = 12'h190+12'h26,
  12. // parameter Fifo5WriteLsbAddr = 12'h1e0+12'h24,
  13. // parameter Fifo6WriteMsbAddr = 12'h230+12'h26
  14. parameter Fifo0WriteLsbAddr = 12'h0+12'h0,
  15. parameter Fifo0WriteMsbAddr = 12'h0+12'h2,
  16. parameter Fifo1WriteLsbAddr = 12'h0+12'h4,
  17. parameter Fifo1WriteMsbAddr = 12'h0+12'h6,
  18. parameter Fifo2WriteLsbAddr = 12'h0+12'h8,
  19. parameter Fifo2WriteMsbAddr = 12'h00+12'ha,
  20. parameter Fifo3WriteLsbAddr = 12'h0+12'hc,
  21. parameter Fifo3WriteMsbAddr = 12'h0+12'he,
  22. parameter Fifo4WriteLsbAddr = 12'h0+12'h10,
  23. parameter Fifo4WriteMsbAddr = 12'h190+12'h9,
  24. parameter Fifo5WriteLsbAddr = 12'h1e0+12'h10,
  25. parameter Fifo5WriteMsbAddr = 12'h1e0+12'h11,
  26. parameter Fifo6WriteLsbAddr = 12'h230+12'h12,
  27. parameter Fifo6WriteMsbAddr = 12'h230+12'h13
  28. )
  29. (
  30. input Clk_i,
  31. input Rst_i,
  32. input SmcVal_i,
  33. input [CmdRegWidth-1:0] SmcData_i,
  34. input [AddrRegWidth-1:0] SmcAddr_i,
  35. output reg ToRegMapVal_o,
  36. output reg [CmdRegWidth-1:0] ToRegMapData_o,
  37. output reg [AddrRegWidth-1:0] ToRegMapAddr_o,
  38. output reg [FifoNum-1:0] ToFifoVal_o,
  39. output reg [CmdRegWidth*2*FifoNum-1:0] ToFifoData_o
  40. );
  41. //================================================================================
  42. // REG/WIRE
  43. //================================================================================
  44. wire requestToFifo0 = (SmcAddr_i==Fifo0WriteLsbAddr||SmcAddr_i==Fifo0WriteMsbAddr);
  45. wire requestToFifo1 = (SmcAddr_i==Fifo1WriteLsbAddr||SmcAddr_i==Fifo1WriteMsbAddr);
  46. wire requestToFifo2 = (SmcAddr_i==Fifo2WriteLsbAddr||SmcAddr_i==Fifo2WriteMsbAddr);
  47. wire requestToFifo3 = (SmcAddr_i==Fifo3WriteLsbAddr||SmcAddr_i==Fifo3WriteMsbAddr);
  48. wire requestToFifo4 = (SmcAddr_i==Fifo4WriteLsbAddr||SmcAddr_i==Fifo4WriteMsbAddr);
  49. wire requestToFifo5 = (SmcAddr_i==Fifo5WriteLsbAddr||SmcAddr_i==Fifo5WriteMsbAddr);
  50. wire requestToFifo6 = (SmcAddr_i==Fifo6WriteLsbAddr||SmcAddr_i==Fifo6WriteMsbAddr);
  51. wire requestToFifo = (requestToFifo0|requestToFifo1|requestToFifo2|requestToFifo3|requestToFifo4|requestToFifo5|requestToFifo6);
  52. //================================================================================
  53. // ASSIGNMENTS
  54. //================================================================================
  55. //================================================================================
  56. // LOCALPARAMS
  57. //================================================================================
  58. //================================================================================
  59. // CODING
  60. //================================================================================
  61. always @(posedge Clk_i or posedge Rst_i) begin
  62. if (Rst_i) begin
  63. ToRegMapVal_o <= 1'b0;
  64. ToRegMapData_o <= 16'h0;
  65. ToRegMapAddr_o <= 12'h0;
  66. ToFifoVal_o <= 7'h0;
  67. ToFifoData_o <= 16'h0;
  68. end else begin
  69. if (requestToFifo) begin
  70. case(SmcAddr_i)
  71. Fifo0WriteLsbAddr: begin
  72. ToFifoVal_o[0] <= 1'b0;
  73. ToFifoData_o[CmdRegWidth*0+:CmdRegWidth] <= SmcData_i;
  74. end
  75. Fifo0WriteMsbAddr: begin
  76. ToFifoVal_o[0] <= SmcVal_i;
  77. ToFifoData_o[CmdRegWidth*1+:CmdRegWidth] <= SmcData_i;
  78. end
  79. Fifo1WriteLsbAddr: begin
  80. ToFifoVal_o[1] <= 1'b0;
  81. ToFifoData_o[CmdRegWidth*2+:CmdRegWidth] <= SmcData_i;
  82. end
  83. Fifo1WriteMsbAddr: begin
  84. ToFifoVal_o[1] <= SmcVal_i;
  85. ToFifoData_o[CmdRegWidth*3+:CmdRegWidth] <= SmcData_i;
  86. end
  87. Fifo2WriteLsbAddr: begin
  88. ToFifoVal_o[2] <= 1'b0;
  89. ToFifoData_o[CmdRegWidth*4+:CmdRegWidth] <= SmcData_i;
  90. end
  91. Fifo2WriteMsbAddr: begin
  92. ToFifoVal_o[2] <= SmcVal_i;
  93. ToFifoData_o[CmdRegWidth*5+:CmdRegWidth] <= SmcData_i;
  94. end
  95. Fifo3WriteLsbAddr: begin
  96. ToFifoVal_o[3] <= 1'b0;
  97. ToFifoData_o[CmdRegWidth*6+:CmdRegWidth] <= SmcData_i;
  98. end
  99. Fifo3WriteMsbAddr: begin
  100. ToFifoVal_o[3] <= SmcVal_i;
  101. ToFifoData_o[CmdRegWidth*7+:CmdRegWidth] <= SmcData_i;
  102. end
  103. Fifo4WriteLsbAddr: begin
  104. ToFifoVal_o[4] <= 1'b0;
  105. ToFifoData_o[CmdRegWidth*8+:CmdRegWidth] <= SmcData_i;
  106. end
  107. Fifo4WriteMsbAddr: begin
  108. ToFifoVal_o[4] <= SmcVal_i;
  109. ToFifoData_o[CmdRegWidth*9+:CmdRegWidth] <= SmcData_i;
  110. end
  111. Fifo5WriteLsbAddr: begin
  112. ToFifoVal_o[5] <= 1'b0;
  113. ToFifoData_o[CmdRegWidth*10+:CmdRegWidth] <= SmcData_i;
  114. end
  115. Fifo5WriteMsbAddr: begin
  116. ToFifoVal_o[5] <= SmcVal_i;
  117. ToFifoData_o[CmdRegWidth*11+:CmdRegWidth] <= SmcData_i;
  118. end
  119. Fifo6WriteLsbAddr: begin
  120. ToFifoVal_o[6] <= 1'b0;
  121. ToFifoData_o[CmdRegWidth*12+:CmdRegWidth] <= SmcData_i;
  122. end
  123. Fifo6WriteMsbAddr: begin
  124. ToFifoVal_o[6] <= SmcVal_i;
  125. ToFifoData_o[CmdRegWidth*13+:CmdRegWidth] <= SmcData_i;
  126. end
  127. endcase
  128. end else begin
  129. ToRegMapVal_o <= SmcVal_i;
  130. ToRegMapData_o <= SmcData_i;
  131. ToRegMapAddr_o <= SmcAddr_i;
  132. end
  133. end
  134. end
  135. endmodule