Quick Start(快速上手)
- 下载并安装 Vivado 2020.1 及以上版本(或 Quartus Prime 18.0+)。
- 新建工程,选择目标器件,例如 Xilinx Artix-7 XC7A35T(Nexys4 DDR)。
- 将 I2C 主控模块(
i2c_master.v)和顶层测试文件(top.v)添加至工程。 - 编写约束文件(
.xdc),分配 I2C 引脚(SCL、SDA)与系统时钟(50MHz)。 - 运行综合(Synthesis),检查无严重警告。
- 运行实现(Implementation),查看资源占用与时序报告。
- 编写 Testbench,使用 Vivado Simulator 或 ModelSim 仿真验证 I2C 写/读时序。
- 观察波形:SCL 周期约 10µs(对应 100kHz),SDA 在 SCL 低电平变化,高电平采样。
- (可选)上板测试:连接 I2C 从设备(如 EEPROM 24LC64),通过串口打印读写结果。
- 验收:仿真波形符合 I2C 标准时序,上板后从设备正确响应 ACK/NACK。
前置条件与环境
| 项目 | 推荐值 | 说明/替代方案 |
|---|---|---|
| 器件/板卡 | Xilinx Artix-7 XC7A35T(Nexys4 DDR) | Altera Cyclone IV / Lattice iCE40 |
| EDA 版本 | Vivado 2020.1 | Quartus Prime 18.0 / ISE 14.7 |
| 仿真器 | Vivado Simulator | ModelSim / Questa / Verilator |
| 时钟/复位 | 50MHz 系统时钟,异步复位(低有效) | 100MHz(需调整分频系数) |
| 接口依赖 | I2C 总线(SCL、SDA 开漏输出) | 可模拟为推挽输出(仅仿真) |
| 约束文件 | I2C 引脚电平 3.3V,输出驱动 8mA | 根据板卡调整 IOSTANDARD |
目标与验收标准
本指南的目标是完成一个可综合的 I2C 主控模块,支持标准模式(100kHz)下的单字节写/读操作。验收标准如下:
- 功能点:产生 START、STOP 条件,发送 7 位从机地址+读写位,发送/接收 8 位数据,检测 ACK/NACK。
- 性能指标:SCL 频率 100kHz ±10%(50MHz 时钟下分频系数 250)。
- 资源占用:LUT ≤ 100,FF ≤ 80,无 BRAM 使用。
- Fmax:≥ 100MHz(综合后时序报告无违例)。
- 验收方式:仿真波形中 SCL 周期 10µs,SDA 在 SCL 低电平变化,ACK 位 SDA 被从机拉低 1 个 SCL 周期。上板测试:EEPROM 写入 0x55 后读出相同值。
实施步骤
工程结构建议
推荐目录结构如下:
i2c_project/
├── rtl/
│ ├── i2c_master.v # I2C 主控核心模块
│ ├── top.v # 顶层(例化 i2c_master + 状态机)
│ └── clk_div.v # 时钟分频(可选,可内嵌)
├── sim/
│ ├── tb_i2c_master.v # 测试平台
│ └── i2c_slave_model.v # 从设备行为模型(可选)
├── constraints/
│ └── top.xdc # 引脚与时序约束
└── vivado/
└── i2c_project.xpr # Vivado 工程文件注意:顶层模块应包含系统时钟输入、复位输入、I2C 引脚(SCL、SDA 为 inout)以及用户接口(如地址、数据、启动信号、完成标志)。
关键模块:i2c_master.v
核心状态机采用三段式(状态转移、次态逻辑、输出逻辑)。状态定义:IDLE → START → SEND_ADDR → ACK1 → SEND_DATA → ACK2 → STOP。关键代码片段如下:
// 状态机输出:SCL 产生
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
scl_out <= 1'b1;
end else begin
// 根据状态与分频计数器控制 SCL
end
end完整源码与仿真测试平台请参考附录中的文件列表。
验证结果
仿真波形应显示:
- SCL 周期为 10µs(100kHz),占空比约 50%。
- START 条件:SCL 高电平时 SDA 由高变低。
- 数据位:SDA 在 SCL 低电平时变化,高电平时被采样。
- ACK 位:第 9 个 SCL 周期,SDA 被从机拉低。
- STOP 条件:SCL 高电平时 SDA 由低变高。
上板测试结果:通过串口输出“Write 0x55, Read 0x55”即验证通过。
排障指南
- SCL 频率偏差过大:检查分频系数计算,确保系统时钟频率正确。
- 无 ACK 响应:确认从设备地址正确,检查 SDA 开漏配置及上拉电阻。
- 仿真波形异常:检查状态机转移条件,确保时序逻辑无竞争冒险。
- 上板后无输出:验证约束文件引脚分配,检查复位信号极性。
扩展建议
- 支持多字节读写:在状态机中增加字节计数逻辑。
- 支持快速模式(400kHz):调整分频系数为 62.5。
- 添加超时检测:防止总线挂死。
- 集成 FIFO 缓冲:实现连续数据流传输。
参考
- NXP I2C 总线规范(UM10204)
- Xilinx Vivado 用户指南(UG910)
- Verilog 硬件描述语言参考手册
附录
附录 A:完整源码文件列表
i2c_master.v:完整状态机实现top.v:顶层模块与用户接口tb_i2c_master.v:仿真测试平台i2c_slave_model.v:从设备行为模型top.xdc:约束文件示例
附录 B:仿真波形截图(略)




