EEPROM读写测试实验

该实验通过FPGA进行EEPROM(AT24C64)的读写测试,涉及I2C通信协议。实验中,首先向每个地址写入对应的数值,然后读取并验证数据,通过LED灯显示结果。FPGA设计包含顶层模块、读写模块、I2C驱动模块和LED显示模块,各模块协同完成读写操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

EEPROM是一种用于计算机系统的非易失性存储器,也常在嵌入式领域中作为数据的存储设备,在物联网及可穿戴设备等需要存储少量数据的场景中也有广泛应用。

实验任务
本节的实验任务是先向EEPROM(AT24C64)的存储器地址0至255分别写入数据0~255;写完之后再读取存储器地址0~ 255中的数据,若读取的值全部正确则LED灯常亮,否则LED灯闪烁。

系统框图:

由系统总体框图可知,FPGA部分包括四个模块,顶层模块(e2prom_top)、读写模块(e2prom_rw)、I2C驱动模块(i2c_dri)和LED灯显示模块(led_alarm)。其中在顶层模块中完成对其余模块的例化。

各模块端口及信号连接如下图所示:

 

顶层模块代码实现:

module e2prom_top(
        input        sys_clk,//系统时钟
        input        sys_rst_n,//系统复位
//eeprom interface
        output        iic_scl,//eeprom的时钟线scl
        inout          iic_sda,//eeprom的数据线sda
//user interface
        output        led//led显示
);
//parameter define
parameter        SLAVE_ADDR=7'b1010000;//器件地址(SLAVE_ADDR)
parameter        BIT_CTRL=1'b1;//字地址位控制参数(16b/8b)
parameter        CLK_FREQ=26'd50_000_000;//i2c_dri模块的驱动时钟频率(CLK_FREQ)
parameter        I2C_FREQ=18'd250_000;//I2C的SCL时钟频率
parameter        L_TIME=17'd125_000;//led闪烁时间参数17
//wire define
wire        dri_clk;//I2C操作时钟

wire        i2c_exec;//I2C触发控制
wire [15:0] i2c_addr;//I2C操作地址
wire [7:0]   i2c_data_w;//I2C写入的数据
wire        i2c_done;//I2C操作结束标志
wire        i2c_ack;//I2C应答标志
wire        i2c_rh_wl;//I2C读写控制
wire        [7:0]        i2c_data_r;//I2C读出的数据
wire        rw_done;//E2PROM读写测试完成
wire        rw_result;//E2PROM读写测试结果0:失败1:成功
//*****************************************************
//**main code
//*****************************************************
//e2prom读写测试模块
e2prom_rw u_e2prom_rw(
        .clk(dri_clk),//时钟信号
        .rst_n(sys_rst_n),//复位信号
//i2c interface
        .i2c_exec(i2c_exec),//I2C触发执行信号
        .i2c_rh_wl(i2c_rh_wl),//I2C读写控制信号

         .i2c_addr(i2c_addr),//I2C器件内地址
        .i2c_data_w(i2c_data_w),//I2C要写的数据
        .i2c_data_r(i2c_data_r),//I2C读出的数据
        .i2c_done(i2c_done),//I2C一次操作完成
        .i2c_ack(i2c_ack),//I2C应答标志0:应答1:未应答
//user interface
        .rw_done(rw_done),//E2PROM读写测试完成
        .rw_result(rw_result)//E2PROM读写测试结果0:失败1:成功
);
//i2c驱动模块
i2c_dri#(
.SLAVE_ADDR(SLAVE_ADDR),//EEPROM从机地址
.CLK_FREQ(CLK_FREQ),//模块输入的时钟频率
.I2C_FREQ(I2C_FREQ)//IIC_SCL的时钟频率
)u_i2c_dri(
        .clk(sys_clk),
        .rst_n(sys_rst_n),
//i2c interface

        .i2c_exec(i2c_exec),//I2C触发执行信号

        .bit_ctrl(BIT_CTRL),//器件地址位控制(16b/8b)
        .i2c_rh_wl(i2c_rh_wl),//I2C读写控制信号
        .i2c_addr(i2c_addr),//I2C器件内地址
        .i2c_data_w(i2c_data_w),//I2C要写的数据
        .i2c_data_r(i2c_data_r),//I2C读出的数据
        .i2c_done(i2c_done),//I2C一次操作完成
        .i2c_ack(i2c_ack),//I2C应答标志
        .scl(iic_scl),//I2C的SCL时钟信号
        .sda(iic_sda),//I2C的SDA信号
        //user interface
        .dri_clk(dri_clk)//I2C操作时钟
);
//led指示模块
led_alarm#(.L_TIME(L_TIME)//控制led闪烁时间
)u_led_alarm(
        .clk(dri_clk),
        .rst_n(sys_rst_n),


        .led(led),
        .rw_done(rw_done),
        .rw_result(rw_result)
);
endmodule

I2C驱动模块状态跳转图:

<
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值