1. UART串口发送模块设计概述
在FPGA开发中,UART(通用异步收发传输器)是最基础也最常用的通信接口之一。它就像电子设备之间的"普通话",让不同硬件能够相互交流。本次设计基于Xilinx ZYNQ平台,实现了一个完整的UART发送模块,支持多种波特率配置,并通过VIO工具实现了灵活的在线调试功能。
1.1 UART通信基本原理
UART采用异步串行通信方式,其核心特点包括:
- 异步传输:不需要时钟线,依靠双方约定的波特率进行同步
- 点对点通信:通常只需要TXD(发送)、RXD(接收)和GND三根线
- 帧结构简单:1位起始位 + 数据位(5-8位) + 可选校验位 + 停止位(1-2位)
以最常见的8N1配置为例,一帧数据包含:
- 起始位(低电平)
- 8位数据位(从最低位开始发送)
- 1位停止位(高电平)
1.2 设计目标与功能
本次设计的UART发送模块具备以下特性:
- 支持5种常用波特率:9600/19200/38400/57600/115200bps
- 8位数据位,无校验位,1位停止位(8N1配置)
- 提供发送完成状态指示
- 支持VIO在线调试,可实时修改发送数据
- 资源占用低,适合嵌入式应用
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 硬件架构设计
2.1 整体模块划分
UART发送模块由三个主要子模块构成:
- 波特率时钟生成模块:根据系统时钟和波特率设置,生成精确的波特率时钟
- 数据输出控制模块:管理数据发送状态,控制发送流程
- 数据传输模块:按照UART协议规范,将数据串行化输出
2.2 接口信号定义
模块的输入输出接口如下表所示:
| 信号名称 | 方向 | 位宽 | 描述 |
|---|---|---|---|
| clk | I | 1 | 系统时钟(50MHz) |
| reset_n | I | 1 | 异步复位信号(低电平有效) |
| data_byte | I | 8 | 待发送的8位数据 |
| send_en | I | 1 | 发送使能信号(上升沿触发) |
| baud_set | I | 3 | 波特率选择信号 |
| uart_tx | O | 1 | 串行数据输出 |
| tx_done | O | 1 | 发送完成标志(高电平有效) |
| uart_state | O | 1 | 发送状态指示(1=正在发送) |
2.3 波特率计算原理
波特率时钟通过系统时钟分频得到。以50MHz系统时钟为例,各波特率对应的分频系数计算如下:
分频系数 = (系统时钟频率 / 波特率) - 1
具体数值:
- 9600bps: 50,000,000/9600 -1 = 5207
- 19200bps: 50,000,000/19200 -1 = 2603
- 38400bps: 50,000,000/38400 -1 = 1301
- 57600bps: 50,000,000/57600 -1 = 867
- 115200bps: 50,000,000/115200 -1 = 433
实际设计中,我们使用16位计数器实现分频,因此最高支持的分频系数为65535,对应最低波特率约763bps。
3. Verilog实现详解
3.1 波特率时钟生成模块
verilog复制// 波特率分频系数查找表
always @(posedge clk or negedge reset_n) begin
if (!reset_n)
bps_DR <= 16'd5207; // 默认9600bps
else begin
case (baud_set)
3'b000: bps_DR <= 16'd5207; // 9600bps
3'b001: bps_DR <= 16'd2603; /
