新闻中心

EEPW首页 > EDA/PCB > 设计应用 > 集成UART核心的FPGA异步串行实现

集成UART核心的FPGA异步串行实现

作者:时间:2012-06-07来源:网络收藏

串行外设都会用到RS232-C异步串行接口,传统上采用专用的电路即实现,如TI、EXAR、EPIC的550、452等系列,但是我们一般不需要使用完整的的功能,而且对于多串口的设备或需要加密通讯的场合使用也不是最合适的。如果设计上用到了/CPLD器件,那么就可以将所需要的UART功能内部,本人最近在用XILINX的XCS30做一个设计的时候,就使用VHDL将UADT的功能了,从而使整个设计更加紧凑,更小巧、稳定、可靠,下面就谈谈设计方法。

本文引用地址:http://www.eepw.com.cn/article/190284.htm

  分析UART的结构,可以看出UART主要由数据总线接口、控制逻辑和状态接口、波特率发生器、发送和接受等部分组成,各部分间关系如图一。

  用FPGA器件实现UART核心功能的一种方法

  了解了UART的各部分组成结构后,下面对各部分的功能进行详细的分析。我们假定所要设计的UART为:数据位为7位、8位可选,波特率可选,效验方式为奇、偶、无等效验方式,下面的分析都是在这个假定的基础上进行。

  一、波特率发生部分

  从图一可以看出,UART的接收和发送是按照相同的波特率进行收发的(当然也可以实现成对的不同波特率进行收发),波特率是可以通过CPU的总线接口设置的。UART收发的每一个数据宽度都是波特率发生器输出的时钟周期的16倍,即假定当前按照9600bps进行收发,那么波特率发生器输出的时钟频率应为9600*16Hz,当然这也是可以改变的,我们只是按照UART的方法进行设计。

  我们假定提供的时钟为1.8432MHz,那么可以很简单地用CPU写入不同的数值到波特率保持寄存器,然后用计数器的方式生成所需要的各种波特率,这个值的计算原则就是1843200/(16*所期望的波特率),如果希望输出9600Hz的波特率,那么这个值就是1843200/(16*9600)=12(0CH)。

  二、 发送部分

  这里应重点分析几个问题:首先是何时CPU可以往发送保持寄存器(THR)写人数据?也就是说CPU要写数据到THR时必须判一个状态,当前是否可写?很明显如果不判这个条件,发送的数据会出错,除非CPU写入THR的频率低于当前传输的波特率,而这种情况是极少出现的。其次是CPU写入数据到THR后,何时THR的数据传送到发送移位寄存器(TSR)并何时移位?即如何处理THR和TSR的关系?再次是数据位有7、8位两种,校验位有三种形式,这样发送一个字节可能有9、10、11位三种串行长度,所以我们必须按照所设置的传输情况进行处理。数据位、效验方式可以通过CPU写一个端口来设置,发送和接受都根据这个设置进行,由于这部分很简单,所以我就不给出程序了。

  根据上面的分析,引进了几个信号:

  bigin1、begin2:引入两个附加移位,目的是为送出起始位、停止位而加入串行长度。

  txdone7、txdone8:分别表示7、8位的结束标志。Txdone《=txdone8 when“8bit”else txdone7;

  Paritycycle7、paritycycle8:分别表示7、8位下的校验位。Parity《=parity8 when“8 bit”else parity7;

  Writerdy:为0时表示CPU不能将数据写入THR,为1时可以写入。


上一页 1 2 下一页

关键词: UART FPGA 集成 核心

评论


相关推荐

技术专区

关闭