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.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

157 lines
4.4 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
  1. module uart_reg_reader #(
  2. parameter CLK_FRE = 50, //clock frequency(Mhz)
  3. parameter BAUD_RATE = 115200 //serial baud rate
  4. ) (
  5. input clk, //clock input
  6. input rst_n, //asynchronous reset input, low active
  7. input wire [31:0] reg_data, //received serial data
  8. output reg [31:0] reg_add,
  9. output reg reg_add_valid,
  10. input wire uart_rx_pin,
  11. output wire uart_tx_pin
  12. );
  13. //
  14. // overtime
  15. // |----------------------^
  16. // v |
  17. // IDLE ---------------> READ REG ADD ---------------> READ_REG ---------------> SEND_REG_DATA
  18. // ^ |
  19. // |------------------------------------------------------------------------------------v
  20. //
  21. //
  22. //
  23. //
  24. parameter STATE_IDLE = 0;
  25. parameter STATE_READ_REG_ADD = 1;
  26. parameter STATE_READ_REG = 2;
  27. parameter STATE_SEND_REG_DATA = 3;
  28. parameter STATE_WAIT_SEND_END = 4;
  29. wire [7:0] rx_data;
  30. wire rx_data_valid;
  31. wire rx_data_ready;
  32. wire tx_data_ready;
  33. reg [7:0] tx_data = 0;
  34. reg tx_data_valid = 0;
  35. reg [7:0] state = 0;
  36. reg [7:0] rxpacket_num = 0;
  37. reg [7:0] txpacket_num = 0;
  38. reg [7:0] rxdatacache = 0; //接收数据buffer
  39. uart_rx #(
  40. .CLK_FRE (CLK_FRE),
  41. .BAUD_RATE(BAUD_RATE)
  42. ) uart_rx_impl (
  43. .clk (clk), // input
  44. .rst_n (rst_n), // input
  45. .rx_data (rx_data), // output
  46. .rx_data_valid(rx_data_valid), // output
  47. .rx_data_ready(rx_data_ready), // input
  48. .rx_pin (uart_rx_pin) // input
  49. );
  50. uart_tx #(
  51. .CLK_FRE (CLK_FRE),
  52. .BAUD_RATE(BAUD_RATE)
  53. ) uart_tx_impl (
  54. .clk (clk), // input
  55. .rst_n (rst_n), // input
  56. .tx_data (tx_data), // input
  57. .tx_data_valid(tx_data_valid), // input
  58. .tx_data_ready(tx_data_ready), // output
  59. .tx_pin (uart_tx_pin) // output
  60. );
  61. assign rx_data_ready = 1'b1;
  62. reg [ 7:0] substep = 0;
  63. reg [31:0] reg_data_cache = 0;
  64. always @(posedge clk or negedge rst_n) begin
  65. if (!rst_n) begin
  66. state <= STATE_IDLE;
  67. rxpacket_num <= 0;
  68. txpacket_num <= 0;
  69. substep <= 0;
  70. reg_add <= 0;
  71. reg_add_valid <= 0;
  72. end else begin
  73. case (state)
  74. STATE_IDLE: begin
  75. rxpacket_num <= 0;
  76. txpacket_num <= 0;
  77. substep <= 0;
  78. state <= STATE_READ_REG_ADD;
  79. end
  80. STATE_READ_REG_ADD: begin
  81. if (rxpacket_num == 1) begin
  82. state <= STATE_READ_REG;
  83. end else if (rx_data_valid) begin
  84. rxdatacache <= rx_data;
  85. rxpacket_num <= rxpacket_num + 1;
  86. end
  87. end
  88. STATE_READ_REG: begin
  89. case (substep)
  90. 0: begin
  91. reg_add_valid <= 1;
  92. reg_add[7:0] <= rxdatacache;
  93. substep <= 1;
  94. end
  95. 1: begin
  96. tx_data_valid <= 0;
  97. substep <= 0;
  98. state <= STATE_SEND_REG_DATA;
  99. end
  100. endcase
  101. end
  102. STATE_SEND_REG_DATA: begin
  103. case (substep)
  104. 0: begin
  105. case (txpacket_num)
  106. 0: begin
  107. tx_data[7:0] <= reg_data_cache[7:0];
  108. end
  109. 1: begin
  110. tx_data[7:0] <= reg_data_cache[15:8];
  111. end
  112. 2: begin
  113. tx_data[7:0] <= reg_data_cache[23:16];
  114. end
  115. 3: begin
  116. tx_data[7:0] <= reg_data_cache[31:24];
  117. end
  118. default: begin
  119. tx_data[7:0] <= 0;
  120. end
  121. endcase
  122. tx_data_valid <= 1;
  123. txpacket_num <= txpacket_num + 1;
  124. substep <= 1;
  125. end
  126. 1: begin
  127. tx_data_valid <= 0;
  128. substep <= 2;
  129. end
  130. 2: begin
  131. if (tx_data_ready) begin
  132. if (txpacket_num != 4) begin
  133. substep <= 0;
  134. end else begin
  135. substep <= 0;
  136. state <= STATE_IDLE;
  137. end
  138. end
  139. end
  140. endcase
  141. end
  142. default begin
  143. state <= STATE_IDLE;
  144. end
  145. endcase
  146. end
  147. end
  148. endmodule