文章目录
- 一、UART接收模块误码率
- 二、接收时钟动态纠正方法
- 2.1、过采样
- 2.2、上板效果
一、UART接收模块误码率
由于发送端和接收端存在一定的频率误差,随着时间的推移,累计误差不断增加,从而产生亚稳态现象,会导致误码,因此需要对时钟做动态纠正
二、接收时钟动态纠正方法
接收模块当识别到起始位的时候,开始产生接收时钟,接收时钟的上升沿处于数据线正中间,因此每次接收新数据的时候,接收时钟都在数据稳定的中间附近进行采样,并且用的都是新时钟,规避累计误差。
2.1、过采样
完整代码详见:https://github.com/shun6-6/UART_Pro
注:代码为本人通过学习FPGA奇哥系列网课进行自主编写
想要识别起始位下降沿,需要采用过采样,即使用大于波特率的时钟进行识别起始位。
r_uart_rx_rst 为时钟分频模块的复位信号,当识别到起始位时,r_rx_overlock会拉低,复位取消,开始产生接收时钟,当一次数据接收完成时重新复位。
r_uart_overvalue 对接收的异步数据进行打拍,并以此判断起始位下降沿
r_rx_overlock 拉高表示当前已经已经识别到起始位
always@(posedge i_clk or posedge i_rst)begin
if(i_rst)
r_uart_rx_rst <= 1'd1;
else if(!w_usr_rx_valid && r_usr_rx_valid_1d)
r_uart_rx_rst <= 1'd1;
else if(r_rx_overlock)
r_uart_rx_rst <= 1'd0;
else
r_uart_rx_rst <= r_uart_rx_rst;
end
always@(posedge i_clk or posedge i_rst)begin
if(i_rst)
r_uart_overvalue <= 'd0;
else if(!r_rx_overlock)
r_uart_overvalue <= {r_uart_overvalue[1:0] , i_uart_rx};
else
r_uart_overvalue <= 3'b111;
end
always@(posedge i_clk or posedge i_rst)begin
if(i_rst)
r_uart_overvalue_1d <= 'd0;
else
r_uart_overvalue_1d <= r_uart_overvalue;
end
always@(posedge i_clk or posedge i_rst)begin
if(i_rst)
r_rx_overlock <= 'd0;
else if(!w_usr_rx_valid && r_usr_rx_valid_1d)
r_rx_overlock <= 'd0;
else if(r_uart_overvalue == 3'b000 && r_uart_overvalue_1d != 3'b000)
r_rx_overlock <= 1'b1;
else
r_rx_overlock <= r_rx_overlock;
end
always@(posedge i_clk or posedge i_rst)begin
if(i_rst)
r_usr_rx_valid_1d <= 'd0;
else
r_usr_rx_valid_1d <= w_usr_rx_valid;
end
2.2、上板效果
误码率几乎为0