基于FPGA的I2C接口程序实现课程设计.doc_第1页
基于FPGA的I2C接口程序实现课程设计.doc_第2页
基于FPGA的I2C接口程序实现课程设计.doc_第3页
基于FPGA的I2C接口程序实现课程设计.doc_第4页
基于FPGA的I2C接口程序实现课程设计.doc_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

郑州轻工业学院可编程数字系统设计 题 目 基于fpga的i2c接口程序实现学生姓名 吕 彦 梅 专业班级 电子信息工程10-2班 学 号 541001030221 院 (系) 电气信息工程学院 指导教师 完成时间 给予fpga的i2c接口程序实现 摘 要串行扩展接口的发展是新一代单片机技术的显著特点,其中i2c 总线功耗低,结构简单,使用灵活,被广泛应用于视频、音像等各类设备中。本课题首先研究了iic 总线的规范,简要介绍了quartus 设计平台,以及fpga 的设计流程。在此基础上,重点介绍了iic 接口的总体设计方案,详细描述时序状态机的工作原理和verilog hdl 语言的实现,以及在quartus 平台上的时序仿真。本系统采用了自顶向下的设计方法,利用了verilog hdl 语言的结构描述风格,把整个设计分成6 个模块,时钟分频模块,寄存器组模块,数据接收模块,数据发送模块,输出缓冲模块,时序控制模块,顶层模块也采用语言描述。在quartus平台上,实现系统的功能和仿真。关键词 现场可编程逻辑门阵列 iic总线 状态机 时序仿真1.绪论 1.1 iic总线的优点 作为一种串行总线,iic总线虽没有并行总线的数据吞吐能力,但它具有如下优点:1、仅由两根信号线组成,节省了芯片i/o、节省pcb面积、节省成本等。 2、总线上可同时挂接多个器件,器件之间是靠不同的编址来区分的,而不需要附加的i/o线或地址译码部件。 3、总线可裁减性好。在原有总线连接的基础上可以随时新增或者删除器件。 4、总线电气兼容性好。iic总线规定器件之间以开漏i/o互联,这样,只要选取适当的上拉电阻就能轻易实现3v/5v逻辑电平的兼容,而不需要额外的转换。 5、支持多种通信方式。一主多从是最常见的通信方式。此外还支持双主机通信、多主机通信以及广播模式等等。 6、兼顾高低速通信。iic总线标准传输速率为100kbit/s,在快速模式下为400 kbps,高速模式下为3.4mbit/s。iic总线的通信速率也可以低至几kbps以下,用以支持低速器件或者用来延长通信距离。 iic总线带来的这些好处,得到了广大工程师的青睐。在通信,音/视频,智能仪表、工控领域都得到了应用。 1.2 课题的主要工作作为一款经典的串行通讯总线,iic总线接口ip核已被越来越广泛的集成到soc中。本文通过用verilog hdl语言在fpga上实现一个iic总线接口,它可作为ip核集成到soc中。研究内容主要包括以下方面:1、深入研究iic协议规范。 2、用verilog hdl硬件描述语言设计基于fpga的iic总线接口,做到数据传输能够有序、有效地进行。 3、用quartus软件对每一个模块进行编译生成单个电路模块。4、在quartus平台上,对设计进行分析、综合、功能和时序仿真。 2 iic总线协议研究 2.1 iic总线概述 2.1.1 iic总线简介 iic总线支持任何ic生产过程,包括cmos、nmos、双极性,用两根信号线进行数据传输串行数据线(sda)和串行时钟线(scl)。它允许若干兼容器件(如存储器、a/d和d/a转换器,以及led、lcd驱动器等)共享总线。图2.1是iic总线结构。 图2.1 典型的iic总线结构 每个器件都有唯一的地址,而且都可以作为一个发送器或接收器,由器件的功能确定,。iic总线上所有器件依靠sda发送的地址信号寻址,不需要片选线。任何时刻总线只能由一个主器件控制,各从器件在总线空闲时启动数据传送,由iic总线仲裁来决定哪个主器件控制总线。表2-1给出了iic总线常用的术语定义。 表2-1 iic总线术语定义 术语描述发送器发送数据到总线的器件接收器从总线接收数据的器件主机初始化发送产生时钟信号和终止发送的器件从机被主机寻址的器件多主机同时有多于一个主机尝试控制总线但不破坏报文仲裁多主机同时尝试控制总线但只允许其中一个主机控制总线并使报文不被破坏的过程同步两个或多个器件同步时钟信号的过程2.1.2 iic总线的电气特性与结构 在系统中,iic总线的典型接法如图2.2所示,注意连接时需要共地。sda和scl都是双向线路,为了使总线上所有电路的输出能实现“线与”功能,各个iic总线的接口电路的输出端必须是漏极开路或集电极开路结构,输出端必须接上拉电阻,上拉电阻一般取值310k。 图2.2 iic总线的器件连接 开漏结构的好处是:1、当总线空闲时,这两条信号线都保持高电平,因各设备都是开漏输出,上拉电阻,使sda和scl线都保持高电平,不会消耗电流。任一设备输出的低电平都使相应的总线信号线变低,即总线上的所有器件都达到高电子状态时,iic总线才能达到高电平,从而使总线上的高速器件和慢速器件工作同步。 2、电气兼容性好。上拉电阻接5v电源就能与5v逻辑器件接口,上拉电阻接3v电源又能与3v逻辑器件接口。 3、因为是开漏结构,所以不同器件的sda与sda之间、scl与scl之可以直接相连,不需要额外的转换电路。 2.2 iic总线的位传输 由于iic总线的器件有不同种类的工艺,逻辑“0”或“1”的电平不是固定的。在iic总线每传输一位数据就有一个时钟脉冲相对应,其逻辑“0”或“1”的信号电平取决于该节点的正端电源vdd的电压。 2.2.1 数据的有效性 iic总线数据传输时,在时钟线高电平期间数据线上必须保持稳定的逻辑电平状态,高电平为数据1,低电平为数据0。只有在时钟线为低电平时,才允许数据线上的电平状态变化。如图2.3所示。 图2.3 iic总线上的数据有效性 2.2.2 总线数据传输的起始和终止 iic总线数据传输定义了两种时序状态,分别为起始信号和终止信号,如图2.4所示。 启始信号(start),当时钟线scl保持高电平期间,sda由高电平向低电平切换,表示开始传送数据,终止信号(stop),当时钟线scl保持高电平期间,sda由低电平向高电平切换,表示停止传送数据。 图2.4 iic总线上的起始和终止信号 起始信号与终止信号都是由主控制器产生,当iic总线出现起始信号时,总线进入“忙”状态,当iic总线上出现结束信号时,总线进入“空闲”状态。挂接在iic总线上的主从设备通过检测起始信号和结束信号判断总线的“忙”、“空闲”状态。由于iic总线协议不定义优先级概念,因此任何新进程的开始必须等待当前进程的结束。使用硬件接口可以很容易地检测起始和结束信号,没有这种接口的微机必须以每时钟周期至少两次对sda取样以检测这种变化。 2.2.3 总线信号的时序 为了保证iic总线数据的可靠传送,对总线上的信号时序做了严格的规定,下面各图中对主要信号时序做了定义。 图2.5 主机向从机发送一个字节的时序 图2.5所表示的是主机向从机发送一个字节的时序,主机向传送一个7位的地址,第8位是读/写位。在第9个时钟时,从机发出一个响应信号,接着传输8位的数据,相应地从机继续发送一个响应位,然后主机在时钟线保持高电平期间,拉高数据线,数据传输停止。 图2.6 主机向从机接收1个字节数据的时序 图2.6所表示的主机向从机接收一个字节的时序,前面8个时钟周期与发送时序相同,不同的是在传输8位数据后,由主机发送响应信号,然后启动停止信号。2.3 iic总线上的数据传输 2.3.1总线的数据传输格式 图2.10所示的是一个完整的数据传输格式。按照规定,在起始条件(s)之后,发送一个7位的从机地址。紧跟着的第8位是数据方向位(r/w),数据方向表明主控器和被控器的数据传输方向。0表示主控器发送数据(写),1表示请求接收数据(读)。数据传输一般由主机产生停止位(p)终止。在这种传输中,也可以有不同的读/写格式相结合。下面介绍3种传输格式, 1、主控制器写操作 主机-发送器向从机发送n个数据字节,方向不变。 注 1-7是地址位,8位是读写位,第9位是响应位 图2.10 完整的数据传输 2、主控制器读操作 在第一个字节后,主控制器立即读从控制器。在第一次响应后,主控制器,发送器变成了主控制器,接收器,从控制器,接收器变成了从控制器,发送器。第一次响应仍由从控制器产生。之前发送了一个不响应信号(/a)的主机产生停止条件。 3、主控制器的读写操作 在数据传输过程中需要改变传输方向操作,这时起始条件和从控制器地址都会被重复,但r/w位取反,它的方向由寻址字节的方向位决定。如果主控制器接收器发送一个重复起始条件,它之前应该发送一个不响应的信号/a,每个字节后都跟着一个响应位,在序列中用a或/a模块表示。寻址字节只表明器件地址及传送方向,器件内部的n个数据地址可以在i2c总线数据操作格式中用第一个数据字节指定。i2c总线被控制器在接收到起始信号后都必须复位他们的总线逻辑,以便对将要开始的被控制器地址的传送进行预处理。 2.4重复起始条件 主机与从机进行通信时,有时需要切换数据的收发方向。例如,访问某一具有i2c总线接口的eeprom存储器时,主机先向存储器输入存储单元的地址信息,发送数据,然后再读取其中的存储内容,接收数据,。在切换数据的传输方向时,可以不必先产生停止条件再开始下次传输,而是直接再一次产生开始条件。i2c总线在已经处于忙的状态下,再一次直接产生起始条件的情况被称为重复起始条件。重复起始条件常常简记为sr。正常的起始条件和重复起始条件在物理波形上并没有什么不同,区别仅仅是在逻辑方面。在进行多字节数据传输过程中,只要数据的收发方向发生了切换,就要用到重复起始条件。 数据传输的结束信号由主iic发出。刚刚结束一个进程的用户有立即启动一个新进程的优先权,该用户可以不发出结束信号而直接发出一个新的启动信号和另一个从iic地址,从而不给其他用户申请总线的机会,以保持自己继续使用总线的权利。 3 设计环境和设计方法 3.1 设计环境 本文中iic总线接口的设计是利用altera公司的设计软件quartus ii,用verilog hdl语言编程实现的。仿真部分采用quartus ii+modelsim。 quartus ii软件是altera提供的完整的多平台设计环境,可以轻易地满足特定地设计需求,是sopc设计的综合性环境。 硬件描述语言(hdl)是一种形式化方法来描述数字电路和设计数字逻辑系统的语言,它是硬件设计人员与eda工具之间沟通的桥梁,其主要目的是用来编写设计文件,建立电子系统行为级的模拟类型。3.2用verilog hdl设计可综合的状态机 基于状态机的设计要点: (1)一个完备的状态机应该具有初始状态和默认状态。当芯片加电或者复位后,状态机能够自动将所有的判断条件复位,并进入初始状态,起始状态是指电路复位后所处的状态,选择一个合理的起始状态将使整个系统更简捷高效。当转移条件不满足,或者状态发生突变时,状态机进入一个默认(default)状态,能保证逻辑不会陷入“死循环”,这是对状态机健壮性的一个重要要求,即自动恢复功能。在case语句的最后,不要忘了加上default分支语句,以避免锁存器的产生。 (3)建模 用两条always语句对其建模比较好:一个always语句用于组合逻辑建模(既包括次态逻辑,也包括输出逻辑),一个always语句用于时序逻辑建模。组合逻辑建模采用阻塞式赋值,时序逻辑建模采用非阻塞式赋值。 (4)时序方式选择 根据触发条件的不同,时序逻辑电路可以分为异步时序和同步时序逻辑。在异步时序逻辑中触发条件很随意,任何时刻都有可能发生,所以记忆状态的触发器输出在任何时刻都有可能发生,而同步时序逻辑中表示状态的触发器输出只能在惟一确定的触发条件发生时刻改变,例如只能由时钟的上升沿或下降沿触发。同步时序逻辑的触发输入至少可以维持一个时钟周期后才会发生第二次触发,利用这一段时间,即在下一次触发信号来到前,为电路的状态改变创造了一个稳定可靠的条件。因此,同步时序逻辑比异步时序逻辑具有更可靠、更简单的逻辑关系。 目前,综合工具只支持同步时序逻辑的设计,用verilog设计可综合的状态机也都使用同步时序逻辑。实用的状态机都应设计为由唯一时钟边沿触发的同步运行方式。 4 iic总线接口设计 iic总线接口的设计是整个系统设计的关键之一,从本章起,开始介绍iic总线接口的内部模块的设计。在接口模块设计中,主要介绍模块要实现的功能和设计的思路,并给出用quartus软件对每一个模块编译生成的单个电路模块。 4.1 实现功能 本文主要通过是用verilog hdl语言在fpga上实现iic总线接口,该接口接收来自高速设备或片上总线的读写命令信号、地址信号、并行数据信号,并把它们转换为相应的串行信号发送到slave器件中去,它还发送应答信号,以便让主器件来调节发送或接收数据的速度移配合从器件的接收,写,和发送,读,数据。鉴于iic总线的规范,其接口主要完成的功能如下:1、具有软件可编程系统时钟频率 2、软件可编程响应位 3、启动/停止/重启/响应各种触发状态 4、支持系统扩展 5、仅支持时钟同步,不支持仲裁 6、随机读取总线数据和状态 接口定义了2个传输速度:标准模式100 kbps 快速模式400 kbps 4.2 iic总线接口的顶层设计 为了实现和iic器件的通讯,该iic接口一方面要通过数据总线与微处理器交换数据,接收来自微处理器的控制信号,命令与数据,实现iic接口与微处理器的通讯,另一方面要通过iic总线与iic器件交换数据,发送iic器件的数据和状态响应到微处理器,使它们之间能够进行通讯。 根据据总线接口要完成的功能,采用自上而下的设计方法,综合考虑,设计如下: 1、时钟分频模块,由于通常fpga的系统外部时钟输入都很高,如50mhz,而iic总线接口协议规定数据传输速率在标准模式下为100kbit/s,快速模式下为400 kbit/s及高速模式下为3.4 mbit/s。为了能产生正确的数据传输时序,需要一时钟分频器对输入时钟进行分频,然后再作为时序控制器的时钟。通过该模块实现频率的可编程,产生总线工作时钟;2、 接收数据模块,接受来自微处理器的数据信号,同时输出一个使时序控制模块工作的触发信号,并反馈给处理器一个响应信号,告诉处理器,已经接收完数据; 3、时序控制模块,控制整个系统工作的时序,并把8位并行数据转换成串行4、发送数据模块,反馈总线的工作信息; 5、输出缓冲器,是一个三态的缓冲器,可为总线时钟和数据信号提供开漏极输出; 6、寄存器组,包括了3个寄存器,各部分的信息如表4-1所示。 表4-1 iic总线接口寄存器 寄存器地址类型字地址寄存器00读/写数据寄存器01只读状态寄存器10只读外部处理器发送出控制信号和地址信号,不同的地址信号指向不同的寄存器,进入不同的读写状态。当地址信号是00时,指向字地址寄存器,处理器进入读/写状态,把数据信号写入字地址寄存器或者从寄存器读出,当地址信号是01,10时,外部处理器分别读取数据寄存器和状态寄存器。 parameter w_add=2b00;/地址寄存器 parameter d_add=2b01;/数据寄存器 parameter s_add=2b10;/状态寄存器 按照设计的要求,需要8位数据线,2位地址线,时钟线,复位,使能信号线,读写命令线,还有反馈信息的响应线以及一位串行时钟线和一位串行数据线。其详细的输入输出接口信号及其功能如表4-2所示,l表示信号低电位有效,在整个设计中都应用了这个规则,其中cs_l是芯片的使能信号,和clk信号是同步的,只有当它有效的时候,其它的地址、复位和命令信号才能启动。 表4-2 iic总线接口信号表 端口方向描述clock输入处理器的时钟输入rst_1输入异步复位信号cs_1输入接口使能信号rd_wr_l输入读写控制命令addr1:0 输入地址选择信号data7:0 双向数据输入输出信号ack_l 输出反馈给处理器的响应信号scl_pin输出iic总线的时钟信号sda_pin 双向iic总线的数据信号综上所述,整个设计分为6个模块,时钟分频器、时序控制器、数据接收器、数据发送器、输出缓冲器、寄存器组。其结构如图4.1所示。 图4.1 iic总线接口结构框图 4.3 内部模块的设计和verilog hdl实现 4.3.1 时钟分频器 由于通常的fpga系统外部时钟输入都很高,如50mhz,而iic总线接口协议规定数据传输速率在标准模式下为100kbit/s,快速模式下为400 kbit/s。为了能产生正确的数据传输时序,由时钟分频寄存器对输入时钟进行分频再作为时序控制器的时钟。8 bit的计数器可以满足大多数情况下的使用,但是如果微处理器的时钟比较大,就需要更大的计数器。同样地,如果iic总线要求工作速度比较大,那么就需要一个相对小的计数器。系统复位时,计数器清零,当时钟上升沿时,计数器加1。在本设计中,假定外部时钟为50 mhz,总线工作在标准模式100 khz,基于verilog同步设计的需要,本地时钟一般为scl时钟的整数倍,这里取2倍。可以求得计数器值num=50m/(100k*2)=250,换算为16进制为fa。通过软件编程可以实现数据传输速率的控制,其模块的rtl级描述如图4.2, 图4.2 时钟分频模块rtl级描述 用quartus ii软件编译仿真之后生成一个器件模块图,其接口电路模块图形如图4.3。 图4.3 时钟分频模块图 4.3.2 数据接收模块 数据接收模块既要接受来自微处理器的数据信号,同时也要输出反馈信号和触发信号。因此,该模块需要一个字地址寄存器,同时要产生状态机的触发信号。当系统复位时,初始化输出的字地址,在使能信号和命令信号同时有效的情况下,当地址信号为00,指向字地址寄存器时,输入的8位数据以字地址信息存储起来,并触发一个i2c_go命令,这个命令是时序控制模块工作的触发信号,并反馈给处理器一个响应信号,告诉处理器,已经接收完数据。其模块的rtl级描述如图4.4, 图4.4 接收寄存器模块rtl级描述 用quartus ii软件生成一个电路模块图如图4.5所示, 图4.5 接收寄存器模块 4.3.3发送寄存器 在这个模块里包括三个寄存器,字地址寄存器,数据寄存器,状态寄存器,根据处理器的地址信号,指向不同的寄存器,输出不同的信息,把总线的状态反馈给处理器。当指向数据寄存器时,把时序控制模块重复读取的总线上的数据信息以8位数据的形式反馈给处理器,如字地址,iic器件的数据,状态等。字地址和数据都是8位的信号直接输出,当处理器的命令是指向状态寄存器时,输出的8位的数据中,各个位的定义如表4-3所示:表4-3状态寄存器位功能表位信号功能7readyiic器件已经把数据准备好6erroriic器件不能响应当前的读命令510未用0响应iic总线周期激活 用quartus ii软件生成一个电路模块图如图4.8, 图4.8 发送寄存器模块 4.3.4 时序控制模块 时序控制模块是接口的核心部分,它控制着整个系统的工作过程、数据传输,及通过控制scl和sda信号线来触发开始和停止信号,该模块包含一个状态机,用于控制系统工作的时序,同时当主机要把数据写入iic总线上的器件时,因为数据寄存器的位宽是8bit,而iic总线上的数据位宽是1bit,所以必须经过并串转换。即该模块具有如下功能:1、控制iic总线的周期;2、对输入数据进行并/串转换; 3、对总线上的数据进行转换;4、触发iic的时钟信号;5、触发iic的数据信号; 6、触发iic总线的状态信号。 采用fpga模拟iic总线,由iic总线规则可以看出,iic在传输过程中有5个固定的状态,空闲、开始、响应、接收/发送、停止。传输的过程也就是状态间进行变换的过程,因此很自然联想到在编程时使用状态机的方法。同时状态间转换要受到来自微控制器的信号的控制,因此需要采用mealy型状态机。并串转换器,在这个模块里,通过8 bit计数器来实现。为了对运行状态进行更一步的细分,在本设计中定义了15个状态,下面把各个状态的定义如下解释: idle iic总线空闲 en_clk 时钟启动 start1,start2,stop1 开始和停止 dev_add1,dev_add2 传输器件地址 ack1,ack2,ack3,ack4 发送响应 w_add 字地址 wait1 等待 dis_clk1 暂停 data 传输数据 当系统复位时,初始化状态为idle,当复位无效,地址信号为00时,指向字地址寄存器,这时产生一个启动状态机的信号,状态机由空闲状态进入开始状态,当分频器过来的脉冲信号从低向高跳变时,传输开始,同时位计数器也开始启动读总线的动作一定要读完一个字节才结束。那么先传输的是7位器件地址,并产生一个响应位,然后传输8位字地址和数据,如果有中断进入等待或暂停状态,需要重新状态机启动。控制器根据所处状态读写总线器件。主机要读取总线器件上的数据也必须通过状态机来实现,当状态机处于数据状态时,如果这时8位计数器的值为5,那么读出数据的第5位就是当时sda上的逻辑值。以此类推,其它的同样。 其状态机程序见附录。简单的流程图如图4.9所示。 图4.9 状态机工作流程图 其生成的rtl级描述图比较庞大,因此就不贴出了。用quartus ii软件生成一个电路模块图如图4.10。图4.10 时序控制模块图 4.3.5输出缓冲器 根据iic总线的传输规范,总线的电气特性为开漏极输出驱动,但是多数的可编程器件不提供开漏极输出特性,为了使sda,scl便于移植,均使用了三态驱动模用quartus ii软件生成一个电路模块图如图4.12。 图4.12 输出缓冲模块 4.3.6 顶层文件 顶层文件可以用电路图的输入方式把5个子模块连接起来,也可以通过硬件语言的例化语句来描述,在本设计中主要运用语言描述的方法。5 iic总线接口的仿真5.1 验证流程 iic总线接口的验证流程如图5.1所示 。 图5.1 iic总线接口验证流程 在图5.1中,功能仿真就是常说的前仿真,用于检查rtl代码的正确性,综合后仿真用于检查网表是否正确,疏忽大意或代码风格不严谨很容易导致综合出来的网表的功能和预想不一致,综合后仿真能发现这样的问题。par后仿真的意思是布局布线,place and route,后仿真,也就是常说的后仿真或时序仿真,它可以检查网表和时序的正确性。5.2 整体构思 为了确认iic总线接口是否能够正确运行,仿真验证时需要建立testbench(测试环境),iic总线接口验证的环境的结构如图5.2所示。整个结构设计分为三个部分:第一部分是主设备仿真模块,第二部分是iic总线接口可仿真综合模块,第三部分是从设备仿真模块。然后用一个测试台程序将三个模块连接起来,并产生激励信号对iic模块的功能进行仿真测试。5.3 测试模块搭建 1、micro module: 微处理器部分可以采用zye1502d实验箱上有的at89c51单片机,或者编写testbench实现。为了仿真方便,在仿真时采用testbench搭建。该micro模型给出了微处理器与iic接口通讯的仿真程序。该模型能产生相应的读写信号,地址信号,并行数据信号,并能接收从器件的应答信号,来调节发送或接收数据的速度。在这个程序中,为了保证iic接口的正确性,可以进行完整的测试,写操作时输入的地址信号和数据信号的数据由于较少,直接写入程序中。读操作时,将读数对比可以验证程序的正确性。该程序通过调用四个任务实现上述功能,write,monitor_iic_rdy,read_data,kill_time。 2、iic_slave module: 该iic_slave模型提供了一个iic存储器。该从模型能够侦测起始和终止命令,在地址控制字时序后产生ack,在数据读之后置iic总线三态。另外它通过比较“slave data receive on write”和“slave data transmitted on read”的信息,实现仿真时数据正确性的检查。 3、clk_rst module:clk_rst模块给测试平台提供时钟和复位信号。编辑clk_period参数更改时钟频率,改变reset_time参数就能改变复位信号的有效时间。 4、iic_tb,iic_tb是测试台的顶层文件。它将iic接口模型iic和测试程序的模型clk_rst、micro、iic_slave实例化,并连接起来。其主要程序:i2c i2c(.data(data),.addr(addr),.rst_l(rst_l),.clock(clock),.cs_l(cs_l), .ack_l(ack_l),.rd_wr_l(rd_wr_l),.scl_pin(scl_pin),.sda_pin(sda_pin); clk_rst clk(.clk(clock),.rst_l(rst_l); micro micro(.clk(clock),.rst_l(rst_l),.data(data),.addr(addr),.cs_l(cs_l), .ack_l(ack_l),.rd_wr_l(rd_wr_l); i2c_slave sep(.sda(sda_pin),.scl(scl_pin); 5.4时序仿真做功能仿真时,在modelsim中建立工程,把iic的所有verilog hdl文件,以及testbench用到的verilog文件加入到工程中,然后编译仿真。仿真波形如图5.2,5.3所示。 图5.2 iic_rst 仿真图 图5.3 功能仿真波形 由输出结果可只,微处理器发送写地址10100000,响应后写入数据55h,响应后重新发启动信号,发送读地址10100001,响应后读出数据,进行比较。同样操作,写入数据aah并读出比较,结果两次数据读回均正确无误。 结束语本课题设计了基于fpga的iic接口的数个模块,时钟模块、接收模块、发送模块、时序控制模块和输出缓冲模块,其中时序控制模块是设计的重点和难点。每个模块都通过了功能仿真和时序仿真,仿真结果表明,各个模块均完成了相应的逻辑功能。整个设计都采用了同步方式,而且没有使用特定公司的技术和ip核,这使得设计可以广泛地重用,但也存在着可改进之处:1、需要提高verilog hdl语言代码的效率,要力求用最简洁,可综合的描述方式描述模块的结构和功能,以使得芯片面积、功耗减小。 2、在基于fpga的器件上,进行逻辑综合过程中,许多约束条件是相互矛盾的,这需要反复设定条件,以求电路结构得到优化。基于verilog hdl语言的可移植性,及不依赖器件的特性,设计者能在更抽象的层次上把握和描述系统结构和功能特性,使设计更具灵活性。由于fpga器件的快速发展,其容量可以将各种外围器件的接口集成到fpga内部,这样可以实现设计的小型化,低功耗,并且降低了设计的复杂度,而且利用fpga在线可编程特点,可以增加系统设计的灵活度,提高了设计效率。 在课题期间,通过不断地学习、探索和实践,掌握了verilog hdl设计技术及其fpga的应用,提高了实际的工作能力和创新能力。 最后感谢我的老师和同学们,在他们的监督和帮助下让我顺利完成了本次的课程设计。 参考文献 1苏建志,王冰锋.iic总线及其应用.现代电子技术,2004,22.2赵辉.iic总线技术及其应用实例.微型电脑应用,2005,31(4):61.3周立功.iic总线概要.产品应用手册,2006,3.4石宗义.总线的时序分析及其模拟j.太原理工大学学报,2004,35(1):53. 5朱明程,黄强.fpga 动态可重构逻辑设计初探.半导体技术,2000,25(4):19.6褚振勇.fpga 设计及应用m.西安:西安电子科技大学出版社,2006.7王毓银.数字电路逻辑设计m.北京:高等教育出版社,1999.8李洪伟.基于quartusii 的fpga/cpld 设计m.北京:电子工业出版社,2006.附录1时钟分频器程序module iic_clk(clock,rst_l,scl_cnt_en,scl_tick); /端口列表 input clock;/外部系统处理器时钟 input rst_l;/外部复位信号,低有效 input scl_cnt_en;/来自时序控制器的计数使能信号 output scl_tick;/状态机的工作时钟 /registers&wires reg scl_tick; reg 7:0 cntr;/分频计数值 /分频 always(posedge clock or negedge rst_l) if(!rst_l) cntr= #1 8b0; else if(scl_cnt_en) cntr= #1 8b0; else cntr=8b0; always(posedge clock or negedge rst_l) if(!rst_l) scl_tick= #1 1b0; else if(cntr= =8hfa) cl_tick= #1 1b1; else scl_tick= #1 1b0; endmodule 附录2数据接收模块程序 timescale 1 ns/100 ps module iic_wreg(data, addr, rst_l, clock, scl_cnt_en, rd_wr_l, cs_l, wrd_add,iic_go, ack_l); /端口列表 input 7:0 data;/处理器输出的数据码 input 1:0 addr;/处理器输出的地址码 input rst_l;/复位信号 input clock;/系统时钟 input cs_l, scl_cnt_en;/系统使能信号 input rd_wr_l;/命令信号 output 7:0 wrd_add;/字地址 output iic_go;/iic总线启动信号 output ack_l;/反馈给处理器的响应信号 /寄存器型 reg 7:0 wrd_add; reg iic_go; reg ack_l; /寄存器参数 parameter w_add=2b00;/地址寄存器 parameter d_add=2b01;/数据寄存器 parameter s_add=2b10;/状态寄存器 always(posedge clock or negedge rst_l) if(!rst_l) wrd_add = #1 8b0; else if(cs_l&!rd_wr_l&(addr= =w_add) wrd_add = #1 data; always(posedge clock or negedge rst_l) if(!rst_l) iic_go= #1 1b0; else if(cs_l&!rd_wr_l&(addr= =w_add) iic_go= #1 1b1;/iic总线的启动信号 else if(scl_cnt_en) iic_go= #1 1b0; /反馈响应信号 always(posedge clock or negedge rst_l) if(!rst_l) ack_l= #1 1b1; else if(cs_l) ack_l= #1 1b0; else ack_l= #1 1b1; endmodule 附录3发送寄存器程序timescale 1 ns/100 ps module iic_rreg(wrd_add,iic_rdata,iic_rdy,iic_act,ack_err,addr,data_o); input 7:0 wrd_add;/iic word address input 7:0 iic_rdata;/iic read data input iic_rdy;/iic status bit input iic_act;/iic cycle active input ack_err;/ack error input 1:0 addr;/cpu address output 7:0 data_o;/muxed cpu data output /寄存器型 reg7:0 data_o;/muxed cpu data output /参数 parameter w_add=2b00;/字地址寄存器 parameter d_add=2b01;/数据寄存器 parameter s_add=2b10;/状态寄存器 /数据多用输出 always(addr or wrd_add or ack_err or iic_rdata or iic_rdy) case(addr) w_add:data_o= #1 wrd_add; d_add:data_o= #1 iic_rdata; s_add:data_o= #1iic_rdy,ack_err,5b0,iic_act; default:data_o= #1iic_rdy,ack_err,5b0,iic_act; endcase endmodule 附录4 状态机程序timescale 1 ns/100 ps module iic_st(rst_l,clock,scl_tick,iic_go,wrd_add,sda_pin,sda,scl,scl_cnt_en, iic_rdy, iic_act, iic_rdata, ack_err); /端口列表 input rst_l;/复位 input clock;/系统时钟 input scl_tick;/scl的时钟 input iic_go;/启动iic总线周期 input 7:0 wrd_add;/iic器件地址 input sda_pin;/iic数据多用输入 output sda;/iic总线数据输出 output scl;/iic总线时钟输出 output scl_cnt_en;/总线计数使能端 output iic_rdy;/总线准备好 output iic_act;/总线周期响应 output 7:0 iic_rdata;/总线上的数据 output ack_err;/响应错误 /寄存器型 reg sda; reg scl; reg scl_cnt_en; reg iic_rdy; reg 7:0 iic_rdata; reg14:0 iic_state; reg 2:0 bit_cntr; reg scl_en; reg en_cntr; reg cntr_done; reg ack_err; wire iic_act; /参数 parameter idle = 4b0000; / state 0 parameter en_clk = 4b0001; / state 1 parameter start1 = 4b1100; / state c parameter dev_add1 = 4b1000; / state 8 parameter ack1 = 4b0100; / state 4 parameter w_add = 4b1010; / state a parameter ack2 = 4b0101; / state 5 parameter wait1 = 4b0011; / state 3 parameter dis_clk1 = 4b1111; / state f parameter start2 = 4b1101; / state d parameter dev_add2 = 4b1001; / state 9 parameter ack3 = 4b0110; / state 6 parameter data = 4b1011; / state b parameter ack4 = 4b0111; / state 7 parameter stop1 = 4b1110; / state e /状态机 always (posedge clock or negedge rst_l) if (!rst_l) iic_state = #1 idle; else case(iic_state) idle : if (iic_go) iic_state = #1 en_clk; en_clk

温馨提示

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

评论

0/150

提交评论