I2C总线接口电路设计_第1页
I2C总线接口电路设计_第2页
I2C总线接口电路设计_第3页
I2C总线接口电路设计_第4页
I2C总线接口电路设计_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

FPGA与12c总线器件接口电路设计

利用FPGA模拟12c总线协议对I2C总线接口器件AT24c256进展读写操作。利用按键输入读写命

令和相应的地址、数据,对芯片进展读写操作,读写的数据用数码管显示。

一、12c总线接口电路设计分析

1.I2C总线协议

12c总线的两根通信线,一根是串行数据线SDA,另一根是串行时钟线SCL。多个符合12c总线标

准的器件都可以通过同一条12c总线进展通信,而不需要额外的地址译码器。每个连接到总线上的器件

都有一个唯一的地址作为识别的标志,都可以发送或接收数据。12c总线通信速率受主机把握,标准模式

下可达100kbit/so

一般具有12c总线的器件其SDA、SCL引脚都为集电极(或漏极)开路构造。因此实际使用时,SDA

和SCL信号线必需加3〜10K的上拉电阻。总线空闲时均保持高平。12c总线接法如图1所示,

VCC

图112c总线连接示意图

(I)12c的主机和从机,发送器和接收器

产生12c总线时钟信号和起始、停顿把握信号的器件,称为主机,被主机寻址的器件称为从机。

任何将数据传送到12c总线的器件称为发送器,任何从12c总线接收数据的器件称为接收器。主

机和从机都可作为发送数据器件和接收数据器件。

(2)12c总线上数据的有效性:

时钟线SCL为高电寻常,数据线SDA的任何电平变化将被看作总线的起始或停顿信号;

在数据传送过程中,当时钟线SCL为高电寻常,数据线SDA必需保持稳定状态,不允许有跳变;

数据线SDA的状态只能在SCL低电平期间才能转变。即进展串行传送数据时,在SCL高电平期间传送

位数据,低电平期间预备数据。

(3)从机地址

12c总线不需要额外的片选信号或地址译码。多个I2C总线接口器件可连接到一条12c总线上,它

们之间通过地址来区分。主机是主把握器件,只有一个主机的不需要地址。其它器件均为从机,均有器

住地址,但必需保证同一条12c总线上的器件地址不能重复。一般从机地址由7位地址位和1位读写位

组成,地址位为高7位,读写位为最低位。读写位为。时,表示主机将向从机写入数据;读写位为1时,

表示主机将要从从机读取数据。

(4)12c总线的通信时序

I2C总线的通信时序如图2所示。

SDAon_rm二二)

ACKACK

应答应答

SCL

L.)

P

S总线

停顿

起始暂停

条件

条件把握

图212c总线的通信时序

①首先主机发送一个起始信号。当时钟线SCL处于高电平期间,数据线SDA电平从高到低的跳

变形成12c总线的起始信号,启动12c总线。

②主机逐位发送7位(高位在前,低位在后)从机地址和1位读写把握信号,共8位。需8个时

钟。

③与传送地址全都的从机发应答信号(ACK)。在第9个时钟周期时将SDA线拉低表示其已收到

一个区位数据.假设在第9个时钟周期,SDA为高电寻常为非应答.

④开头传送数据,传送数据数量不限。每个字节(8位)后紧跟1个接收器件发出的应答位。假设是

主机读取从机数据时,从机发送数据,主机发应答位:假设是主机写数据到从机时,主机发送数据,从机

发应答位。

⑤数据传输完毕时,主机发送1个停顿信号,当时钟线SCL为高电寻常,数据线SDA由低电平

变为高电寻常形成终止信号,停顿12c总线通信。

(5)数据传输根本格式如表19

表112c总线数据传输根本格式

SA7-A1R/WACKD7-D0ACKD7~D0ASKP

起7位0:写应8位应答8位•••应答位停

始地址1:读答数据位数据0:应答止

位位1:非应答位

其中S、A7~A1、R/W、P总是由主机产生;写数据时,ACK由从机产生,D7-D0由主机产生;读

