I2C总线接口电路设计.._第1页
I2C总线接口电路设计.._第2页
免费预览已结束,剩余21页可下载查看

下载本文档

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

文档简介

1、FPGA 与 I1 2 3 4C 总线器件接口电路设计利用 FPGA 模拟 I2C 总线协议对|2C 总线接口器件 AT24C256 进行读写操作。利用按键输入读写命 令和相应的地址、数据,对芯片进行读写操作,读写的数据用数码管显示。一、12C 总线接口电路设计分析1. I2C总线协议2 2I C 总线的两根通信线,一根是串行数据线SDA,另一根是串行时钟线 SCL。多个符合 I C 总线标准的器件都可以通过同一条 I2C 总线进行通信,而不需要额外的地址译码器。每个连接到总线上的器件 都有一个唯一的地址作为识别的标志,都可以发送或接收数据。I2C 总线通信速率受主机控制,标准模式下可达 10

2、0kbit/s。一般具有 I2C 总线的器件其 SDA、SCL 引脚都为集电极(或漏极)开路结构。因此实际使用时,SDA 和 SCL 信号线必须加 310K 的上拉电阻。总线空闲时均保持高平。I2C 总线接法如图 1 所示。VCC图 1 I2C 总线连接示意图1I2C 的主机和从机,发送器和接收器产生 I2C 总线时钟信号和起始、停止控制信号的器件,称为主机,被主机寻址的器件称为从机。 任何将数据传送到 I2C 总线的器件称为发送器,任何从I2C 总线接收数据的器件称为接收器。主机和从机都可作为发送数据器件和接收数据器件。2I2C 总线上数据的有效性:时钟线 SCL 为高电平时,数据线 SDA

3、 的任何电平变化将被看作总线的起始或停止信号;在数据传送过程中,当时钟线SCL 为高电平时,数据线 SDA 必须保持稳定状态,不允许有跳变;数据线 SDA 的状态只能在 SCL 低电平期间才能改变。 即进行串行传送数据时, 在 SCL 高电平期间传送 位数据,低电平期间准备数据。3从机地址I2C 总线不需要额外的片选信号或地址译码。多个I2C 总线接口器件可连接到一条 I2C 总线上,它们之间通过地址来区分。主机是主控制器件,只有一个主机的不需要地址。其它器件均为从机,均有器 件地址,但必须保证同一条 I2C 总线上的器件地址不能重复。一般从机地址由7 位地址位和 1 位读写位组成,地址位为高

4、 7 位,读写位为最低位。 读写位为 0 时,表示主机将向从机写入数据;读写位为 1 时,表示主机将要从从机读取数据。4I2C 总线的通信时序2I C 总线的通信时序如图 2 所示。RJDOC二OCTTDOC二C7iACKACK:应答应答RAZU/7UUVAAV八S总线起始暂停条件控制图 2 I2C 总线的通信时序1首先主机发送一个起始信号。当时钟线SCL 处于高电平期间,数据线 SDA 电平从高到低的跳变形成 I2C 总线的起始信号,启动 I2C 总线。2主机逐位发送 7 位(高位在前,低位在后)从机地址和1 位读写控制信号,共 8 位。需 8 个时钟。3与传送地址一致的从机发应答信号( A

5、CK )。在第 9 个时钟周期时将 SDA 线拉低表示其已收到 一个 8位数据。若在第 9 个时钟周期,SDA 为高电平时为非应答。4开始传送数据,传送数据数量不限。每个字节(8 位)后紧跟 1 个接收器件发出的应答位。若是主机读取从机数据时,从机发送数据,主机发应答位;若是主机写数据到从机时,主机发送数据,从机发应答位。5数据传输结束时,主机发送 1 个停止信号,当时钟线 SCL 为高电平时,数据线 SDA 由低电平变为高电平时形成终止信号,停止I2C 总线通信。(5)数据传输基本格式如表 1。表 1 I2C 总线数据传输基本格式SA7A1R/WACKD7D0ACKD7D0ASKP起始位7

