24LC04B详解:FPGA与低功耗EEPROM的高效通信指南

5星 · 超过95%的资源 需积分: 50 14 下载量 49 浏览量 更新于2024-08-05 1 收藏 828KB PDF 举报
24LC04B是一款由Microchip Technology Inc.生产的4kbit电可擦除只读存储器(PROM),它具有低功耗特性,适用于FPGA应用中的数据存储。这款器件的特点包括: 1. **存储容量与结构**: - 24LC04B由两个独立的256x8位内存块组成,每个块支持独立操作,总共有4kbit的存储空间。 - 提供多种封装形式,如8脚PDIP、SOIC、TSSOP、2x3DFN、MSOP以及5引脚SOT-23,满足不同设计需求。 2. **低功耗与兼容性**: - 采用低电压设计,支持1.7V工作,待机电流极低,仅为1μA,写操作电流为1mA。 - 兼容I2C™接口,方便与其他微控制器或系统集成。 - 提供100kHz和400kHz时钟兼容性,确保数据传输稳定性。 3. **高效数据操作**: - 支持页写功能,一次最多写入16字节数据,有16字节的页写缓冲区,提高数据处理效率。 - 自动定时擦除/写入周期,减少了外部控制。 - 数据保护机制,包括硬件写保护,提供ESD防护高达4,000V,保证数据安全。 4. **长期可靠性**: - 可承受超过100万次的擦除/写入循环,数据保留期长达200年以上。 - 设备支持工厂预编程,便于批量生产应用。 5. **电气特性**: - 采用Schmitt触发输入,有效抑制噪声,输出斜率控制防止接地反弹。 - 总线操作规定明确,如空闲状态、起始位和停止位的信号定义,确保数据传输一致性。 6. **工作模式与兼容性**: - 总线设计支持双向通信,主设备控制总线时钟和数据传输,24LC04B作为从设备响应。 - 主设备和从设备都能独立执行发送或接收,但主设备决定了数据传输的主导角色。 24LC04B是一个理想的FPGA读写EEPROM选择,它的低功耗、灵活的接口和高效的数据操作能力使其在许多嵌入式和系统级应用中表现出色,尤其是在需要长时间数据保存和低功耗环境下的应用中。通过理解和掌握其总线协议和电气特性,工程师们可以充分利用这款器件的优势来构建自己的电路设计。
2021-04-12 上传
FPGA 读写i2c_eeprom_Verilog逻辑源码Quartus工程文件+文档说明,EEPROM 型号24LC04,,FPGA型号Cyclone4E系列中的EP4CE6F17C8,Quartus版本17.1。 module i2c_eeprom_test( input clk, input rst_n, input key1, inout i2c_sda, inout i2c_scl, output [5:0] seg_sel, output [7:0] seg_data ); localparam S_IDLE = 0; localparam S_READ = 1; localparam S_WAIT = 2; localparam S_WRITE = 3; reg[3:0] state; wire button_negedge; reg[7:0] read_data; reg[31:0] timer; wire scl_pad_i; wire scl_pad_o; wire scl_padoen_o; wire sda_pad_i; wire sda_pad_o; wire sda_padoen_o; reg[ 7:0] i2c_slave_dev_addr; reg[15:0] i2c_slave_reg_addr; reg[ 7:0] i2c_write_data; reg i2c_read_req; wire i2c_read_req_ack; reg i2c_write_req; wire i2c_write_req_ack; wire[7:0] i2c_read_data; ax_debounce ax_debounce_m0 ( .clk (clk), .rst (~rst_n), .button_in (key1), .button_posedge (), .button_negedge (button_negedge), .button_out () ); wire[6:0] seg_data_0; seg_decoder seg_decoder_m0( .bin_data (read_data[3:0]), .seg_data (seg_data_0) ); wire[6:0] seg_data_1; seg_decoder seg_decoder_m1( .bin_data (read_data[7:4]), .seg_data (seg_data_1) ); seg_scan seg_scan_m0( .clk (clk), .rst_n (rst_n), .seg_sel (seg_sel), .seg_data (seg_data), .seg_data_0 ({1'b1,7'b1111_111}), .seg_data_1 ({1'b1,7'b1111_111}), .seg_data_2 ({1'b1,7'b1111_111}), .seg_data_3 ({1'b1,7'b1111_111}), .seg_data_4 ({1'b1,seg_data_1}), .seg_data_5 ({1'b1,seg_data_0}) ); always@(posedge clk or negedge rst_n) begin if(rst_n == 1'b0) begin state <= S_IDLE; i2c_write_req <= 1'b0; read_data <= 8'h00; timer <= 32'd0; i2c_write_data <= 8'd0; i2c_slave_reg_addr <= 16'd0; i2c_slave_dev_addr <= 8'ha0;//1010 000 0(default address ‘000’ write operation) i2c_read_req <= 1'b0; en