1. FPGA实战:手搓IIC驱动玩转EEPROM存储
最近在做一个FPGA项目时需要用到EEPROM存储配置参数,正好借这个机会彻底搞懂I2C协议在FPGA上的实现。作为电子工程师,I2C总线是我们最常用的接口之一,但真正要从零开始实现一个可靠的I2C控制器,还是有不少坑要踩的。
这次我选择用Verilog在Altera Cyclone IV FPGA上实现AT24C64 EEPROM的读写控制。这个64Kbit的存储芯片通过I2C接口通信,典型应用场景包括参数存储、配置保存等。下面就把整个实现过程、关键技术和踩坑经验分享给大家。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. I2C协议深度解析
2.1 I2C物理层特性
I2C总线只需要两根线:
- SCL(串行时钟线)
- SDA(串行数据线)
物理层特点:
- 多设备总线结构,支持多个主设备和从设备
- 采用开漏输出,需要上拉电阻(通常4.7kΩ)
- 标准模式100kbps,快速模式400kbps
- 7位设备地址,可寻址112个设备(保留16个地址)
2.2 协议层关键时序
I2C通信包含几个关键状态:
- 起始条件:SCL高电平时SDA从高到低跳变
- 停止条件:SCL高电平时SDA从低到高跳变
- 数据有效性:SCL高电平期间SDA必须保持稳定
- 应答机制:每字节传输后接收方要发送ACK
典型写操作时序:
code复制START | 设备地址(W) | ACK | 字地址 | ACK | 数据 | ACK | STOP
2.3 AT24C64特性
我们使用的AT24C64具有:
- 64Kbit容量(8KB),组织为256页×32字节
- 支持页写(最多32字节连续写入)
- 典型写入时间5ms
- 器件地址高4位固定为1010,低3位由硬件引脚决定
3. FPGA I2C控制器设计
3.1 整体架构设计
系统包含以下模块:
- I2C控制器核心(i2c_ctrl)
- 数据收发管理(i2c_rw_data)
- 按键消抖(key_filter)
- 数码管显示(seg_595_dynamic)
verilog复制module i2c_ctrl(
input wire sys_clk,
input wire s