6、位地址0 :写1 :读应答位8 位数据应答位8 位数据应答位0:应答1 :非应答停止位其中 S、A7A1、R/W、P 总是由主机产生;写数据时, ACK 由从机产生,D7D0 由主机产生;读数据时,ACK 由主机产生,D7D0 由从机产生。2. I2C 总线器件 AT24C2562 2AT24C256 是一个 256K 位的串行 CMOS 型 EPROM, 可存储 32768 个字节。该器件通过 IC 总线接口进行操作,其引脚如图3 所示,各引脚功能见表2。表 2 AT24C256 引脚功能说明SDASCLP停止条件图 3 AT24C256 引脚图管脚名称功能说明SCLAT24C256 串行时

7、钟输入管脚。用于产生器件所有数据发送或接收的时钟,是输入管脚。SDA双向串行数据/地址管脚。用于器件所有数据的发送或接收,SDA 是一个开漏输岀管脚可与其它开漏输岀或集电极开路输岀进行线或wire-OR。WP写保护。当 WP 脚连接到 Vcc,所有内存变成写保护只能读;当 WP 引脚连接到 Vss 或 悬空,允许器件进行读/写操作。A0 A1器件地址输入。这些管脚为硬连线或者不连接,对于单总线系统最多可寻址4 个AT24C256 器件。当这些引脚没有连接时其默认值为0。VSS电源地VCC1.86VNC空脚作为带有 I2C 总线接口的器件,每个 AT24C256 都有一个 7 位的从机地址,其高

8、 5 位固定为“10100”,接下来的 2 位由 AT24C256 的引脚 A1 A0 硬连线输入决定(A1、A0 直接接电源 VCC 或 GND),同一 I2C 总线上最多可以连接 4 个 AT24C256 器件。AT24C256 除了有作为从机的地址,其内部还有作为存 储单元的编码子地址,其子地址为双字节(16 位),从 0000H7FFFH。本设计中只有 1 个 AT24C256,可将 AT24C256 的引脚 A1、A0 直接接地,其硬件电路如图 4 所示。则该 AT24C256 作为从机的 7 位地 址为“ 1010000”。HHi-104图 4 单个 AT24C256 连接电路图3

9、.对 AT24C256 的读写过程(1)向 AT24C256 某一存储单元写入 1 个字节数据,过程如下:1主机(这里为 FPGA 控制器)发送一个起始信号,启动发送过程;2主机发送 7 位从机地址(这里为 1010000)和 1 位写控制位(为 0);3从机(这里为 AT24C256 )发应答位。在主机发送起始信号和从机地址字节后,AT24C256 监视总线并当其地址与发送的从地址相符时,响应一个应答信号。在第9 个时钟,将 SDA 线拉为低电平;4主机接收到应答位后,发从机子地址高8 位(为 AT24C256 某一存储单元地址)。5从机接收完高 8 位子地址后,发应答位;6主机接收到应答位

10、后,发从机子地址低8 位;7从机接收完低 8 位子地址后,发应答位;8主机接收到应答位后,发送待8 位写入数据;9从机接收完 8 数据后,发应答位,并开始内部数据的擦写;10主机接收到应答位后,发停止位,结束传送,总线挂起。SDA 上数据传输格式见表 3,数据传送时序如图 5 所示。表 3 向 AT24C256 写 1 个数据时总线 SDA 上数据传输格式SA7A100AD15AD80AD7AD00D7D00/1PlOQfSPAscTU3起7 位写应高 8 位应低 8 位应写入应停始器件答指针答指针答8 位答止位地址位地址位地址位数据位位主机发送从主机发送从主机发送从主机发送从机主机机机发送机

