描述问题:当对串口的空闲状态进行曼彻斯特编码后,在pe_uart_rx如何识别数据的起始是解码成功的关键。
当我设置三个连“”1“”作为数据起始码时,如何识别它们是问题的关键。
问题难点:使用与串口发送相同的波特率时钟(不同之处再于稍稍延后约2000ns,以保采到电平)时,若使用bps_clk一直采,容易采到空闲时的“1”,从而识别错误。
若停止使用bps_clk,使其只采集数据位,那么前导码又识别不了,根本无法采集到数据位。
目标:需要找到办法控制它在3个连“1”时开始bps_clk 或者使bps_clk在除前导码以外的位置均采不到3个连“1”。
问题解决:最初想的办法是在检测到前导码前一直进行数据的过采样,直至检测出3个连“1”后再切换回采数据沿,方法虽行的通,但是过于繁琐且耗费资源过多;后经过反复查看多种数据组合的signalTap后发现,空闲编码时“0”“1”电平均正常,因此只需保证在3个连“1”前有大于1个bps_clk时钟周期的0,保证它在3个连“1”到来前状态处于CHECK_1即可。这个问题需修改pe_uart_tx代码
case(tx_cnt)
0 : pe_tx_Data <= 1'b0;
1 : pe_tx_Data <= 1'b0;
2 : pe_tx_Data <= 1'b1;
3 : pe_tx_Data <= 1'b1;
4 : pe_tx_Data <= 1'b1;
5 : pe_tx_Data <= !s0_pe_Data[0];
6 : pe_tx_Data <= s0_pe_Data[0];
7 : pe_tx_Data <= !s0_pe_Data[1];
8 : pe_tx_Data <= s0_pe_Data[1];
9 : pe_tx_Data <= !s0_pe_Data[2];
10 : pe_tx_Data <= s0_pe_Data[2];
11 : pe_tx_Data <= !s0_pe_Data[3];
12 : pe_tx_Data <= s0_pe_Data[3];
13 : pe_tx_Data <= !s0_pe_Data[4];
14 : pe_tx_Data <= s0_pe_Data[4];
15 : pe_tx_Data <= !s0_pe_Data[5];
16 : pe_tx_Data <= s0_pe_Data[5];
17 : pe_tx_Data <= !s0_pe_Data[6];
18 : pe_tx_Data <= s0_pe_Data[6];
19 : pe_tx_Data <= !s0_pe_Data[7];
20 : pe_tx_Data <= s0_pe_Data[7];
default:pe_tx_Data <= 1'b0;
endcase
修改后可正确识别前导码并入数据解码状态