關於串口數據接收出錯問的問題(RS232、RS422、UART)

這兩天調試串口驅動,串口驅動應該是很簡單的啊,但是發現數據接收的時候,總是偶爾會出現錯誤,經過不斷的排查,終於找到了問題的關鍵所在。
一段串口的verilog代碼如下:

    module uart_rx(
	input		clk,
	input		uart_rx_i,
	.....
	);
parameter state_idle = 2'b01;
parameter state_data = 2'b10;

reg		uart_rx_i_r;

reg		state;

always @(posedge clk)
	uart_rx_i_r <= uart_rx_i;
......
always @(posedge clk)
....
   if(uart_rx_i_r&! uart_rx_i)//採集串口的下降沿
   	state <= state_data;//當檢測到串口的下降沿時,進入數據接收狀態
.....
endmodule

如果採樣上面的方式對串口數據進行接收,就會發現串口數據總是偶爾出現個別的數據接收出錯。通過ila抓波形,發現有如下圖一的異常情況出現,這個時候uart_rx_i已經拉低了,但是卻沒有檢測到下降沿,就會導致數據接收出錯,這是由於亞穩態所帶來的危害,特權同學有一本書裏有講到亞穩態是特別需要注意的。正常的是如下圖二的圖片所示。

在這裏插入圖片描述

在這裏插入圖片描述

正確的做法應該是將uart_rx_i打兩拍再判斷下降沿,如下:

   module uart_rx(
	input		clk,
	input		uart_rx_i,
	.....
	);
parameter state_idle = 2'b01;
parameter state_data = 2'b10;

reg		uart_rx_i_r;
reg		uart_rx_i_rr;
reg		uart_rx_i_rrr;

reg		state;

always @(posedge clk) begin 
	uart_rx_i_r  <= uart_rx_i;
	uart_rx_i_rr <= uart_rx_i_r ;
	uart_rx_i_rrr<= uart_rx_i_rr;
end
......
always @(posedge clk)
....
   if(uart_rx_i_rrr&! uart_rx_i_rr)//採集串口的下降沿
   	state <= state_data;//當檢測到串口的下降沿時,進入數據接收狀態
.....
endmodule
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章