1. 项目概述
在FPGA开发中,IIC总线协议的应用非常广泛,特别是在与各类传感器和存储设备的通信中。本次实验我们将重点探讨如何在Zynq平台的PL(Programmable Logic)端实现IIC从设备的功能模拟,具体对象是常见的AT24C256 EEPROM存储芯片。
这个实验的独特之处在于,我们完全通过PL端的硬件逻辑来模拟IIC从设备的行为,而不是简单地使用PS端的控制器。这种方法对于理解IIC协议底层机制、提升FPGA设计能力都有很大帮助。我在实际项目中多次采用类似方法解决特殊外设的接口问题,效果非常理想。
2. 实验环境准备
2.1 硬件配置
实验采用Xilinx Zynq-7000系列开发板作为硬件平台。具体配置如下:
- Zynq XC7Z020芯片
- 512MB DDR3内存
- 16MB QSPI Flash
- 扩展接口引出PL端IO
2.2 软件工具
需要准备的开发工具包括:
- Vivado 2020.2设计套件
- SDK/Vitis开发环境
- 逻辑分析仪软件(如Saleae Logic)
提示:建议使用Vivado 2020.2或更新版本,旧版本可能存在IP核兼容性问题。
2.3 基础工程创建
首先在Vivado中创建新工程:
- 选择对应型号的Zynq芯片
- 添加Zynq Processing System IP核
- 配置PS端基本参数(时钟、DDR等)
- 导出硬件平台到SDK/Vitis
3. IIC协议核心原理
3.1 IIC总线基本特性
IIC(Inter-Integrated Circuit)总线是一种同步、多主从的串行通信协议,主要特点包括:
- 两线制(SCL时钟线,SDA数据线)
- 7位或10位设备地址
- 标准模式(100kbps)、快速模式(400kbps)和高速模式(3.4Mbps)
- 支持多主设备仲裁
3.2 AT24C256特性分析
AT24C256是256Kbit的串行EEPROM,关键参数:
- 支持400kHz快速模式
- 32字节页写
- 64字节页读
- 硬件写保护功能
- 典型地址:0x50(7位地址)
在PL端模拟该设备时,必须严格遵循这些特性,特别是时序要求和页操作限制。
4. PL端IIC从机设计
4.1 状态机设计
IIC通信本质上是状态驱动的,我们需要设计一个完善的状态机。核心状态包括:
- IDLE:等待起始条件
- ADDR:接收设备地址
- ACK:发送应答
- CMD:接收操作命令
- DATA:数据读写
- STOP:检测停止条件
状态转换图如下(用文字描述):
- IDLE状态下检测到START条件跳转到ADDR
- 地址匹配后进入ACK
- 根据R/W位决定进入读或写流程
- 检测STOP条件返回IDLE
4.2 时序实现要点
在FPGA中实现IIC从机需要特别注意以下时序:
- 起始条件检测:SCL高电平时SDA下降沿
- 停止条件检测:SCL高电平时SDA上升沿
- 数据采样:SCL上升沿
- 数据变化:SCL低电平期间
Verilog实现示例:
verilog复制// 起始条件检测
always @(negedge SDA) begin
if(SCL == 1'b1) begin
state <= ADDR;
bit_cnt <= 0;
end
end
4.3 存储器模拟
AT24C256的存储空间需要模拟:
- 使用FPGA内部的Block RAM实现32KB存储
- 实现地址指针自动递增功能
- 处理页边界条件(写入跨越页边界时需要特殊处理)
存储接口设计:
verilog复制reg [7:0] mem [0:32767];
reg [14:0] addr_ptr;
// 写操作
always @(posedge clk) begin
if(wr_en) begin
mem[addr_ptr] <= data_in;
addr_ptr <= addr_ptr + 1;
end
end
5. 系统集成与测试
5.1 顶层模块设计
将IIC从机模块与Zynq PS端集成:
- 通过AXI接口提供PS端访问通道
- 配置PL端引脚约束
- 添加ILA逻辑分析仪核用于调试
5.2 测试方案
建议分阶段测试:
- 基础通信测试:检测起始/停止条件、ACK响应
- 单字节读写测试
- 页读写测试
- 边界条件测试(地址回绕等)
测试用例表示例:
| 测试项 | 预期结果 | 实际结果 | 通过 |
|---|---|---|---|
| 单字节写 | 存储正确 | 存储正确 | ✓ |
| 跨页写 | 自动分页 | 分页错误 | ✗ |
| 地址回绕 | 正确循环 | 正确循环 | ✓ |
5.3 常见问题排查
在实际调试中可能会遇到以下问题:
-
ACK响应异常
- 检查状态机是否在正确周期生成ACK
- 确认SDA线驱动强度足够
-
数据采样错误
- 调整SCL采样时钟相位
- 检查Setup/Hold时间是否符合要求
-
页写入失败
- 验证页指针管理逻辑
- 检查页边界处理代码
注意:IIC总线对时序要求严格,建议使用逻辑分析仪捕获实际波形进行比对分析。
6. 性能优化技巧
经过多次项目实践,我总结出以下优化经验:
-
时序收敛技巧
- 对SCL信号进行适当的时钟域交叉处理
- 添加输入延迟约束确保建立保持时间
-
资源优化
- 共享存储器接口减少BRAM使用
- 使用状态编码而非独热码节省逻辑
-
调试技巧
- 添加可配置的调试输出
- 实现软复位功能便于测试
实际项目中,通过这些优化可以将逻辑资源占用降低30%以上,同时提高时序裕量。
7. 扩展应用
掌握了PL端IIC从机实现方法后,可以进一步扩展:
-
多从机模拟
- 在单个FPGA中模拟多个IIC设备
- 实现地址解码逻辑
-
协议转换
- 开发IIC转SPI的协议转换桥
- 实现不同接口设备间的互联
-
自定义设备
- 根据项目需求设计专用IIC设备
- 添加特殊功能寄存器
我在一个工业传感器项目中就采用了类似方案,成功实现了4个虚拟IIC设备的同时模拟,大大简化了系统设计。
