首 页 用户登录 | ![]() |
|||
|
|||
按字母检索 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
按声母检索 | A | B | C | D | E | F | G | H | J | K | L | M | N | O | P | Q | R | S | T | W | X | Y | Z | 数字 | 符号 |
|
![]() |
您的位置: 5VAR论文频道 → 论文中心 → 理工论文 → 电子通信 |
|
|||||
用VerilogHDL实现I2C总线功能 | |||||
收集整理:佚名 来源:本站整理 时间:2009-01-10 22:53:05 点击数:[] ![]() |
|||||
[本篇论文由上帝论文网为您收集整理,上帝论文网http://paper.5var.com将为您整理更多优秀的免费论文,谢谢您的支持] 关键词:I2C总线 FPGA Verilog HDL 时序 开发FPGA时,利用EDA工具设计芯片实现系统功能已经成为支撑电子设计的通用平台,并逐步向支持系统级的设计方向发展。在软件设计过程中,越来越强调模块化设计。I2C总线是Philips公司推出的双向两线串行通讯标准,具有接口线少、通讯效率高等特点。把I2C总线设计成相应的模块,有利于相关FPCA的开发。 目前有一些介绍相关开发的资料,但都是利用VHDL语言或AHDL语言实现的。本文给出利用Verilog HDL语言设计的I2C总线模块。 1 I2C总线概述 I2C总线系统由两根总线即SCL(串行时钟)线和SDA(串行数据)线构成。这种总线可以设计成很多种通讯配置,但本文只讨论主从系统的应用。主器件控制总线通讯,开始/结束传送、发送信息并产生I2C系统时钟。在写操作过程中,从器件一旦被主控器件寻址,就执行特定的相应功能。在读操作过程中,主控器件从从器件那里获得数据。在整个主从传送过程中,所有的事件都通过主控器件的SCL时钟线达到同步。连到总线上的器件的接口形式必须是漏极开路或集电极开路输出状态。通过上拉电阻,使得两根总线在空闲的状态下都为高电平状态。因此I2C总线上具有线与功能,即总线上的所有器件都达到高电子状态时,I2C总线才能达到高电平状态,从而使总线上的高速器件和慢速器件工作同步。 在I2C协议中,从器件地址是一个唯一的7位地址。接下来是一个读写方向标志位,读状态是高电平、写状态是低电子。 根据I2C协议中传输过程的特点,I2C模块可以划分为字节发送模块、字节接收模块、开始条件模块、停止条件模块。其中,字节发送模块、字节接收模块和停止条件模块为基本模块。在开始条件模块中,因为需要发送从器件地址,所以要调用字节发送模块。 下面给出用Verilog HDL语言实现字节发送模块的关键程序。相关变量的声明在此略去。程序在Max+PlusII环境下编译、调试、仿真。 assign en_sdao=tempen_sdao;//设置SDA三态输出使能 assign send_byte_over=tempsend_byte_over; assign NO_ACK=tempNO_ACK; assign sdao=tempsda; assign sclo=tempscl; always@(posedge send_byte_clk) begin case(send_byte_zt) sendbit 1: begin if(send_byte_num==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: //延时三个周期 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: //延时三个周期 begin 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 else begin send_byte_zt=ForACK1; send_byte_num=0; end end ForACK1: begin tempsda=1; //释放数据线,等待应答信号 send_byte_zt=delay_ACK; end delay_ACK: //延时 begin if(delay_counter>=3) begin send_byte_zt=ForACK2; delay_counter=0; end else begin delay_counter=delay_counter+1; send_byte_zt=send_byte_zt; tempscl=1; end end ForACK2: begin send_byte_zt=AckYESNO; tempen_sdao=0; //输出SDA使能信号,控制sdao和sdai end AckYESNO: begin if(sdai) //如果应答信号sdai为1,NO_ACK置1 begin tempNO_ACK=1; //设置未应答标志信号 end tempsc1=0; //终止应答位 send_byte_zt=Finish_delay; end Finish_delay: //延时 begin if(delay_counter>=2) begin tempsend_byte_over=1; send_byte_zt=FinishACK1; delay_counter=0; end else begin delay_counter=delay_counter+1; send_byte_zt=send_byte_zt; end end FinishACK1: begin send_byte_zt=sendbit1; send_byte_num=0; end default: begin send_byte_zt=sendbit1; send_byte_num=0; end endcase end 字节发送模块的仿真测试结果如图1所示。 根据I2C总线标准,利用Verilog HDL很容易实现字节接收模块、开始条件模块、停止条件模块这三个模块。图2是数据发送过程的仿真测试结果。从器件的7位地址为101011,向从器件发送的数据为00010111。aensclo和aensdao分别是sclo/scli和sdao/sdai的切换信号。 图3是数据接收过程的仿真测试结果。从器件的7位地址为0011001,从器件发送的数据为11111111。ensclo和ensdao分别是sclo/scli和sdao/sdai的切换信号。 对各个模块进行多层次处理,形成I2C总线模块。 以该I2C总线模块为基础,编写FPGA与AT24C01A(ATMEL公司生产的E2PROM)的通讯程序。然后把相关程序下载到EPF10Kl0LC84-3中,与AT24C01A进行实际通讯实验,效果良好。 |
提供人:佚名 | |
【返回上一页】【打 印】【关闭窗口】 |
![]() |
5VAR论文频道 |
![]() |
5VAR论文频道 |
![]() |
关于本站 -
网站帮助 -
广告合作 -
下载声明 -
网站地图
Copyright © 2006-2033 5Var.Com. All Rights Reserved . |