1. 异步串口通信协议
1.1 UART 收发传输时序时序图
发送和接收波特率必须保持一致才能正确通信。波特率是指1秒最大传输的数据位数,包括起始位、数据位、校验位、结束位。假如通信波特率设定为9600,那么一个数据位的时间长度是1/9600秒。串口的波特率是指每秒收/发的bit数,此实验设为115200bit/s。因此要将50MHz的系统时钟进行适当的分频。如上图,每计到CYCLE个时钟脉冲就传输一位。因此CYCLE=50_000_000/115200。
#(
parameter CLK_FRE = 50, //clock frequency(Mhz)
parameter BAUD_RATE = 115200 //serial baud rate
)
//计算符合波特率的时钟频率
localparam CYCLE = CLK_FRE * 1000000 / BAUD_RATE;//1比特时间
1.2 uart_rx.v
接收数据状态图:
“S_IDLE”状态为空闲状态,上电后进入“S_IDLE”,如果信号“rx_pin”有下降沿,我们认为是串口的起始位,进入状态“S_START”,等一个BIT时间起始位结束后进入数据位接收状态“S_REC_BYTE”,本实验中数据位设计是8位,接收完成以后进入“S_STOP”状态,在“S_STOP”没有等待一个BIT周期,只等待了半个BIT时间,这是因为如果等待了一个周期,有可能会错过下一个数据的起始位判断,最后进入“S_DATA”状态,将接收到的数据送到其他模块。为了满足采样定理,在接受数据时每个数据都在波特率计数器的时间中点进行采样,以避免数据出错的情况:
reg