单位文秘网 2021-10-26 08:14:04 点击: 次
打开文本图片集
摘 要:本文介绍了I2C总线规范,用有限状态机设计了基于FPGA的I2C总线接口控制器。并用Verilog HDL语言对一些基本模块进行了具体描述。所设计的I2C总线模块通过Modelsim6.2b进行软件仿真,所得结果符合I2C通信标准,下载到FPGA中电路运行稳定。
关键词:I2C总线;FPGA;有限状态机;Verilog HDL
中图分类号:TP336 文献标识码: A 文章编号: 2095-8595 (2016) 03-195-05电子科学技术 URL: http//.cn DOI: 10.16453/j.issn.2095-8595.2016.03.001
引言
目前,通信中常用的总线有串行总线和并行总线,与并行总线相比,串行总线成本低、占用管脚少,并且结构简单。在工程中比较常用的串行总线有I-wire、IEEE1394、USB和I2C等,其中I2C总线具有简单实用的特点,在串行EEPROM、单片机、数字电位器等器件中应用比较广泛。
I2C总线是英文Inter IC BUS的简写,最早由荷兰飞利浦公司研发,I2C总线只需要两条串行数据线进行数据传输:数据线SDA和时钟线SCL,可用于双向、二进制数据同步串行传输。它允许在总线上连接若干个IC终端,每个IC终端有单独的地址作为识别标识,并且都具有收发数据的功能,从而可实现连接到总线的IC终端间数据信息交互[1]。
现在市场上存在的I2C总线接口芯片大部分为专用芯片,虽然价格比较便宜,用起来也很方便,但功能性能单一、通用性不强、可选的地址范围很小。针对FPGA系统可编程、易调试、可实现在线配置的特点,可以选择可编程器件来实现I2C总线的设计与应用,从而可增强I2C总线功能的通用性,并极大减少系统的开发周期。
1 I2C总线数据传输协议
I2C总线要实现正常的数据传输,在设计时需符合I2C总线数据传输协议中规定的数据传输时序要求。I2C总线进行一次完整数据传输的时序要求如图1所示。
I2C总线利用时钟同步信号实现数据同步传输,与数据传输相关的信号主要有开始信号、地址信号、读写控制信号、应答信号、数据传输信号和终止信号[2]。
I2C总线工作时序描述如下:
(1)开始进行通信时,在主机端,时钟线(SCL)为高电平时,数据线(SDA)从高电平到低电平产生跳变。
(2)主机向从机发送7位地址信息和1位读写方式信息,前7位地址信息决定了哪个从机要和主机通信,最后1位讀写方式信息表示主机是向从机发送信息还是接收信息,其中“0”表示主机向从机发送信息, “1”表示主机从从机读取信息。
(3)接下来的1个时钟脉冲为应答位信息,与主机所发送的从机地址相符的从机将产生应答信号,数据线(SDA)上为低电平时表示应答信号,为高电平时表示非应答信号。
(4)而后主机和从机间进行数据通信,当时钟线(SCL)为低电平时,表示开始准备在数据线(SDA)上进行数据通信,当时钟线(SCL)为高电平时,表示在数据线(SDA)上正式进行数据通信。为了保证数据的正确收发,要求每传送1个字节的数据后,数据接收方要进行应答,以确认是否成功收到数据。
(5)终止通信时,在主机端,时钟线(SCL)为高电平时,数据线(SDA)从低电平到高电平产生跳变。
在I2C总线数据传输过程中,比较典型的读写方式为字节写和随机地址读,字节写时序和随机地址读时序分别如图2和图3所示。
2 I2C总线的设计
2.1 I2C总线总体框图设计
I2C总线接口可按不同功能分为寄存器部分、时钟生成器部分和接口控制器部分组成,寄存器部分包括状态寄存器、控制寄存器、发送寄存器和接收寄存器。其总体框图如图4所示。
其中控制寄存器主要实现控制信号的存储, 利用控制寄存器,主机可对I2C总线接口进行控制。它由2个8位的寄存器组成,其中一个寄存器用于存储要读/写的字节数WRcnt,另一个寄存器的第0~4位用于存储读/写的五种工作模式,其中00001对应字节写,00010对应页写,00100对应立即地址读,01000对应随机地址读,10000对应顺序地址读。第5位用于存储读/写状态信号WR,第6位用于存储开始信号Start,第7位用于存储复位信号Reset。
状态寄存器主要实现总线工作状态的存储,利用状态寄存器,主机可实时得到I2C总线接口的状态信息。状态寄存器的最低位表示可以从接收寄存器读取数据(即Data_Read_Ok),次高位表示可以向发送寄存器写入数据(即Data_Write_Ok)[3]。
发送寄存器主要实现对要发送的数据和地址存储。发送寄存器中存储的地址主要包括从地址(Slave_Addr)和字节地址(Word_Addr)。
接收数据寄存器实现对从I2C总线读取的数据的存储。主机可通过该寄存器将接收的数据读出。
时钟生成器用于I2C总线接口控制器时钟的产生。
I2C接口控制器为总线设计的核心,I2C总线的主要功能都是通过接口控制器来实现的。
2.2 I2C接口控制器
I2C接口控制器是设计的核心,也是设计难度最大的部分。I2C接口控制器要实现对从机的读写,需要根据控制寄存器的信息,产生满足控制时序要求的时钟(SCL)和数据(SDA)信号。由于控制时序的正确与否直接关系着控制的可靠性,因此可采用有限状态机来设计接口控制器。I2C总线时序控制图如图5所示。
有限状态机的空闲状态为idle,当接收到复位信号(Reset=0)时,状态机进入idle状态,FPGA发出开始(St=1)命令后,状态机将处于Start状态,在时钟线(SCL)和数据线(SDA)上发出开始信号,然后状态机到达TAddr状态,主机向从机发出器件地址和读写方式信息;当输出完毕后,主机将接收到从机发送的应答信号,而后状态机将根据不同的工作模式要求,进入相应的状态。例如字节写和页写还需要输出从机的字节地址,接收到响应信号才进入写状态,而随机读除了要输出从机的地址外,还要再一次输出起始信号和从机的器件地址,而后才进入读状态,立即地址读和顺序读则不需要输出字节地址即可进入读状态。
数据写模式可以实现字节写和页写。当写完一个字节的数据后,会接到从机的响应信号,假如要写的字节数全部写完后,状态机进入Stop狀态,否则继续进行下一字节的写入。数据读模式可以实现立即地址读、随机读和顺序地址读。当读完一个字节的数据后,会发送响应信号,假如要读的字节数全部读完后,状态机进入Stop状态,否则继续进行下一字节的读出。
状态机进入停止状态后,在时钟线(SCL)和数据线(SDA)上发出停止信号,之后状态机将进入idle状态。
2.3 I2C接口控制器状态机代码设计
整个I2C接口控制器状态机由十个功能模块组成,通过在各个模块之间的转换实现特定的功能,其中的开始模块、结束模块、发送数据模块和接收数据模块为基本模块,由于篇幅原因,下面仅给出用Verilog HDL语言实现上述四个基本模块功能的程序代码。相关变量的声明在此略去[4]。
(1)开始模块
该模块主要用于实现总线通信的开始控制,当时钟总线(SCL)为高电平时,数据总线(SDA)电平从高变到低,实现总线通信的开始。其代码描述如下:
Start:
begin
count=count+1;
case(count)
1: SDA<=1;
2: SCL<=1;
3: SDA<=0;
4: SCL<=0;
5:
begin
count=0;
state<=TAddr;
end
default: state<=Idle;
endcase
end
(2)结束模块
该模块主要用于实现总线通信的停止控制,当时钟总线(SCL)为高电平时,数据总线(SDA)电平从低变到高,实现总线通信的停止,代码描述如下:
Stop:
begin
count=count+1;
case(count)
1: SDA<=0;
2: SCL<=1;
3: SDA<=1;
4:
begin
count=0;
state<=Idle;
end
default: state<=Idle;
endcase
end
(3)发送数据模块
发送数据模块主要实现向从机中写入数据的功能,每一次完成一个字节数据的写入,当要写入的字节数比较多时,将反复调用该模块,直到将所有数据写入从机中,代码描述如下:
TData:
begin
count=count+1;
case(count)
1: SDA<=data_write[bcnt];
2: SCL<=1;
3: SCL<=0;
4:
begin
if(bcnt==0)
begin
bcnt=8;
data_write_ok=1;
TRcnt=TRcnt-1;
state<=TAck;
end
else
state<=TData;
bcnt=bcnt-1;
count=0;
end
default: state<=Idle;
endcase
end
(4)接收数据模块
接收数据模块主要实现从从机中读取数据的功能,每一次完成一个字节数据的读取,当要读取的字节数比较多时,将反复调用该模块,直到将所有数据从从机中读取出来,代码描述如下:
RData:
begin
count=count+1;
case(count)
1: SDA<=1"bz;
2: SCL<=1;
3: data_read[bcnt]=SDA;
4: SCL<=0;
5:
begin
if(bcnt==0)
begin
bcnt=8;
TRcnt=TRcnt-1;
state<=RAck;
data_read_ok=1;
end
else
state<=RData;
bcnt=bcnt-1;
count=0;
end
default: state<=Idle;
endcase
end
3 I2C总线的应用
实验中,我们以AT24C02存储芯片读写数据过程的仿真时序对I2C总线控制器的功能进行验证,其仿真时序结果符合I2C通信标准。将程序下载到FPGA芯片中并运行,运行的通信数据正确、电路稳定、可靠。I2C总线控制器程序在Xilinx ISE10.1的环境下进行逻辑综合,并利用ModelSim 6.2b进行通信时序仿真。其仿真图见图6和图7。
图6是主机写的仿真波形图,主要实现对AT24C02存储器进行字节写的时序仿真。图中仿真的是对从机模块的器件地址为50H,字节地址为03H的存储单元写入1字节数值为AAH的数据。从仿真时序关系上可以看出,主机对从机地址和数据的写入和从机应答信号的时序是正确的。
图7为主机随机从从机读取数据的仿真波形。主要实现对AT24C02存储器进行随机地址读的时序仿真。仿真过程是将前次写入的1个字节的数据读出,读出的结果与写入的完全一样。从仿真时序关系上可以看出,主机对从机地址的写入、数据的读出和主机应答信号的时序是正确的。
在实际应用中,该I2C总线控制器能够实现对AT24C02芯片的五种工作模式下的读写操作,同时能够实现对AD5248数字电位器中的数据读写操作。
4 结论
本文根据I2C总线通信协议,采用状态机方式对I2C控制器进行设计,并对一些基本模块进行了分析,同时结合AT24C02芯片对该控制器的读写状态进行了时序仿真验证,结果显示该I2C总线信号符合I2C通信标准,下载到FPGA中完全可实现对具有I2C通信协议的芯片进行读写操作。
由于FPGA现场可编程特性在编程和调试上的灵活性。该设计可以生成一个IP核,并嵌入到基于FPGA的系统设计中,可实现对I2C总线中IC芯片数据读写。可避免对不同产品进行重复开发,提高了系统的设计效率。降低了产品开发周期和成本。
参考文献
王彦. 基于FPGA的工程设计与应用[M]. 西安电子科技大学出版社,2007.
张文甲. IIC总线通信中主机控制器的设计与应用[J]. 网络通讯与安全,2006.
张宪起.I2C总线通讯接口的FPGA实现[J].集成电路通讯,2008.
林健磊,殷瑞祥. I2C总线串行数据接口的Verilog实现[J]. 嵌入式网络技术应用,2007.
(责任编辑:单位文秘网) )地址:https://www.kgf8887.com/show-236-97055-1.html
下一篇:无线传感器网络消防报警系统的设计
版权声明:
本站由单位文秘网原创策划制作,欢迎订阅或转载,但请注明出处。违者必究。单位文秘网独家运营 版权所有 未经许可不得转载使用