SPIs.v 6.6 KB

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