毕业论文:基于FPGA的串口设计-精品 下载本文

总结

状态机一直在等待RXD的电平跳转,从逻辑1变为逻辑0,即起始位,这意味着新的一帧UART数据帧的开始,一旦起始位被确定,状态机将转入R_CENTER状态。图6中的RXD_SYNC信号是RXD的同步信号,因为在进行逻辑1或逻辑0判断时,不希望检测的信号是不稳定的,所以不直接检测RXD信号,而是检测经过同步后的RXD_SYNC信号。

2、R_CENTER状态:对于异步串行信号,为了使每一次都检测到正确的位信号,而是在较后的数据位检测时累计误差较小,显然在每位的中点检测是最为理想的。在本状态,就是由起始位求出每位的中点,通过对bclk的个数进行计数(RCNT16),但计数值不是想当然的“1000”,要考虑经过一个状态,也即经过了一个bclk周期,所希望得到的是在采样时1/2位。另外,可能在R_START状态检测到的起始位不是真正的起始位,可能是一个偶然出现的干扰尖脉冲(负脉冲)。这种干扰脉冲的周期是很短的,所以可以认为保持逻辑0超过1/4个位时间的信号一定是起始位。

第31页 (共37页)

基于FPGA的串口设计

图13 UART接收器的接收状态机

注:状态机一共有5个状态:R_START(等待起始位)、R_CENTER(求中点)、R_WAIT(等待采样)、R_SAMPLE(采样)和R_STOP(停止位接收)。

3、R_WAIT状态:当状态机处于这一状态,等待计满15个bclk,在第16个bclk是进入R_SAMPLE状态进行数据位的采样检测,同时也判断是否采集的数据位长度已达到数据帧的长度,如果到来,就说明停止位来临了。在本设计中默认为8,即对应的UART工作在8位数据位、无校验位格式。

4、R_SAMPLE状态:即数据位采样检测,完成后无条件状态机转入R_WAIT状态,等待下次数据位的到来。

5、R_STOP状态:无论停止位是1还是1.5位,或是2位,状态机在R_STOP不具体检测RXD,只是输出帧接收完毕信号(REC_DONE<’1’),停止位后状态机转

第32页 (共40页)

总结

回到R_START状态,等待下一个帧的起始位。

图14 UART接收器的模块图

UART接收器的仿真波形结果

Bclkr:波特率时钟信号周期 Resetr:复位信号

Rxdr:电平触发信号,从逻辑1变为逻辑0 R_ready:数据帧 Rbuf:并行数据

图15 UART接收器的仿真波形

第33页 (共37页)

基于FPGA的串口设计

UART发送器模块: 发送器只要每隔16个bclk周期输出一个数据即可,次序遵循第一位是起始位,第8位是停止位。在本设计中没有校验位,但只要改变Generic参数Frameelen,也可以加入校验位,停止位是固定的1位格式[6]。图4..4.3.1是发送状态机的状态图。

此状态机一共有5个状态:X_IDLE(空闲)、X_START(起始位)、X_WAIT(移位等待)、X_SHIFT(移位)和X_STOP(停止位)。

1、X_IDLE状态:当UART被复位信号RESETL复位后,状态机将立刻进入这一状态。在这个状态中,UART的发送器一直在等待一个数据帧发送命令XMIT_CMD。这时由于XMIT_CMD是一个外加信号,在FPGA之外,不可能对XMIT_CMD的脉冲宽带进行限制,如果XMIT_CMD有效在UART发完一个数据帧依然有效,那么就会错误地被认为,一个新的数据发送命令又到来了,UART发送器就会再次启动UART帧的发送,显然该帧的发送是错误的。在此对XMIT_CMD进行了脉冲宽度的限定,用XMIT_CMD_P代替XMIT_CMD信号,XMIT_CMD_P是一个短脉冲信号。当XMIT_CMD_P=‘1’,状态机转入X_START,准备发送起始位。

2、X_START 状态:在这个状态下,UART的发送器一个时间宽度的逻辑0信号至TXD,即起始位。紧接着状态机转入X_WAIT状态。XCNT16是bclk的计数器。 3、X_WAIT 状态:同UART接收状态机中的R_WAIT状态类似。

4、X_SHIFT 状态:当状态机处于这一状态时,实现待发数器的并串转换。转换完成立即回到X_WAIT状态。

5、X_STOP :停止位发送状态,当数据帧发送完毕,状态机转入该状态,并发送16个bclk周期的逻辑1信号,即1位停止位。状态机送完停止位后回到X_IDLE状

第34页 (共40页)