FPGA的I2C协议实现(FPGA学习笔记)
参考资料:正点原子E2PROM读写测试


SCL为高电平时,SDA产生下降沿表示I2C传输开始,在传输完7位器件地址及一位写命令(0)后,主机释放SDA总线,从机拉低SDA应答。对于16位器件存储字地址而言,需要分两次8位器件存储字地址传输,等待从机应答后再传输8位数据,最后SDA在SCL为高电平时产生上升沿表示一次I2C单次传输结束。

I2C随机读操作与前面传输器件地址和传输16位器件存储字地址相同,在传输完器件存储字地址后SDA会在次在SCL为高电平时产生下降沿(既起始信号)和再次传输器件地址,只不过这次7位器件地址后面是读命令(1),这种操作称为虚写,主要是为了使从机内部指针指向需要读取得存储单元地址。

I2C驱动时钟频率为scl频率的4倍(便于SDA实现在SCL低电平中间(此时为dri_clk上升沿)改变数据,并在SCL为高电平时保持数据),dri_clk由输入的50MHZ晶振分频得到1000KHZ。初始状态SCL与SDA保持高电平,当收到外部I2C触发信号i2c_exec高电平时,SCL拉低启动I2C,接着后面状态转移分为8个部分。


由于SDA为双向接口,所以要避免同时作为输入与输出

当i2c_exec拉高时,外部传入I2C的控制信号通过寄存器临时保存


后面由三段式状态机实现I2C的状态转移
第一段时序电路描述状态转移
第二段逻辑电路描述状态转移条件
第三段时序电路描述状态输入与输出
I2C写操作



I2C读操作