数据时,ACK由主机产生,D7~D0由从机产生。

2I2C总线器件AT24c256

AT24C256是一个256K位的串行CMOS型E2PROM,可存储32768个字节。该器件通过12c总

线接口进展操作,其引脚如图3所示,各引脚功能见表2。

图3AT24c256引脚图

表2AT24c256引脚功能说明

管脚名称功能说明

SCLAT24C256串行时钟输入卷脚叫于产生器件全部数据发送或接收的时钟。输入管脚。双

向串行数据/地址管脚。用于曙件全部数据的发送或接收,SDA是一个开漏输出管脚可

SDA

与其它开漏输出或集电极开路输出进展线或wire-ORc

写保护。当WP脚连接到Vcc,全部内存变成写保护只能读:当WP引脚连接到Vss或

WP

悬空,允许器件进展读/写操作。

器件地址输入。这些管脚为硬连线或者不连接,对于单总线系统最多可寻址4个

A0A1

AT24c256器件。当这些引脚没有连接时其默认值为0。

VSS电源地

VCCI.8-6V

NC空脚

作为带有I3C总线接口的器件,每个AT24c256都有一个7位的从机地址,其高5位固定为“10100”,

接下来的2位由AT24c256的引脚AlA0硬连线输入打算(AKA0直接接电源VCC或GND),同一

I2C总线上最多可以连接4个AT24C256器件。AT24C256除了有作为从机的地址,其内部还有作为存

储单元的编码子地址,其子地址为双字节(16位),从0000H〜7FFFH。本设计中只有1个AT24c256

可将AT24c256的引脚Al、A0直接接地,其硬件电路如图4所示。则该AT24c256作为从机的7位地

址为“1010000”。

图4单个AT24C256迂接电路图

3对AT24c256的读写过程

(I)向AT24c256某一存储单元写入I个字节数据,过程如下:

①主机(这里为FPGA把握器)发送一个起始信号,启动发送过程;

②主机发送7位从机地址(这里为1010000)和1位写把握位(为0);

③从机(这里为AT24c255)发应答位。在主机发送起始信号和从机地址字节后,AT24c256监视

总线并当其地址与发送的从地址相符时,响应一个应答信号。在第9个时钟,将SDA线拉为低电平;

④主机接收到应答位后,发从机子地址高8位(为AT24c256某一存储单元地址)。

⑤从机接收完高8位子地址后,发应答位;

⑥主机接收到应答位后,发从机子地址低8位;

⑦从机接收完低8位子地址后,发应答位;

⑧主机接收到应答位后,发送待8位写入数据:

⑨从机接收完8数据后,发应答位,并开头内部数据的擦写;

⑩主机接收到应答位后,发停顿位,完毕传送,总线挂起。

SDA上数据传输格式见表3,数据传送时序如图5所示。

表3句AT24C256写1个数据时总线SDA上数据传输格式

1—。」一。一」_AD15-AD8~~-AN-ADO~L-44—J---!-?•

起7位写应高8位应低8位应写入应停

始器件答指针答指针答8位答止

位地址位地址位地址位数据位位

主机发送从主机发送从主机发送从主机发送从机主

机机机发送机

发发发发

送送送送

图5向AT24C256写一个数据时序

(2)从AT24c256某一存储单元读出1个字节数据,过程如下:

