SPIs.v 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  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 or posedge Rst_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. shiftReg<= {shiftReg[30:0], Mosi0_i};
  96. end
  97. else begin
  98. shiftReg<= 32'h0;
  99. end
  100. end
  101. else begin
  102. if (Ss_i) begin
  103. shiftReg<= {shiftReg[30:0], Mosi0_i};
  104. end
  105. else begin
  106. shiftReg<= 32'h0;
  107. end
  108. end
  109. end
  110. else begin
  111. if (SelSt_i) begin
  112. if (!Ss_i) begin
  113. shiftReg<= {Mosi0_i, shiftReg[31:1]};
  114. end
  115. else begin
  116. shiftReg<= 32'h0;
  117. end
  118. end
  119. else begin
  120. if (Ss_i) begin
  121. shiftReg<= {Mosi0_i, shiftReg[31:1]};
  122. end
  123. else begin
  124. shiftReg<= 32'h0;
  125. end
  126. end
  127. end
  128. end
  129. end
  130. always @(posedge Clk_i) begin
  131. if (SelSt_i) begin
  132. if (ssReg && !ssRegR) begin
  133. Val_o <= 1'b1;
  134. end
  135. else begin
  136. Val_o <= 1'b0;
  137. end
  138. end
  139. else begin
  140. if (!ssReg&& ssRegR) begin
  141. Val_o <= 1'b1;
  142. end
  143. else begin
  144. Val_o <= 1'b0;
  145. end
  146. end
  147. end
  148. endmodule