uart_rx.v 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. module uart_rx #(parameter DATA_WIDTH = 8, FIFO_DEPTH = 4) (
  2. input clk,
  3. input rstn,
  4. input baud16,
  5. input uart_rxd,
  6. input lcr_sps,
  7. input lcr_stp2,
  8. input lcr_eps,
  9. input lcr_pen,
  10. input rx_read,
  11. input rx_clear,
  12. output rx_full,
  13. output rx_empty,
  14. output [DATA_WIDTH-1:0] rx_data,
  15. output reg rx_idle,
  16. input rx_dma_en,
  17. input rx_dma_clr,
  18. output reg rx_dma_req,
  19. output reg framing_error,
  20. output reg parity_error,
  21. output reg break_error,
  22. output reg overrun_error
  23. );
  24. parameter UART_IDLE = 3'h0;
  25. parameter UART_START = 3'h1;
  26. parameter UART_DATA = 3'h2;
  27. parameter UART_PARITY = 3'h3;
  28. parameter UART_STOP = 3'h4;
  29. parameter BAUD_CNT = 16;
  30. parameter SAMPLE_CNT = 3;
  31. reg [2:0] rx_state;
  32. reg [SAMPLE_CNT+1:0] rx_in; // 2 extra bits for synchronization
  33. reg [1:0] rx_val;
  34. reg [3:0] rx_baud_cnt;
  35. reg rx_bit;
  36. reg rx_parity;
  37. reg [$clog2(DATA_WIDTH):0] rx_data_cnt;
  38. reg [DATA_WIDTH-1:0] rx_shift_reg;
  39. reg rx_idle_en;
  40. wire rx_lo = rx_val <= 1;
  41. wire rx_hi = !rx_lo;
  42. wire rx_sample = baud16 && rx_baud_cnt == BAUD_CNT / 2 + 1; // Where to sample rx input
  43. wire fifo_wren = rx_state == UART_STOP && rx_sample;
  44. sync_fifo #(.WIDTH(DATA_WIDTH), .DEPTH(FIFO_DEPTH), .SHOWAEAD(1)) rx_fifo(
  45. .clk (clk ),
  46. .rstn (rstn ),
  47. .wren (fifo_wren ),
  48. .rden (rx_read ),
  49. .din (rx_shift_reg),
  50. .dout (rx_data ),
  51. .full (rx_full ),
  52. .empty(rx_empty )
  53. );
  54. always @(posedge clk or negedge rstn) begin
  55. if (!rstn) begin
  56. rx_in <= {SAMPLE_CNT+1{1'b1}};
  57. end else if (baud16) begin
  58. rx_in <= { rx_in[SAMPLE_CNT:0], uart_rxd };
  59. end
  60. end
  61. integer i;
  62. always @(*) begin
  63. rx_val = 0;
  64. for (i = 2; i < SAMPLE_CNT + 2; i = i + 1)
  65. rx_val = rx_val + rx_in[i];
  66. end
  67. always @(posedge clk or negedge rstn) begin
  68. if (!rstn) begin
  69. rx_bit <= 1'b0;
  70. end else if (baud16 && rx_baud_cnt == 15) begin
  71. rx_bit <= 1'b1;
  72. end else begin
  73. rx_bit <= 1'b0;
  74. end
  75. end
  76. always @(posedge clk) begin
  77. if (rx_state == UART_START) begin
  78. rx_data_cnt <= DATA_WIDTH - 1;
  79. end else if (rx_bit) begin
  80. if (rx_state == UART_DATA && rx_data_cnt == 0) begin
  81. rx_data_cnt <= DATA_WIDTH + 1 + lcr_pen + lcr_stp2;
  82. end else begin
  83. rx_data_cnt <= rx_data_cnt - 1;
  84. end
  85. end
  86. end
  87. always @(posedge clk or negedge rstn) begin
  88. if (!rstn) begin
  89. rx_shift_reg <= 0;
  90. end else if (rx_state == UART_DATA && rx_sample) begin
  91. rx_shift_reg <= { rx_hi, rx_shift_reg[DATA_WIDTH-1:1] };
  92. end
  93. end
  94. always @(posedge clk) begin
  95. if (rx_state == UART_START) begin
  96. rx_parity <= !lcr_eps;
  97. end else if (rx_state == UART_DATA && rx_bit && !lcr_sps) begin
  98. rx_parity <= rx_parity ^ rx_shift_reg[7];
  99. end
  100. end
  101. always @(posedge clk or negedge rstn) begin
  102. if (!rstn) begin
  103. rx_baud_cnt <= 0;
  104. end else if (rx_state == UART_IDLE && rx_lo) begin
  105. rx_baud_cnt <= SAMPLE_CNT - 1;
  106. end else if (baud16) begin
  107. rx_baud_cnt <= rx_baud_cnt + 1;
  108. end
  109. end
  110. always @(posedge clk or negedge rstn) begin
  111. if (!rstn) begin
  112. rx_idle_en <= 1'b0;
  113. end else if (!rx_empty) begin
  114. rx_idle_en <= 1'b1;
  115. end else if (rx_clear) begin
  116. rx_idle_en <= 1'b0;
  117. end
  118. end
  119. always @(posedge clk or negedge rstn) begin
  120. if (!rstn) begin
  121. rx_idle <= 1'b0;
  122. end else if (rx_state == UART_IDLE && rx_data_cnt == 0 && rx_bit && rx_idle_en) begin
  123. rx_idle <= 1'b1;
  124. end else if (rx_clear) begin
  125. rx_idle <= 1'b0;
  126. end
  127. end
  128. always @(posedge clk or negedge rstn) begin
  129. if (!rstn) begin
  130. framing_error <= 1'b0;
  131. end else if (rx_state == UART_STOP && rx_sample && rx_lo) begin
  132. framing_error <= 1'b1;
  133. end else if (rx_clear) begin
  134. framing_error <= 1'b0;
  135. end
  136. end
  137. always @(posedge clk or negedge rstn) begin
  138. if (!rstn) begin
  139. parity_error <= 1'b0;
  140. end else if (rx_state == UART_PARITY && rx_sample && rx_parity != rx_hi) begin
  141. parity_error <= 1'b1;
  142. end else if (rx_clear) begin
  143. parity_error <= 1'b0;
  144. end
  145. end
  146. always @(posedge clk or negedge rstn) begin
  147. if (!rstn) begin
  148. break_error <= 1'b0;
  149. end else if (rx_state == UART_STOP && rx_sample && rx_lo && rx_shift_reg == 0) begin
  150. break_error <= 1'b1;
  151. end else if (rx_clear) begin
  152. break_error <= 1'b0;
  153. end
  154. end
  155. always @(posedge clk or negedge rstn) begin
  156. if (!rstn) begin
  157. overrun_error <= 1'b0;
  158. end else if (fifo_wren && rx_full) begin
  159. overrun_error <= 1'b1;
  160. end else if (rx_clear) begin
  161. overrun_error <= 1'b0;
  162. end
  163. end
  164. always @(posedge clk or negedge rstn) begin
  165. if (!rstn) begin
  166. rx_dma_req <= 1'b0;
  167. end else if (!rx_dma_en || rx_dma_clr) begin
  168. rx_dma_req <= 1'b0;
  169. end else if (!rx_empty) begin
  170. rx_dma_req <= 1'b1;
  171. end
  172. end
  173. always @(posedge clk or negedge rstn) begin
  174. if (!rstn) begin
  175. rx_state <= UART_IDLE;
  176. end else begin
  177. case (rx_state)
  178. UART_IDLE: if (rx_lo) rx_state <= UART_START;
  179. UART_START: if (rx_bit && rx_baud_cnt == 0) rx_state <= UART_DATA;
  180. UART_DATA: if (rx_bit && rx_data_cnt == 0) rx_state <= lcr_pen ? UART_PARITY : UART_STOP;
  181. UART_PARITY: if (rx_bit) rx_state <= UART_STOP;
  182. UART_STOP: if (rx_sample && rx_hi) rx_state <= UART_IDLE;
  183. endcase
  184. end
  185. end
  186. endmodule