




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、FPGA与 II2C的主机和从机,发送器和接收器产生I2C总线时钟信号和起始、停止控制信号的器件,称为主机,被主机寻址的器件称为从机。 任何将数据传送到12C总线的器件称为发送器,任何从I2C总线接收数据的器件称为接收器。主机和从机都可作为发送数据器件和接收数据器件。 I2C总线上数据的有效性:时钟线SCL为高电平时,数据线 SDA的任何电平变化将被看作总线的起始或停止信号;在数据传送过程中,当时钟线SCL为高电平时,数据线 SDA必须保持稳定状态,不允许有跳变;数据线SDA的状态只能在SCL低电平期间才能改变。 即进行串行传送数据时, 在SCL高电平期间传送 位数据,低电平期间准备数据。 从
2、机地址I2C总线不需要额外的片选信号或地址译码。多个I2C总线接口器件可连接到一条I2C总线上,它们之间通过地址来区分。主机是主控制器件,只有一个主机的不需要地址。其它器件均为从机,均有器 件地址,但必须保证同一条I2C总线上的器件地址不能重复。一般从机地址由7位地址位和1位读写位组成,地址位为高7位,读写位为最低位。 读写位为0时,表示主机将向从机写入数据;读写位为1时,表示主机将要从从机读取数据。 I2C总线的通信时序C总线器件接口电路设计利用FPGA模拟I2C总线协议对|2C总线接口器件AT24C256进行读写操作。利用按键输入读写命 令和相应的地址、数据,对芯片进行读写操作,读写的数据
3、用数码管显示。、丨2C总线接口电路设计分析1. I 2c总线协议2 2I C总线的两根通信线,一根是串行数据线SDA,另一根是串行时钟线 SCL。多个符合I C总线标准的器件都可以通过同一条I2C总线进行通信,而不需要额外的地址译码器。每个连接到总线上的器件都有一个唯一的地址作为识别的标志,都可以发送或接收数据。I2C总线通信速率受主机控制,标准模式下可达100kbit/s。一般具有I2C总线的器件其SDA、SCL引脚都为集电极(或漏极)开路结构。因此实际使用时,SDA 和SCL信号线必须加310K的上拉电阻。总线空闲时均保持高平。I2C总线接法如图1所示。VCC图1 I2C总线连接示意图2I
4、 C总线的通信时序如图 2所示。S起始条件ACK应答应答7 I I 2'-总线暂停控制U.iP停止条件图2 I2C 总线的通信时序 首先主机发送一个起始信号。当时钟线SCL处于高电平期间,数据线 SDA电平从高到低的跳变形成i2c总线的起始信号,启动i2c总线。 主机逐位发送7位(高位在前,低位在后)从机地址和1位读写控制信号,共 8位。需8个时钟。 与传送地址一致的从机发应答信号(ACK )。在第9个时钟周期时将 SDA线拉低表示其已收到一个8位数据。若在第9个时钟周期,SDA为高电平时为非应答。 开始传送数据,传送数据数量不限。每个字节(8位)后紧跟1个接收器件发出的应答位。若是主
5、机读取从机数据时,从机发送数据,主机发应答位;若是主机写数据到从机时,主机发送数据,从机发应答位。 数据传输结束时,主机发送 1个停止信号,当时钟线 SCL为高电平时,数据线 SDA由低电平变为高电平时形成终止信号,停止I2C总线通信。(5)数据传输基本格式如表 1。SA7A1R/WACKD7D0ACKD7D0ASKP起始位7位地址0 :写1 :读应答位8位数据应答位8位数据应答位0:应答1 :非应答停止位表1 I2C总线数据传输基本格式其中S、A7A1、R/W、P总是由主机产生;写数据时, ACK由从机产生,D7D0由主机产生;读 数据时,ACK由主机产生,D7D0由从机产生。2. I2C
6、总线器件 AT24C2562 2AT24C256是一个256K位的串行 CMOS型 EPROM, 可存储32768个字节。该器件通过I C总线接口进行操作,其引脚如图3所示,各引脚功能见表2。图3 AT24C256引脚图表2 AT24C256引脚功能说明功能说明管脚名称SCLAT24C256串行时钟输入管脚。用于产生器件所有数据发送或接收的时钟,是输入管脚。SDA双向串行数据/地址管脚。用于器件所有数据的发送或接收,SDA是一个开漏输岀管脚可与其它开漏输岀或集电极开路输岀进行线或wire-OR。WP写保护。当WP脚连接到Vcc ,所有内存变成写保护只能读; 当WP引脚连接到Vss或 悬空,允许
7、器件进行读/写操作。A0 A1器件地址输入。这些管脚为硬连线或者不连接,对于单总线系统最多可寻址4个AT24C256器件。当这些引脚没有连接时其默认值为0。VSS电源地VCC1.86VNC空脚作为带有I2C总线接口的器件,每个AT24C256都有一个7位的从机地址,其高5位固定为“10100”, 接下来的2位由AT24C256的引脚A1 A0硬连线输入决定(A1、A0直接接电源 VCC或GND),同一 I2C总线上最多可以连接 4个AT24C256器件。AT24C256除了有作为从机的地址,其内部还有作为存 储单元的编码子地址,其子地址为双字节(16位),从0000H7FFFH。本设计中只有
8、1个AT24C256,可将AT24C256的引脚A1、A0直接接地,其硬件电路如图 4所示。则该AT24C256作为从机的7位地 址为“ 1010000”。VCC13-rHT 卜WDA0A1A2SDAWPSCLvssAT24CJ55图4单个AT24C256连接电路图3. 对AT24C256的读写过程(1)向AT24C256某一存储单元写入 1个字节数据,过程如下: 主机(这里为FPGA控制器)发送一个起始信号,启动发送过程; 主机发送7位从机地址(这里为 1010000)和1位写控制位(为 0); 从机(这里为 AT24C256 )发应答位。在主机发送起始信号和从机地址字节后,AT24C256
9、监视总线并当其地址与发送的从地址相符时,响应一个应答信号。在第9个时钟,将SDA线拉为低电平; 主机接收到应答位后,发从机子地址高8位(为AT24C256某一存储单元地址)。 从机接收完高8位子地址后,发应答位; 主机接收到应答位后,发从机子地址低8位; 从机接收完低8位子地址后,发应答位; 主机接收到应答位后,发送待8位写入数据; 从机接收完8数据后,发应答位,并开始内部数据的擦写; 主机接收到应答位后,发停止位,结束传送,总线挂起。SDA上数据传输格式见表 3,数据传送时序如图 5所示。表3向AT24C256写 1个数据时总线SDA上数据传输格式SA7A100AD15AD80AD7AD00
10、D7D00/1P模拟I2C总线对AT24C256的读写控制电路基本结构框图如图7所示。起7位写应高8位应低8位应写入应停始器件答指针答指针答8位答止位地址位地址位地址位数据位位主机发送从主机发送从主机发送从主机发送从机主机机机发送机发发发发送送送送图5向AT24C256写一个数据时序(2)从AT24C256某一存储单元读出1个字节数据,过程如下: 主机发送一个起始信号,启动发送过程,接着发送7位从机地址(1010000 )和1位写控制位(0); 从机检测到起始信号及本身从地址相符时的从机地址后,发应答位。 主机接收到应答位后,发从机子地址高8位(为AT24C256某一存储单元地址)。 从机接收
11、完高8位子地址后,发应答位; 主机接收到应答位后,发从机子地址低8位; 从机接收完低8位子地址后,发应答位; 主机接收到应答位后,再发送一个起始信号(称为重复起始信号),接着再发送 7位从机地址(1010000)和1位读控制位(为 1); 从机检测到重复起始信号及从机地址后,发应答位,并将子地址对应的存储单元数据发送到总 线上。 主机接收到应答位后,接着准备从总线接收数据,从总线接收完8数据后。发非应答位和发停止位,结束传送,总线挂起。SDA上数据传输格式见表 4所示,数据传送时序如图 6所示。SA7A100AD15AD80AD71AD00SrA7A110D7D00/1P起始位7位器件地址写应
12、答位高8位指针地址应答位低8位 指针 地址应答位重复起始位7位器件地址读应答位读岀8位数据非应答停止位主机发送从 机 发 送主 机 发 送从 机 发 送主 机 发 送从 机 发 送主机发送从 机 发 送从 机 发 送主 机 发 送主 机 发 送BYTE ACWE55 *1 s-sArA)表4从AT24C256上读1个数据时总线SDA上数据传输格式BUS ACT-VI < MASTERADDRESSSTOP模拟I2C总线对AT24C256的读写控制电路基本结构框图如图7所示。fti it 口rm: i 朗 nm i: ::丨冋A*SIGO图6从AT24C256读一个数据时序4. FPGA内
13、部电路图7模拟I2C总线对AT24C256的读写控制框图2(1) I C总线端口i2c总线端口为三态输出,当使能端有效时,总线输出为低电平;当使能端无效时三态门输出为高 阻,但由于I2C总线上有上拉电阻,总线保持在高电平或由总线上从机输出数据决定。总线数据始终能 被读入。其结构示意图如图 8所示。SclSda(2) 位传输控制模块位传输模块以“位”为单位产生各种I2C协议命令(开始、停止和重复开始)以及进行位数据读写。为了读写到稳定的“位”数据,读写1位数据分为4到5个阶段完成。1位数据传输时序要求如图 9所示。这样内部读写时钟频率一般采用5倍于SCL时钟总线频率。开始重复开始停止图9 I2C
14、协议命令和位数据传输的执行时序位传输控制电路根据输入的控制命令,将来自字控制模块的一位待写入的数据送到总线上,或从总 线上读入一位数据给字控制模块。当完成1位数据传输时产生读写完成标志,并根据数据传输情况产生忙标志和总线仲裁丢失标志。(3) 字传输控制模块字节传输模块以字节为单位控制I2C总线的数据传输。该模块根据输入控制命令,将存放在发送寄存器中的数据加载到一个移位寄存器,然后逐位发送到位传输模块, 再控制位传输模块将数据发送到I 2c总线上。或控制位传输模块从总线上逐位接收位数据,暂存到移位寄存器,再转换成字节数据送给数据 输出。同时给出相关传输标志。(4) AT24C256读写控制根据输
15、入控制信号和来自位传输模块的反馈标志,将控制信号加到命令寄存器,给字节传输模块提 供控制信号;将输入数据或指定单元地址加载到数据传送寄存器;将从字节模块读取的数据回送到数据 接收寄存器。二、FPGA硬件系统电路设计(略)三、I C总线接口电路VHDL设计1. I2C总线端口(1) 名称:IIC_IO.vhd(2) 功能:|2C总线双向端口电路描述(3) 端口说明方向端口名宽度说明输入Sda en1数据线三态使能控制端,来自位传输控制模块Scl en1时钟线三态使能控制端,来自位传输控制模块输出Sda_i1回送的数据线信号,给位传输控制模块Scl_i1回送的时钟线信号,给位传输控制模块双向Sda
16、1I2C的数据线,外接I2c器件Scl1I2C的时钟线,外接l2C器件(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' WHEN scl_e n=
17、39;O' ELSE 'Z'Sda<='0' WHEN sda_e n='O' ELSE 'Z' END one;2. 位传输控制模块(1) 名称:bit_txd_rxd.vhd(2) 功能:实现位数据或协议命令的传输(3) 端口说明 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 IS方向端口名宽度说明输
18、入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 rd1从总线读岀的1位数据GENERIC (n:INTEGER:=48);- 分频系数PORT(Clk_sys:IN STD_LOGIC;Rst,ena:I
19、N STD_LOGIC;cmd: IN STD_LOGIC_VECTOR(3 DOWNTO 0);Bit_data_wr:IN STD_LOGIC;-Scl_i,sda_i : 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,sta
20、rt_d,start_e,stop_a,stop_b,stop_c,stop_d, write_a, write_b, write_c, write_d,read_a, read_b, read_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;-
21、SCL 的边沿信号SIGNAL scl_oen_r, sda_oen_r: STD_LOGIC;- 总线使能信号SIGNAL sda_chk: STD_LOGIC;- 写数据时,检查总线信号SIGNAL 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)
22、 - 同步 SCL 和 SDA 的输入信号BEGINIF rst='0' THENScl_a<='1'Sda_a<='1'Scl_b<='1'Sda_b<='1'ELSIF RISING_EDGE(clk_sys) THEN - 暂存 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
23、);- 检测时钟 SCL 上升沿PROCESS (clk_sys) -产生数据输出信号,在 SCL 上升沿时锁存 SDA 上的数据值 BEGINIF RISING_EDGE(clk_sys) THENIF scl_edg='1' THENBit_data_rd<=Sda_a;END IF;END IF;END PROCESS;-从节点未准备好时,下拉 SCL 延迟周期;当给出的 SCL 使能为 1 时,检测 SCL 总线为 0 时,则 节点未准备就绪,产生等待信号。PROCESS (clk_sys)BEGINIF RISING_EDGE(clk_sys) THEN dsc
24、l_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' THENcnt: =0; en_500k<='1'ELSIF RISING_EDGE(clk_sys) THENIF clk_cnt<n-1 THEN -n 为分频系
25、数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 的下降沿(起始信号) ,产生启动标志-在 SCL 高电平时 ,检测
26、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;-生成总线忙标志-检测到启
27、动信号发生,但无停止信号发生时表示总线处于忙状态PROCESS (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
28、_sys,rst)BEGINIF rst='0' THEN stop_cmd<='0'- 停止命令信号 stop_cmd_r <='0'Lose_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;ANDLose_r<=(Sda_P
29、 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 rst='0' THEN Sta_p<=bit_idle;- 初始准备状态 bit_finish<='0' -1 位信号发送或接收完成标志 Scl_oen_r<='1'- 时钟
30、输出使能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'ELSEbit_finish <='0'IF clk_en=
31、9;1' THENCASE sta_p ISWHEN bit_idle=>- 准备状态Scl_oen_r <=scl_oen_r;- 保持 SCL 在同一状态Sda_oen_r <=sda_oen_r; - 保持 SDA 在同一状态Sda_chk<='0'CASE cmd IS - 状态命令字WHEN "0001"=> sta_p<=start_a;- 发送起始信号状态WHEN "0010" => sta_p<=stop_a;- 发送停止信号状态WHEN "0100&quo
32、t; => sta_p<=write_a;- 写入 1 位数据WHEN "1000" => sta_p<=read_a; - 读出 1 位数据WHEN OTHERS=> sta_p<=bit_idle;END CASE;-启动 I2C 状态,分 5 个时钟段产生起始信号WHEN start_a=>sta_p<=start_b;Scl_oen_r <=scl_oen_r; - 保持 SCLSda_oen_r <='1' -SDA 处于高Sda_chk<='0' - 不检查输出WH
33、EN start_b=>sta_p<=start_c;Scl_oen_r <='1'Sda_oen_r <='1'Sda_chk<='0'WHEN start_c=>sta_p<=start_d;Scl_oen_r <='1'Sda_oen_r <='0'Sda_chk<='0'WHEN start_d=>sta_p<=start_e;Scl_oen_r <='1'Sda_oen_r <='0
34、'Sda_chk<='0'WHEN start_e=> - 开始状态 5 sta_p<=bit_idle;- 回到等待状态 bit_finish <='1'- 起始信号传送完成,给出标志 Scl_oen_r <='0'Sda_oen_r <='0'Sda_chk<='0'-停止 I2C 状态,分 4 个时钟段产生停止信号WHEN stop_a=> sta_p<=stop_b; Scl_oen_r <='0' Sda_oen_r &l
35、t;='0'Sda_chk<='0'WHEN stop_b=> sta_p<=stop_c; Scl_oen_r <='1' Sda_oen_r <='0' Sda_chk<='0'WHEN stop_c=> sta_p<=stop_d; Scl_oen_r <='1' Sda_oen_r <='0' Sda_chk<='0'WHEN stop_d=>sta_p<=bit_idle;bit_
36、finish <='1'- 停止信号传送完成,给出标志 Scl_oen_r <='1'Sda_oen_r <='1'Sda_chk<='0'-读状态,分 4 个时钟段读 1 位信号WHEN read_a=> sta_p<= read_b;Scl_oen_r <='0' - SCL 处于低Sda_oen_r <='1' -SDA 由从器件决定 Sda_chk<='0'WHEN read_b=> sta_p<= read_
37、c; Scl_oen_r <='1' Sda_oen_r <='1' Sda_chk<='0'WHEN read_c=> sta_p<= read_d; Scl_oen_r <='1' Sda_oen_r <='1' Sda_chk<='0'WHEN read_d=>sta_p<=bit_idle;bit_finish <='1'-读完1位数据,给出标志 Scl_oen_r <='0'Sda_oe
38、n_r <='1'Sda_chk<='0:-写状态,分4个时钟段写1位信号WHEN write_a=>sta_p<= write_b;Scl_oen_r <='0' - SCL 处于低Sda_oen_r <=bit_data_wr;-输入数据Sda_chk<='0'WHEN write_b=>sta_p<= write_c;Scl_oen_r <='1'-Sda_oe n_r <=bit_data_wr;Sda_chk<='1'-WHE
39、N write_c=> -写状态 3 sta_p<= write_d;Scl_oen_r <='1'-Sda_oe n_r <= bit_data_wr;Sda_chk<='1'WHEN write_d=> -写状态 4 sta_p<=bit_idle;bit_finish <='1'-写完1位信号,给出标志Scl_oen_r <='0'Sda_oe n_r <= bit_data_wr;Sda_chk<='0'WHEN OTHERS=>n u
40、ll;END CASE;END IF;END IF;END IF;END PROCESS;END two;3.字传输控制模块(1) 名称:byte_txd_rxd.vhd(2) 功能:实现字节数据的传输控制。(3) 端口说明方向端口名宽度说明输入Rst1复位信号,外接按钮开关,低电平复位clk_sys1系统时钟start1启动命令stop1停止命令read1读命令write1写命令Ack_in1应答输入信号Data_txd8待发送的8位输入数据或地址,由发送寄存器提供Bit_data_rd1从位模块接收的1位数据Lose1总线仲裁丢失标志Bit_finish1来自位模块的1位传送完成标志输出c
41、md4输岀命令Bit_data_wr1向位模块发送的数据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
42、:IN STD_LOGIC_VECTOR(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 DO
43、WNTO 0);END byte_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;- 加载数据使能、移位数据使能SIGNA
44、L shift_reg:STD_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' TH
45、EN shift_reg<=(OTHERS=>'0');ELSIF RISING_EDGE(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) - 进行读写位计数
46、BEGINIF rst='0' THEN cnt_rw<="000"ELSIF RISING_EDGE(clk_sys) THENIF Ld_en='1' THEN - 加载新数据时 cnt_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
47、" 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<=Byte_idle;- 初始准备状态 sck_finish_r<='0
48、39;- 应答完成标志置 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_
49、wr<=shift_reg(7); - 取移位寄存器的最高位作为待写出位 shift_en<='0'- 禁止移位ld_en<='0'- 禁止加载 ack_finish_r<='0' - 应答完成标志置 0 CASE sta_c ISWHEN Byte_idle=>- 空闲状态IF en='1' THEN- 发生读 /写/停止命令且无应答完成标志 ld_en<='1' - 重新加载写入数据初值,复位传送计数器IF start='1' THEN sta_c<=B
50、yte_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;- - 停止状态 cmd<= "0010
51、" - 启动位模块发送停止位 ack_finish_r<='1'- 产生传送完成标志END IF;END IF;WHEN Byte_start=>IF bit_finish='1' THEN - 起始位发送完成标志 ld_en<='1' - 重新加载初值IF read='1' THEN sta_c<=Byte_read; cmd<="1000"ELSE sta_c<=Byte_write; cmd<="0100"END IF;END IF;
52、WHEN Byte_write=>IF bit_finish ='1' THEN - 写完 1 位标志IF cnt_done='1' THEN- 写完 8 位标志 sta_c<=ack_rd; - 读应答状态 Cmd<="1000"- 准备读应答位ELSE sta_c<=Byte_write;- 保持写状态 cmd<= "0100"- 准备继续写下 1 位 shift_en<='1' - 移位,准备下 1 位数据END IF;END IF;WHEN Byte_read=&
53、gt;IF bit_finish ='1' THEN - 读完 1 位标志 shift_en<='1' - 移位,存储新读入的 1 位数据 IF cnt_done='1' THEN- 读完 8 位标志 sta_c<=ack_wr; - 写应答状态 cmd<= "0100"- 准备写应答位 bit_data_wr<=ack_in;- 给出待发送的应答信号 ELSEsta_c<=Byte_read;- 保持读状态 Cmd<= "1000"- 准备继续读下 1 位 END IF
54、;END IF;WHEN ack_rd=>- 读应答状态IF bit_finish ='1' THEN - 应答位读完成标志 ack_out<=bit_data_rd;- 输出应答信号 ack_finish_r<='1' - 给出应答完成标志 data_rxd<=shift_reg;IF stop='1' THENsta_c<=Byte_stop;cmd<= "0010"- 发停止位ELSEsta_c<=Byte_idle; - 空闲状态cmd<="0000"
55、- 等待END IF;END IF;WHEN ack_wr=>- 写应答状态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"- 等待E
56、ND IF;ELSEbit_data_wr<=ack_in;END IF;WHEN Byte_stop=>- 停止状态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) 功能:通过I2C总线对AT24C256指定单元进行读写。(3) 端口说明 VHDL 描述LIBRARY
57、 IEEE;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_ in:
58、 IN STD_LOGIC_VECTOR(7 DOWNTO 0);ack_fi nish,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);方向端口名宽度说明输入Rst1复位信号,外接按钮开关,低电平复位clk_sys1系统时钟
59、ena1接口使能信号clk_ena1:时钟使能信号rw1读写控制Ack_flag1应答值Ack finish1完成一个字节传输标志Slave_addr7:从机地址,送给传输寄存器Sub_addr16从机子地址,送给传输寄存器Data rd8从从机读入的数据,送给接收寄存器Data_in8输入数据,送给传输寄存器输出Data_wr8待写岀值,来自传输寄存器Data out8输岀数据,来自接收寄存器Rtx f1传输完成标志start1启动命令,来自命令寄存器stop1停止命令,来自命令寄存器read1读命令,来自命令寄存器write1写命令,来自命令寄存器END AT24C256_rw; ARCH
60、ITECTURE four OF A T24C256_rw ISType 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 txd_reg: STD_LOGIC_VECTOR(7 DOWNTO 0);- 数据发送寄存器 SIGNAL rxd_reg: STD_LOGIC_VECTOR(7 DOWNTO 0);- 数据接收寄存器 BEGINstart<=cmd_reg(0);stop <=cmd_reg(1);write <=cmd_reg(2); read <=cmd_reg(3); data_wr <=txd_reg; data_out<=rxd_reg;PROCESS(rst,clk_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年防火门知识产权保护与许可合同
- 2025-2030年中国医疗器械漏电测试仪项目投资可行性研究分析报告
- 2025年度展览馆装修消防设施合同范本
- 2025年度装卸搬运作业环保达标评估合同
- 2025年度中英文合同翻译与知识产权保护合同
- 2025年店面装饰装修工程消防安全合同
- 2025年度物业收费标准调整合同范本
- 2025年度植树造林项目生态效益评估与监测合同
- 2025年度厂房买卖中介合同范本(含行业法规说明)
- 2025年度最高额抵押借款合同范本(区块链技术应用)
- 美团外卖骑手服务合同(2025年度)
- 应急预案解读与实施
- 2025年春季学期团委工作安排表
- 2025年《国有企业领导人员腐败案例剖析》心得体会样本(3篇)
- 广告行业安全培训详细介绍
- 2024-2029年全球及中国氨能源(绿氨)应用可行性研究与投资战略规划分析报告
- 2025福南平市建武夷水务发展限公司招聘21人高频重点提升(共500题)附带答案详解
- 2025年上半年工业和信息化部装备工业发展中心应届毕业生招聘(第二批)易考易错模拟试题(共500题)试卷后附参考答案
- 《快递运营》课件-项目三 收件
- 川教版三年级下册《生命生态安全》教学设计含教学计划【附安全知识】
- 国家中医药管理局发布的406种中医优势病种诊疗方案和临床路径目录
评论
0/150
提交评论