FPGA读写EEPROM芯片AT24C02实验Verilog逻辑源码Quartus11.0工程文件, FPGA型号为CYCLONE4E系列中的EP4CE6E22C8,可以做为你的学习设计参考。
module iic_com(
clk,rst_n,
sw1,sw2,
scl,sda,
dis_data
);
input clk; // 50MHz
input rst_n; //复位信号,低有效
input sw1,sw2; //按键1、2,(1按下执行写入操作,2按下执行读操作)
output scl; // 24C02的时钟端口
inout sda; // 24C02的数据端口
output[7:0] dis_data; //数码管显示的数据
//按键检测
reg sw1_r,sw2_r; //键值锁存寄存器,每20ms检测一次键值
reg[19:0] cnt_20ms; //20ms计数寄存器
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt_20ms <= 20'd0;
else
cnt_20ms <= cnt_20ms+1'b1; //不断计数
end
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
sw1_r <= 1'b1; //键值寄存器复位,没有键盘按下时键值都为1
sw2_r <= 1'b1;
end
else if(cnt_20ms == 20'hfffff)
begin
sw1_r <= sw1; //按键1值锁存
sw2_r <= sw2; //按键2值锁存
end
end
//---------------------------------------------
//分频部分
reg[2:0] cnt; // cnt=0:scl上升沿,cnt=1:scl高电平中间,cnt=2:scl下降沿,cnt=3:scl低电平中间
reg[8:0] cnt_delay; //500循环计数,产生iic所需要的时钟
reg scl_r; //时钟脉冲寄存器
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt_delay <= 9'd0;
else if(cnt_delay == 9'd499)
cnt_delay <= 9'd0; //计数到10us为scl的周期,即100KHz
else
cnt_delay <= cnt_delay+1'b1; //时钟计数
end
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt <= 3'd5;
else
begin
case (cnt_delay)
9'd124: cnt <= 3'd1; //cnt=1:scl高电平中间,用于数据采样
9'd249: cnt <= 3'd2; //cnt=2:scl下降沿
9'd374: cnt <= 3'd3; //cnt=3:scl低电平中间,用于数据变化
9'd499: cnt <= 3'd0; //cnt=0:scl上升沿
default: cnt <= 3'd5;
endcase
end
end
`define SCL_POS (cnt==3'd0) //cnt=0:scl上升沿
`define SCL_HIG (cnt==3'd1) //cnt=1:scl高电平中间,用于数据采样
`define SCL_NEG (cnt==3'd2) //cnt=2:scl下降沿
`define SCL_LOW (cnt==3'd3) //cnt=3:scl低电平中间,用于数据变化
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n)
scl_r <= 1'b0;
else if(cnt==3'd0)
scl_r <= 1'b1; //scl信号上升沿