为了适应全数字化自动控制更加广泛的应用,采用现场可编程门阵列(FPGA)对异步串行通信控制器(UART)进行多模块的系统设计的方法,使串口通信的集成度更高。
对UART系统结构进行了模块化分解,可分为三个模块:FPGA波特率发生器控制模块、FPGA数据发送模块及数据接收模块。采用Verilog语言描述硬件功能,利用Xilinx公司的FPGA芯片,在Xilinx ISE Design Suite 13.4环境下进行设计、编译、综合、下载。采用第三方仿真工具ModelSim进行模拟仿真。
0 引言
异步串行通信(UART)是一种广泛应用的串行数据传输协议,UART的要求是传输线少,可靠性高而且传输距离远。UART功能负责从总线采集数据,转换成传输格式,然后发送到串口。也负责从串口接收数据,检查和删除附加的位,并传送结果数据给总线。异步串行通信广泛的应用于军事、工业、自动控制、仪器、通信、医药、话音图像处理等众多领域。现实应用中多采用专用集成芯片实现UART 功能,如8250、8250A、16450、16C451、16C551 等。但在实际应用中,一般只需要UART的几个主要功能,专用芯片成本比较大且造成资源的浪费。近年来随着电子设计技术的日趋成熟,特别是FPGA在集成度和速度上的大幅提高,可以用一个芯片构成一个复杂的系统。一个芯片就能完成处理计算、通信、控制等多功能,而且成本大幅度降低。根据以上考虑,本文采用FPGA实现UART 功能。
1 UART通信原理
串行通信分为两种类型:同步通信方式和异步通信方式。UART即通用异步串行通信收发器。UART的一帧数据由起始位、数据位、奇偶校验位和停止位组成。数据在传输过程中是通过一个字符接一个字符进行传输来实现通信的。每一帧的信息在传送前传输线处于高电平状态。在传送一个字符信息的时候,每一个字符的接收是靠起始位来同步的,字符的前面是一位起始位,首先发送起始位为低电平,一般用下降沿通知收方传输开始,然后发送起始位之后的数据位,数据位的传送先低位后高位,字符本身由5~8位数据位组成。
数据位后面是奇偶校验位,奇偶校验位后的是停止位,标志着一帧字符结束。停止位后为高电平,为空闲位,并为下一个字符的开始传送做准备。在发送、接收数据时,数据的帧与帧之间如果有间隙,就要在停止位之后附加空闲位,停止位后面是不定长度的空闲位。停止位和空闲位都规定高电平,这样可以保证起始位开始处有一个下降沿。如图1所示。
1.1 系统设计与硬件实现
异步通信允许在串行链路上进行全双工的通信。
本文把异步通信电路作为一个整体来实现,数据接收经过MAX232进行电平转换后经FPGA 串口模块的RXD端输入,由FPGA 进行串/并转换后,8 位有效数据进入总线,再进入处理芯片。数据发送经数据处理后经由总线进入FPGA串口模块,8位有效数据在FPGA中进行并行转换为串行数据后由TXD端输出到MAX232的12管脚,在MAX232种经过电平转换后由TXD 端输出,系统基本结构框图如图2所示。
帧格式采用1位开始位,8位数据位,1位停止位,波特率为115 200,根据采用的帧格式,需要发送的数据为10位(1位开始位、8位数据位、1位停止位),在发送完这10位后,就应该停止发送,并使发送端电平处于逻辑1,然后等候下次的发送。
1.2 FPGA波特率发生器模块
串口通信,就是RS 232/RS 485通信,要求通信的双方波特率等通信格式一样才可以通信成功。在电子通信领域,波特率(BaudRate)即调制速率,指的是信号被调制以后在单位时间内的变化,即单位时间内载波参数变化的次数。它是对符号传输速率的一种度量,1 Baud即指每秒传输1个符号。在基于FPGA实现通用异步通信时,波特率发生器是一个必不可少的部分。波特率发生器实际上就是一个分频器,可以根据给定的系统时钟频率和要求的波特率算出波特率分频因子,算出的波特率分频因子作为分频器的分频数从而产生所需的时钟频率。在设定发送和接收使用相同的波特率的情况下,UART只需要一个波特率发生器就可以了。
系统提供的时钟频率为10 MHz,数据信号的传输速率为115 200 Hz,波特率发生器产生的时钟对数据信号进行采样,设定对传输的数据信号进行3倍采样,则波特率发生器产生的频率为:
3×115 200=345 600 Hz那么就可以根据给定的系统时钟和要求的波特率计算出分频因子:
1×107/345 600=28.94对时钟进行28.94分频是很难实现的,因此取整数30作为分频因子。尽管这样会使得分频得到的时钟会比所需的345 600 Hz高3.5%,但这样微小的变化不会影响实际电路的工作。其仿真图如图3所示。
1.3 FPGA数据发送模块
发送过程就是把并行总线上的数据发送到串行总线上。数据发送的过程可以分为空闲状态、加载状态、发送状态和发送完成状态。空闲状态就是UART 内核复位后的空闲状态,等待加载状态。UART进入空闲状态后,当检测到发送控制信号有效时,就进行加载状态并开始进行数据的加载。加载状态就是发送模块按照串行发送的顺序将要发送的这一帧数据加载到移位寄存器内,将移位寄存器和计数器都复位,使移位寄存器和计数器的工作时钟为系统时钟。当计数器达到了计数的上限时,它会产生一个指示信号通知UART内核进入发送状态。UART 内核状态机进入发送状态的同时要改变相应信号,这时移位寄存器时钟必须为波特率时钟,最重要的是将输出信号送到RS 232 的发送端口TXD上。在发送状态,也需要计数器的控制,当计数器达到了计数的上限时,它会产生一个信号通知UART内核进入发送完成状态。当UART 内核状态机进入发送状态后,并产生发送完成中断信号。这样就可以把数据从串行端口上发送出去了。发送数据和接收数据的状态转换图如图4所示。
发送一帧数据的部分程序如下:
发送一帧数据的仿真结果如图5所示:
1.4 FPGA数据接收模块
数据的接收与数据的发送相比要复杂些。在数据的接收过程中,UART的接收模块首先要进行的是对起始位的检验。一般当接收的第一个是低电平,就标志着一个数据帧的开始,但是在一个数据帧中间也有可能包括-个低电平的位,系统有可能默认为这个低电平为起始位,这样就会产生一个“假的起始位”.所以,在数据接收的过程当中还要包括对数据起始位的判断。所以数据的接收过程可以分为空闲状态、起始位检测状态、数据位读取状态、读取停止状态、准备完成接收和停止位读取状态。在判断起始位低电平后,触发接收过程,进入数据位读取状态使串行总线的输入数据不断被读取并且保存在寄存器内,计数器也到达计数的上限时,接收完成之后并进入准备完成接收状态,UART控制器会在输出结果之前对已经接收的数据进行奇偶校验。
然后进入停止位读取状态。在每一种状态,如果使能信号无效时都转回空闲状态。最后UART 控制器准备下一次的数据接收并重置控制器内的信号检测器。
在接收数据过程中,会有一些其他原因使信号产生反转。为了消除毛刺,在接收数据时,采用3选2的方法消除误差。也就是这个字符的值是至少有两次采样的值相等的值。
采用3选2方法接收数据的程序如下:
接收一帧数据的仿真结果如图6所示。
在波特率为115 200 情况下对UART 进行仿真,结果如图7所示。通过仿真波形可以看出,设计结果正确地发送和接收一帧数据并产生相应的中断。
2 结论
本文介绍了一种基于FPGA 实现异步串行通信功能,采用多模块的方法实现异步串行通信功能,可以方便用户根据需要进行裁减、便于理解和调试。本文运用Verilog语言进行设计异步串行并行收发器的IP核电路。
用FPGA 实现UART 功能,充分利用了FPGA 的剩余资源,相对于专用UART 芯片,减小系统PCB 板的面积,降低系统的功耗,提高系统的稳定性。近年来在电子设计领域中,这种硬件软件化的方法已经成为一种流行趋势。该设计采用Xilinx公司的Spartan3E系列中器件XC3S100E.通过ISE软件进行时序仿真和硬件测试各项通信指标均满足要求,整个设计的正确性和完整性得到验证,各项功能均达到预期的要求。(作者:田乐,张勇)