QuadSPIm.v 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. module QuadSPIm(
  2. input Clk_i,
  3. input Rst_i,
  4. input [27:0] Data_i,
  5. input Start_i,
  6. output Mosi0_i,
  7. output Mosi1_i,
  8. output Mosi2_i,
  9. output Mosi3_i,
  10. output Sck_o,
  11. output Ss_o
  12. );
  13. //================================================================================
  14. // REG/WIRE
  15. //================================================================================
  16. reg startFlag;
  17. reg [2:0] ssCnt;
  18. reg Ss;
  19. reg SSr;
  20. reg [6:0] mosiReg0;
  21. reg [6:0] mosiReg1;
  22. reg [6:0] mosiReg2;
  23. reg [6:0] mosiReg3;
  24. //================================================================================
  25. // ASSIGNMENTS
  26. //================================================================================
  27. assign Mosi0_i = (!Ss) ? (mosiReg3[6]):1'b0;
  28. assign Mosi1_i = (!Ss) ? (mosiReg2[6]):1'b0;
  29. assign Mosi2_i = (!Ss) ? (mosiReg1[6]):1'b0;
  30. assign Mosi3_i = (!Ss) ? (mosiReg0[6]):1'b0;
  31. assign Ss_o = Ss;
  32. assign Sck_i = (!Ss) ? (~Clk_i) : 1'b0;
  33. //================================================================================
  34. // CODING
  35. //================================================================================
  36. always @(posedge Clk_i) begin
  37. if (Rst_i) begin
  38. SSr <=1'b0;
  39. end
  40. else begin
  41. SSr <= Ss;
  42. end
  43. end
  44. always @(posedge Clk_i) begin
  45. if (Rst_i) begin
  46. startFlag <= 1'b0;
  47. end
  48. else begin
  49. if (!Start_i) begin
  50. startFlag <= 1'b1;
  51. end
  52. else begin
  53. startFlag <= 1'b0;
  54. end
  55. end
  56. end
  57. always @(negedge Clk_i) begin
  58. if (Rst_i) begin
  59. ssCnt <= 1'b0;
  60. end
  61. else if (ssCnt < 7 && startFlag ) begin
  62. ssCnt <= ssCnt + 1'b1;
  63. end
  64. else begin
  65. if (ssCnt == 6 || !startFlag) begin
  66. ssCnt <= 1'b0;
  67. end
  68. end
  69. end
  70. always @(negedge Clk_i) begin
  71. if (Rst_i) begin
  72. Ss <= 1'b1;
  73. end
  74. else begin
  75. if (ssCnt < 7 && startFlag ) begin
  76. Ss <= 1'b0;
  77. end
  78. else begin
  79. Ss <= 1'b1;
  80. end
  81. end
  82. end
  83. always @(negedge Clk_i) begin
  84. if (Rst_i) begin
  85. mosiReg0 <= Data_i[27:21];
  86. end
  87. else begin
  88. if (!SSr) begin
  89. mosiReg0 <= { mosiReg0[5:0],1'b0 };
  90. end
  91. else begin
  92. mosiReg0 <= Data_i[27:21];
  93. end
  94. end
  95. end
  96. always @(negedge Clk_i) begin
  97. if (Rst_i) begin
  98. mosiReg1 <= Data_i[20:14];
  99. end
  100. else begin
  101. if (!SSr) begin
  102. mosiReg1 <= { mosiReg1[5:0],1'b0 };
  103. end
  104. else begin
  105. mosiReg1 <= Data_i[20:14];
  106. end
  107. end
  108. end
  109. always @(negedge Clk_i) begin
  110. if (Rst_i) begin
  111. mosiReg2 <= Data_i[13:7];
  112. end
  113. else begin
  114. if (!SSr) begin
  115. mosiReg2 <= { mosiReg2[5:0],1'b0 };
  116. end
  117. else begin
  118. mosiReg2 <= Data_i[13:7];
  119. end
  120. end
  121. end
  122. always @(negedge Clk_i) begin
  123. if (Rst_i) begin
  124. mosiReg3<= Data_i[6:0];
  125. end
  126. else begin
  127. if (!SSr) begin
  128. mosiReg3 <= { mosiReg3[5:0],1'b0 };
  129. end
  130. else begin
  131. mosiReg3<= Data_i[6:0];
  132. end
  133. end
  134. end
  135. endmodule