⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.v

📁 Mars-XC2S50-S-Core-V2.0开发板核心板的说明和设计文档
💻 V
字号:
/*
I2C总线是一种非常常用的串行总线,它操作简便,占用接口少。本程序介绍操作一个I2C总线接口的EEPROM AT24C02
的方法,使用户了解I2C总线协议和读写方法。
实验过程是:按动开发板键盘某个键CPLD将拨码开关的数据写入EEPROM的某个地址,按动另外一个键,将刚写入的数据
读回CPLD,并在数码管上显示。

sw0 写入,sw1读出 
为了更好的理解程序,用户应该仔细阅读光盘中的AT24C02的手册

*/

module i2c(clk,rst,data_in,scl,sda,wr_input,rd_input,lowbit,en,seg_data);

input clk,rst;
output scl;//I2C时钟线
inout  sda;//I2C数据线
input[3:0] data_in;//拨码开关输入想写入EEPROM的数据
input wr_input;//要求写的输入
input rd_input;//要求读的输入
output lowbit; //输出一个低电平给矩阵键盘的某一行
output[1:0] en;//数码管使能
output[7:0] seg_data;//数码管段数据
reg[7:0] seg_data;


reg scl;
reg[1:0] en;

reg[7:0] seg_data_buf;
reg[11:0] cnt_scan;
reg sda_buf;//sda输入输出数据缓存
reg link;   //sda输出标志
reg phase0,phase1,phase2,phase3;//一个scl时钟周期的四个相位阶段,将一个scl周期分为4段
//phase0对应scl的上升沿时刻,phase2对应scl的下降沿时刻,phase1对应从scl高电平的中间时刻,phase2对应从scl低电平的中间时刻,
reg[7:0] clk_div;//分频计数器
reg[1:0] main_state;
reg[2:0] i2c_state;//对i2c操作的状态
reg[3:0] inner_state;//i2c每一操作阶段内部状态
reg[19:0] cnt_delay;//按键延时计数器
reg start_delaycnt;//按键延时开始
reg[7:0] writeData_reg,readData_reg;//要写的数据的寄存器和读回数据的寄存器
reg[7:0] addr;//被操作的EEPROM字节的地址

parameter div_parameter=100;// 分频系数,AT24C02最大支持400K时钟速率

parameter start=4'b0000, //开始
		  first=4'b0001, //第1位
		  second=4'b0010,//第2位
		  third=4'b0011, //第3位
		  fourth=4'b0100, //第4位
		  fifth=4'b0101, //第5位
		  sixth=4'b0110, //第6位
		  seventh=4'b0111, //第7位
		  eighth=4'b1000, //第8位
		  ack=4'b1001,   //确认位
		  stop=4'b1010; //结束位
		
parameter ini=3'b000, //初始化EEPROM状态
		  sendaddr=3'b001, //发送地址状态
		  write_data=3'b010, //写数据状态

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -