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:未应