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.

76 lines
1.7 KiB

2 years ago
  1. module transmitter (
  2. input wire [7:0] din,
  3. input wire wr_en,
  4. input wire clk_50m,
  5. input wire clken,
  6. input wire rest_n,
  7. output reg tx,
  8. output wire tx_busy,
  9. output wire [1:0] t_state,
  10. output wire [2:0] t_bitpos,
  11. output wire t_worksignal
  12. );
  13. parameter STATE_IDLE = 2'b00;
  14. parameter STATE_START = 2'b01;
  15. parameter STATE_DATA = 2'b10;
  16. parameter STATE_STOP = 2'b11;
  17. initial begin
  18. tx = 1'b1;
  19. end
  20. reg [7:0] data = 8'h00;
  21. reg [2:0] bitpos = 3'h0;
  22. reg [1:0] state = STATE_IDLE;
  23. reg worksignal = 0;
  24. assign workflag = (state != STATE_IDLE);
  25. always @(posedge clken, posedge wr_en) begin
  26. if (wr_en) begin
  27. worksignal <= 1'b1;
  28. data <= din;
  29. end else begin
  30. if (!workflag) worksignal <= 1'b0;
  31. end
  32. end
  33. always @(posedge clken or negedge rest_n) begin
  34. if (!rest_n) begin
  35. state <= STATE_IDLE;
  36. end else begin
  37. case (state)
  38. STATE_IDLE: begin
  39. tx <= 1'b1;
  40. if (worksignal) begin
  41. state <= STATE_START;
  42. bitpos <= 0;
  43. end
  44. end
  45. STATE_START: begin
  46. tx <= 1'b0;
  47. state <= STATE_DATA;
  48. end
  49. STATE_DATA: begin
  50. if (bitpos == 3'h7) state <= STATE_STOP;
  51. else bitpos <= bitpos + 3'h1;
  52. tx <= data[bitpos];
  53. end
  54. STATE_STOP: begin
  55. tx <= 1'b1;
  56. state <= STATE_IDLE;
  57. end
  58. default begin
  59. tx <= 1'b1;
  60. state <= STATE_IDLE;
  61. end
  62. endcase
  63. end
  64. end
  65. assign tx_busy = (state != STATE_IDLE);
  66. assign t_state = state;
  67. assign t_bitpos = bitpos;
  68. assign t_worksignal = worksignal;
  69. endmodule