一、实验目的
实验在 EEPROM 的 8’b0 地址写入 8bit 数据 8’b10101010,按下 KEY2 表示写,再按下
KEY4 触发写开始;按下 KEY3 表示在 8’b0 地址读,再按下 KEY4 触发读开始,将读出的数据
以二进制形式用 LED 灯显示,按下 KEY1 使 LED 恢复为全灭状态。
二、实验原理
1.IIC 协议简介
IIC 是一种两线式串行总线,由数据线 SDA 和时钟线 SCL 构成通信线路,属于半双工通信
方式。所有接到 I2C 总线上的设备的串行数据 SDA 都接到总线的 SDA 上,各设备的时钟线 SCL
接到总线的 SCL 上。
IIC 总线上每一个设备都有唯一地址,通过“唯一地址”进行寻址通信。并且数据传输过程中还必须有应答信号,所以 SDA 数据线是双向的。
传输速率:标准模式下可达 100Kbit/s,快速模式下可达 400Kbit/s,高速模式下可达3.4Mbit/s
2.IIC 时序实现
在空闲状态下,SCL 和 SDA 都为高电平。SCL 输出高电平时SDA 由高到低变化为开始传输标志。SCL 为高电平,SDA 再出现上升沿,表示传输结束
时序要求:
本实验采用 400Kbit/s 的传输速率,所以 SCL 的频率应设置为 400KHz,切占空比为 50%,
即 tHIGH=1250ns,tLOW=1250ns;
为满足上表中的时序要求,设计一 SCL 周期计数器,在计数器上取 4 个位置:
SCL 变化点为 scl_cnt 计数器的“half”处和“full”处;
SDA 变化点为 scl_cnt 计数器的“dsu”处。
3.IIC 读写操作流程
Byte Write:
Device Address Byte
主设备每传输 8bit 数据需释放 SDA,接收来自从设备的 ACK 应答信号。
Byte Write:
开始第一个字节都为从设备的 device ID:
Device Address Byte 的最低位若为“0”表示“写”,若为“1”则表示“读”。
第二个字节是写地址的字节:
第三个字节是写数据的字节。其中 Device Address Byte 的 A2、A1和 A0与硬件连接相关:
因此,开发板上的 EEPROM 的 device ID 为:7’b1010000;
Random Read:
读操作的过程中,先进行 Dummy Write,此部分与写操作类似,不管读或者写,主机首先是要找到从机,然后指明要读或者写的地址。
Dummy Write 之后,主设备再发送一次从设备 Device Address Byte,最低位为“1”表示读,Data Word 表示读取从设备数据。
IIC 的读写操作流程可总结为:
4.IIC 读写操作流程的状态机实现
默认 IDLE 状态,若接收到开始触发信号,则跳转到 Start 状态;
Start 状态下,在计数器计到 full_cycle 跳转到 send_byte 状态;
send_byte 状态下,发送完 8bit 数据时跳转到 s_ack 状态,接收从设备的应答信号;
s_ack 状态下:若为写操作,byte 数未发送完成(ID+ADDR+DATA),则跳转到 send_byte 继续发送下一
byte,若 byte 数已发送完成,则跳转到 stop 状态;若为读操作,Dummy Write 阶段的 byte 数(ID+ADDR)未发送完成则跳转到 send_byte 状态继续发送下一 byte,Dummy Write 阶段的 byte 数(ID+ADDR)发送完成则跳转到 Start 状态再重新发送一次 device ID,第二次发送完成 device ID 后接收 ack 信号,从 s_ack状态跳转到 reve_byte 状态。
reve_byte 状态下,若接收完 8bit 数据则跳转到 rack 状态;
rack 状态下,若需要接收多 byte 数据,为接收完所有 byte 则需要跳转回 reve_byte 状态,若接收完成所有 byte,接收完 ack 应答信号后跳转到 stop 状态;
Stop 状态下,完成 IIC 传输结束标志后跳转到 IDLE 空闲状态;
IIC 读写操作流程的状态机实现,verilog 代码详见参考工程。
4 .实验源码
实验代码主要框架如下:
KEY1 按下表示复位,KEY2 按下后 wr 信号为 1,表示写;KEY3 按下后 wr 信号为 0,表示读;KEY4 按下表示 IIC 写/读触发开始。
verilog 代码详见参考例程。
三、实验现象
KEY1 为复位按键;
写数据:按下 KEY2 后再按一次 KEY4 开始写入 1byte 数据,代码中固定在 8’b0 地址,写入 8'b10101010 数据,可在顶层文件 iic_top 中修改此值,如下图:
读数据:按下 KEY3 再按一次 KEY4,从上一次写入的地址中读出数据,LED 灯的状态为写入的数据 8'b10101010。
更多实验教程敬请关注!