信任学过单片机的同学对I2C总线都不生疏吧,今日咱们来学习怎样用verilog言语来完成它,并在FPGA学习版上显现。
i2c总线在近年来微电子通讯操控范畴广泛选用的一种新式的总线规范,他是同步通讯的一种特别方法,具有接口少,操控简略,器材封装方法小,通讯速率高级长处。在主从通讯中,能够有多个i2c总线器材一起接到i2c总线上,一切与i2c兼容的器材都有规范的接口,经过地址来辨认通讯目标,使他们能够经由i2c总线相互直接通讯。
i2c总线由两条线操控,一条时钟线SCL,一条数据线SDA,这儿以E2PROM芯片AT24C08来介绍i2c通讯方法。这是我学习版上的E2PROM芯片
下面是AT24系列芯片的器材地址阐明
前四位是现已默许的地址,接下来三位是可编程部分,能够自己拟定器材的地址,就像上面的芯片,A0,A1,A2悉数接地,所以我的开发板上的E2PROM的地址就为1010_000x,最终一位是读写标志位,若为1,则表明我要从E2PROM里读数据,若为0,则表明我要往里边写数据。
下面是AT24C08的写时序
想要了解这段时序,让咱们来渐渐将它分化来看,从上到下,从左到右
1、SCL
由芯片的datasheet咱们能够知道芯片的作业频率规模,一般是100KHZ到400KHZ,这儿咱们用100KHZ的作业频率。由于咱们的FPGA芯片是50MHZ的频率,所以要用到分频,周期是20ns,所以计数500次便是10us,也便是100KHZ了,下面是分频部分的代码
由芯片的材料可知,在SCL是低电平器材数据才能够改变,也便是说,只要在SCL在低电平器材才能够向E2PROM里边写数据,在SCL高电平期间数据安稳,所以咱们能够从里边读数据,所以咱们将SCL的一个时钟周期分为四部分,分别是高电平中心时间(用于读数据),下降沿,低电平中心时间(用于写数据),上升沿。上升沿和下降沿来操控SCL的时序。
2、START
开端信号,在SCL为高电平期间,SDA有一个从高电平到低电平的跳变,咱们能够参阅上传的源代码,从一上电开端,SCL就依照100KHZ的频率在改变,咱们需求操控的仅仅SDA即可。
3、DEVICE-ADDRESS
器材地址,当开端信号作用后,就能够将器材的地址送人数据总线SDA,由于SDA是串行的,所以要一位一位的送,并且要从高位开端送,下面是状况机寻器材地址部分代码,留意地址的最终一位是读写位,这儿要送写地址,即1010_0000;
下面我来解释一下上图的代码为什么这样写
(1)首先在SCL在低电平期间归于数据安稳期,咱们能够向里边写数据。
(2)进入ADD1状况后,sda_num就开端计数,由于咱们用的对错堵塞赋值,所以第一个时钟周期case捕获的sda_num的值是0而不是1,有些朋友或许不明白这儿,总是觉得case句子上来不就捕获了1嘛,在这儿给咱们解说一下
(3)这样一连送8个时钟周期的器材地址,送完之后sda_num清零,并开释sda总线,进入下一个状况
4、ACK
应对信号,当器材地址发送结束后,主机要向从机要一个应对信号,用来表明从机现已接纳到了主机发送的数据,假如一段时间内主机没有收到从机发来的应对信号,则主机默许从机收到的主机发送的数据。在这儿咱们使用状况机等候一个时钟周期,作为应对等候时间,并在这个时间内给db_r寄存器送数据地址
5、WORD_ADDRESS
数据地址,当找到要往哪个器材里写数据之后,就要开端寻址往这个器材的哪个地址里写数据了,AT24C08的存储容量为1024×8,也便是能够写1024个字节,共有1024个地址,往哪个地址里写呢,需求咱们自己确认。和上面发送器材地址相同,直接将地址数据发送至SDA总线即可。
接下来从机再给主机一个应对信号,假如此刻咱们按下键1的话那么就会进入写状况,然后咱们就能够写数据了,详细代码和上面寻址的代码相似,直接将数据发送到数据总线SDA。
下面是读时序
读时序和写时序的仅有不同点便是当发送玩数据地址后,接纳到应对信号后,假如想要履行读指令,那还要进行一次开端信号,即START2,然后再发送一次器材地址,当再收到应对信号后就能够从里边读数据了,留意读数据的时分咱们是在scl的高电平期间,由于这个时分数据安稳,而在写数据的时分,咱们是在scl的低电平器材,由于这个器材数据才答应改变,代码如下
还有一点要留意,由于SDA是输入输出信号inout,所以为了当数据线作为输出或许输入时不被搅扰,这儿界说了一个变量sda_link,来操控它,当sda作为输入信号时,咱们让它处于高阻态,当sda作为输出信号时,将其赋予sda_r的值
下面是生成的RTL视图
下面是状况机的模型
下面是板子上试验