首页 > 技术文章 > EEPROM读写例程学习笔记

lbf-19940424 2017-03-05 15:19 原文

本人FPGA新手一名,这篇随笔是我读EEPROM读写例程时记的流水账,还望各位高人勿喷!

I2C读写时序:

写:启动信号》》控制字节(末位1)》》应答》》写单元地址》》应答》》要写的数据》》应答》》停止信号(用5个时钟完成写操作)

读:启动信号》》控制字节(末位0)》》应答》》写单元地址》》应答》》启动》》控制字节(末位1)》》应答》》读数据(用7个时钟完成读操作)

----------------------

源码为:verilog数字系统设计教程(夏宇闻)第十六章例程源码(学习嵌套状态机写法)

信号源产生:读信号(WR)、写信号(RD)、并行地址信号(addr[10:0])、并行数据信号(DATA[7:0])

各信号作用:

link_write 当其有效时,将sh8out_buf[7]连接到sda2上,此处只取最高位,再利用子状态机的移位操作,实现8位数据sh8out_buf的串行输出

link_head  link_stop 原理同上,利用2位二进制数实现启动信号和停止信号的串行输出

link_sda 当其有效时,将上述串行数据连接到SDA,将数据输入EEPROM

link_read 有效时将data_from_rm中缓存的8位并行数据输出到DATA中 即实现读操作

FF :标志寄存器(用于显示子状态机任务是否完成),例如,在write_start状态中,如果FF为0表明启动信号还没送出,则启动子状态机,输出启动信号,并在完成后将FF置1,表明已经输出启动信号,可以进行下一步操作

主状态机:

复位:各控制信号断开(link),读写标志清零,标志寄存器清零(FF),状态机复位到空闲状态

空闲状态:各控制信号保持断开,如果写信号(WR)有效,则写操作标志(WF)置1,同时进入准备状态;读有效时同上

准备状态:将开始信号线和输出数据线接通,FF清零,将head_buf 高位置1(通过移位产生启动信号),启动信号状态机赋状态初值

写开始状态:如果FF为0,则启动信号状态机(shift_head)工作,输出启动信号,同时在该任务完成后将FF置1;如果FF为1,说明启动信号已经输出,则关闭启动信号,接通串行数据输出线(写控制开启),将FF清零,同时将写子状态机(shift8_out)赋状态初值

写控制字状态:如果FF为0,通过子状态机shift8_out将8位并行写控制字串行输出,在完成后将FF置1;如果FF为1,说明写控制已经输出完成,此时将子状态机(shift8_out)复位,并将地址数据送入输出寄存器中,用于下一状态的输出;

写地址状态:在FF为0时,将地址数据输出,并在完成后将FF置1;当FF为1时,表明地址数据已经输出完成,先将FF清零,此处需要根据读写操作标志来选择:如果写操作标志(WF)有效(接下来写数据),先将数据输出子状态机复位,将要写入的数据DATA送入输出寄存器,主状态机进入写数据状态(data_write );如果读操作标志有效(接下来读开始),启动信号子状态机(shift_head)赋状态初值,主状态机进入读开始状态;

写数据状态:FF为0时,将数据输出,完成后将FF置1;FF为1时,表明数据输出已完成(写成功了),将停止信号状态机(shift_stop)赋状态初值,主状态机进入操作停止状态,将写入数据线(link_write)断开(即DATA与输出寄存器之间的连接断开),FF清零;

读开始状态:FF为0时,进入读信号子状态机输出读启动信号,完成后FF置1;在FF为1时表明读启动信号已经输出,此时将读控制字写入输出寄存器(sh8out_shift),启动信号控制线断开,数据串行输出线接通(用于输出控制字数据),FF=0,数据输出子状态机赋状态初值,主状态机进入读控制字状态

读控制字状态:》读数据状态操作停止状态》(同上略)

操作停止状态:当FF为0时,进行输出停止信号的操作,完成时将FF置1;当FF为1时,说明停止信号已经输出完成,此时产生应答信号(ACK),FF清零,主状态机进入应答状态;

应答状态:将应答信号清零,各标志清零,主状态机进入空闲状态;

 

推荐阅读