FPGA入门——EEPROM读写例程(二 代码)

这篇博客介绍了如何使用Verilog在FPGA中实现对EEPROM(AT24C04)的读写操作。首先,通过一个顶层代码展示了写入0x12到地址0和随后读取该地址的过程。接着,详细解释了IIC通信程序,包括写单个储存字节和读单个储存字节的步骤,遵循IIC通信时序和协议。
摘要由CSDN通过智能技术生成

一、代码功能

1.写一个数据(0x12)到EEPROM(AT24C04)的地址0, 再读出地址0的内容。
2.实例化 iic_com 模块和 chipscope 的两个模块 chipscope_icon 和 chipscope_ila。使用
50Mhz 时钟做为 chipscope 的采样时钟。采样的信号为从 EEPROM 读出的数据 RdData。

二、代码

1.顶层代码

`timescale 1ns / 1ps
//
module eeprom_test(
		input	CLK_50MHz,
		input RSTn,
		output [3:0]LED,
		output SCL,
		inout	 SDA
    );

wire [7:0] RdData;	//读数据
wire Done_Sig;	//iic_com块中通信结束信号

reg [3:0] i;
reg [3:0] rLED;

reg [7:0] rAddr;
reg [7:0] rData;
reg [1:0] isStart;

assign LED = rLED;

/*****************************************/
/*			EEPROM write and read			  */
/*****************************************/

always@(posedge CLK_50MHz or negedge RSTn)
	if(!RSTn)
		begin
			i <= 4'd0;
			rAddr <= 8'd0;
			rData <= 8'd0;
			isStart <= 2'b00;
			rLED <= 4'b0000;
		end
	else
		case(i)
		0:		//eeprom write 0x12 to addr 0
			if(Done_Sig)begin isStart <= 2'b00;i <= i + 1'b1;end			//在iic_com模块中isDone需要开始复位
			else begin isStart <= 2'b01; rData <= 8'h12; rAddr <= 8'd0;end	//isStart == 01 写开始
		
		1:		//eeprom read addr 0
			if(Done_Sig)begin isStart <= 2'b00; i <= i + 1'b1;end
			else begin isStart <= 2'b10; rAddr <= 8'd0; end		//isStart ==10  读开始
			
		2:	
			begin rLED <= RdData[3:0];end
		endcase

/**********************************/
//					通信程序				//
/*********************************/

iic_com inst_iic_com(
		.CLK(CLK_50MHz),
		.RSTn(RSTn),
		.Start_Sig(isStart),
		.Addr_Sig(rAddr),
		.WrData(rData),
		.RdData(RdData),
		.Done_Sig(Done_Sig),
		.SCL(SCL),
		.SDA(SDA)
);


wire [35:0]	CONTROL0;
wire [255:0] TRIG0;

icon_debug inst_icon_debug(
    .CONTROL0(CONTROL0)
); /* synthesis syn_black_box syn_noprune=1 */;

chipscoepe_ila inst_chipscope_ila(
    .CONTROL(CONTROL0),
    .CLK(CLK_50MHz),
    .TRIG0(TRIG0)
); /* synthesis syn_black_box syn_noprune=1 */;


assign TRIG0[7:0] = RdData;

endmodule

程序先从case0(写0x12数据到eeprom中地址0)开始。当Done_Sig为0时(在iic_com模块中isDone开始复位后), isStart <= 2’b01——Start_Sig[0]为1,选择写操作; rData <= 8’h12——写入数据为0x12; rAddr <= 8’d0——写入地址为0。
写完后,iic_com中isDone置1,即Done_Sig=1,执行i=i+1;跳转到case1。
case1同case0,只是只有读地址0操作。

二、IIC 的通信程序

1.代码

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
//
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值