基于FPGA的UART控制器的实现

2020-02-28 18:23发布

通用异步收发器(UART, Universa lA synchronousRece iver Transm itter)是一种应用广泛的短距离串行传输接口, 具有传输线少、成本低、可靠性高等优点. 8250、8251等都是常见的UART 接口芯片, 但专用芯片一般引脚较多, 内含许多辅助模块和一些辅助功能, 在实际使用时往往用不到这些功能, 基本的UART 通信只需要接收和发送两条信号线, 接收与发送是全双工形式, 因此若采用UART 专用芯片, 将会使电路变得复杂, PCB面积增大, 从而导致成本增加, 系统的稳定性和可靠性降低. 由于FPGA 的功能日益强大, 开发周期短、可重复编程等优点也越来越明显, 可以在FPGA 芯片上集成UART 功能模块, 从而简化电路, 缩小PCB 面积, 提高系统可靠性. 此外, 基于FPGA 的设计具有很高的灵活性, 可以方便地进行升级和移植。
1、 UART 控制器的FPGA实现
异步收发器的顶层模块由波特率发生器、UART 接收器和UART发送器构成. UART 发送器的用途是将准备输出的并行数据按照基本UART 帧格式转为TXD 信号串行输出; UART 接收器接收RXD 串行信号, 并将其转化为并行数据, 但串并转换的时钟同发送器一样处理, 收发设备间的时钟是会累计的, 会导致接收数据不正确, 波特率发生器就是专门产生一个远远高于波特率的本地时钟信号对输入RXD 不断采样, 以不断地让接收器与发送器保持同步。
本设计主要分为波特率发生器模块、发送模块和接收模块, 采用的芯片为康欣公司的KX _7C5系列芯片, 其具体型号为EP2C5T144, 具备4608个逻辑宏单元、两个锁相环, 约20万门、约12万RAM bi.t 具体实现方法如下:
1. 1、波特率控制器
波特率控制可有多种方法实现, 常用计数器分频, 或利用片内锁相环控制, 分频较为简单, 但对输入频率有要求, 分频后的频率必须在该波特率下频率偏差允许范围内, 设定较好的输入频率值, 可解决此问题,这样可较少消耗片内资源, 锁相环技术虽然对输入频率没有过高要求, 但定制内部锁相环, 必然耗费较多的片内资源, 本设计出于对片内资源的考虑, 采用了分频方法实现波特率控制器. 波特率发生器实际是一个频率变换器. 可以根据给定的系统时钟和要求的波特率, 通过内部的分频或倍频, 最终得到适宜双方通信的一个时钟频率. 发送器和接收器以该频率为基准, 进行发送和采样接收。
1. 2、接收器
由于串行数据帧和接收时钟是异步的, 由逻辑1转为逻辑0可以被视为一个数据帧的起始位. 然而为了避免毛刺影响, 能够得到正确的起始为信号, 必须要求接收到的起始位在波特率采样过程中至少有一半是属于逻辑0才可以认定接收到的是起始位. 由于内部采样时钟是发送和接收时钟频率的16倍, 所以起始位至少有8个连续采样时钟周期的逻辑0被收到, 才认为起始位接收到, 接着数据位和奇偶校验位将每隔16个采样时钟周期被采样一次(即每一个波特率时钟采样一次). 如果起始位的确是16个采样时钟周期, 那么接下来数据在每位中点处被采样, 采得的数据进行移位寄存, 当一帧接收完, 把移位接收寄存器中的内容放入接收缓冲寄存器, 同时产生接收完一帧的标志信号。
基于UART 的实现原理和通信协议, 本设计采用图1的状态机完成此模块。

接收器共设有5个工作状态: R_START (等待起始位)、R_CENTER (求中点)、R_WA IT (等待采样)、R_SAMPLE (采样)、R_STOP(停止位接收) 。
( 1) R_START状态: 当UART接收器复位后, 接收状态机将处于这一个状态. 在此状态, 状态机一直在等待RXD的电平跳转, 从逻辑1变为逻辑0, 即起始位, 这意味着新的一帧UART数据帧的开始, 一旦起始位被确定, 状态机将被转入R_CENTER状态。
( 2) R_CENTER 状态: 在本状态, 判定起始位是否真实, 通过对采样时钟的个数进行计数( RCNT16为采样时钟个数计数器) , 可以认为保持逻辑0超过1 /2个位时间的信号一定是起始位。
( 3) R_WA IT状态: 当状态机处于这一状态, 等待计满15个采样时钟周期, 在第16个采样时钟周期是进入R_SAMPLE状态进行数据位的采样检测, 同时也判断是否采集的数据位长度已达到数据帧的长度( FRAMELEN ) , 如果到来, 就说明停止位来临了。
( 4) R_SAMPLE 状态: 即数据位采样检测, 完成后无条件状态机转入R_WA IT状态, 等待下次数据位的到来。
( 5) R_STOP状态: 无论停止位是1还是1. 5位, 或是2位, 状态机在R_STOP不具体检测RXD, 只是输出帧接收完毕信号(REC_DONE< = ‘1’), 停止位后状态机转回到R START状态, 等待下一个帧的起始位。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。