代码下载
版本1.1: uart.vhd (13.1 KB)
修正了接收起始位错误检测
版本1.0: uart_v1_0.vhd (13.0 KB)
首次公开发布
特性
- 通用异步收发器(UART)组件的VHDL源代码
- 全双工
- 可配置波特率
- 可配置数据宽度
- 可配置校验位(奇/偶/无)
- 可配置接收数据过采样率
- 无流控
简介
本文详述了用于CPLD和FPGA的UART组件,采用VHDL编写。该组件使用Quartus II 13.1.0版本设计。资源需求取决于具体实现方案。图1展示了集成到系统中的UART典型实例。
图 1. 应用示例
背景
UART是用于异步串行通信的设备。包含两条数据传输线:RX和TX,分别用于不同方向的传输。有时会包含额外线路实现流控,最常见的是RTS(请求发送)和CTS(清除发送)。传输速率、数据位宽、校验方式和流控均可配置,且必须确保两个UART通信方的设置一致。
图2展示了数据传输时的数据帧结构。无通信时,线路保持高电平以表明线路及发射器未损坏。通信事务以低电平起始位开始。随后是数据字。接下来是可选的校验位,可配置为偶校验、奇校验或无校验。最终由高电平停止位结束通信事务。
![]()
图 2. 数据帧结构
通信模式可为单工、半双工或全双工。该组件中,发送与接收线路独立运作。虽然这使得组件本身具备全双工特性,但通过用户逻辑控制也可实现单工或半双工操作。
工作原理
生成波特率与过采样率时钟使能信号
波特率指数据传输速度(单位:比特/秒)。过采样率表示接收电路在每个波特周期(即每个数据位)内对接收输入的采样次数。
本组件通过生成对应频率的时钟使能脉冲来实现波特率与过采样率。这些信号源自系统时钟 clk 的频率,该频率必须在通用参数 clk_freq 中指定。
组件内部计数器产生符合波特率的波特脉冲。该周期性脉冲使系统时钟能以波特率驱动发送电路。由于生成的波特率必须是系统时钟的整数倍,每个波特周期会引入微小误差。但该误差不会超过一个系统时钟周期。
同理,另一个计数器生成频率=过采样率×波特率的过采样脉冲。该脉冲使系统时钟能以过采样率驱动接收电路。注意此计数器会在每个波特脉冲时复位,确保计数误差不会累积超过一个波特周期。通过这种方式,接收电路实现的波特率与发送电路的波特率完全一致。
发送电路
当tx_ena 输入信号有效时,tx_data 上的数据会被锁存到内部移位寄存器中。此时,校验位也会通过异或逻辑计算得出,并与起始位、停止位一同锁存至该移位寄存器。随后波特脉冲会周期性地启用系统时钟,以波特率将寄存器内容移位输出到 tx 线路。tx_busy 输出信号向用户逻辑指示传输何时完成,以及电路何时准备好接收新的发送数据。
接收电路
接收电路在每个过采样脉冲时监测 rx 输入。若检测到逻辑低电平,则开始计数,并在检测到足够数量的连续低电平输入后确认接收到起始位。此时开始通过计数过采样脉冲,以波特率将 rx 线路的值移位存入移位寄存器。
当整个数据字移入寄存器后,接收电路通过异或逻辑验证数据校验位。随后将接收到的数据输出至 rx_data 端口,并在 rx_error 端口标记检测到的任何错误。rx_busy 端口的高到低跳变向用户逻辑表明新的接收数据已就绪。
配置 UART
通过设置ENTITY中的GENERIC参数来配置UART。表1描述了这些参数。
表 1. 通用参数说明
端口描述
表2描述了UART的端口。
表 2. 端口描述
事务处理
虽然属于同一组件,但发送和接收事务互不影响,因此可独立运行。
发送
图3展示了一个示例传输的时序图。请注意,此处显示的 baud_tb 信号是UART内部信号,仅用于说明目的。用户使用UART时无需考虑该信号。
图 3. 发送时序图示例
tx_busy 输出端口的低电平表示组件已准备好发送数据。在 tx_ena 输入信号有效时的第一个 时钟 上升沿,组件会锁存 tx_data 端口上的数据。在下一个 时钟 周期,组件将置位 tx_busy 信号,表示UART发送电路正忙。此状态下发送电路将忽略所有输入信号。实际传输将在UART内部生成下一个波特周期脉冲baud_tb 时开始。此时tx 信号将输出逻辑低电平的起始位,传输正式开始。UART会先发送 tx_data 的最低有效位(LSB)。图示传输中,数据字后跟随的是偶校验位。当逻辑高电平的停止位发送完毕且传输完成后, tx_busy 信号将解除置位,表示发送电路已准备好进行下一次传输。
接收
图4展示了一个接收示例的时序图。接收事务由UART通信方通过 rx 输入端口发送逻辑低电平起始位触发。当UART检测到 rx 输入线保持低电平达半个波特周期时,将识别起始位并置位 rx_busy 信号,通知用户逻辑正在进行接收事务。随后UART会以预设波特率逐位移入数据位,计算并校验奇偶位,确保在正确时间出现逻辑高电平停止位。检测到停止位后,UART将接收到的数据输出至 rx_data 端口,首个接收位作为最低有效位。同时输出 rx_error 信号,指示是否检测到起始位、奇偶位或停止位错误。随即解除 rx_busy 信号置位,告知用户逻辑接收事务已完成,结果可通过 rx_data 和 rx_error 端口获取。
图 4. 接收时序图示例
图5展示了UART如何检测接收线上的输入位。UART会在每个过采样脉冲时监测 rx 输入。在此仿真中,过采样率( os_rate )设置为16,即每个波特周期内产生16个采样点。当UART检测到 rx 输入连续8个采样周期( os_rate/2 )保持逻辑低电平时,即判定起始位存在。随后每隔16个采样点移位读取一个数据位,该时刻对应每个接收位的中间位置。
![]()
图 5 。 UART内部接收位处理机制
复位
UART组件工作时, reset_n 输入端口必须保持逻辑高电平。该端口的低电平信号会异步复位组件。复位期间,组件将 tx_busy 端口置高以表明当前无法发送数据。正在进行的任何传输都将中止, tx 输出端转为逻辑高电平状态。rx_busy 端口保持低电平,表示当前无接收操作。正在进行的接收过程将被终止,rx_data 和rx_error 输出端口清零。复位解除后, tx_busy 端口会在下一个时钟周期解除断言,表明UART已准备好通信。
结论
本UART为可配置可编程逻辑组件,支持通过简易异步串行接口进行通信。用户可自定义系统时钟、波特率、数据长度、校验方案及过采样率等参数。




