一、代码功能
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:
//
//