11、发发发发送送送送图 5 向 AT24C256 写一个数据时序(2)从 AT24C256 某一存储单元读出 1 个字节数据,过程如下:1主机发送一个起始信号,启动发送过程,接着发送 7 位从机地址(1010000 )和 1 位写控制位(0);2从机检测到起始信号及本身从地址相符时的从机地址后,发应答位。3主机接收到应答位后,发从机子地址高8 位(为 AT24C256 某一存储单元地址)。4从机接收完高 8 位子地址后,发应答位;5主机接收到应答位后,发从机子地址低8 位;6从机接收完低 8 位子地址后,发应答位;7主机接收到应答位后,再发送一个起始信号(称为重复起始信号),接着再发送 7 位从机

12、地址(1010000)和 1 位读控制位(为 1);8从机检测到重复起始信号及从机地址后,发应答位,并将子地址对应的存储单元数据发送到总 线上。9主机接收到应答位后,接着准备从总线接收数据,从总线接收完8 数据后。发非应答位和发停止位,结束传送,总线挂起。SDA 上数据传输格式见表 4 所示,数据传送时序如图6 所示。表 4 从 AT24C256 上读 1 个数据时总线 SDA 上数据传输格式SA7A100AD151AD80AD7AD00SrA7A110D7D00/1P起始位7 位器件地址写应答位高 8 位指针地址应答位低 8 位指针地址应答位重复起始位7 位器件地址读应答位读岀8 位数据非应

13、答停止位主机发送从 机发 送主 机 发送从机发送主 机 发送从 机发 送主机发送从 机发 送从 机 发送主 机发 送主 机发 送STOPOd一-NoACKBUS ACTlVrTT * $LWEBYTE ADDRESSASUWEMASTER R ADDRESS岛席 Afl片讯R ADORESS沁Fn rr rti ; ;: ;i丽rr m FAAAACCCC图 6 从 AT24C256 读一个数据时序4. FPGA 内部电路模拟 I2C 总线对 AT24C256 的读写控制电路基本结构框图如图7 所示。图 7 模拟 I2C 总线对 AT24C256 的读写控制框图(1)I2C总线端口I2C总线端

14、口为三态输出,当使能端有效时,总线输出为低电平;当使能端无效时三态门输出为高 阻,但由于I2C 总线上有上拉电阻,总线保持在高电平或由总线上从机输出数据决定。总线数据始终能 被读入。其结构示意图如图 8 所示。(2)位传输控制模块位传输模块以“位”为单位产生各种I2C 协议命令(开始、停止和重复开始)以及进行位数据读写。为了读写到稳定的“位”数据,读写1 位数据分为 4 到 5 个阶段完成。1 位数据传输时序要求如图 9 所示。这样内部读写时钟频率一般采用5 倍于 SCL 时钟总线频率。SclSda图 9 I2C 协议命令和位数据传输的执行时序位传输控制电路根据输入的控制命令,将来自字控制模块

15、的一位待写入的数据送到总线上,或从总 线上读入一位数据给字控制模块。当完成1 位数据传输时产生读写完成标志,并根据数据传输情况产生忙标志和总线仲裁丢失标志。(3) 字传输控制模块字节传输模块以字节为单位控制I2C 总线的数据传输。该模块根据输入控制命令,将存放在发送寄存器中的数据加载到一个移位寄存器,然后逐位发送到位传输模块,再控制位传输模块将数据发送到I2C总线上。或控制位传输模块从总线上逐位接收位数据,暂存到移位寄存器,再转换成字节数据送给数据 输出。同时给出相关传输标志。(4) AT24C256 读写控制根据输入控制信号和来自位传输模块的反馈标志,将控制信号加到命令寄存器,给字节传输模块

16、提 供控制信号;将输入数据或指定单元地址加载到数据传送寄存器;将从字节模块读取的数据回送到数据 接收寄存器。二、FPGA硬件系统电路设计(略)三、I2C 总线接口电路VHDL设计1. I2C 总线端口(1) 名称:IIC_IO.vhd(2) 功能:I2C 总线双向端口电路描述(3) 端口说明.方向端口名宽度说明输入Sda en1数据线三态使能控制端,来自位传输控制模块开始重复开始停止Scl en1时钟线三态使能控制端,来自位传输控制模块输出Sda_i1回送的数据线信号,给位传输控制模块Scl_i1回送的时钟线信号,给位传输控制模块双向Sda1I2C 的数据线,外接 I2c 器件Scl1I2C

