SPIs.v 7.8 KB

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