SPIs.v 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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 SELST_i,
  9. output reg [23:0] Data_o,
  10. output reg [7:0] Addr_o,
  11. output [31:0] DataToRxFifo_o,
  12. output reg Val_o
  13. );
  14. //================================================================================
  15. // REG/WIRE
  16. //================================================================================
  17. reg ssReg;
  18. reg ssRegR;
  19. reg [31:0] shiftReg;
  20. reg [31:0] shiftRegM;
  21. //===============================================================================
  22. // ASSIGNMENTS
  23. assign DataToRxFifo_o = {Addr_o, Data_o};
  24. //================================================================================
  25. // CODING
  26. //================================================================================
  27. always @(posedge Clk_i) begin
  28. ssReg <= Ss_i;
  29. ssRegR <= ssReg;
  30. end
  31. always @(*) begin
  32. if (Rst_i) begin
  33. shiftRegM = 32'h0;
  34. end
  35. else begin
  36. case(WidthSel_i)
  37. 0: begin
  38. shiftRegM = shiftReg[7:0];
  39. end
  40. 1: begin
  41. shiftRegM = shiftReg[15:0];
  42. end
  43. 2: begin
  44. shiftRegM = shiftReg[23:0];
  45. end
  46. 3: begin
  47. shiftRegM = shiftReg[31:0];
  48. end
  49. endcase
  50. end
  51. end
  52. always @(posedge Clk_i) begin
  53. if (Rst_i) begin
  54. Data_o <= 24'h0;
  55. end
  56. else begin
  57. if (SELST_i) begin
  58. if (ssReg && !ssRegR) begin
  59. Data_o <= shiftRegM;
  60. end
  61. end
  62. else begin
  63. if (!ssReg && ssRegR) begin
  64. Data_o <= shiftRegM[23:0];
  65. end
  66. end
  67. end
  68. end
  69. always @(posedge Clk_i) begin
  70. if (Rst_i) begin
  71. Addr_o <= 8'h0;
  72. end
  73. else begin
  74. if (SELST_i) begin
  75. if (ssReg && !ssRegR) begin
  76. Addr_o <= shiftRegM[31:24];
  77. end
  78. end
  79. else begin
  80. if (!ssReg && ssRegR) begin
  81. Addr_o <= shiftRegM[31:24];
  82. end
  83. end
  84. end
  85. end
  86. always @(posedge Sck_i or posedge Rst_i) begin
  87. if (Rst_i) begin
  88. shiftReg<= 32'h0;
  89. end
  90. else begin
  91. if (SELST_i) begin
  92. if (!Ss_i) begin
  93. shiftReg<= {shiftReg[30:0], Mosi0_i};
  94. end
  95. else begin
  96. shiftReg<= 32'h0;
  97. end
  98. end
  99. else begin
  100. if (Ss_i) begin
  101. shiftReg<= {shiftReg[30:0], Mosi0_i};
  102. end
  103. else begin
  104. shiftReg<= 32'h0;
  105. end
  106. end
  107. end
  108. end
  109. always @(posedge Clk_i) begin
  110. if (SELST_i) begin
  111. if (ssReg && !ssRegR) begin
  112. Val_o <= 1'b1;
  113. end
  114. else begin
  115. Val_o <= 1'b0;
  116. end
  117. end
  118. else begin
  119. if (!ssReg&& ssRegR) begin
  120. Val_o <= 1'b1;
  121. end
  122. else begin
  123. Val_o <= 1'b0;
  124. end
  125. end
  126. end
  127. endmodule