motor_feedback_rx.v 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. `timescale 1ns/1ps
  2. // Parse the same 16-byte A5 5A framed protocol used by trace_packet_tx.
  3. // Only packet type 0x91 (PC -> FPGA MOTOR_FEEDBACK) is accepted.
  4. module motor_feedback_rx (
  5. input wire clk,
  6. input wire reset_n,
  7. input wire [7:0] rx_data,
  8. input wire rx_valid,
  9. output reg feedback_valid,
  10. output reg [15:0] feedback_seq,
  11. output reg [15:0] feedback_flags,
  12. output reg [31:0] feedback_timestamp,
  13. output reg [15:0] feedback_rpm,
  14. output reg [15:0] feedback_current_ma,
  15. output reg crc_error
  16. );
  17. localparam [7:0] PKT_MOTOR_FB = 8'h91;
  18. localparam [1:0] R_SYNC_A5 = 2'd0;
  19. localparam [1:0] R_SYNC_5A = 2'd1;
  20. localparam [1:0] R_BODY = 2'd2;
  21. reg [1:0] state;
  22. reg [4:0] index;
  23. reg [7:0] crc;
  24. reg [7:0] type_l;
  25. reg [15:0] seq_l;
  26. reg [15:0] flags_l;
  27. reg [31:0] time_l;
  28. reg [31:0] data_l;
  29. function [7:0] crc8_update;
  30. input [7:0] crc_in;
  31. input [7:0] data_in;
  32. integer i;
  33. reg [7:0] c;
  34. begin
  35. c = crc_in ^ data_in;
  36. for (i = 0; i < 8; i = i + 1) begin
  37. if (c[7])
  38. c = (c << 1) ^ 8'h07;
  39. else
  40. c = (c << 1);
  41. end
  42. crc8_update = c;
  43. end
  44. endfunction
  45. always @(posedge clk or negedge reset_n) begin
  46. if (!reset_n) begin
  47. state <= R_SYNC_A5;
  48. index <= 5'd0;
  49. crc <= 8'd0;
  50. type_l <= 8'd0;
  51. seq_l <= 16'd0;
  52. flags_l <= 16'd0;
  53. time_l <= 32'd0;
  54. data_l <= 32'd0;
  55. feedback_valid <= 1'b0;
  56. feedback_seq <= 16'd0;
  57. feedback_flags <= 16'd0;
  58. feedback_timestamp <= 32'd0;
  59. feedback_rpm <= 16'd0;
  60. feedback_current_ma<= 16'd0;
  61. crc_error <= 1'b0;
  62. end else begin
  63. feedback_valid <= 1'b0;
  64. crc_error <= 1'b0;
  65. if (rx_valid) begin
  66. case (state)
  67. R_SYNC_A5: begin
  68. if (rx_data == 8'hA5)
  69. state <= R_SYNC_5A;
  70. end
  71. R_SYNC_5A: begin
  72. if (rx_data == 8'h5A) begin
  73. state <= R_BODY;
  74. index <= 5'd2;
  75. crc <= 8'h00;
  76. end else if (rx_data != 8'hA5) begin
  77. state <= R_SYNC_A5;
  78. end
  79. end
  80. R_BODY: begin
  81. if (index <= 5'd14)
  82. crc <= crc8_update(crc, rx_data);
  83. case (index)
  84. 5'd2: type_l <= rx_data;
  85. 5'd3: seq_l[15:8] <= rx_data;
  86. 5'd4: seq_l[7:0] <= rx_data;
  87. 5'd5: flags_l[15:8]<= rx_data;
  88. 5'd6: flags_l[7:0] <= rx_data;
  89. 5'd7: time_l[31:24]<= rx_data;
  90. 5'd8: time_l[23:16]<= rx_data;
  91. 5'd9: time_l[15:8] <= rx_data;
  92. 5'd10: time_l[7:0] <= rx_data;
  93. 5'd11: data_l[31:24]<= rx_data;
  94. 5'd12: data_l[23:16]<= rx_data;
  95. 5'd13: data_l[15:8] <= rx_data;
  96. 5'd14: data_l[7:0] <= rx_data;
  97. default: begin end
  98. endcase
  99. if (index == 5'd15) begin
  100. if (rx_data == crc) begin
  101. if (type_l == PKT_MOTOR_FB) begin
  102. feedback_seq <= seq_l;
  103. feedback_flags <= flags_l;
  104. feedback_timestamp <= time_l;
  105. feedback_rpm <= data_l[31:16];
  106. feedback_current_ma <= data_l[15:0];
  107. feedback_valid <= 1'b1;
  108. end
  109. end else begin
  110. crc_error <= 1'b1;
  111. end
  112. state <= R_SYNC_A5;
  113. index <= 5'd0;
  114. end else begin
  115. index <= index + 1'b1;
  116. end
  117. end
  118. default: state <= R_SYNC_A5;
  119. endcase
  120. end
  121. end
  122. end
  123. endmodule