17、的时钟线,外接 I2c 器件(4) VHDL 描述LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY IIC_IO ISPORT(Scl_e n, sda_e n: IN STD_LOGIC;Sda,Scl: INOUT STD_LOGIC;Scl_i,sda_i : OUT STD_LOGIC);END IIC_IO;ARCHITECTURE one OF IIC_IO ISBEGINSda_i=sda;Scl_i=scl;Scl=0 WHENscl_e n=O ELSE Z;Sda=0 WHEN sda_e n=O ELSE Z; END one

18、;2.位传输控制模块5(1)名称:bit_txd_rxd.vhd(2)功能:实现位数据或协议命令的传输 端口说明方向端口名宽度说明输入Rst1复位信号,低电平复位clk_sys1系统时钟ena1系统使能信号,高电平有效cmd4控制命令,由字节传输模块给岀Bit_data_wr1待写入总线的 1 位数据Scl_i1总线时钟输入Sda_i1总线数据输入输出Scl_oen1总线时钟输岀使能Sda oen1总线数据输岀使能Bit_finish1完成 1 位读写的标志,1 为完成,0 为未完成busy1总线忙标志,1 为忙,0 为闲lose1总线仲裁丢失标志,1 为岀错,0 为正确Bit data rd

19、1从总线读岀的 1 位数据5 VHDL 描述LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_Arith.ALL;USE IEEE.STD_LOGIC_ Un sig ned.ALL;ENTITY bit_txd_rxd ISGENERIC (n:INTEGER:=48);- 分频系数PORT(Clk_sys:IN STD_LOGIC;Rst,ena:IN STD_LOGIC;cmd: IN STD_LOGIC_VECTOR(3 DOWNTO 0);Bit_data_wr:IN STD_LOGIC;-Scl_i,sda_i

20、: IN STD_LOGIC;Scl_oen,sda_oen: OUT STD_LOGIC;Busy,Lose: OUT STD_LOGIC;Bit_data_rd,Bit_finish: OUT STD_LOGIC);END bit_txd_rxd;ARCHITECTURE two OF bit_txd_rxd ISType state_t IS (bit_idle,start_a,start_b,start_c,start_d,start_e,stop_a,stop_b,stop_c,stop_dwrite_b, write_c, write_d,read_a, read_b, read_

21、c, read_d);SIGNAL sta_p: state_t;CONSTANT n:INTEGER:=48; - 产生 500KHz 的分频系数SIGNAL en_500k:STD_LOGIC;-500KHz 时钟使能信号SIGNAL Scl_a,Sda_a, Scl_b,Sda_b:STD_LOGIC;- 同步 SCL 和 SDA 中间信号SIGNAL scl_edg: STD_LOGIC;-SCL 的边沿信号SIGNAL scl_oen_r, sda_oen_r: STD_LOGIC;- 总线使能信号SIGNAL sda_chk: STD_LOGIC;- 写数据时,检查总线信号SIGN

22、AL dscl_oen,slave_wait: STD_LOGIC;- 时钟延迟等待的信号SIGNAL Sda_S,Sda_P: STD_LOGIC;- 启动、停止标志位SIGNAL Busy_r,Lose_r: STD_LOGIC;- 忙标志、丢失标志信号SIGNAL stop_cmd,stop_cmd_r: STD_LOGIC;- 停止命令信号BEGINPROCESS (clk_sys,rst) - 同步 SCL 和 SDA 的输入信号BEGINIF rst=0 THENScl_a=1;Sda_a=1;Scl_b=1;Sda_b=1;ELSIF RISING_EDGE(clk_sys) T

