原创 用VerilogHDL实现I2C总线功能

2006-11-5 00:31 2670 5 6 分类: FPGA/CPLD

开发FPGA时,利用EDA工具设计芯片实现系统功能已经成为支撑电子设计的通用平台,并逐步向支持系统级的设计方向发展。在软件设计过程中,越来越强调模块化设计。I2C总线是Philips公司推出的双向两线串行通讯标准,具有接口线少、通讯效率高等特点。把 I2C总线设计成相应的模块,有利于相关FPCA的开发。目前有一些介绍相关开发的资料,但都是利用VHDL语言或AHDL语言实现的。本文给出利用Verilog HDL语言设计的I2C总线模块。


1 I2C总线概述


I2C总线系统由两根总线即SCL(串行时钟)线和SDA(串行数据)线构成。这种总线可以设计成很多种通讯配置,但本文只讨论主从系统的应用。主器件控制总线通讯,开始/结束传送、发送信息并产生I2C系统时钟。在写操作过程中,从器件一旦被主控器件寻址,就执行特定的相应功能。在读操作过程中,主控器件从从器件那里获得数据。在整个主从传送过程中,所有的事件都通过主控器件的SCL时钟线达到同步。连到总线上的器件的接口形式必须是漏极开路或集电极开路输出状态。通过上拉电阻,使得两根总线在空闲的状态下都为高电平状态。因此I2C总线上具有线与功能,即总线上的所有器件都达到高电子状态时,I2C总线才能达到高电平状态,从而使总线上的高速器件和慢速器件工作同步。


在I2C协议中,从器件地址是一个唯一的7位地址。接下来是一个读写方向标志位,读状态是高电平、写状态是低电子。




2 I2C模块的设计与实现


根据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




程序中sdao、sclo为输出信号,sdai为应答信号,en_sdao是对sdao和sdai 进行切换的信号。I2C总线具有SDA和SCL两根信号线,所以在整个模块设计中,把sdao/sclo和sdai/scli作为两组信号。当需要向外部 SDA信号线上输出信息时,sdao连到SDA信号线上;当需要从外部SDA信号线上读入信息时,置sdao成高阻态,sdai连到SDA信号线上。 en_sdao信号作为这一过程的切换信号。在程序中定义了一些状态信号:NO_ACK、send_byte_over。其中,NO_ACK信号判断从器件是否对发送的信号给予了应答。send_byte_over信号判断字节是否传输完毕。这些信号可以传递给上一层设计模块,以控制程序的流程。为了使 I2C总线能够有效地通讯,必须考虑信号的建立和保持时间,所以程序中设置了相应的延时部分。另外,在以clk为触发信号的过程模块中,定义 send_byte_clk信号为时钟信号的两倍频信号,并加入字节发送模块使能信号start_send_byte控制模块工作于篇幅所限,略去该过程模块。


字节发送模块的仿真测试结果如图1所示。


根据I2C总线标准,利用Verilog HDL很容易实现字节接收模块、开始条件模块、停止条件模块这三个模块。图2是数据发送过程的仿真测试结果。从器件的7位地址为101011,向从器件发送的数据为00010111。aensclo和aensdao分别是sclo/scli和sdao/sdai的切换信号。


图3是数据接收过程的仿真测试结果。从器件的7位地址为0011001,从器件发送的数据为11111111。ensclo和ensdao分别是sclo/scli和sdao/sdai的切换信号。




将图2和图3所模拟的I2C总线时序与I2C总线协议中相关要求进行比较,满足I2C总线的时序要求。


对各个模块进行多层次处理,形成I2C总线模块。


以该I2C总线模块为基础,编写FPGA与AT24C01A(ATMEL公司生产的E2PROM)的通讯程序。然后把相关程序下载到EPF10Kl0LC84-3中,与AT24C01A进行实际通讯实验,效果良好。

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户111554 2007-7-10 15:58

你好,我也想看看。谢谢

sqxziverson@163.com

相关推荐阅读
用户64191 2006-11-27 17:35
MAX1148型高精度14位串行A/D转换器
1 概述    模/数转换器(ADC)是现代测控中非常重要的环节。它有并行和串行两种数据输出形式。并行ADC虽然数据传输速度快,但有引脚多、体积大、占用微处理器接口多的缺点;而串行ADC的传输速率目前...
用户64191 2006-11-27 17:29
模拟信号隔离放大器技术应用
   无源型IC 内部包含有电流信号调制解调电路、信号耦合隔离变换电路等,很小的输入等效电阻,使该IC的输入电压达到超宽范围(7.5—32V),以满足用户无需外接电源而实现信号远距离、无失真传输的需要...
用户64191 2006-11-27 17:23
构成信号发生器的DDS和变换器
许多设备需要使用能产生高性能、高分辩率信号的低频信号发生器。本实例提供一种能产生0~1MHz频率的电路。你利用这种电路就可产生正弦波、三角波和方波,并能达到优于0.1Hz的频率分辨率和优于0.1○ 的...
用户64191 2006-11-27 17:17
内容可寻址存储器CAM在交换机中的应用
内容可寻址存储器CAM(Content Addressable Memory是一种特殊的存储阵列。它具有将输入数据与CAM中存储的所有数据项同时进行比较,迅速判断输入数据是否与CAM中存储的数据项相...
用户64191 2006-11-25 21:09
BGA布线规则
BGA是PCB上常用的组件,通常CPU、NORTH BRIDGE、SOUTH BRIDGE、AGP CHIP、CARD BUS CHIP…等,大多是以bga的型式包装,简言之,80﹪的高频信号及特殊信...
用户64191 2006-11-25 20:35
数据统计在印制电路板品质控制的重要性
     在印制电路板生产过程中,经常出现诸多的质量缺陷,有许多质量问题很难及时而又快速地解决之。为此,要确保印制板的高品质,就必须对发现的问题进行有计划的、按程序和规程、步骤进行数据统计,以便于更好...
EE直播间
更多
我要评论
1
5
关闭 站长推荐上一条 /3 下一条