I2C总线接口协议设计及FPGA的实现摘要:简单介绍了I2C总线规范和提出一种基于FAGA的I2C总线接口协议的设计方法,并给出了仿真结果。关键词:I2C总线;FPGA;VerilogHDL0引言I2C总线是Philps公司开发的一种用于芯片间通讯的串行传输总线,它由串行时钟线SCL和串行数据线SDA完成全双工数据传送。由于它具有连线少、允许多主机控制、具有总线仲裁和同步等特点,被广泛应用到各个领域,并已经成为一种世界性的工业标准。本文结合现行的研究项目,利用ver-ilogHDL语言在FPGA上设计实现I2C总线接口功能。1I2C总线的基本原理I2C总线数据传输时,在时钟高电平期间数据线上必须保持有稳定的逻辑电平状态,高电平为数据1,低电平为数据0。只有在时钟线为低电平时,才允许数据线的电平状态变化。起始信号:在时钟线保持高电平期间,数据线出现由高电平向低电平变化时启动I2C总线,为I2C总线的起始信号。终止信号:在时钟线保持高电平期间数据线上出现由低到高的电平变化时将停止I2C总线的数据传送,为I2C总线的终止信号。应答信号:I2C总线数据传送时,每传送一个字节数据后都必须有应答信号。应答信号在第九个时钟位上出现,接收器输出低电平为应答信号(A),输出高电平则为非应答信号(-A)。图1为一次完整的数据传输。按照设计要求需要有8位双向数据线(data-bus),1位时钟线(clk),2位控制线(drive和r/-w)、一位握手线(mcf)、一位串行时钟线(scl)及一位串行数据线(sda)共计14位输入输出引线。EDA模块的主要功能是完成并行数据与串行数据的转换,在转换过程中串行数据的输入与输出必须满足I2C总线规范。分频器:由FPGA的锁相环输出的稳定时钟信号,由于频率很高所以必须经过分频模块输出满足I2C总线要求的数据传输速率。I2C总线接口控制时序逻辑块:I2C总线数据传输的所有时序控制逻辑都由它产生,是这个I2C模块的核心。数据锁存器:根据读写使能信号(r/-w)存储I2C己接收的或待发送的数据。移位寄存器:在时序控制逻辑模块的控制下根据读写使能信号(r/-w)对数据进行正确地处理。3verilogHDL代码设计由于I2C总线传输协议可知,I2C在传输过程中存在着几个固定的状态,因此我们采用同步状态机来设计I2C模块。主状态机共有5个状态:空闲(Idle),开始(Start),发送数据(Tx),接收数据(Rx),停止(Stop)。Idle:I2C总线处在空闲状态。Start:当drive信号为高电平时开始运作I2C模块,且根据(r/-w)判断进入下一状态。Tx:当(r/-w)为“0”时传输数据。Rx:当(r/-w)为“1”时接收数据。Stop:当数据传输完毕,跳入Stop状态。状态转移图如图3所示。4仿真验证对I2C总线串口设计的系统调试主要是看串行时钟线(scl)及串行数据线(sda)的输出是否满足I2C总线规范。为此我们将I2C模块实例化了两个模块master和slave,并设计了顶层模块调用master和slave,使用了modelsim6.0进行了仿真。从图4和图5明显可知,当master的drive线置高电平且r/-w线为低电平时,I2C模块运作,产生起始信号Start,且在sda线发送8位数据,且在scl线发送9个时钟脉冲信号,等待mcf,若slave响应,则mcf为高电平,继续发5结论从以上对master和slave接口的读写时序的模拟仿真结果可以看出,整个时序满足I2C总线协议的时序要求,并且所编写的I2C接口模块的VerilogHDL代码是可综合的。本人已成功下载至altera公司EP2S90F1020C5器件上且模拟了I2C总线接口功能,基本实现项目要求。下一字节数据,直到产生终止信号Stop,sda线和scl线置高电平,发送数据终止,等待下一个起始信号Start。同样的,当slave的drive线置高电平时,I2C模块运作,r/-w线为’1’时接收数据功能启动。当mcf为’1’时,slave响应master,且在这时刻才能保证接收数据的准确性,当出现终止信号Stop时数据接收终止,等待下一个起始信号Start。图4和图5准确反映了master发送3字节数据和slave准确接收3字节数据的功能。参考文献[1]何立民.I2C总线应用系统设计[M].北京航空航天大学出版社,2004.[2]夏宇闻.Verilog数字系统设计教程[M].北京航空航天大学出版社,2005.[3]吴继华,王诚.AlteraFPGA/CPLD设计(高级篇)[M].人民邮电出版社,2005.