PacketAnalyzer4Mosi.v 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. ////////////////////////////////////////////////////////////////////////////////////////////
  2. // Company: TAIR
  3. // Engineer: Zaytsev Mikhail
  4. //
  5. // Create Date: 18/04/2024
  6. // Design Name:
  7. // Module Name: PacketAnalyzer4Mosi
  8. // Project Name: SB_TMSG44V1_FPGA
  9. // Target Devices: Board: SB_TMSG44v1. FPGA: GW1N-LV9PG256C6/I5
  10. // Tool versions:
  11. // Description: The module analyzes the input data bus DataFromSpi_i[23:0] by the
  12. // validity signal ValDataFromSpi_i. When a configuration packet is
  13. // received, it is captured into the internal register. Further, each
  14. // incoming data packet decrements the internal configuration register
  15. // until the internal configuration register is zero, which means that
  16. // the module is ready to receive the next configuration packet. Each
  17. // decrement sets the data validity bit for the specific end device.
  18. // The module also has an output signal Busy_o, which signals that
  19. // the module is in the state of processing the data received in
  20. // 4MOSI mode for writing to the FIFO.
  21. //
  22. // Dependencies:
  23. // Revision:
  24. // Revision 1.0 - File Created
  25. // Additional Comments:
  26. //
  27. ////////////////////////////////////////////////////////////////////////////////////////////
  28. module PacketAnalyzer4Mosi (
  29. input Clk_i,
  30. input Rst_i,
  31. input [23:0] DataFromSpi_i,
  32. input ValDataFromSpi_i,
  33. input BusyMosi1_i,
  34. output reg ValLmxDataToFifo_o,
  35. output reg ValDdsDataToFifo_o,
  36. output reg ValPotDataToFifo_o,
  37. output reg ValDacDataToFifo_o,
  38. output reg ValAttDataToFifo_o,
  39. output reg ValShRegDataToFifo_o,
  40. output reg ValMaxDataToFifo_o,
  41. output reg ValGpioDataToFifo_o,
  42. output reg Busy_o
  43. );
  44. //==========================================
  45. // Registers
  46. //==========================================
  47. reg [22:0] dataSpiReg;
  48. //==========================================
  49. // Wires
  50. //==========================================
  51. wire lmxOr;
  52. wire ddsOr;
  53. wire potOr;
  54. wire dacOr;
  55. wire attOr;
  56. wire shRegOr;
  57. wire maxOr;
  58. wire gpioOr;
  59. wire [7:0] selector;
  60. //==========================================
  61. // Parameters
  62. //==========================================
  63. localparam [22:0] DECREMENT_LMX = 23'h80000; //23'b000 1000 0000 0000 0000 0000
  64. localparam [22:0] DECREMENT_DDS = 23'h20000; //23'b000 0010 0000 0000 0000 0000
  65. localparam [22:0] DECREMENT_POT = 23'h10000; //23'b000 0001 0000 0000 0000 0000
  66. localparam [22:0] DECREMENT_DAC = 23'h8000; //23'b000 0000 1000 0000 0000 0000
  67. localparam [22:0] DECREMENT_ATT = 23'h4000; //23'b000 0000 0100 0000 0000 0000
  68. localparam [22:0] DECREMENT_SH_REG = 23'h1000; //23'b000 0000 0001 0000 0000 0000
  69. localparam [22:0] DECREMENT_MAX = 23'h200; //23'b000 0000 0000 0010 0000 0000
  70. localparam [22:0] DECREMENT_GPIO = 23'h80; //23'b000 0000 0000 0000 1000 0000
  71. //==========================================
  72. // Assignments
  73. //==========================================
  74. assign lmxOr = |dataSpiReg[22:19];
  75. assign ddsOr = |dataSpiReg[18:17];
  76. assign potOr = dataSpiReg[16];
  77. assign dacOr = dataSpiReg[15];
  78. assign attOr = dataSpiReg[14];
  79. assign shRegOr = |dataSpiReg[13:12];
  80. assign maxOr = |dataSpiReg[11:9];
  81. assign gpioOr = |dataSpiReg[8:7];
  82. assign selector = {lmxOr, ddsOr, potOr, dacOr, attOr, shRegOr, maxOr, gpioOr};
  83. //==========================================================================//
  84. // CODING //
  85. //==========================================================================//
  86. always @(posedge Clk_i) begin
  87. if (Rst_i) begin
  88. Busy_o <= 1'b0;
  89. end
  90. else if (dataSpiReg != 0) begin
  91. Busy_o <= 1'b1;
  92. end
  93. else begin
  94. Busy_o <= 1'b0;
  95. end
  96. end
  97. always @(posedge Clk_i) begin
  98. if (Rst_i || BusyMosi1_i) begin
  99. dataSpiReg <= 23'b0;
  100. ValLmxDataToFifo_o <= 1'b0;
  101. ValDdsDataToFifo_o <= 1'b0;
  102. ValPotDataToFifo_o <= 1'b0;
  103. ValDacDataToFifo_o <= 1'b0;
  104. ValAttDataToFifo_o <= 1'b0;
  105. ValShRegDataToFifo_o <= 1'b0;
  106. ValMaxDataToFifo_o <= 1'b0;
  107. ValGpioDataToFifo_o <= 1'b0;
  108. end
  109. else if (ValDataFromSpi_i) begin
  110. if ((dataSpiReg == 0) && (DataFromSpi_i[23] == 1'b1)) begin
  111. dataSpiReg <= DataFromSpi_i[22:0];
  112. end
  113. else begin
  114. casez(selector)
  115. 8'b1???????: begin //LMX
  116. dataSpiReg <= dataSpiReg - DECREMENT_LMX;
  117. ValLmxDataToFifo_o <= 1'b1;
  118. end
  119. 8'b01??????: begin //DDS
  120. dataSpiReg <= dataSpiReg - DECREMENT_DDS;
  121. ValDdsDataToFifo_o <= 1'b1;
  122. end
  123. 8'b001?????: begin //POT
  124. dataSpiReg <= dataSpiReg - DECREMENT_POT;
  125. ValPotDataToFifo_o <= 1'b1;
  126. end
  127. 8'b0001????: begin //DAC
  128. dataSpiReg <= dataSpiReg - DECREMENT_DAC;
  129. ValDacDataToFifo_o <= 1'b1;
  130. end
  131. 8'b00001???: begin //ATT
  132. dataSpiReg <= dataSpiReg - DECREMENT_ATT;
  133. ValAttDataToFifo_o <= 1'b1;
  134. end
  135. 8'b000001??: begin //ShReg
  136. dataSpiReg <= dataSpiReg - DECREMENT_SH_REG;
  137. ValShRegDataToFifo_o <= 1'b1;
  138. end
  139. 8'b0000001?: begin //MAX2870
  140. dataSpiReg <= dataSpiReg - DECREMENT_MAX;
  141. ValMaxDataToFifo_o <= 1'b1;
  142. end
  143. 8'b00000001: begin //GPIO
  144. dataSpiReg <= dataSpiReg - DECREMENT_GPIO;
  145. ValGpioDataToFifo_o <= 1'b1;
  146. end
  147. default: begin
  148. ValLmxDataToFifo_o <= 1'b0;
  149. ValDdsDataToFifo_o <= 1'b0;
  150. ValPotDataToFifo_o <= 1'b0;
  151. ValDacDataToFifo_o <= 1'b0;
  152. ValAttDataToFifo_o <= 1'b0;
  153. ValShRegDataToFifo_o <= 1'b0;
  154. ValMaxDataToFifo_o <= 1'b0;
  155. ValGpioDataToFifo_o <= 1'b0;
  156. end
  157. endcase
  158. //=========================DELETE AFTER HARDWARE TEST===========================
  159. /*if (lmxOr) begin //LMX
  160. dataSpiReg <= dataSpiReg - DECREMENT_LMX;
  161. ValLmxDataToFifo_o <= 1'b1;
  162. end
  163. else if (ddsOr) begin //DDS
  164. dataSpiReg <= dataSpiReg - DECREMENT_DDS;
  165. ValDdsDataToFifo_o <= 1'b1;
  166. end
  167. else if (potOr) begin //POT
  168. dataSpiReg <= dataSpiReg - DECREMENT_POT;
  169. ValPotDataToFifo_o <= 1'b1;
  170. end
  171. else if (dacOr) begin //DAC
  172. dataSpiReg <= dataSpiReg - DECREMENT_DAC;
  173. ValDacDataToFifo_o <= 1'b1;
  174. end
  175. else if (attOr) begin
  176. dataSpiReg <= dataSpiReg - DECREMENT_ATT;
  177. ValAttDataToFifo_o <= 1'b1;
  178. end
  179. else if (shRegOr) begin
  180. dataSpiReg <= dataSpiReg - DECREMENT_SH_REG;
  181. ValShRegDataToFifo_o <= 1'b1;
  182. end
  183. else if (maxOr) begin
  184. dataSpiReg <= dataSpiReg - DECREMENT_MAX;
  185. ValMaxDataToFifo_o <= 1'b1;
  186. end
  187. else if (gpioOr) begin
  188. dataSpiReg <= dataSpiReg - DECREMENT_GPIO;
  189. ValGpioDataToFifo_o <= 1'b1;
  190. end
  191. else begin
  192. ValLmxDataToFifo_o <= 1'b0;
  193. ValDdsDataToFifo_o <= 1'b0;
  194. ValPotDataToFifo_o <= 1'b0;
  195. ValDacDataToFifo_o <= 1'b0;
  196. ValAttDataToFifo_o <= 1'b0;
  197. ValShRegDataToFifo_o <= 1'b0;
  198. ValMaxDataToFifo_o <= 1'b0;
  199. ValGpioDataToFifo_o <= 1'b0;
  200. end*/
  201. //=========================DELETE AFTER HARDWARE TEST===========================
  202. end
  203. end
  204. else begin
  205. ValLmxDataToFifo_o <= 1'b0;
  206. ValDdsDataToFifo_o <= 1'b0;
  207. ValPotDataToFifo_o <= 1'b0;
  208. ValDacDataToFifo_o <= 1'b0;
  209. ValAttDataToFifo_o <= 1'b0;
  210. ValShRegDataToFifo_o <= 1'b0;
  211. ValMaxDataToFifo_o <= 1'b0;
  212. ValGpioDataToFifo_o <= 1'b0;
  213. end
  214. end
  215. endmodule