基于CPLD的I2C总线主控制器IP核的设计

(整期优先)网络出版时间:2008-10-20
/ 2

基于CPLD的I2C总线主控制器IP核的设计

宋海明

(集美大学教务处,福建厦门361021)

摘要:根据单片机I2C串行扩展的特点,在EDA软件MaxplusII的环境下,利用硬件描述语言,建立IP核。此设计利用状态机实现,在给出设计的同时详细说明IP核的建立过程,并下载到芯片通过硬件试验验证。

关键词:I2C总线;IP核;CPLD系统

引言

I2C总线是PHILIPS公司推出的新一代串行总线,其应用日渐广泛。目前许多单片机都带有I2C总线接口,能方便地实现I2C总线设计;对没有I2C总线的微控制器(MCU),可以采用两条I/O口线进行模拟。在以单片机为MCU的系统中/很容易实现I2C总线的模拟扩展,有现成的通用软件包可以使用。

1基于CPLD系统中开发自己的I2C总线IP核的重要性

对有些基于CPLD的系统,要与带有I2C总线接口的外围器件连接,实现起来相对复杂一些。为实现系统中的I2C总线接口,可以另外引入单片机,也可以采用PCF8584或者PCA9564器件(PHILIPS公司推出的专用I2C总线扩展器)进行扩展,但这样会增加系统成本,使系统冗余复杂。像ALTERA、XILINX等一些大公司有专用的基于CPLD器件的I2C总线IP核,但这些IP核的通用性不强,需要的外围控制信号较多,占用系统很大的资源,因此直接采用这种IP核不可取。

鉴于此,依照I2C总线协议的时序要求,在基于CPLD的系统中开发了自己的I2C总线IP核。对于一些带有I2C总线接口的外围器件较少、对I2C总线功能要求较简单的CPLD系统,自主开发IP核显得既经济又方便。

图1i2c的传输原理

2I2C总线的协议

I2C总线仅仅依靠两根连线就实现了完善的全双工同步数据传送:一根为串行数据线SDA,一根为串行时钟线SCL。该总线协议有严格的时序要求。总线工作时,由时钟控制线SCL传送时钟脉冲,由串行数据线SDA传送数据。总线传送的每帧数据均为一个字节8bit,但启动I2C总线后,传送的字节个数没有限制,只要求每传送一个字节后,对方回应一个应答位(AcknowledgeBit)。发送数据时首先发送数据的最高位(MSB)。

I2C总线协议规定,启动总线后第一个字节的高7位是从器件的寻址地址,第8位为方向位(“0”表示主器件对从器件的写操作;“1”表示主器件对从器件的读操作),其余的字节为操作的数据。总线每次传送开始时有起始信号,结束时有停止信号。在总线传送完一个或几个字节后,可以使SCL线的电平变低,从而使传送暂停。

图1列出了I2C总线上典型信号的时序和I2C总线上一次完整的数据传送过程。

依据I2C总线的传输协议,总线工作时的具体时序如下:

起始信号(S):在时钟SCL为高电平期间,数据线SDA出现由高电平向低电平的变化,用于启动(A)总线,准备开始传送数据;

停止信号(P):在时钟SCL为高电平期间,数据线SDA出现由低电平向高电平的变化,用于停止I2C总线上的数据传送;

应答信号(A):I2C总线的第9个脉冲对应应答位,若SDA线上显示低电平则为总线“应答”(A),若SDA线上显示高电平则为“非应答”(/A);

数据位传送:I2C总线起始信号或应答信号之后的第1-8个时钟脉冲对应一个字节的8位数据传送。在脉冲高电平期间,数据串行传送;在脉冲低电平期间,数据准备,允许总线上数据电平变化。

3在MaxplusII环境下I2C串行扩展IP核的建立

MaxplusII是美国Altera公司用于CPLD的EDA软件,内部有许多常用的宏单元,如计数器、四则运算、各类逻辑门乃至ROM、RAM等。这些宏单元内具体的参数都可以由用户来自行设定,这就是上面提到的IP核形式。它避免了重复劳动,提高了效率。以下将要设计的是下位机的IP核。

MaxplusII的AHDL(AlteraHardwareDescriptionLanguage)是Altera公司开发的完全集成于MaxplusII中的一种模块化高级语言,特别适合于描述复杂的组合逻辑、组运算、状态机和真值表。本文利用AHDL,直接生成IP核。

设计的最终目标是生成如图2所示的Symbol。通过输入数据来达到控制SDA和SCL的目的,将信号按要求的时序传送给I2C器件。

