FPGA——EEPROM原理——使用手册翻译(2)读与写

书接上文:

6.0写操作

6.1字节写

从主控码开始,控制码(4),芯片选择(3)R/W(这是一个逻辑低)被主发射机控制在总线上。这表明在第9个时钟周期中,地址高字节将跟随在它产生一个应答位之后的地址。因此,由主机传输的下一个字节是单词地址的高阶字节,并将写入24xx64的地址指针中。下一个字节是最不重要的地址字节。

在接收到来自24xx64的另一个确认信号后,主设备将把数据字发送到地址内存位置。24xx64再次确认,主生成一个停止条件。这将启动内部写入循环,在此期间,24xx64将不会生成应答信号(6-1)。如果试图用WP管脚来写入数组,设备将承认命令,但是不会出现写周期,也不会写入数据。该设备将立即接受一个新的命令。在字节写入命令之后,内部地址计数器将指向刚刚写入的地址位置。

6-1 字节写操作

6.2页写

写入控制字节、字地址和第一个数据字节以与字节写入相同的方式传输到24xx64

但不是生成一个停止条件,主传送最多31个额外的字节,这些字节暂时存储在芯片页缓冲区中,并且在主发送停止条件后将写入内存。在收到每个单词后,五个较低的地址指针位在内部增加一个。如果主服务器在生成停止条件之前传输超过32个字节,地址计数器将会滚动,而先前接收到的数据将被覆盖。与字节写操作一样,一旦接收到停止条件,就会开始一个内部写周期(6-2)。如果试图用WP管脚来写入该数组,设备将承认该命令,但不会发生写入周期,也不会写入数据。设备将立即接受一个新的命令。

6-2 页写操作

6.3写保护

当引脚与Vcc绑定时,WP引脚允许用户写入保护整个数组(0000ff - 1fff)

如果绑定到VSS或悬空,则禁用写保护。WP引脚在每个写命令的停止位上取样(1-1),在停止位后对WP pin进行切换对写入循环的执行没有影响。

7.0应答轮询

由于该设备在写入循环期间不会应答,因此可以使用该功能来确定何时完成循环(此功能可以用于最大化总线吞吐量)。一旦从主服务器发出写入命令的停止条件,该设备将启动内部计时写入循环。可以立即启动ACK轮询。这涉及到主发送一个启动条件,然后是写入命令的控制字节(R/W = 0)。如果设备仍然忙于写入循环,则不返回ACK。如果没有返回ACK,则必须重新发送起始位和控制字节。

如果循环完成,则设备将返回ACK,然后主可以继续下一个读或写命令。流程图见图7-1

7-1 应答轮询流程

8.0读操作

读取操作的方式与写操作相同,但控制字节的R/W位被设置为1。读取操作有三种基本类型:当前地址读取、随机读取和顺序读取。

8-1 当前地址读取

8.1当前地址读

24xx64包含一个地址计数器,该计数器维护被访问的最后一个字的地址,内部增加一个。因此,如果之前的读访问是针对n (n是任何合法地址),那么下一个当前的地址读操作将访问地址n + 1的数据。在接收到由R/W位设置为1的控制字节后,24xx64发出确认并传输8位数据字。

主机不会应答传输,但会生成一个停止状态,24xx64中断传输(8-1)

8.2随机读取

随机读取操作允许主机随机访问任何内存位置。要执行这种类型的读操作,首先必须设置字地址。这是通过将字地址发送到24xx64作为写操作的一部分(R/W位设置为0)完成的。在发送字地址之后,主服务器会在应答后生成一个启动条件。这将终止写操作,但不会在设置内部地址指针之前。然后,主程序再次发出控制字节,但将R/W位设置为1。然后,24xx64将发出一个确认并传输8位数据字。主不应答传输,但会生成一个停止条件,导致24xx64中断传输(8-2)。在随机读取命令之后,内部地址计数器将指向刚刚读取的地址位置。

8-2 随机读取

8.3顺序读

顺序读取与随机读取的方式相同,只是在24xx64传输第一个数据字节之后,主问题是一个应答,而不是随机读取停止条件。这个应答指示24xx64传输下一个顺序处理的8位字(8-3)。在最后一个字节传送给主后,主机不应答,但会产生一个停止条件。为了提供顺序读取,24xx64包含一个内部地址指针,该指针在每次操作完成时递增一个。这个地址指针允许在一次操作期间连续读取整个内存内容。内部地址指针将自动从地址1FFF转到地址0000,如果主机应答从数组地址1FFF收到的字节。

8-3 顺序读

FPGAEEPROM芯片AT24C02实验Verilog逻辑源码Quartus11.0工程文件, FPGA型号为CYCLONE4E系列中的EP4CE6E22C8,可以做为你的学习设计参考。 module iic_com( clk,rst_n, sw1,sw2, scl,sda, dis_data ); input clk; // 50MHz input rst_n; //复位信号,低有效 input sw1,sw2; //按键1、2,(1按下执行入操作,2按下执行操作) output scl; // 24C02的时钟端口 inout sda; // 24C02的数据端口 output[7:0] dis_data; //数码管显示的数据 //按键检测 reg sw1_r,sw2_r; //键值锁存寄存器,每20ms检测一次键值 reg[19:0] cnt_20ms; //20ms计数寄存器 always @ (posedge clk or negedge rst_n) begin if(!rst_n) cnt_20ms <= 20'd0; else cnt_20ms <= cnt_20ms+1'b1; //不断计数 end always @ (posedge clk or negedge rst_n) begin if(!rst_n) begin sw1_r <= 1'b1; //键值寄存器复位,没有键盘按下时键值都为1 sw2_r <= 1'b1; end else if(cnt_20ms == 20'hfffff) begin sw1_r <= sw1; //按键1值锁存 sw2_r <= sw2; //按键2值锁存 end end //--------------------------------------------- //分频部分 reg[2:0] cnt; // cnt=0:scl上升沿,cnt=1:scl高电平中间,cnt=2:scl下降沿,cnt=3:scl低电平中间 reg[8:0] cnt_delay; //500循环计数,产生iic所需要的时钟 reg scl_r; //时钟脉冲寄存器 always @ (posedge clk or negedge rst_n) begin if(!rst_n) cnt_delay <= 9'd0; else if(cnt_delay == 9'd499) cnt_delay <= 9'd0; //计数到10us为scl的周期,即100KHz else cnt_delay <= cnt_delay+1'b1; //时钟计数 end always @ (posedge clk or negedge rst_n) begin if(!rst_n) cnt <= 3'd5; else begin case (cnt_delay) 9'd124: cnt <= 3'd1; //cnt=1:scl高电平中间,用于数据采样 9'd249: cnt <= 3'd2; //cnt=2:scl下降沿 9'd374: cnt <= 3'd3; //cnt=3:scl低电平中间,用于数据变化 9'd499: cnt <= 3'd0; //cnt=0:scl上升沿 default: cnt <= 3'd5; endcase end end `define SCL_POS (cnt==3'd0) //cnt=0:scl上升沿 `define SCL_HIG (cnt==3'd1) //cnt=1:scl高电平中间,用于数据采样 `define SCL_NEG (cnt==3'd2) //cnt=2:scl下降沿 `define SCL_LOW (cnt==3'd3) //cnt=3:scl低电平中间,用于数据变化 always @ (posedge clk or negedge rst_n) begin if(!rst_n) scl_r <= 1'b0; else if(cnt==3'd0) scl_r <= 1'b1; //scl信号上升沿
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值