QuadSPIs.v 4.3 KB

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