①主机发送一个起始信号,启动发送过程,接着发送7位从机地址(1010000〕和1位写把握位(0J:

②从机检测到起始信号及本身从地址相符时的从机地址后,发应答位。

③主机接收到应答位后,发从机子地址高8位(为AT24c256某一存储单元地址)。

④从机接收完高8位子地址后,发应答位;

⑤主机接收到应答位后,发从机子地址低8位;

⑥从机接收完低8位子地址后,发应答位;

⑦主机接收到应答位后,再发送一个起始信号(称为重复起始信号),接着再发送7位从机地址

(1010000)和1位读把握位(为1):

⑧从机检测到重复起始信号及从机地址后,发应答位,并将子地址对应的存储单元数据发送到总

线上。

⑨主机接收到应答位后,接着预备从总线接收数据,从总线接收完8数据后。发非应答位和发停

顿位,完毕传送,总线挂起。

SDA上数据传输格式见表4所示,数据传送时序如图6所示。

表4从AT24C256上读1个数据时总线SD^上数据传输格式

A7AD15AD7A7D7

S0000Sr100/1P

AIAD8ADOAID0

起7位应高8位应低8位应重复7位应读出非停

始器件答指针答指针答起始器件读答8位应止

位地址位地址位地址位位地址位数据答位

从主从主从从从主主

主机机机机机机机机机机

王机发送

发送发发发发发发发发发

送送送送送送送送送

S

TS

TAT

BUSACTIVITY:ASLAVEBYTEADDRESSRO

TP

MASTERRADDRESSAi5-AeDATA

SHAIINF印口,口「*|::::二|

N

O

A

C

K

图6从AT24C256读一个数据时序

4FPGA内部电路

模拟12c总线对AT24c256的读写把握电路根本构造框图如图7所示。

图7模拟I2C总线对AT24C256的读写把握框图

(1)12c总线端口

I2C总线端口为三态输出,当使能端有效时,总线输出为低电平:当使能端无效时三态门输出为高

阻,但由于12c总线上有上拉电阻,总线保持在高电平或由总线上从机输出数据打算。总线数据始终能

被读入。其构造示意图如图8所示。

图812c总线端口示意图

(2)位传输把握模块

位传输模块以“位”为单位产生各种12c协议命令(开头、停顿和重复开头)以及进展位数据读写。

为了读写到稳定的“位”数据,读写I位数据分为4到5个阶段完成。1位数据传输时序要求如图9所

示。这样内部读写时钟频率一般承受5倍于SCL时钟总线频率,

SCL

开头

SDA

SCL

重复开头

SDA

SCL

停帧

SDA

SCL

SDA

SCL

SDA

图9I2C协议命令和位数据传输的执行时序

位传输把握电路依据输入的把握命令,将来自字把握模块的一位待写入的数据送到总线上,或从总

线上读入一位数据给字把握模块。当完成I位数据传输时产生读写完成标志,并依据数据传输状况产生

忙标志和总线仲裁丧失标志。

(3)字传输把握模块

字节传输模块以字节为单位把握12c总线的数据传输。该模块依据输入把握命令,将存放在发送存

放器中的数据加载到一个移位存放器,然后逐位发送到位传输模块,再把握位传输模块将数据发送到12c总线

上。或把握位传输模块从总线上逐位接收位数据,暂存到移位存放器,再转换成字节数据送给数据输出。

同时给出相关传输标志。

(4)AT24c256读写把握

依据输入把握信号和来自住传输模块的反响标志,将把握信号加到命令存放器,给字节传输模块供

给把握信号;将输入数据或指定单元地址加载到数据传送存放器:将从字节模块读取的数据回送到数据接

收存放器。

二、FPGA硬件系统电路设计〔略〕

三、12c总线接口电路VHDL设计

1.I2C总线端口

(1)名称:IlCJO.vhd

(2)功能:hC总线双向端口电路描述

⑶端II说明.

方向端口名宽度说明

Sda_en1数据线三态使能把握端,来自位传输把握模块

轴入

Scl_en1时钟线三态使能把握端,来自位传输把握模块

Sda.i1回送的数据线信号,给位传输把握模块

输出

SclJ1回送的时钟线信号,给位传输把握模块

Sda1I2C的数据线,外接I1C器件

双向

Scl112c的时钟线,外接12c器件

(4)VHDL描述

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITY1IC_IOIS

PORT(

Scl_en,sda_en:INSTD_LOGIC;

Sda,Scl:INOUTSTD_LOGIC;

Scl_i,sda_i:OUTSTD_LOGIC);

ENDHC」O;

ARCHITECTUREoneOFIIC_IOIS

BEGIN

Sda_i<=sda;

Scl_i<=scl;

Scl<="0"scl_en="0"”Z

WHENELSE”:

Sdav="0"sda_en="0"”

WHENELSEZ

ENDone;

2位传输把握模块

(1)名称:bit_txd_rxd.vhd

(2)功能:实现位数据或协议命令的传输

⑶端口说明.

方向端口名窕度说明

Rsl1坦位信号,低电平坦位

clk_sys1系统时钟

ena1系统使能信号,高电平有效

输入cmd4把握命令,由字节传输模块给出

Bit_da(a_wr1待写入总线的1位数据

SclJ1总线时钟输入

Sda_i1总线数据输入

Scl_oen1总线时钟输出访能

Sda_oen1总线数据输出访能

Bit_finish1完成1位读写的标志,1为完成,0为未完成

输出

busy1总线忙标志,1为忙,0为闲

lose1总线仲裁丧失标志,1为出借,0为正确

Bit_data_rd1从总线读出的1位数据

(4)VHDL描述

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_Arith.ALL;

USEIEEE.STD_LOGIC_Unsigncd.ALL;

ENTITYbittxdrxdIS

GENERIC(n:INTEGER:=48);--分频系数

PORT(

Clk_sys:INSTD_LOGIC;

Rst,ena:INSTD_LOGIC;

cmd:INSTD_LOGIC_VECTOR(3DOWNTO0);

Bit_data_wr:INSTD_LOGIC;-

Scl_i,sda_i:INSTD_LOGIC;

Scl_oen,sda_oen:OUTSTD_LOGIC;

Busy,Lose:OUTSTD_LOGIC;

Bitdatard,Bitfinish:OUTSTDLOGIC);

ENDbil_txd_rxd;

ARCHITECTUREtwoOFbit_txd_rxdIS

Types(atc_tIS(bit_idlc,start_a,start_b,start_c,start_d,start_e,stop_a,stop_b,stop_c,stop_d,write_

write_b,wrile_c,\vrite_d,read_a,read_b,read_c,read_d);

SIGNALsta_p:statc_t;

CONSTANTn:INTEGER:=48;一产生500KHz的分频系数

SIGNALen_500k:STD_LOGIC;-500KHz时钟使能信号

SIGNALScl_a,Sda_a,Scl_b,Sda_b:STD_LOGIC;--同步SCL和SDA中间信号

SIGNALscl_cdg:STD_LOGIC;--SCL的边沿信号

SIGNALscl_oen_r,sda_oen_r:STDJLOGIC;-总线使能信号

SIGNALsda.chk:STD_LOGIC;-写数据时,检杳总线信号

SIGNALdscl_oen,slave_wait:STD_LOGIC;—时钟延迟等待的信号

SIGNALSda_S,Sda_P:STD_LOGIC;・・启动、停顿标志位SIGNAL

Busy」,Lose」:STD_LOGIC;一忙标志、丧失标志信号SIGNAL

stop_cmd.stop_cmd_r:STDJLOGIC;--停顿命令信号

BEGIN

PROCESS(clk_sys,rst)一同步SCL和SDA的输入信号

BEGIN

IFrst="(TTHEN

Scl_a<=>,r,;

Sda_a<=M1

,)

Scl_b<=T;

Sda_b<=Ml

,,・

ELSIFRISING_EDGE(clk_sys)THEN一暂存SCL、SDA的值

Scl_a<=Scl_i;

Sda_a<=SdaJ;

Scl_b<=Scl_a;

Sda_b<=Sda_a;

ENDIF;

ENDPROCESS;

Scl_cdg<=scl_aAND(NOTScl_b);--检测时钟SCL上升沿

PROCESS(clk_sys)・・产生数据输出信号,在SCL上升沿时锁存SDA上的数据值

BEGIN

IFRISING_EDGE(clk_sys)THEN

IFscl_edg=TTHEN

Bit_data_rd<=Sda_a;

ENDIF;

ENDIF;

ENDPROCESS;

-从节点未预备好时,下拉SCL延迟周期;当给出的SCL使能为1时,检测SCL总线为。时,则

节点未预备就绪,产生等待信号。

PROCESS(clk_sys)

BEGIN

IFRISING_EDGE(clk_sys)THEN

dsclocn<=sclocnr;

ENDIF:

ENDPROCESS;

Slave_wait<=dscl_oenAND[NOTscl_a);

PROCESS(clk_sys,rsi)--将24M系统时钟分频产生500KHz时钟使能把握信号

VARIABLEent:INTEGERRANGE0TOn-1;一时钟分频计数器

BEGIN

IFrst=,,O'^THEN

ent:=0;

cn_500ku=T;

ELSIFRISING_EDGE(clk_sys)THEN

IFclk_cnl<n-lTHEN-n为分频系数

IFena=,,P,THEN

cnt:=cnt+1;

en_50()kv="0";

ENDIF;

ELSE

IFSlave_wait="0"THEN-从节点预备好,给出时钟使能

en_500kv='T';

ELSE-从节点未预备好,延迟等待

cnt:=ent;

en_500k<="0";

ENDIF;

ENDIF;

ENDIF;

ENDPROCESS;

-生成启动标志和停顿标志

-在SCL高电寻常,检测SDA的下降沿(起始信号),产生启动标志

--在SCL高电寻常,检测SDA的上升沿(停顿信号),产生停顿标志

PROCESS(clk_sys,rst)

BEGIN

IFrst="O”THEN

Sda_S〈="0";—启动标志复位

Sda_P〈="0"L停顿标志更

ELSIFRISING_EDGE(clk_sys)THEN

Sda_S<=(NOTSda_a)ANDSda_bANDScl_a;一生成启动标志

Sda_P<=Sda_aAND(NOTSda_b)ANDScl_a;一生成停顿标志

ENDIF;

ENDPROCESS;

-生成总线忙标志

--检测到启动信号发生,但无停顿信号发生时表示总线处于忙状态

PROCESS(clk_sys,rst)

BEGIN

IFrst=^^O^^THEN

Busy_r<="0":

ELSIFRISING_EDGE(clk_sys)THEN

Busy_r<=(Sda_SORbusy_r)AND(NOTSda_P);

ENDIF;

ENDPROCESS;

Busy〈=busy_r;-忙标志输出

-产生仲裁丧失标志,

-当没有停顿恳求时,检测到停顿信号,产生仲裁丧失标志

一当驱动SDA总线为高时,,但检测SDA始终为低,产生仲裁丧失标志

PROCESS(clk_sys,rst)

BEGIN

IFrst=^^O^^THEN

stop_cmd<="0";--停顿命令信

号stop_cmd_r<=,,0M;

Lose_r〈=''0";

ELSIFRISING_EDGE(clk_sys)THEN

IFcmdv="0010"THEN-有停顿命令

stop_Cmd<=,,r,;

ELSE

slop_Cmd<="0";

ENDIF;

slop_Cmd_r<=slop_Cmd;

Lose_r<=(Sda_PAND(NOTstop_Cmd_r))OR(NOTsda_aANDsda_chkAND

sda_oen_r);--丧失标志

ENDIF;

ENDPROCESS;

Lose<=Lose_r;

--位传输状态机

Scl_ocn<=scl_ocn_r;

Sda_oen<=Sda_oen_r;

PROCESS(clk_sys,rst)

BEGIN

IFrst="()“THEN

Sta_pv=bit_idle;--初始预备状态

bit_finishv="(T;位信号发送或接收完成标

志Scl_oen_r<='T';--时钟输出访能

Sda_oen_r数据输出访

能Sda_chkv="(T;--不检查输出

ELSIFRISING_EDGE(clk_sys)THEN

IFLose_r="l”THEN—数据传输信号丧失

S(a_p<=bit_idle;

bit_finishv=''O";

Scl_oen_r<=T;

Sda_oen_rv='T';

Sda_chkv="O'';

ELSE

bit_finishv=''O";

IFclk_en=TTHEN

CASEsta_pIS

WHENbit_idle=>一预备状态

Scl_ocn_r<=scl_ocn_r;--保持SCL在同一状态

Sda_oen_r<=sda_oen_r;--保持SDA在同一状态

Sda_chk<=,,(r,;

CASEcmdIS--状态命令字

WHEN“0001sta_p<=start_a;—发送起始信号状态

WHENu00104t=>sta_p<=stop_a;—发送停顿信号状态

WHEN“0100”=>sta_p<=write_a;-^A1位数据

WHEN“1000"=>sta_p<=read_a;一读出1位数据

WHENOTHERS=>sta_p<=bit_idle;

ENDCASE;

-启动I2C状态,分5个时钟段产生起始信号

WHENslar(_a=>

sta_p<=start_b:

Scl_oen_r<=scl_oen_r;--保持SCL

Sda_oen_rv="l”;-SDA处于

高Sdachk<="0";一不检查输出

WHENstart_b=>

sta_p<=start_c;

Scl_oen_rv='T';

Sda_oen_rv='T';

Sda_chk<=,,0,*;

WHENstart_c=>

sta_p<=start_d;

Scl_oen_rv='T';

Sda_oen_r<="()”;

Sda_chk<="0";

WHENstart_d=>

sta_p<=start_e;

Scl_oen_r<='T';

Sda_oen_rv="0";

Sdachk<="0";

WHENslart_e=>一开头状态5

sia_p<=bit_idle;--回到等待状态

bit_finish起始信号传送完成,给出标

志Scl_oen_r<="0”;

Sda_oen_r<=^^0^^;

Sda一chkv="(产;

--停顿I2C状态,分4个时钟段产生停顿信号

WHENstop_a=>

sta_p<=stop_b;

Scl_oen_r

v="0'';

Sda_oen_r<="()”;

Sda_chk<=,,0M;

WHENstop_b=>

sta_p<=stop_c;

Scl_oen_rv="l”;

Sda_oen_r<="()”;

Sda_chk<=''。";

WHENstop_c=>

sta_p<=stop_d;

Scl_oen_r

Sda_oen_rv="0";

Sda_chkv="0";

WHENstop_d=>

sta_p<=bit_idle;

bit.finish停顿信号传送完成,给出标志

Scl_oen_ry='T';

Sda_oen_rv='T';

Sda_chk<="0";

-读状态,分4个时钟段读1位信号

WHENrcad_a=>

sta_p<=read_b;

Scl_ocn_rv="0";一SCL处于低

Sda_oen_r<=,,r,;-SDA由从器件打

算Sda_chkv="0";

WHENread_b=>

sta_p<=read_c:

Scl_ocn_r<="「';

Sda_oen_rv=T;

Sda_chkv="0";

WHENread_c=>

sta_p<=read_d;

Scl_ocn_r<=,,T,;

Sda_oen_r

v=”],,;

Sda_chk〈=''O";

WHENreadd=>

sta_p<=bit_idle;

bit_finishv=T;・・读完1位数据,给出标志

Scl_oen_rv="0";

Sda_oen_rv=T;

Sda_chk<="。'';

-写状态,分4个时钟段写1位信号

WHENwrite_a=>

sta_p<=write_b:

Scl_oen_r<=M0M;-SCL处于低

Sda_oen_rv=bil_daia_wr;--输入数据

,,,,

Sda_chk<=0;

WHENwrite_b=>

sta_p<=write_c;

Scl_oen_rv='T';

Sda_oen_r<=bit_data_wr;

Sda_chk<=,,r,;-

WHENwrite_c=>一写状态3

sta_p<,=wri(e_d;

Scl_ocn_rv=T;-

Sda_oen_r<=bil_data_wr;

Sda_chk<=,,r,;

WHENwrite_d=>一写状态4

sta_p<=bit_idle;

bi^finish写完1位信号,给出标志

Scloenrv="0";

Sda_ocn_r<=bit_data_wr;

,,,,

Sda_chk<=Ci;

WHENOTHERS=>null;

ENDCASE;

ENDIF;

ENDIF;

ENDIF;

ENDPROCESS;

ENDtwo;

3字传输把握模块

(1)名称:byte_txd_rxd.vhd

(2)功能:实现字节数据的传输把握。

(3)靖3说明.

方向端口名宽度说明

Rst1复位信号,外接按钮开关,低电平第位

clk_sys1系统时钟

start1启动命令

输入

stop1停顿命令

read1读命令

write1写命令

Ack_in1应答输入信号

Data_txd8待发送的8位输入数据或地址,由发送存放器供给

Bit_data_rd1从位模块接收的1位数据

Lose1总线仲裁丧失标志

Bit_finish1来自位模块的1位传送完成标志

emd4输出命令

Bit_data_wr1向位模块发送的数据

输出Data_rxd8接收到的8位数据,送给接收存放器,

Ack_finish1应答完成标志

Ack_out1从总线上读出的应答信号

(4)VHDL描述

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_Arith.ALL;

USEIEEE.STD_LOGIC_Unsigncd.ALL;

ENTITYbyte_txd_rxdIS

P0RT(

clk.sys:INSTD_LOGIC;

rst:INSTD_L0GIC;

ack_in:INSTD.LOGIC;

da(a_txd:INSTD_LOGIC_VECTOR(7DOWNTO0);

start,stop.writejead:INSTD_LOGIC;

lose:INSTD_LOGIC;

bit_data_rd:INSTDJLOGIC;--从位把握模块读入的一位数据

bit.finish:INSTD_LOGIC;—1位传送完成标志cmd:

OUTSTD_L0GIC_VECT0R(3DOWNTO0);

bit_data_wr:OUTSTD_LOG【C;--待写出的位数据

ack_finish,ack_out:OUTSTD_LOGIC;

data_rxd:OUTSTD_L()GIC_VECT()R(7DOWNTO()));

ENDbyte_txd_rxd:

ARCHITECTUREthreeOFbytc_txd_rxdIS

Typeslate_byteIS(byte_:dle,byte_start,byte_stop,byte_write,byte_read,ack_wr,ack_rd);

SIGNALsta_c:state_byte;

SIGNALack_finish」:STD_LOGIC;-完成I字节数据传输标志

SIGNALen:STD_LOGIC;一使能信号

SIGNALld_en,shift_cn:STD_LOGIC;-加载数据使能、移位数据使能SIGNAL

shift.reg:STD_L0GIC_VECT0R(7DOWNTO0);--数据移位存放器

SIGNALcnt_rw:STD_L0GIC_VECT0R(2DOWNTO0);--移位次数计数器

SIGNALcnt_done:STD_LOGIC;-完成1个字节数据移位完成标志

BEGIN

ack_finish<=ack_finish_r;

en<=(readORwriteORstop)AND(NOTAck_finish_r);--操作使能

PROCESS(clk_sys,rsi)-生成移位存放器内容

BEGIN

IFrst="O''THEN

shift.regv=(OTHERS=>"0");

ELSIFRISING_EDGE(clk_sys)THEN

IFld_en='T'THEN-写数据时

shift_rcgv:data_txd;-待发送数据加载到移位存放器

ELSIFshift_en=,,lwTHEN••读数据时

shift_reg<=shift_reg(6DOWNTO0)&bit_dala_rd;--移位读入数据

ENDIF;

ENDIF;

ENDPROCESS;

PROCESS(clk.sys.rst)--进展读写位计数

BEGIN

IFrst="O''THEN

cnt_rwv="000“;

ELSIFRlSING_EDGE(clk_sys)THEN

IFLd_cn="l”THEN--加载数据时

cnt_rwv="111”;--设置计数初值为8次

ELSIFshift_en=,,lMTHEN一移位I次

cnt_rw<=cnt_rw-11计数

ENDIF;

ENDIF;

ENDPROCESS;

cnt_done<="「'WHENcnt_nv="000"ELSE”。”;--读写完1个字节(计数8次),给出标志

--字节传送状态把握

PROCESS(clk_sys,rst)

BEGIN

IFrst=,,O,'THEN

cmdv="0000“;--I2C总线处于空闲状态命令

bit_data_wr--待写出的位数据

ld_en<="0";--制止加载数据

shin_en<="0";一制止移位

Sia_c<=Byte_idlc;--初始预备状态

sckfinishr<=,,0,';-应答完成标志置

0

sck_outv="0"L应答输出置0

ELSIFRISING_EDGE(clk_sys)THEN

IFLosc="l”THEN-数据传输信号丧失

cmdv='、0000“;

bit_data_wr<-'O',;

ld_cnv="0";

shift_en<=,,0M;

sta_c<=Byte_idle;

ackfinishr<="0";

ack_out<=,'0M;

ELSE-

bit_data_wr<=shift_rcg(7);一取移位存放器的最高位作为待写出位

shift_env="O"L制止移位

,,,,

ld_en<=0;-制止加载

ack_flnish_r<="(r;—应答完成标志置

OCASEsta_cIS

WHENByte_idle=>-空闲状态

IFen="l”THE、--发生读/写/停顿命令且无应答完成标

志ld_env="l";一重加载写入数据初值,复位传送计数

器IFstart=TTHEN

sta_c<=Bytc_start;--起始状态

cmd<="0001”;--启动位模块发送起始位

ELSIFread=TTHEN

sta_cv二Bytejead;--读状态

cmdv="1000”;一启动位模块读取1位数据

ELSIFwrite='T'THEN

sta_c〈=Byte_write;--写状态

cmd<="0100”;一启动位模块写入I位数据

ELSE

sta_c<=Byte_stop;-―停顿状态

cmd<="0010”;一启动位模块发送停顿位

ack_finishj〈="l”;・・产生传送完成标志

ENDIF;

ENDIF;

WHENByte_start=>

IFbit_flnish='T'THEN--起始位发送完成标志

ld_en<=,,r,;-重加载初值

IFreader5THEN

sta_c<=Bytc_rcad;

cmdv="IOOO";

ELSE

sta_c<=Byte_write;

cmd-OO";

ENDIF;

ENDIF;

WHENByte_write=>

IFbit_finish="1"THEN--写完1位标志

IFcnt_done="l"THEN--写完8位标

志sta_c〈=ack_rd;--读应答状态

Cmd<=M1000M;-预备读应答位

ELSE

sta_c<=Byte_write;--保持写状态

cmdv-"0100”;一预备连续写下1位

shift_en<=”l";一移位,预备下1位数

ENDIF;

ENDIF;

WHENByte_read=>

IFbit_finish="l”THEN-读完1位标志

shifl_env=T;--移位,存储读入的1位数据

IFentdonc="l”THEN-读完8位标志

sta_c<=ack_wr;一写应答状态

cmd<="0100”;一预备写应答位

bil_data_“rv=ack_in;-给出待发送的应答信号

ELSE

sta_c<=Byte_read;-保持读状态

Cmd<="I000”;一预备连续读下I位

ENDIF;

ENDIF:

WHENack」d=>--溟应答状态

IFbit_finish=7"THEN-应答位读完成标志

ack_out<=bit_data_rd;--输出应答信号

ack_finish_r<="l";一给出应答完成标志

data_rxd<=shift_rcg;

IFstop='T'THEN

sta_c<=Byte_stop;

cmd<="0010”;一发停顿位

ELSE

sta_c<=Byte_idle;一空闲状态

cmd<="0000”;一等待

ENDIF;

ENDIF;

WHENack_wr=>--写应答状态

IFbiLfinish=T”THEN--应答位写完成标志

bit_data_wr<=,>l";一待写入的位信号为高

ack_finish_r<=Mr,;一给出应答完成标志

IFst

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论