设计思路是利用状态机实现时序。主要包括输入数据锁存、起始、数据传输、停止等状态机。通过状态机,在每一状态下确定下一状态SDA和SCL是高电平或者低电平,通过这种方式实现了I2C所需要的每一种时序。由于使用的是AHDL,这种状态机实现起来非常方便,程序简洁明了。由于篇幅限制,仅介绍数据传输的状态机。状态图如图3所示。

以下程序中,Cmd_reg2为发送允许暂存位;Sh_reg[]为数据锁存,通过左移,最高位数据Sh_reg7为当前将发送数据,存入SDA_tmp。通过图3对照程序,可以看到发送一个利用状态机数据位的详细过程。程序清单如下:

IFCmd_reg2THEN——若“发送允许”,则将Sh_reg7作为当前发送位

SDA_tmp=Sh_reg7;

ELSE

SDA_tmp=VCC;

ENDIF;

St.clk=SysClk;

St.ena=BaudGen;

CASEStIS--控制传输8位数据的状态机

WHENt0=>

IFCmd_reg2ORCmd_reg3THEN

SDA=SDA_tmp;--开始传送数据

SCL=GND;

St=t1;

ELSE

St=t0;

ENDIF;

WHENt1=>

SCL=VCC;

SDA=SDA_tmp;

St=t1a;

WHENt1a=>

SCL=VCC;

SDA=SDA_tmp;

St=t2;

WHENt2=>

Sh_reg[7..1]=Sh_reg[6..0];--数据左移,取高位

Sh_reg[0]=GND;

Sh_reg[].ena=EXU;

SCL=GND;

SDA=SDA_tmp;

IFBit[]==7THEN--若8位传完,则发应答位;否则继续

St=t3;

ELSE

St=t0;

ENDIF;

WHENt3=>--发应答位

SDA=GND;

St=t4;

WHENt4=>

SDA=GND;

SCL=VCC;

St=t4a;

WHENt4a=>

SDA=GND;

SCL=VCC;

St=t5;

WHENt5=>

SCL=GND;

St=t6;

WHENt6=>

SDA=GND;

FINISHED=VCC;

St=t0;

ENDCASE;

Bit[]=Bit[]+1;——传输完一位,已传输位数加一

图4为仿真结果。起始信号给出以后,传输2个8位数据:每个数据后跟一个应答位,在输送完第一个数据要求的情况下,暂停一段时间,再输送第二个数据;2个数据输完以后,主机发出停止输送要求,即给出停止信号。这些信号,在SDA和SCL上完全符合I2C的时序要求。要使总线传输速率达到改进后的规范,即400kb/s,因为根据以上叙述,每发送1位数据需要4个时钟周期,所以所给的时钟为1600kHz。图4中Execute为执行信号,即它为高电平时,输入数据DIN[7..0]有效;EXU为发送使能信号,只有当它为高电平时,方可输送串行数据到外围器件;Start为开始控制信号,用于发生起始信号;STOP用于告知总线数据传输结束,发生停止信号。

图4仿真结果

4仿真结果工作正常

仿真以后,通过编程电缆将生成的pof文件用ISP(在系统编程)方式下载到FPGA板EPM7128SLC84-6,I/O口SDA和SCL挂上拉电阻,外接两片I2C器件SAA1064(LED显示I2C串入并出芯片)进行测试,结果CPLD利用该I2C的IP核,工作正常可以按照要求显示。

参考文献

[1]Altera.ALTERADIGITALLIBRARY,2000.

[2]何立民.可编程逻辑器件原理、开发与应用[M].北京:北京航空航天大学出版社,2000.

[3]赵曙光.可编程逻辑器件原理、开发与应用[M].西安:西安电子科技大学出版社,2000.

[4]SAA1064ProductSpecificationPhilps.

[5]杨志刚,蒋欣.CPLD在基于PCI总线的功率模块设计中的应用[J].国外电子元器件,2008,4:29-31.

[6]黄科元,黄守道.DSP和CPLD构成的矩阵式变换器控制系统[J].电力电子技术,2008(2):70-72.

[7]康岭,朱齐丹.基于CPLD的DSP与LCD接口的设计与实现[J].应用科技,2008(5):60-64.

[8]田开坤,徐海霞.基于CPLD的单片机接口设计[J].现代电子技术,2008(2,265):34-36.

[9]王妍,李志扬,郑君.基于CPLD的通用液晶驱动电路[J].郑州轻工工业学院学报(自然科学版),2008(2):47-49.

作者简介:宋海明(1964~),男,福建龙海人(汉),实验师,本科,从事高校电化教学设备的配置与维修研究。