UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是用于控制CPU与串行设备通信的芯片,将由CPU传送过来的并行数据转换为输出的串行数据流。将系统外部来的串行数据转换为字节,供系统内部使用并行数据的器件使用。他可以在输出的串行数据流中加人奇偶校验位和启停标记,并对从外部接收的数据流进行奇偶校验以及删除启停标记。常见UART主要有INS8250,PC16450和PCI6550,其中16550发送和接收都带有16 B的FIFO,为协调发送、接收端的速率匹配提供了更大的缓冲余地,同时也可以提高CPU的使用效率,从而提高系统的整体性能。
2 UART16550的基本结构 如图1所示,UART16550的基本结构由CPU接口模块、波特率发生器、FIFO控制器、发送/接收FIFO和发送/接收模块共7个部分组成。 CPU通过UART的CPU接口模块配置整个UART,波特率发生器在CPU写入初始值后产生需要的波特率,控制发送和接收模块在设定的波特率下工作。CPU通过接口模块向发送FIFO内写入需要发送的8位数据,同时发送模块开始读取FIFO中的数据,并加入起始位、奇偶校验位和停止位后以串行发送的方式传输给串行接收设备。接收模块时刻监视串行输入端口,发现有数据发送来的时候马上启动接收模块开始接收数据并有效的判断出奇偶校验位来检测数据的正确性,最后把剩下的8位数据放入接收FIFO,并通知CPU有数据进来进行接收。异步串行通信协议的数据传输格式如图2所示。 UART16550的发送数据位可以选择为5~8位,同时可以选择奇校验、偶校验或者不设置校验位,停止位可以约定为1,1.5或2位。 3 UART16550的设计实现 3.1 CPU接口模块 CPU接口模块完成了CPU指令的解读与寄存器配置以及UART状态读取等功能。通过3位的地址线和8位的数据线,CPU可以对波特率发生器的波特率进行预先的设定,以使串口两端的设备在同一波特率下完成接收和发送的工作。同时CPU接口接收来自CPU的需要发送的5∽8位数据,送人发送模块,或者把接收模块接收到的数据通过接口送给CPU进行数据处理。在此接口模块里,设置了8个控制和状态寄存器,包括RBR(Receiver Buffer Register)接收缓冲寄存器、THR(Transmit Hold Register)发送保持寄存器、IER(Interrupt Enable Register)中断使能寄存器、IIR(Interrupt ID Register)中断寄存器、LCR(Line Control Register)线控制寄存器、LSR(Line Status Register)线状态寄存器、SCR(Scratchpad Register)暂存寄存器和FCR(FIFO Control Register)。在使用UART16550前,CPU必须要对控制寄存器进行配置,包括波特率、数据位数、奇偶校验、停止位位数及FIFO的控制等。这也是16550区别于一般UART的具有可编程的特点。 3.2波特率发生器 波特率是单位时间内传送的二进制数据的位数,以位/秒(b/s)表示,也称为数据位率。 收/发时钟频率与波特率之间关系: 收/发时钟频率=N×波特率 N可以取8,16,32和64等,为了兼顾速度和稳定性一般取为16。N在硬件设计时已经设定好,软件不能改变。波特率发生器由两个8位的数据寄存器组合成16位的分频寄存器,可以实现系统频率的1~2(16)分频,达到预定的波特率设置。 3.3 FIFO控制器和发送/接收FIFO 带有缓存是16550以及更高端UART的突出的特点。16550带有8位宽、16字节深的异步FIFO。FIFO控制器从CPU接口读入信息,配置发送/接收FIFO,并且在需要的时候使能FIFO,并且把FIFO的实时状态通过CPU接口送给CPU以方便CPU读取数据。在发送FIFO空和接收FIFO满的时候,FIFO控制器立即产生中断请求,通知CPU进行下一步的操作。另外,当配置DMA模式时,CPU可以进行大数据量的发送和读取,减轻了CPU的负担,可以提高整个系统的运行效率。 3.4发送模块 发送模块的核心是one hot编码的状态机。他可以读人来自FIFO的数据,并根据配置寄存器里面的信息加入起始位、1,1.5或2位停止位和奇偶校验位,然后把打包的数据通过移位寄存器把数据以标准的串口协议发送给串口接收设备。只要发送FIFO中有数据存在,发送模块就会一直发送,直到FIFO空为止。在不选择FIFO的情况下,发送模块则直接接收来自THR(Transmit Hold Register)发送保持寄存器的数据,不经过缓存直接发送。 3.5接收模块 接收模块是发送模块功能的逆序执行。他接收来自外部的串行数据,根据配置去除数据的起始、停止位和奇偶校验位,若出现数据差错则立即产生错误信息。如果没有错误,则将剩余的8位有用数据送入接收FIFO让CPU读取。同样接收模块也可以选择不使用FIFO,这时接收模块就会把8位数据直接送给RBR(Receive Buffer Register)接收缓冲寄存器,再由RBR送给CPU。 4结果的验证仿真 设计采用VHDL语言在FPGA Advantage平台下编写,并通过Modelsim编译仿真,并且通过ISE下载到电路板上验证,硬件验证FPGA芯片采用Xilinx的Spartan3。XC400PQ208。由于验证UART接收/发送时序必须要有处理器,所以采用在FPGA内部嵌入Xilinx的MicroBlaze软核模拟CPU控制时序,通过FPGA外接的串口实现与计算机串口进行通信。 5 结 语 本文介绍了UARTl6550在可编程逻辑器件FPGA上的实现,并通过实际电路验证了设计的功能,使用FP-GA不仅可以方便地用串口协议与PC机进行串行通信,而且扩展了板级系统的接口功能。应用在可编程器件FPGA内部,可以很大程度地减少电路板的使用面积,并提高系统的稳定性和可编程性。 |