SPI.v.html 1.2 KB

123456789101112131415161718192021222324252627282930313233343536
  1. `timescale 1ns / 1ps
  2. // Motorola Serial Peripheral Interface (SPI) PDR 23.3.12 / 16.10.13
  3. // transmitter / receiver of words (fast, clk/3) or bytes (slow, clk/64)
  4. // e.g 8.33MHz or ~400KHz respectively at 25MHz (slow needed for SD-card init)
  5. // note: bytes are always MSbit first; but if fast, words are LSByte first
  6. module SPI(
  7. input clk, rst,
  8. input start, fast,
  9. input [31:0] dataTx,
  10. output [31:0] dataRx,
  11. output reg rdy,
  12. input MISO, output MOSI, output SCLK);
  13. wire endbit, endtick;
  14. reg [31:0] shreg;
  15. reg [5:0] tick;
  16. reg [4:0] bitcnt;
  17. assign endtick = fast ? (tick == 2) : (tick == 63); //25MHz clk
  18. assign endbit = fast ? (bitcnt == 31) : (bitcnt == 7);
  19. assign dataRx = fast ? shreg : {24'b0, shreg[7:0]};
  20. assign MOSI = (~rst | rdy) ? 1 : shreg[7];
  21. assign SCLK = (~rst | rdy) ? 0 : fast ? endtick : tick[5];
  22. always @ (posedge clk) begin
  23. tick <= (~rst | rdy | endtick) ? 0 : tick + 1;
  24. rdy <= (~rst | endtick & endbit) ? 1 : start ? 0 : rdy;
  25. bitcnt <= (~rst | start) ? 0 : (endtick & ~endbit) ? bitcnt + 1 : bitcnt;
  26. shreg <= ~rst ? -1 : start ? dataTx : endtick ?
  27. {shreg[30:24], MISO, shreg[22:16], shreg[31], shreg[14:8],
  28. shreg[23], shreg[6:0], (fast ? shreg[15] : MISO)} : shreg;
  29. end
  30. endmodule