SPIs.v 7.2 KB

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