FPGA有限状态机模拟I2C总线设计

[复制链接]
4023|1
 楼主| cwvin 发表于 2009-4-4 18:09 | 显示全部楼层 |阅读模式
摘要:以I2C总线协议为根据。用有限状态机(FSM:Finite&nbsp;State&nbsp;Machine)设计了基于FPGA的I2C初始化程序模块。主要内容包括简述I2C总线的特点;介绍用FPGA中FSM开发I2C总线模块时的设计思想和实现过程;给出并解释了部分用Verilog&nbsp;HDL描述I2C总线初始化SAA7111和SAA7121的程序,最后在QuartusII中进行了I2C总线主从模式下的时序仿真和用其内嵌逻辑软分析仪SignalTap&nbsp;II完成了硬件调试。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;在现代电子系统中,有为数众多的IC需要进行相互之间以及与外界的通信。为了简化电路的设计,Philips公司开发了一种用于内部IC控制的简单的双向两线串行总线PC&nbsp;(Intel-Integrated&nbsp;Circuit&nbsp;bus)。该总线具有接口线少、通讯效率高等特点。<br />&nbsp;&nbsp;&nbsp;&nbsp;在进行FPGA设计时,经常需要和外围提供PC接口的芯片通信,虽然市场上有专用I2C总线接口芯片,但是地址可选范围小、性能指标固定、功能单一、使用不方便。根据I2C总线的电气特性及其通讯协议,在Altera公司的FPGA(EP2S30)上可以很方便地实现I2C总线的通讯接口,且具有高速、易调试、可以灵活地实现地在线配置等优点,同时大大地减少了系统的开发周期。<br /><br />1&nbsp;I2C总线协议概述<br />&nbsp;&nbsp;&nbsp;&nbsp;I2C总线系统由两根总线即SCL(串行时钟)线和SDA(串行数据)线构成。I2C&nbsp;总线主从器件之间传送的一次数据称为一帧,由启动信号、地址码、若干数据字节、应答位以及停止信号等组成。通讯启动时,主器件发送一个启动信号(当SCL线上是高电平时,SDA线上产生一个下跳沿)、从器件的地址(唯一的7位地址码)和1位读写方向标志位;通讯停止时,主器件发送一个停止信号(当SCL线上是高电平时,SDA线上产生一个上跳沿)。在数据传送过程中。当SCL线上是高电平时,必须保证SDA线上的数据稳定,传完一个字节的数据,必须由从器件送回一个应答信号。总线的传输速率为100kbit/s(标准)-400kbit/s(快速)。<br />&nbsp;&nbsp;&nbsp;&nbsp;这种总线可以设计成很多种通讯配置,考虑到在课题中的实际应用,该I2C总线模型如下:单主操作,只实现简单的写和读操作,写地址连续,没有竞争和仲裁,是很简单的I2C总线系统。在本设计中,用FPGA模拟的I2C总线协议模块完成对SAA7111和SAA7121(Philips公司的视频解码和编码芯片)先后进行初始化。<br /><br />2&nbsp;I2C&nbsp;模块的设计与实现<br />2.1&nbsp;I2C模块设计思路<br />&nbsp;&nbsp;&nbsp;&nbsp;I2C&nbsp;总线写命令格式如下:<br />&nbsp;&nbsp;&nbsp;&nbsp;写信号:&ltStart&gt&ltWrite&nbsp;Slave&nbsp;Address+Write&nbsp;Bit&gt&ltAck&gt&ltRegister&nbsp;Index&gt&ltAck&gt&ltData&gt&ltAck&gt&nbsp;……&nbsp;&ltStop&gt.<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;图1为I2C总线一次完整的数据传输时序图,可以将整个过程分为5个状态:(1)起始,(2)写数('0'或'1'),(3)应答,(4)暂停,(5)结束。针对SAA7111进行初始化,需要在I2C总线上传输的参数共有34个字节:从器件地址(7bits)和写操作位(1bit)占一个字节,基地址参数占一个字节,再加上内部地址连续的32个寄存器(每个寄存器写一个字节数据),写完最后第34个字节后产生一个信号,作为初始化SAA7111的启动信号,初始化SAA7121的过程与前者类似&nbsp;只是传输的参数共有130个字节,就不再赘述。整个初始化SAA711l的具体状态转化过程如图2所示。<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;为了准确控制和描述每个状态,将SDA和SCL的每一状态都分成四部分(00,01,10,11),如下图3,图中是Ack'1'是非应答状态,Ack'0'是应答状<br />态,另外设置Idle状态是为了在传输完一个字节后如果继续传输数据,则在这个状态准备下一个要传输的数据.保障了传输过程中的可靠性。<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;图中每一状态的四个部分都用4个时钟周期来描述,也就是说时钟频率是总线的传输速率(100kb/s—400kb/s)的4倍,即其时钟频率为400kHz-<br />1600kHz(2.5us-O.625us),所以SDA与SCL之间的跳变沿,都相应地满足I2C通信协议中SDA与SCL之间的建立与保持时间(≥O.6us)。<br /><br />2.2&nbsp;I2C&nbsp;模块程序编写<br />&nbsp;&nbsp;&nbsp;&nbsp;整个程序用Verilog&nbsp;HDL语言编制,选择I2C总线的传输速率为200kb/s,则输入时钟频率应为800kb/s。在这里把双向数据线SDA用分成两条线模拟:SDAOUT为SDA数据输出,SDAACK为SDA的应答信号。<br />&nbsp;&nbsp;&nbsp;&nbsp;程序由5个状态组成:Start,Write,Ack,Idle,Stop。状态机的编码方式会影响到逻辑设计的性能,针对FPGA触发器资源丰富,这里采用独热(One-Hot)的编码方式,虽然多用了触发器,但可以有效节省和简化组合电路,提高电路的速度和可靠性,也有利于提高器件资源的利用率。状态定义如下:<br />parameter&nbsp;[19:0]&nbsp;St_Start0=20'b0000_0000_0000_0000_0001;<br />parameter&nbsp;[19:0]&nbsp;St_Start1=20'b0000_0000_0000_0000_0010;<br />parameter&nbsp;[19:0]&nbsp;St_Start2=20'b0000_0000_0000_0100,……<br /><br />2.2.1&nbsp;状态机描述:<br />(1)开始信号(Start)的产生<br />St_Start0:begin&nbsp;SCLOUT=1'b1;SDAOUT=1'b1;<br />NS=St_Start1;end&nbsp;……<br />(2)写信号(Write)的产生<br />St_Write0:begin&nbsp;SCLOUT&nbsp;=1'b0;<br />SDAOUT=SDA_TEMP;NS=St_Write1;end……<br /><br />2.2.2&nbsp;数据输入<br />&nbsp;&nbsp;&nbsp;&nbsp;一般情况下,I2C总线传输的数据由外部ROM或其它专门的数据存储区来存储,但在数据相对固定且数据量不是很大的情况下,可以将初始化的数据写在程序中,这样可减少频繁的数据交换,简化操作。SAA7111的初始化数据就属于这种情况,可以通过检测应答信号来改变输入的值。程序如下:<br />always&nbsp;@(posedge&nbsp;CLKIN)begin&nbsp;//Input&nbsp;Data&nbsp;for&nbsp;Initializafion.<br />case(ACK_CNT)&nbsp;//ACK_CNT&nbsp;is&nbsp;a&nbsp;counter&nbsp;for&nbsp;acknowlege.<br />&nbsp;&nbsp;8'h00:DATA_REG&lt=8'h48;&nbsp;//-Slave&nbsp;Address+Wr<br />&nbsp;&nbsp;8'h01:DATA_REG&lt=8'h00;……<br /><br />2.2.3&nbsp;数据并串转换<br />&nbsp;&nbsp;&nbsp;&nbsp;由于数据寄存器的数据位宽是8bits,而在I2C总线上传输的是位宽是1bit,所以要进行并串转换,且需满足数据高位在前,低位在后。<br /><br />2.2.4&nbsp;产生初始化SAA7121的启动信号<br />&nbsp;&nbsp;&nbsp;&nbsp;当SAA7111初始化完后,应产生开始初始化SAA7121的启动信号,该信号的要求是平时为低电平,当检测到SAA7111的SDA和SCL均为高电平时,生成一个高脉冲,作为SAA7121初始化状态机的Reset信号。<br /><br />3&nbsp;I2C仿真与调试<br />&nbsp;&nbsp;&nbsp;&nbsp;下图4是在Quartus&nbsp;II中时序仿真的信号波形,其中SDAACK为高时,即模拟I2C总线上非应答时的情况,可以从SCL和SDA的波形看到,I2C总线又<br />重新进入开始状态,开始第二次初始化。这样万一初始化失败,还可以再次重新开始,提高了设计的可靠性。<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;图5(a)和图5(b)是在Quartus&nbsp;II中把相关程序下载到EP2S30中,用其内嵌的在线逻辑分析仪SignalTap&nbsp;II采得的初始化SAA7111时的信号波形,信号依次为SCL,SDA,START7121。<br /><br />4&nbsp;结束语<br />&nbsp;&nbsp;&nbsp;&nbsp;以该I2C总线协议为基础,编写FPGA初始化SAA7111和SAA7121的程序,仿真顺利通过并在硬件上调试成功,实现了FPGA与SAA7111和SAA7121实际通讯实验,结果工作正常,验证了FPGA有限状态机模拟I2C总线设计的正确性和可行性。该模块只需修改“2.2.2数据输入”中的参数和ACK_CNT计数器的值,就能移植到对其它满足I2C总线通信协议的器件的初始化中,如AD公司的ADV7170,ADV7179等,效果不错。<br /><br /> 相关链接:<a href='http://www.2-ic.cn'>http://www.2-ic.cn</a>
zhang123 发表于 2009-4-6 16:42 | 显示全部楼层

luguo

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

9

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部