QuadSPIs.v 5.4 KB

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