23、HEN - 暂存 SCL、 SDA 的值Scl_a= Scl_i;Sda_a= Sda_i;Scl_b= Scl_a;Sda_b= Sda_a;END IF;END PROCESS;Scl_edg=scl_a AND( NOT Scl_b);- 检测时钟 SCL 上升沿PROCESS (clk_sys)-产生数据输出信号,在SCL 上升沿时锁存 SDA 上的数据值BEGINIF RISING_EDGE(clk_sys) THENwrite_a,IF scl_edg=1 THENBit_data_rd=Sda_a;END IF;END IF;END PROCESS;-从节点未准备好时,下拉 SC

24、L 延迟周期;当给出的 SCL 使能为 1 时,检测 SCL 总线为 0 时,则 节点未准备就绪,产生等待信号。PROCESS (clk_sys)BEGINIF RISING_EDGE(clk_sys) THEN dscl_oen=scl_oen_r;END IF;END PROCESS;Slave_wait=dscl_oen AND (NOT scl_a);PROCESS (clk_sys,rst) - 将 24M 系统时钟分频产生 500KHz 时钟使能控制信号VARIABLE cnt: INTEGER RANGE 0 TO n-1;- 时钟分频计数器BEGINIF rst=0 THENc

25、nt: =0; en_500k=1;ELSIF RISING_EDGE(clk_sys) THENIF clk_cntn-1 THEN -n 为分频系数IF ena=1 THEN cnt:= cnt+1; en_500k=0;END IF;ELSEIF Slave_wait=0 THEN- 从节点准备好,给出时钟使能 cnt:=0; en_500k=1;ELSE-从节点未准备好,延迟等待cnt:= cnt; en_500k=0;END IF;END IF;END IF;END PROCESS;-生成启动标志和停止标志-在 SCL 高电平时 ,检测 SDA 的下降沿(起始信号) ,产生启动标志-

26、在 SCL 高电平时 ,检测 SDA 的上升沿(停止信号) ,产生停止标志PROCESS (clk_sys,rst)BEGINIF rst=0 THENSda_S=0;- 启动标志复位Sda_P=0;- 停止标志复位ELSIF RISING_EDGE(clk_sys) THENSda_S=(NOT Sda_a ) AND Sda_b AND Scl_a ;- 生成启动标志 Sda_P=Sda_a AND ( NOT Sda_b )AND Scl_a; - 生成停止标志 END IF;END PROCESS;-生成总线忙标志-检测到启动信号发生,但无停止信号发生时表示总线处于忙状态PROCESS

27、 (clk_sys,rst)BEGINIF rst=0 THEN Busy_r=0;ELSIF RISING_EDGE(clk_sys) THEN Busy_r=(Sda_S OR busy_r) AND (NOT Sda_P);END IF;END PROCESS;Busy=busy_r;- 忙标志输出-产生仲裁丢失标志,-当没有停止请求时,检测到停止信号,产生仲裁丢失标志-当驱动 SDA 总线为高时,但检测 SDA 一直为低,产生仲裁丢失标志PROCESS (clk_sys,rst)BEGINIF rst=0 THEN stop_cmd=0;- 停止命令信号 stop_cmd_r =0;L

