用veriloghdl实现i2c总线功能

用veriloghdl实现i2c总线功能

ID:22208550

大小:62.50 KB

页数:5页

时间:2018-10-27

用veriloghdl实现i2c总线功能_第1页
用veriloghdl实现i2c总线功能_第2页
用veriloghdl实现i2c总线功能_第3页
用veriloghdl实现i2c总线功能_第4页
用veriloghdl实现i2c总线功能_第5页
资源描述:

《用veriloghdl实现i2c总线功能》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、用VerilogHDL实现I2C总线功能

2、第1简述了I2C总线的特点;介绍了开发FPGA时I2C总线模块的设计思想;给出并解释了用VerilogHDL实现部分I2C总线功能的程序,以及I2C总线主从模式下的仿真时序图。  关键词:I2C总线FPGAVerilogHDL时序  开发FPGA时,利用EDA工具设计芯片实现系统功能已经成为支撑电子设计的通用平台,并逐步向支持系统级的设计方向发展。在软件设计过程中,越来越强调模块化设计。I2C总线是Philips公司推出的双向两线串行通讯标准,具有接口线少、通讯效率高等特点。把I2

3、C总线设计成相应的模块,有利于相关FPCA的开发。目前有一些介绍相关开发的资料,但都是利用VHDL语言或AHDL语言实现的。本文给出利用VerilogHDL语言设计的I2C总线模块。  1I2C总线概述  I2C总线系统由两根总线即SCL(串行时钟)线和SDA(串行数据)线构成。这种总线可以设计成很多种通讯配置,但本文只讨论主从系统的应用。主器件控制总线通讯,开始/结束传送、发送信息并产生I2C系统时钟。在写操作过程中,从器件一旦被主控器件寻址,就执行特定的相应功能。在读操作过程中,主控器件从从器件那里获得数据。在整个主从

4、传送过程中,所有的事件都通过主控器件的SCL时钟线达到同步。连到总线上的器件的接口形式必须是漏极开路或集电极开路输出状态。通过上拉电阻,使得两根总线在空闲的状态下都为高电平状态。因此I2C总线上具有线与功能,即总线上的所有器件都达到高电子状态时,I2C总线才能达到高电平状态,从而使总线上的高速器件和慢速器件工作同步。  在I2C协议中,从器件地址是一个唯一的7位地址。接下来是一个读写方向标志位,读状态是高电平、写状态是低电子。 500)this.style.ouseg(this)">   2I2C模块的设计与实现  根据I

5、2C协议中传输过程的特点,I2C模块可以划分为字节发送模块、字节接收模块、开始条件模块、停止条件模块。其中,字节发送模块、字节接收模块和停止条件模块为基本模块。在开始条件模块中,因为需要发送从器件地址,所以要调用字节发送模块。  下面给出用VerilogHDL语言实现字节发送模块的关键程序。相关变量的声明在此略去。程序在Max+PlusII环境下编译、调试、仿真。  assignen_sdao=tempen_sdao;//设置SDA三态输出使能  assignsend_byte_over=tempsend_byte_ove

6、r;  assignNO_ACK=tempNO_ACK;  assignsdao=tempsda;  assignsclo=tempscl;  al==0)  begin  shiftdata[7:0]=indata[7:0];  end  shiftdata=shiftdata<<1;  tempsda=shiftdata[8];  tempscl=1;//置SCL为高电平  send_byte_zt=delay_1;  send_byte_num=send_byte_num+1;  end  delay_1

7、://延时三个周期  begin  if(delay_counter>=2)  begin  send_byte_zt=sendbit2;  delay_counter=0;  end  else  begin  delay_counter=delay_counter+1;  send_byte_zt=send_byte_zt;  end  end  sendbit2:  begin  tempsc1=0;//SCL置零  send_byte_zt=delay_2;  end  delay_2://延时三个周期  b

8、egin  if(delay_counter>=2)  begin  send_byte_zt=sendbit3;  delay_counter=0;  end  else  begin  delay_counter=delay_counter+1;  send_byte_zt=send_byte_zt;  end  end  sendbit3://判断是否字节中所有位都发送完毕  begin  if(send_byte_num<=8)  begin  send_byte_zt=sendbit1;  end  

9、else  begin  send_byte_zt=ForACK1;  send_byte_num=0;  end  end  ForACK1:  begin  tempsda=1;//释放数据线,等待应答信号  send_byte_zt=delay_ACK;  end  delay_ACK://延时 

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。