Guest User

1mfbenq

a guest
Aug 1st, 2025
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.03 KB | None | 0 0
  1. module SPI_SLAVE
  2. (
  3. input clock, // 50 MHz
  4. input reset_n,
  5.  
  6. output reg RX_valid, // data valid pulse
  7. output reg [7:0] RX_data, // mosi byte
  8.  
  9. input TX_valid, // data valid (obtain miso byte ; held until TX_received is set)
  10. output TX_request, // request next byte (pulse to prepare next miso byte)
  11. output reg TX_received, // acknowledge (flag that miso has been received)
  12. input [7:0] TX_data, // miso byte
  13.  
  14. input SPI_clock,
  15. output SPI_miso,
  16. input SPI_mosi,
  17. input SPI_cs_n
  18. );
  19. /* mosi omitted for brevity */
  20.  
  21. reg [7:0] TX_preload; // local miso byte copy
  22. reg [2:0] TX_counter; // miso bit counter (7 .. 0)
  23. reg [2:0] sync0_TX_counter, sync1_TX_counter; // sync miso counter to sys clock
  24. reg TX_done, prev_TX_done; // used to pulse TX_request
  25.  
  26. // TX_request process
  27. assign TX_request = TX_done & ~prev_TX_done;
  28. always @(posedge clock)
  29. begin
  30. prev_TX_done <= TX_done;
  31. sync0_TX_counter <= TX_counter;
  32. sync1_TX_counter <= sync0_TX_counter;
  33.  
  34. if (sync1_TX_counter == 3'd6)
  35. TX_done <= 1'b1;
  36. else
  37. TX_done <= 1'b0;
  38. end
  39.  
  40. reg [8:0] TX_temp; // used to shift out miso bits
  41.  
  42. // process to load/shift TX_temp
  43. always @(negedge SPI_clock)
  44. begin
  45. // shift and load
  46. if (TX_counter == 3'd1) // using 8'ha5 constant for debugging
  47. TX_temp <= { TX_temp[7], 8'h5A }; // TX_preload };
  48. // shift
  49. else
  50. TX_temp <= TX_temp << 1'b1;
  51. end
  52.  
  53. // TX_preload and TX_received process
  54. always @(posedge clock, negedge reset_n)
  55. begin
  56. if (!reset_n)
  57. begin
  58. TX_preload <= 8'd0;
  59. TX_received <= 1'b0;
  60. end else if (TX_valid) // grab TX_data and set TX_received pulse
  61. begin
  62. TX_preload <= TX_data;
  63. TX_received <= 1'b1;
  64. end else // end TX_received pulse
  65. TX_received <= 1'b0;
  66. end
  67.  
  68. // TX_counter process
  69. always @(negedge SPI_clock, posedge SPI_cs_n)
  70. begin if (SPI_cs_n)
  71. TX_counter <= 3'd7;
  72. else
  73. TX_counter <= TX_counter - 3'd1;
  74. end
  75.  
  76. // miso is simply the high bit of the shift reg
  77. assign SPI_miso = TX_temp[8];
  78.  
  79. endmodule
Advertisement
Add Comment
Please, Sign In to add comment