新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 一款基于FPGA的I2C总线的设计方案

一款基于FPGA的I2C总线的设计方案

作者: 时间:2014-03-19 来源:网络 收藏

异步时钟域的转换,采用两级寄存器的结构。输入滤波器采用5 级寄存器的结构。当采样到连续5 个高电平时,输出才为高电平,否则为低电平。接口部分的寄存器全都用 的系统时钟驱动。

本文引用地址:https://www.eepw.com.cn/article/234978.htm

2.2 SLAVE 控制逻辑的实现

SLAVE 控制逻辑状态机是整个模块的核心,所有 总线相应的控制都由其完成。状态机有四个状态:IDLE,START,SAMPLE 和STOP 组成。Verilog 的定义如下:

`define IDLE 2'b00

`define START 2'b01

`define STOP 2'b10

`define SAMPLE 2'b11

下面介绍各个状态的功能。当I2C 总线无任何操作时控制器在IDLE 状态下,并保持。当接口逻辑判断到START 条件时,控制器跳转到START 状态下,并做好接受第一个字节的准备,包括初始化bit计数器。接着开始接受第一个字节包含7bit的地址和1bit 的读写状态位。当采集完第一个字节后,控制器跳到SAMPLE 状态下,开始执行数据字节的接受或发送。是接受或发送的状态由前一字节的最后1bit 的读写状态位决定。

当读写状态位为高时,表示I2C 总线的读操作, 逻辑发送数据。读写状态位为低时,表示I2C 总线的写读操作,逻辑接受数据。接着FPGA 逻辑发出一个ACK 信号后,表示可以进行读写操作。那么就进入到SAMPLE 状态下,正常读或写一个字节(也可以连续的读写多个字节,对此没有限制)。在完成8bit 数据读写后,I2C 的主器件会发出一个STOP 条件操作。fpga 逻辑收到后,就跳转到STOP 状态,并在几个时钟周期后,自动跳转到IDLE 状态下。从而完成一个完整的I2C 总线的读或写操作。

当然也包括一些异常处理,以防止状态机处在一个不确定的状态下。在SAMPLE 状态下如果遇到意外的START 条件时,即上次的总线操作没有完成就开始了下次的操作,则控制状态机会跳转到START 状态下,而开始接受这次新的总线操作,而上次的操作为无效。由如在SAMPLE 状态下,但是又收到一个START 条件。还有如在STOP 状态收到一个START 条件,处理也和上面一样。下图4 介绍了I2C SLAVE 控制逻辑状态机的状态跳转图。

 

 

如上图所示,在 SAMPLE 状态下,可以连续的读写数据,而地址是在读写完一个字节后由FPGA 逻辑自动加1 的。这样做使得I2C 总线的一次操作就可以连续对多个字节读或写。提高的总线的使用效率。

以下是在modelsim6.0 下进行的行为级仿真的时序图。

由自行编制的I2C 总线主器件BFM 驱动进行测试。图5 I2CSLAVE 控制器写时序图。图6 I2C SLAVE 控制器读时序图。

 

 

3 结论

本方案通过介绍SLAVE 模式的特点,给出设计的原理框图和modelsim 下的行为仿真时序图。在Altera 的Cyclone II 系列中用Quartus II 12.0生成的模块时钟频率可达到180MHz,占用的资源Totalcombinational functions 为83 个,Total registers 为41 个。而在实际应用中达100MHz 左右。证实了本方案操作简便,效果不错。

上拉电阻相关文章:上拉电阻原理

上一页 1 2 下一页

关键词: FPGA I2C

评论


相关推荐

技术专区

关闭