FPGA的I2C程序

明天就放假了。在首页看到的一句话,记下来加以自勉!
代码是最为耐心、最能忍耐和最令人愉快的伙伴,在任何艰难困苦的时刻,它都不会抛弃你。

准备工作

  1. 看三段状态机:crazybingo的书第七章讲的很好
    (1)一段式状态机:将整个状态机的进程写在一个模块中,此模块中即描述状态的转移,又描述状态的输入和输出。
    适用场合:这个状态中只涉及时序逻辑电路,没有竞争风险,适合寄存器少的CPLD的实现。适合逻辑简单的应用场合,不适用于状态转换很多的场合。两段式状态机和三段式状态机适合于逻辑复杂的应用场合。
    (2)两段式状态机:使用一个时序逻辑来描述状态的转移,同时使用另一个组合逻辑判断状态的转移条件,并且描述逻辑输出。
    两段式状态机的输出因为其组合逻辑,比较容易产生毛刺,存在冒险竞争。所以有时组合逻辑电路也可以用时序逻辑来替换,这样就会减少毛刺。但是这个时序逻辑会使输出延迟一个时钟周期输出,所以,如果这个延时不影响效果,就可以采用两个时序逻辑的形式。
    (3)三段式状态机:即用三个逻辑实现功能,第一个进程中用时序逻辑描述次态寄存器迁移到现态寄存器;第二个进程用组合逻辑,判断现态寄存器的状态,并描写状态转移,即次态寄存器的值(注意状态转移要写完整(用case语句));第三个进程中用时序逻辑实现,通过判断次态寄存器的值来描述输出。
    特点:
    1)第二个进程采用组合逻辑,通过判断现态寄存器来描述次态寄存器,通过画时序图可看出次态寄存器于提前变化,有点像时代的先锋、探索者。
    2)第一个进程和第三个进程都采用时序逻辑,并且都是通过判断次态寄存器的值进行时序输出,这样就形成了输出和现态寄存器同时进行变化,这个特点很适合对时序要求很严格的电路。其实这两个进程可以合并为一个进程,这样就非常容易理解“同时变化”的意思了。
    状态机是时序电路的万能钥匙,所有的时序电路都能通过状态机实现。状态机是FPGA逻辑电路设计的精髓。

  2. I2C的时序图
    需要读懂器件的I2C时序,然后开始划分状态机,还得有寄存器的地址和配置值的表。

  3. 参考代码
    crazybingo书的第14章,OV7725摄像头用到的I2C协议,正好符合我的应用,只有一点的差别。所以只要读懂这个代码就可以实现我的要求了。

代码实现

和crazy的差不多(待续)

你可能感兴趣的:(FPGA)