版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 精神障碍患者的护理和支持
- 糖尿病足管理策略培训
- 中老年人营养的重要性
- 生鲜商品管理计划
- 肾内科肾衰竭护理管理
- 新疆维吾尔自治区塔城地区2025-2026学年中考物理模拟预测题(含答案解析)
- 2026年探索绿色视觉设计的未来发展趋势
- 骨关节炎的生活方式干预措施
- 新能源运维管理
- 2026年狂犬病暴露处置与规范接种培训方案
- 春季驾驶员安全教育培训
- 节后复工复产安全教育培训(春节节后)
- 肾癌治疗新进展
- 植树活动感想(9篇)
- 技能人才评价新职业考评员培训在线考试(四川省)
- 学校室内装修合同书(2024版)
- 6.3.2化学电源-2024学年高一化学同步课堂(苏教版2019必修第二册)
- 人教版选择性必修第三册课件Unit2-Habits-for-a-healthy-life-style
- 神话故事后羿射日
- 推动公共卫生工作医院进修心得分享
- DB22-T 3529-2023 北方粳稻高能重离子束辐射诱变育种技术规程
评论
0/150
提交评论