28、ose_r=0;ELSIF RISING_EDGE(clk_sys) THENIF cmd= 0010 THEN -有停止命令 stop_Cmd=1;ELSE stop_Cmd=0;END IF; stop_Cmd_r = stop_Cmd;Lose_r=(Sda_P AND (NOT stop_Cmd_r ) OR(NOT sda_a AND sda_chk sda_oen_r);-丢失标志END IF;END PROCESS;Lose=Lose_r;-位传输状态机Scl_oen=scl_oen_r; Sda_oen=Sda_oen_r;PROCESS(clk_sys,rst)BEGINIF

29、 rst=0 THEN Sta_p=bit_idle;- 初始准备状态 bit_finish=0; -1 位信号发送或接收完成标志Scl_oen_r=1;- 时钟输出使能Sda_oen_r =1;- 数据输出使能 Sda_chk=0;- 不检查输出 ELSIF RISING_EDGE(clk_sys) THENIF Lose_r=1 THEN- 数据传输信号丢失 Sta_p=bit_idle;bit_finish =0; Scl_oen_r =1; Sda_oen_r =1;Sda_chk=0;ELSE bit_finish - 准备状态Scl_oen_r =scl_oen_r;- 保持 SC

30、L 在同一状态 Sda_oen_r =sda_oen_r; -保持 SDA 在同一状态 Sda_chk sta_p sta_p sta_pANDsta_p sta_p sta_p=start_b; Scl_oen_r =scl_oen_r; - 保持 SCL Sda_oen_r =1; -SDA处于高 Sda_chk sta_p=start_c; Scl_oen_r =1; Sda_oen_r =1; Sda_chk sta_p=start_d; Scl_oen_r =1; Sda_oen_r =0; Sda_chk sta_p=start_e; Scl_oen_r =1; Sda_oen_r

31、 =0; Sda_chk-开始状态 5sta_p=bit_idle;- 回到等待状态 bit_finish =1;- 起始信号传送完成,给出标志 Scl_oen_r=0;Sda_oen_r =0;Sda_chk sta_p=stop_b; Scl_oen_r =0; Sda_oen_r =0;Sda_chk sta_p=stop_c; Scl_oen_r =1; Sda_oen_r =0;Sda_chk sta_p=stop_d; Scl_oen_r =1; Sda_oen_r =0; Sda_chksta_p=bit_idle;bit_finish =1;- 停止信号传送完成,给出标志 Sc

32、l_oen_r =1;Sda_oen_r =1;Sda_chk sta_p= read_b;Scl_oen_r =0; - SCL 处于低Sda_oen_r =1; -SDA 由从器件决定 Sda_chk sta_p= read_c; Scl_oen_r =1; Sda_oen_r =1; Sda_chk sta_p= read_d; Scl_oen_r =1; Sda_oen_r =1;Sda_chksta_p=bit_idle;bit_finish =1;-读完 1 位数据,给出标志 Scl_oen_r =0;Sda_oen_r =1;Sda_chk sta_p= write_b;Scl_

33、oen_r =0; - SCL 处于低Sda_oen=bit_data_wr;-输入数据 Sda_chk sta_p= write_c;Scl_oen_r =1;-Sda_oe n_r =bit_data_wr;Sda_chk -写状态 3 sta_p= write_d;Scl_oen_r =1;-Sda_oe n_r = bit_data_wr;Sda_chk -写状态 4 sta_p=bit_idle;bit_finish =1;-写完 1 位信号,给出标志Scl_oen_r =0;Sda_oe n_r = bit_data_wr;Sda_chk null;END CASE;END IF;

34、END IF;END IF;END PROCESS;END two;3.字传输控制模块(1) 名称:byte_txd_rxd.vhd(2) 功能:实现字节数据的传输控制。端口说明Ack_in1应答输入信号Data_txd8待发送的 8 位输入数据或地址,由发送寄存器提供Bit_data_rd1从位模块接收的 1 位数据方向端口名宽度说明输入Rst1复位信号,外接按钮开关,低电平复位clk_sys1系统时钟start1启动命令stop1停止命令read1读命令write1写命令Lose1总线仲裁丢失标志Bit_finish1来自位模块的 1 位传送完成标志输出cmd4输岀命令Bit_data_w

35、r1向位模块发送的数据Data_rxd8接收到的 8 位数据,送给接收寄存器,Ack_finish1应答完成标志Ack_out1从总线上读岀的应答信号(4) VHDL 描述LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_Arith.ALL;USE IEEE.STD_LOGIC_ Un sig ned.ALL;ENTITY byte_txd_rxd ISPORT(clk_sys:IN STD_LOGIC;rst:IN STD_LOGIC;ack_i n:IN STD_LOGIC;data_txd:IN STD_LOGIC_V

36、ECTOR(7 DOWNTO 0);start,stop,write,read:IN STD_LOGIC;lose:IN STD_LOGIC;bit_data_rd:IN STD_LOGIC;-从位控制模块读入的一位数据bit_fi nish:IN STD_LOGIC;-1 位传送完成标志cmd:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);bit_data_wr:OUT STD_LOGIC;-待写出的位数据ack_fi nish,ack_out:OUT STD_LOGIC;data_rxd:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);END byte

