SPIs.v 6.5 KB

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