通用异步收发器(Universal Asynchronous Receiver Transmitter,UART)是数字通信领域流行和广泛使用的一种接口设备,主要用来控制符合RS 232-C协议的计算机与串行设备间的通信。普通串行外设和计算机间的通信,一般使用通用的串行接口芯片,但是这种接口芯片存在体积较大、接口复杂以及成本较高的缺点,会使得硬件设计更加复杂,并且结构与功能相对固定,无法根据设计的需要对其逻辑控制进行灵活的修改。而目前日趋成熟的SOC技术则要求将整个设计的功能集成在单片或几块芯片当中,因此,将UART的功能集成在FPGA芯片当中,可以使整个系统更为灵活、紧凑,性能也更加稳定。本文提出了一种使用VHDL语言开发UAWT的方法,实现了FPGA与计算机之间的数据通信,并将其应用于FPGA芯片开发的功能验证当中,从而衍生出了将UART嵌入到EPGA芯片,与计算机互联的一种直观的FPGA设计的验证和调试方法。
1 UART通信原理
UART采用通用的RS 232-C串行接口标准,该协议的优点是使用广泛,几乎所有计算机和串行外设当中都置有这种接口,其传输距离可达15 m,并且实现较简单,用于双向连接时最少只需要2条导线即可实现基本通信。UART的具体帧格式如图1所示,每帧数据由开始位、数据位、奇偶校验位和停止位四部分依次组成。其中,开始位为低电平;数据位长度为5,6,7,8不等;奇偶校验的模式有无校验、奇校验、偶校验、粘附校验1和粘附校验0;停止位为高电平,具体长度为1位、1.5位和2位不等,这些选项都通过UART内部的线性控制寄存器来确定。当没有数据发送时,发送和接收引脚都保持高电平。
2 UART的FPGA实现
本实现中,UART主要包括接收模块、发送模块、MODEM控制器和中断仲裁4个部分。它们的具体功能如下:
接收模块 具体作用是接收从串行数据输入端口SIN送来的异步数据,并进行串/并转换,此外,接收模块还包含模块控制和模块状态配置功能,用来设置接收数据帧的属性以及向中断仲裁模块输出状态信号;
发送模块 其作用是对从CPU送来的并行数据进行并/串转换,将串行数据从SOUT输出到串口,同接收模块相同,该模块也包含模块控制和模块状态配置功能;
中断仲裁模块 其作用是用来实现外部接口对内部寄存器的操作以及中断信号的仲裁操作,在UART的工作过程中,发送和接收模块的状态信号都送入该模块的线性状态寄存器中,经过内部的逻辑操作输出相应的中断信号,指示与UART相连的外部设备进行相应的读写操作;
MODEM模块 其作用是用来和外部的调制解调器或者其他的UART设备进行通信。
2.1 接收模块
在接收的过程中,由于串行数据帧异步于接收时钟,因此,当检测到SIN由高电平到低电平的变化将被认为是一帧数据的开始位。为避免由于噪声引起的错误数据,本设计中实现了错误开始位检测功能,即要求开始位必须在收发波特率时钟的50%以上为低电平。由于我们采用的内部时钟其频率是波特率时钟的16倍,因此开始位至少在8个内部时钟周期内为低电平才被认为有效。一旦开始位被确认,后面的数据比特和校验比特将会每16个内部时钟周期采样一次。
接收模块包括一个数据缓冲寄存器和一个接收移位寄存器。当检测到开始位有效时,其后的数据比特将会依次存人数据移位寄存器,根据数据帧的配置,当接收完所有数据比特后会根据奇偶校验是否被使能来判断下一步进行校验或停止接收,等待外部设备读取接收到的数据。整个过程可通过状态机方便的实现,状态转移图如图2所示。
由图2不难看出,接收模块的状态机包含4个状态:空闲状态(idle)、移位状态(shift)、奇偶校验状态(parity)和停止位状态(stop)。其工作过程如下:当系统复位时,状态机进入idle状态,等待开始位,SIN由高电平变为低电平并被确认为有效的开始位后,状态机进入shift状态;shift状态中,接收模块为每一个数据比特移人等待16个内部时钟周期,接收完一帧数据后,若奇偶校验使能有效,跳转到parity状态,否则,进入stop状态;在parity状态中对奇偶校验比特进行采样,状态机将跳转到stop状态;状态机进入stop状态后,等待16个内部时钟周期后将对停止位的长度进行采样,而后进人idle状态。
2.2 发送模块
在发送过程中,当发送数据装载到发送保持寄存器后,串行数据将自动使能从而进行数据传输。首先一个开始位被发送出去,同时发送数据由发送保持寄存器装载到发送移位寄存器中,而将数据以波特率时钟逐位发送出去,并按照线性控制寄存器的要求加上奇偶校验位和停止位。其时钟、帧结构配置和工作过程与接收模块类似,因此,发送模块也可以通过相似的状态机实现。
2.3 中断仲裁模块
UART的中断分为4个等级,其对应的中断事件为:接收模块线性状态、接收数据准备就绪、发送保持寄存器空和MODEM状态,它们记录在中断识别寄存器中。UART通过读取中断识别寄存器检测所有的中断信号,然后指明优先级最高的中断给外部接口。该模块使用状态机实现时,共分为5个状态,其中4个等级的中断各为一个状态,外加一个空闲状态,根据每次读取中段识别寄存器的结果确定应进入哪一状态,从而保证了各级中断依次被响应。