37、_txd_rxd;ARCHITECTURE three OF byte_txd_rxd ISType state_byte IS (byte_idle,byte_start,byte_stop, byte_write,byte_read,ack_wr,ack_rd);SIGNAL sta_c: state_byte;SIGNAL ack_fi nish_r:STD_LOGIC;-完成 1 字节数据传输标志SIGNAL en:STD_LOGIC;-使能信号SIGNAL ld_e n, shift_e n:STD_LOGIC;- 加载数据使能、移位数据使能SIGNAL shift_reg:STD_

38、LOGIC_VECTOR(7 DOWNTO 0);- 数据移位寄存器SIGNAL cnt_rw: STD_LOGIC_VECTOR(2 DOWNTO 0);-移位次数计数器SIGNAL cnt_do ne: STD_LOGIC;-完成 1 个字节数据移位完成标志BEGINack_fi nish=ack_fi nish_r;en =(read OR write OR stop) AND (NOT Ack_fi nish_r);- 操作使能PROCESS (clk_sys,rst)-生成移位寄存器内容BEGINIF rst=0 THEN shift_reg0);ELSIF RISING_EDGE(

39、clk_sys) THENIF ld_en=1 THEN - 写数据时 shift_reg=data_txd;- 待发送数据加载到移位寄存器ELSIF shift_en=1 THEN- 读数据时 shift_reg=shift_reg(6 DOWNTO 0)& bit_data_rd;- 移位读入数据END IF;END IF;END PROCESS;PROCESS (clk_sys,rst) - 进行读写位计数BEGINIF rst=0 THENcnt_rw=000;ELSIF RISING_EDGE(clk_sys) THENIF Ld_en=1 THEN - 加载新数据时 cnt

40、_rw=111;- 设置计数初值为 8 次ELSIF shift_en=1 THEN -移位 1 次 cnt_rw=cnt_rw-1;- 减 1 计数END IF;END IF;END PROCESS;cnt_done=1 WHEN cnt_rw=000 ELSE 0;- 读写完 1 个字节(计数 8 次),给出标志 -字节传送状态控制PROCESS (clk_sys,rst)BEGINIF rst=0 THEN cmd=0000;-I2C 总线处于空闲状态命令 bit_data_wr =0; - 待写出的位数据ld_en=0;- 禁止加载数据 shift_en=0;- 禁止移位Sta_c=B

41、yte_idle;- 初始准备状态 sck_finish_r=0;- 应答完成标志置 0 sck_out=0;- 应答输出置 0ELSIF RISING_EDGE(clk_sys) THENIF Lose=1 THEN- 数据传输信号丢失 cmd=0000;bit_data_wr =0; ld_en=0;shift_en=0; sta_c=Byte_idle;ack_finish_r=0; ack_out=0;ELSE - bit_data_wr=shift_reg(7); -取移位寄存器的最高位作为待写出位 shift_en=0;- 禁止移位ld_en=0;- 禁止加载 ack_finish

42、_r- 空闲状态IF en=1 THEN- 发生读 /写/停止命令且无应答完成标志 ld_en=1; - 重新加载写入数据初值,复位传送计数器IF start=1 THEN sta_c=Byte_start;- 起始状态 cmd= 0001;- 启动位模块发送起始位ELSIF read=1 THEN sta_c=Byte_read;- 读状态 cmd= 1000; - 启动位模块读取 1 位数据ELSIF write=1 THEN sta_c=Byte_write;- 写状态 cmd=0100 ; - 启动位模块写入 1 位数据ELSE sta_c=Byte_stop;- - 停 止 状 态c

43、md= 0010; - 启 动 位 模 块 发 送 停 止 位ack_finish_rIF bit_finish=1 THEN - 起始位发送完成标志 ld_en=1; - 重新加载初值 IF read=1 THENsta_c=Byte_read; cmd=1000;ELSE sta_c=Byte_write; cmdIF bit_finish =1 THEN - 写完 1 位标志IF cnt_done=1 THEN- 写完 8 位标志 sta_c=ack_rd; - 读应答状态 Cmd=1000;- 准备读应答位ELSE sta_c=Byte_write;- 保持写状态 cmd= 0100;

