QuadSPIs.v 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. module QuadSPIs (
  2. input Clk_i,
  3. input Rst_i,
  4. input Sck_i,
  5. input Ss_i,
  6. input Mosi0_i,
  7. input Mosi1_i,
  8. input Mosi2_i,
  9. input Mosi3_i,
  10. input [1:0] WidthSel_i,
  11. input SELST_i,
  12. output reg [23:0] Data_o,
  13. output reg [7:0] Addr_o,
  14. output [31:0] DataToRxFifo_o,
  15. output reg Val_o
  16. );
  17. //================================================================================
  18. // REG/WIRE
  19. //================================================================================
  20. reg ssReg;
  21. reg ssRegR;
  22. reg SckReg;
  23. reg [7:0] addrReg;
  24. reg [7:0] shiftReg0;
  25. reg [7:0] shiftReg1;
  26. reg [7:0] shiftReg2;
  27. reg [7:0] shiftReg0M;
  28. reg [7:0] shiftReg1M;
  29. reg [7:0] shiftReg2M;
  30. reg [7:0] addrRegM;
  31. //===============================================================================
  32. // ASSIGNMENTS
  33. assign DataToRxFifo_o = {Addr_o, Data_o};
  34. //================================================================================
  35. // CODING
  36. //================================================================================
  37. always @(posedge Clk_i) begin
  38. ssReg <= Ss_i;
  39. ssRegR <= ssReg;
  40. end
  41. always @(*) begin
  42. if (Rst_i) begin
  43. addrRegM = 8'h0;
  44. shiftReg0M = 8'h0;
  45. shiftReg1M = 8'h0;
  46. shiftReg2M = 8'h0;
  47. end
  48. else begin
  49. case(WidthSel_i)
  50. 0: begin
  51. addrRegM = addrReg [1:0];
  52. shiftReg0M = shiftReg0[1:0];
  53. shiftReg1M = shiftReg1[1:0];
  54. shiftReg2M = shiftReg2[1:0];
  55. end
  56. 1: begin
  57. addrRegM = addrReg [3:0];
  58. shiftReg0M = shiftReg0[3:0];
  59. shiftReg1M = shiftReg1[3:0];
  60. shiftReg2M = shiftReg2[3:0];
  61. end
  62. 2: begin
  63. addrRegM = addrReg [5:0];
  64. shiftReg0M = shiftReg0[5:0];
  65. shiftReg1M = shiftReg1[5:0];
  66. shiftReg2M = shiftReg2[5:0];
  67. end
  68. 3: begin
  69. addrRegM = addrReg [7:0];
  70. shiftReg0M = shiftReg0[7:0];
  71. shiftReg1M = shiftReg1[7:0];
  72. shiftReg2M = shiftReg2[7:0];
  73. end
  74. endcase
  75. end
  76. end
  77. always @(posedge Clk_i) begin
  78. if (Rst_i) begin
  79. Data_o <= 24'h0;
  80. end
  81. else begin
  82. if (SELST_i) begin
  83. if (ssReg && !ssRegR) begin
  84. Data_o <= {shiftReg2M, shiftReg1M, shiftReg0M};
  85. end
  86. end
  87. else begin
  88. if (!ssReg && ssRegR) begin
  89. Data_o <= {shiftReg2M, shiftReg1M, shiftReg0M};
  90. end
  91. end
  92. end
  93. end
  94. always @(posedge Clk_i) begin
  95. if (Rst_i) begin
  96. Addr_o <= 8'h0;
  97. end
  98. else begin
  99. if (SELST_i) begin
  100. if (ssReg && !ssRegR) begin
  101. Addr_o <= addrRegM;
  102. end
  103. end
  104. else begin
  105. if (!ssReg && ssRegR) begin
  106. Addr_o <= addrRegM;
  107. end
  108. end
  109. end
  110. end
  111. always @(posedge Sck_i) begin
  112. if (Rst_i) begin
  113. shiftReg0 <= 8'h0;
  114. end
  115. else begin
  116. if (SELST_i) begin
  117. if (!Ss_i) begin
  118. shiftReg0 <= {shiftReg0[6:0], Mosi0_i};
  119. end
  120. else begin
  121. shiftReg0 <= 8'h0;
  122. end
  123. end
  124. else begin
  125. if (Ss_i) begin
  126. shiftReg0 <= {shiftReg0[6:0], Mosi0_i};
  127. end
  128. else begin
  129. shiftReg0<= 8'h0;
  130. end
  131. end
  132. end
  133. end
  134. always @(posedge Sck_i ) begin
  135. if (Rst_i) begin
  136. shiftReg1 <= 8'h0;
  137. end
  138. else begin
  139. if (SELST_i) begin
  140. if (!Ss_i) begin
  141. shiftReg1 <= {shiftReg1[6:0], Mosi1_i};
  142. end
  143. else begin
  144. shiftReg1 <= 8'h0;
  145. end
  146. end
  147. else begin
  148. if (Ss_i) begin
  149. shiftReg1 <= {shiftReg1[6:0], Mosi1_i};
  150. end
  151. else begin
  152. shiftReg1 <= 8'h0;
  153. end
  154. end
  155. end
  156. end
  157. always @(posedge Sck_i ) begin
  158. if (Rst_i) begin
  159. shiftReg2 <= 8'h0;
  160. end
  161. else begin
  162. if (SELST_i) begin
  163. if (!Ss_i) begin
  164. shiftReg2 <= {shiftReg2[6:0], Mosi2_i};
  165. end
  166. else begin
  167. shiftReg2 <= 8'h0;
  168. end
  169. end
  170. else begin
  171. if (Ss_i) begin
  172. shiftReg2 <= {shiftReg2[6:0], Mosi2_i};
  173. end
  174. else begin
  175. shiftReg2 <= 8'h0;
  176. end
  177. end
  178. end
  179. end
  180. always @(posedge Sck_i ) begin
  181. if (Rst_i) begin
  182. addrReg <= 8'h0;
  183. end
  184. else begin
  185. if (SELST_i) begin
  186. if (!Ss_i) begin
  187. addrReg <= {addrReg[6:0], Mosi3_i};
  188. end
  189. else begin
  190. addrReg <= 8'h0;
  191. end
  192. end
  193. else begin
  194. if (Ss_i) begin
  195. addrReg <= {addrReg[6:0], Mosi3_i};
  196. end
  197. else begin
  198. addrReg <= 8'h0;
  199. end
  200. end
  201. end
  202. end
  203. always @(posedge Clk_i) begin
  204. if (SELST_i) begin
  205. if (ssReg && !ssRegR) begin
  206. Val_o <= 1'b1;
  207. end
  208. else begin
  209. Val_o <= 1'b0;
  210. end
  211. end
  212. else begin
  213. if (!ssReg&& ssRegR) begin
  214. Val_o <= 1'b1;
  215. end
  216. else begin
  217. Val_o <= 1'b0;
  218. end
  219. end
  220. end
  221. endmodule