You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

260 lines
7.7 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. module spi_reg_reader (
  2. input clk, //clock input
  3. input rst_n, //asynchronous reset input, low active
  4. //regbus interface
  5. output reg [31:0] addr,
  6. output reg [31:0] wr_data,
  7. output reg wr_en,
  8. input wire [31:0] rd_data, //received serial data
  9. //
  10. input wire spi_cs_pin, //
  11. input wire spi_clk_pin, //
  12. input wire spi_rx_pin, //
  13. output reg spi_tx_pin
  14. );
  15. parameter STATE_IDLE = 0;
  16. parameter STATE_RECEIVE_ADD = 1;
  17. parameter STATE_READ_REG = 2;
  18. parameter STATE_TRANSMIT_DATA = 3;
  19. parameter STATE_RECEIVE_DATA = 4;
  20. parameter STATE_WRITE_REG = 5;
  21. parameter ADDRESS_WIDTH_BYTE_NUM = 2;
  22. initial begin
  23. addr = 0;
  24. wr_data = 0;
  25. wr_en = 0;
  26. spi_tx_pin = 0;
  27. end
  28. zutils_signal_filter #(
  29. .FILTER_COUNT(5)
  30. ) cs_filter (
  31. .clk(clk),
  32. .rst_n(rst_n),
  33. .in(spi_cs_pin),
  34. .out(spi_cs_pin_after_filter)
  35. );
  36. zutils_signal_filter #(
  37. .FILTER_COUNT(2)
  38. ) clk_filter (
  39. .clk(clk),
  40. .rst_n(rst_n),
  41. .in(spi_clk_pin),
  42. .out(spi_clk_pin_after_filter)
  43. );
  44. zutils_signal_filter #(
  45. .FILTER_COUNT(2)
  46. ) spi_rx_filter (
  47. .clk(clk),
  48. .rst_n(rst_n),
  49. .in(spi_rx_pin),
  50. .out(spi_rx_pin_after_filter)
  51. );
  52. //
  53. // 捕获SPI_CS的下降沿 SPI_CLK的上升沿
  54. // detect:
  55. // spi_cs_negedge_tri
  56. // spi_clk_posedge_tri
  57. //
  58. zutils_edge_detecter cs_edge_detecter (
  59. .clk(clk),
  60. .rst_n(rst_n),
  61. .in_signal(spi_cs_pin_after_filter),
  62. .in_signal_falling_edge(spi_cs_negedge_tri)
  63. );
  64. zutils_edge_detecter clk_edge_detecter (
  65. .clk(clk),
  66. .rst_n(rst_n),
  67. .in_signal(spi_clk_pin_after_filter),
  68. .in_signal_rising_edge(spi_clk_posedge_tri),
  69. .in_signal_falling_edge(spi_clk_negedge_tri)
  70. );
  71. /*******************************************************************************
  72. * SPI数据解析及其部分状态更新 *
  73. *******************************************************************************/
  74. //
  75. //
  76. //
  77. // cs : ----______________________________________________
  78. // clk : ----------____----____----____----____----____----
  79. // bitcnt : 0 1 2 ... 7 0
  80. // rx : . . . . .
  81. // tx : <======><======><======><======><======>
  82. // valid : .
  83. // byte_cnt: 0 1
  84. //
  85. wire [31:0] spi_clk_cnt;
  86. wire [31:0] spi_byte_cnt;
  87. wire [ 7:0] bit_cnt;
  88. zutils_clk_parser clk_parser (
  89. .clk (clk),
  90. .rst_n(rst_n),
  91. .cs_signal_in (spi_cs_pin_after_filter),
  92. .clk_signal_in(spi_clk_pin_after_filter),
  93. .clk_start_signal(spi_clk_start_signal),
  94. .clk_mid_signal(spi_clk_mid_signal),
  95. .clk_end_signal(spi_clk_end_signal),
  96. .clk_cnt(spi_clk_cnt), //[31:0]
  97. .byte_cnt(spi_byte_cnt), //[31:0]
  98. .clk_bit_cnt(bit_cnt) //[7:0]
  99. );
  100. //
  101. // spi_tx_1byte_data 发送
  102. //
  103. reg [7:0] spi_tx_1byte_data = 0;
  104. always @(*) begin
  105. spi_tx_pin <= spi_tx_1byte_data[bit_cnt];
  106. end
  107. //
  108. // spi_rx_1byte_data
  109. // spi_rx_1byte_data_valid
  110. //
  111. // 上升沿触发时,接收1bit数据
  112. // bit_cnt == 7时 接收完一byte数据
  113. //
  114. reg [7:0] spi_rx_1byte_data = 0;
  115. reg spi_rx_1byte_data_valid = 0;
  116. always @(posedge clk or negedge rst_n) begin
  117. if (!rst_n || spi_cs_pin_after_filter) begin
  118. spi_rx_1byte_data <= 0;
  119. spi_rx_1byte_data_valid <= 0;
  120. end else begin
  121. if (spi_clk_mid_signal) begin
  122. spi_rx_1byte_data[bit_cnt] <= spi_rx_pin_after_filter;
  123. if (bit_cnt == 7) spi_rx_1byte_data_valid <= 1;
  124. end else begin
  125. spi_rx_1byte_data_valid <= 0;
  126. end
  127. end
  128. end
  129. /*******************************************************************************
  130. * 缓存接收到的数据 *
  131. *******************************************************************************/
  132. reg [7:0] spi_rx_data_cache[0:7];
  133. genvar i;
  134. always @(posedge clk or negedge rst_n) begin
  135. if (!rst_n || spi_cs_pin_after_filter) begin
  136. spi_rx_data_cache[0] <= 0;
  137. spi_rx_data_cache[1] <= 0;
  138. spi_rx_data_cache[2] <= 0;
  139. spi_rx_data_cache[3] <= 0;
  140. spi_rx_data_cache[4] <= 0;
  141. spi_rx_data_cache[5] <= 0;
  142. spi_rx_data_cache[6] <= 0;
  143. spi_rx_data_cache[7] <= 0;
  144. end else begin
  145. // 选中状态
  146. if (spi_rx_1byte_data_valid && spi_byte_cnt <= 7) begin
  147. spi_rx_data_cache[spi_byte_cnt] <= spi_rx_1byte_data;
  148. end
  149. end
  150. end
  151. /*******************************************************************************
  152. * 自动设置SPI需要发送的数据 spi_tx_1byte_data *
  153. *******************************************************************************/
  154. always @(*) begin
  155. case (spi_byte_cnt)
  156. ADDRESS_WIDTH_BYTE_NUM + 0: spi_tx_1byte_data <= rd_data[7:0];
  157. ADDRESS_WIDTH_BYTE_NUM + 1: spi_tx_1byte_data <= rd_data[15:8];
  158. ADDRESS_WIDTH_BYTE_NUM + 2: spi_tx_1byte_data <= rd_data[23:16];
  159. ADDRESS_WIDTH_BYTE_NUM + 3: spi_tx_1byte_data <= rd_data[31:24];
  160. default: spi_tx_1byte_data <= 0;
  161. endcase
  162. end
  163. /*******************************************************************************
  164. * 自动设置addr数值 *
  165. *******************************************************************************/
  166. always @(*) begin
  167. case (ADDRESS_WIDTH_BYTE_NUM)
  168. 0: begin
  169. addr[7:0] <= 0;
  170. addr[15:8] <= 0;
  171. addr[23:16] <= 0;
  172. addr[31:24] <= 0;
  173. end
  174. 1: begin
  175. addr[7:0] <= {1'b0, spi_rx_data_cache[0][6:0]};
  176. addr[15:8] <= 0;
  177. addr[23:16] <= 0;
  178. addr[31:24] <= 0;
  179. end
  180. 2: begin
  181. addr[7:0] <= spi_rx_data_cache[0][7:0];
  182. addr[15:8] <= {1'b0, spi_rx_data_cache[1][6:0]};
  183. addr[23:16] <= 0;
  184. addr[31:24] <= 0;
  185. end
  186. 3: begin
  187. addr[7:0] <= spi_rx_data_cache[0][7:0];
  188. addr[15:8] <= spi_rx_data_cache[1][7:0];
  189. addr[23:16] <= {1'b0, spi_rx_data_cache[2][6:0]};
  190. addr[31:24] <= 0;
  191. end
  192. 4: begin
  193. addr[7:0] <= spi_rx_data_cache[0][7:0];
  194. addr[15:8] <= spi_rx_data_cache[1][7:0];
  195. addr[23:16] <= spi_rx_data_cache[2][7:0];
  196. addr[31:24] <= {1'b0, spi_rx_data_cache[3][6:0]};
  197. end
  198. endcase
  199. end
  200. /*******************************************************************************
  201. * wr_data *
  202. *******************************************************************************/
  203. always @(*) begin
  204. wr_data[7:0] <= spi_rx_data_cache[ADDRESS_WIDTH_BYTE_NUM];
  205. wr_data[15:8] <= spi_rx_data_cache[ADDRESS_WIDTH_BYTE_NUM+1];
  206. wr_data[23:16] <= spi_rx_data_cache[ADDRESS_WIDTH_BYTE_NUM+2];
  207. wr_data[31:24] <= spi_rx_data_cache[ADDRESS_WIDTH_BYTE_NUM+3];
  208. end
  209. /*******************************************************************************
  210. * wr_en *
  211. *******************************************************************************/
  212. reg has_trigger_wr_en = 0;
  213. always @(posedge clk or negedge rst_n) begin
  214. if (!rst_n || spi_cs_pin_after_filter) begin
  215. wr_en <= 0;
  216. has_trigger_wr_en <= 0;
  217. end else begin
  218. if (!has_trigger_wr_en && //
  219. spi_byte_cnt == ADDRESS_WIDTH_BYTE_NUM + 4 && //
  220. spi_rx_data_cache[ADDRESS_WIDTH_BYTE_NUM-1][7]) begin
  221. wr_en <= 1;
  222. has_trigger_wr_en <= 1;
  223. end else begin
  224. wr_en <= 0;
  225. end
  226. end
  227. end
  228. endmodule