44、- 准备继续写下 1 位 shift_enIF bit_finish =1 THEN - 读完 1 位标志 shift_en=1; - 移位,存储新读入的 1 位数据 IFcnt_done=1 THEN- 读完 8 位标志 sta_c=ack_wr; - 写应答状态 cmd= 0100;- 准备写应答位 bit_data_wr=ack_in;- 给出待发送的应答信号 ELSE sta_c=Byte_read;- 保持读状态 Cmd- 读应答状态IF bit_finish =1 THEN -应答位读完成标志 ack_out=bit_data_rd;- 输出应答信号 ack_finish_r=1;

45、- 给出应答完成标志 data_rxd=shift_reg;IF stop=1 THENsta_c=Byte_stop;cmd= 0010;- 发停止位ELSEsta_c=Byte_idle; - 空闲状态 cmd- 写应答状态IF bit_finish =1 THEN -应答位写完成标志 bit_data_wr=1;- 待写入的位信号为高ack_finish_r=1; - 给出应答完成标志 IF stop=1 THEN sta_c=Byte_stop;cmd= 0010;- 发停止位ELSEsta_c=Byte_idle; - 空闲状态 cmd=0000;- 等待END IF;ELSEbit

46、_data_wr- 停止状态IF bit_finish=1 THEN -停止位发送完成标志 sta_c=Byte_idle;Cmd=0000;- 等待END IF;END CASE;END IF;END IF;END PROCESS;END three;4. AT24C256 读写控制(1) 名称:AT24C256_wr.vhd(2) 功能:通过|2C 总线对 AT24C256 指定单元进行读写。(3) 端口说明6方向端口名宽度说明输入Rst1复位信号,外接按钮开关,低电平复位clk_sys1系统时钟ena1接口使能信号clk_ena1时钟使能信号rw1读写控制Ack_flag1应答值Ack_

47、finish1完成一个字节传输标志Slave_addr7从机地址,送给传输寄存器Sub_addr16从机子地址,送给传输寄存器Data_rd8从从机读入的数据,送给接收寄存器Data_in8输入数据,送给传输寄存器输出Data_wr8待写岀值,来自传输寄存器Data_out8输岀数据,来自接收寄存器Rtx f1传输完成标志start1启动命令,来自命令寄存器stop1停止命令,来自命令寄存器read1读命令,来自命令寄存器write1写命令,来自命令寄存器END AT24C256_rw; ARCHITECTURE four OF AT24C256_rw IS6VHDL 描述LIBRARY IE

48、EE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_Arith.ALL;USE IEEE.STD_LOGIC_ Un sig ned.ALL;ENTITY AT24C256_rw ISPORT(clk_sys:IN STD_LOGIC;-24MHz 系统时钟rst,ena, clk_ena:IN STD_LOGIC;-复位,使能信号rw:IN STD_LOGIC;slave_addr: STD_LOGIC_VECTOR(6 DOWNTO 0); sub_addr:STD_L0GIC_VECT0R(15 DOWNTO 0);data_i n: IN

49、 STD_LOGIC_VECTOR(7 DOWNTO 0);ack_fi ni sh,ack_flag: IN STD_LOGIC;data_rxd: IN STD_LOGIC_VECTOR(7 DOWNTO 0); data_wr: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);start,stop,write,read:OUT STD_LOGIC;data_out: OUT STD_LOGIC_VECTOR(7 DOWNTO 0); rtx_f: OUT STD_LOGIC);Type state_at IS (S0,S1,S2,S3,S4,S5,S6);SIGNAL sta_n: state_at;SIGNAL cmd_reg: STD_LOGIC_VECTOR(3 DOWNTO 0);-命令寄存器SIGNAL

温馨提示

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

评论

0/150

提交评论