文献标识码:A
文章编号: 0258-7998(2013)01-0037-03
通用异步收发器UART(Universal Asynchronous Receiver/Transmitter)是串行通信的重要组成部分,其基本功能是实现数据的串行化/反串行化和错误校验,这也是所有的UART设计都能实现的基本功能,但是其他各种功能都兼顾的设计非常少。参考文献[1]设计了一个在MCU中运用非常广泛的UART接口,其功能比较全面,但是波特率产生器采用整数分频的设计,导致系统只有在特定系统时钟、特定波特率的情况下误差才会比较小,不能满足高波特率和非标准波特率的要求;参考文献[2]设计的UART IP基本功能良好,但是不支持红外、自动波特率检测等功能;参考文献[3]的设计只支持中断模式,不支持DMA模式,不能满足大量数据高速传输的需求,且中断总是打断CPU的操作,效率较低。本文提出了一种多功能UART模块的设计,并利用VerilogHDL语言进行实现。本设计能满足多模导航基带芯片中的不同需求(如相关器数据的传输等),同时降低误差,保证卫星数据的正确性。
1 UART电路主要模块设计
本设计采用标准的UART传输协议,字符帧由起始位、数据位、奇偶校验位和停止位四部分组成[4]。UART电路包括UART总控模块UART_CTRL、波特率产生器UART_BFG、数据发送模块TRANSMITTER、数据接收模块RECEIVER和FIFO模块,其总体结构图如图1所示。
1.1 接收模块
串行数据帧和接收数据时钟是异步的,由逻辑1跳变为逻辑0可视为一个数据帧的开始,所以接收器首先需要判断起始位,常用的方法有三倍速采样法和起始位中断捕捉定时采样法。据经验可知,数据的中间采样值可靠性较高,可以采用中间时刻采样法[2],并且,接收和发送单元的数据采样率为波特率的16倍,可降低由于时钟不匹配引起的误采样。接收器采用状态机[2]实现,状态机的描述如下:
(1)RX_IDLE:当UART接收器复位时,FSM处于这一状态。在该状态中,状态机一直等待RXD电平跳变,即出现下降沿。检测到起始位后,进入RX_START状态。
(2)RX_START:在该状态下,在采样时钟的上升沿对URXD低电平进行计数。当计数为8(即确保在起始位的中间点)时,转到RX_DATA状态;如果逻辑零的个数少于8,则认为是毛刺,跳回RX_IDLE状态。
(3)RX_DATA:在该状态下,每隔16个采样时钟采样1 bit串行数据,接收8 bit异步数据并进行串/并转换。同样是对采样时钟的上升沿进行计数,当计数值为16时进行数据采样。如果起始位为16位,则可以保证数据位都是在中点处被采样,同时进行串/并转换。当探测已经接收到相应位的数据后,进入奇偶校验状态。
(4)RX_PARITY:该状态的主要功能是奇偶校验,通过对实际接收到的数据的奇偶性与发送过来的奇偶校验位进行比较,判断奇偶校验错误状态。
(5)RX_STOP:对停止位进行采样,并且判断停止位是否为1。若停止位不正确,则帧错状态位置1。
将接收到的数据和错误状态数据一起写入到接收FIFO中。接收到错误的数据后不马上产生错误中断,一旦数据被读出,此时错误状态也一起被读出,立即产生错误中断。
1.2 发送模块
发送器实现的功能是将输入的8 bit并行数据变成串行数据,同时在数据位头部加入起始位,在数据位尾部加奇偶校验位和停止位。发送模块的设计比较简单,其状态机与接收模块相对应,在此不再赘述。
1.3 波特率产生模块
波特率发生器一般采用分频器实现,传统的采用整数分频器实现的误差在某些系统时钟下超出了可控范围,如在参考时钟为16.37 MHz、波特率为460 Kb/s的情况下,误差达到了11.2%,会导致数据传输的错误。因此,本设计采用小数分频器实现相对准确的波特率。另外,在收发的过程中,可以改变波特率寄存器的值,但实际波特率的改变发生在当前帧传输完成之后。波特率产生模块的电路结构图如图2所示。
小数分频的实现方法有很多,但其基本原理是一样的,即在若干个分频周期中采取某种方法使某几个周期多计或少计一个数,从而在整个分频周期内总体平均分频数为小数分频[5]。
通过采用小数分频,大大降低了实际波特率与要求波特率之间的误差。在正常情况下,误差不应超过2%,如果超过了,则需要相应地提高系统时钟来降低误差。表1列出了19.2 MHz情况下的整数分频和小数分频波特率误差对应表,可以看到采用小数分频的波特率误差明显较小。
在本设计中,发送器、接收器和波特率产生模块是主要模块。FIFO(先进先出)模块是数字电路设计中比较常用的模块,本文复用了通用的FIFO模块,在文中就不再赘述。UART的控制模块主要负责对寄存器的相关操作,通过APB总线实现,其电路设计比较简单,也不再赘述。
2 UART模块的其他功能
2.1 自动波特率检测
UART接收通道在接收数据之前,如果发送端的波特率不清楚,可进行自动波特率检测。实现方法是:发送端间隔发送检测字,间隔时间为传输一帧所需的时间。接收方UART根据start位来确定是否有数据在传输,当其检测到下降沿时就进入RX_START的状态中,在波特率不明确的情况下,并不产生采样时钟,用PCLK进行采样计数。由于start位为1 bit,根据计数值可知这1 bit所占用的时间。如果接收数据完成后,接收到的数据是约定值,则证明波特率检测成功,可以将检测到的值存储于寄存器中。自动波特率检测原理公式如下:
1/baudrate=count×(1/PCLK)(1)
根据式(1)可得发送端的波特率。实现自动波特率检测无需专门的模块设计,在接收器模块内就可以实现。
2.2 自检测模式
Loopback(自检测)模式是UART内部的一种自测功能。当UART出现问题时可以先自测,将控制寄存器中Loopback位使能,UART可以将内部的发送(TXD)和接收(RXD)连接在一起,确定内部的数据通路没有问题。
2.3 红外传输功能
本设计的UART支持IrDA 1.0协议,所以使用红外时最高波特率为115.2 Kb/s。通过寄存器的红外控制位选择红外使能,可以实现红外脉冲。IrDA数据通路如图3所示[1]。
2.4 DMA模式
本设计UART不仅支持查询、中断模式,还支持DMA模式以提高连续传输的能力,能够高效地传输基带芯片相关器中的大量数据。CPU除了在开始和结束时处理中断外,在传输过程中也可以进行其他工作。
3 仿真验证和综合结果
3.1 仿真验证
本文采用Altera公司EP3SL150F1152的FPGA芯片进行实测,使用VCS仿真工具,并利用VERA语言和Verification IP进行验证。仿真结果如图4、图5所示。
图4是波特率自动检测的仿真波形。002号波形是未知波特率的接收端波特率产生器的分频值,在未知的情况下为0;005号波形是发送端波特率产生器的分频值,为567H。从002号波形的变化可以看到,发送端发送检测字41H,接收端在接收完一个检测字41H后,可计算出波特率分频值为567H。001号波形是接收端的接收移位寄存器,将串行数据转化为并行数据,接收完成后得到41H,也证明了数据的正确传输。这种波特率检测的方法迅速准确,一般情况下发一次检测字就能检测出发送端的波特率。
图5是数据红外传输的仿真波形。编码模块将待发送的001号波形编码成符合红外协议的002号波形发送出去,接收端接收到005号波形要经过译码模块译码成006号波形输出给接收器。由图中可以看到,发送寄存器发送了3个值2cH、78H、65H,在经过编码、译码模块后,接收器能够接收到正确的值。008号波形中高电平脉冲表示一个数据接收成功;007号波形接收移位寄存器中的数据正是发送端发送的3个值,证明数据能够正确传输。本设计支持协议中5 bit、6 bit、7 bit、8 bit数据的传输,图5中采用的是6 bit数据位。
3.2 综合结果
UART接口包括UART接口模块(接收和发送模块)、两个FIFO模块(深度为32、宽度为8)、UART波特率产生模块和UART控制模块,在0.18 μm CMOS的工艺下用Synopsys的Design Compiler对模块进行综合,将UART接口的输入时钟PCLK设置为100 MHz,模块总面积为19 620.7 μm2,约合1962逻辑门、7 848个晶体管。
本文提出了一个功能全面的UART IP核的设计,并采用Verilog HDL语言实现[6]。在与PC机的长时间串口通信实验中能够正确进行传输,在不同的波特率设置下都能正确工作。同时,用示波器观测传输波形可知,波特率误差小于1%。设计完成后,在VERA平台上进行了仿真验证,最后下载到FPGA平台上实现,与PC的串口相连,采用串口大师软件进行实测,其在全双工模式下也能正常工作,实测的结果显示其性能和功能都能满足要求。
参考文献
[1] Samsung.S3C2410A:user manual revision 1.0[Z].2004.
[2] 赵海登,刘晓文,胡景军,等.基于FPGA的UART IP核的设计实现[J].通信技术,2009,5(42):177-178.
[3] 张松,董玲,于宗光,等.一种适合于SoC集成的UART核的设计实现[J].微电子学与计算机,2005,22(9):12.
[4] Wang Yongcheng,Song Kefei.A new approach to relize UART[C].International Conference on Electronic & Mechanical Engineering and Information Technology,2011:2751.
[5] 周殿凤,周素成,王俊华.基于FPGA的任意输注分频器的设计[J].信息化研究,2010,36(2):59-60.
[6] 王金明.数字系统设计与Verilog HDL第二版[M].北京:电子工业出版社,2005.