Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2023
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.87 KB | None | 0 0
  1. `timescale 1ns / 1ps
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 11/22/2023 04:13:05 PM
  7. // Design Name:
  8. // Module Name: Tx_FSM
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //////////////////////////////////////////////////////////////////////////////////
  21.  
  22.  
  23. module Tx_FSM(
  24. input CLK50MHZ,
  25. input n_rst,
  26. input Tx_En,
  27. input baud_tick,
  28. input [7:0] TxD,
  29. input D_num,
  30. input S_num,
  31. input [1:0] par_scheme,
  32. output reg TxD_out,
  33. output reg Tx_Done,
  34. output reg [5:0] state,
  35. output reg [2:0] bit_no
  36. );
  37.  
  38. reg [5:0] state, next_state;
  39. integer bit_no, bit_no_next, ones_count, ones_count_next;
  40.  
  41. parameter init = 6'b000001,
  42. start_bit = 6'b000010,
  43. data_bit = 6'b000100,
  44. par_bit = 6'b001000,
  45. stop_bit = 6'b010000,
  46. done = 6'b100000;
  47.  
  48. always@(posedge CLK50MHZ or negedge n_rst) begin
  49. if(!n_rst) begin
  50. state <= init;
  51. end
  52. else if(baud_tick) begin
  53. state <= next_state;
  54. end
  55. else begin
  56. state <= state;
  57. end
  58. end
  59.  
  60. always@(posedge CLK50MHZ or negedge n_rst) begin
  61. if(!n_rst) begin
  62. bit_no <= 0;
  63. ones_count <= 0;
  64. end
  65. else if(baud_tick) begin
  66. bit_no <= bit_no_next;
  67. ones_count <= ones_count_next;
  68. end
  69. else begin
  70. bit_no <= bit_no;
  71. ones_count <= ones_count;
  72. end
  73. end
  74.  
  75. always@(*) begin: next_state_logic
  76. case(state)
  77. init: begin
  78. bit_no_next = 0;
  79. // The Tx_En is going to be something like FIFO_Full or TF_read or something. Just some way to tell the FSM
  80. // that it is an appropriate time to read from the FIFO.
  81. ones_count_next = 0;
  82. if(Tx_En) next_state = start_bit;
  83. else next_state = init;
  84. end
  85. start_bit: begin
  86. next_state = data_bit;
  87. bit_no_next = 0;
  88. ones_count_next = ones_count;
  89. end
  90. data_bit: begin
  91. bit_no_next = bit_no + 1;
  92. if(bit_no+1 == 7+D_num) next_state = par_bit;
  93. else next_state = data_bit;
  94. if(TxD) ones_count_next = ones_count + 1;
  95. else ones_count_next = ones_count;
  96. end
  97. par_bit: begin
  98. bit_no_next = 0; // Reset the bit no counter for the stop bits.
  99. next_state = stop_bit;
  100. ones_count_next = ones_count;
  101. end
  102. stop_bit: begin
  103. bit_no_next = bit_no + 1;
  104. ones_count_next = ones_count;
  105. if(bit_no+1 == 1+S_num) next_state = done;
  106. else next_state = stop_bit;
  107. end
  108. done: begin
  109. ones_count_next = ones_count;
  110. bit_no_next = 0;
  111. next_state = init;
  112. end
  113. default: begin
  114. next_state = init;
  115. ones_count_next = 0;
  116. bit_no_next = 0;
  117. end
  118. endcase
  119. end
  120.  
  121. always@(state) begin: output_logic
  122. case(state)
  123. init: begin
  124. TxD_out = 1'b1;
  125. Tx_Done = 1'b0;
  126. end
  127. start_bit: begin
  128. TxD_out = 1'b0;
  129. Tx_Done = 1'b0;
  130. end
  131. data_bit: begin
  132. TxD_out = TxD[bit_no];
  133. Tx_Done = 1'b0;
  134. end
  135. par_bit: begin
  136. //00 no parity, 01 odd parity, 10 even parity, 11 invalid
  137. Tx_Done = 1'b0;
  138. if(par_scheme == 2'b00) TxD_out = 1'b0;
  139. else if (par_scheme == 2'b01) begin
  140. if(ones_count%2) TxD_out = 1'b0;
  141. else TxD_out = 1'b1;
  142. end
  143. else if (par_scheme == 2'b10) begin
  144. if(ones_count%2) TxD_out = 1'b1;
  145. else TxD_out = 1'b0;
  146. end
  147. else TxD_out = 1'b0;
  148. end
  149. stop_bit: begin
  150. TxD_out = 1'b1;
  151. Tx_Done = 1'b0;
  152. end
  153. done: begin
  154. TxD_out = 1'b1;
  155. Tx_Done = 1'b1;
  156. end
  157. default: begin
  158. TxD_out = 1'b1;
  159. Tx_Done = 1'b0;
  160. end
  161. endcase
  162. end
  163. endmodule
  164.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement