USB2-IP核的设计与FPGA实现_第1页
USB2-IP核的设计与FPGA实现_第2页
USB2-IP核的设计与FPGA实现_第3页
USB2-IP核的设计与FPGA实现_第4页
USB2-IP核的设计与FPGA实现_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

USB2 IP核的设计与FPGA实现本文介绍了一种USB2.0设备控制IP核的设计方法。先总结控制器的功能和内部结构。再来是控制器的接口和扩展芯片。然后是内部数据读取方式。接着是UTMI接口、PL层、存储器接口和仲裁器,控制状态寄存器,最后通过verilog HDL实现IP核的的设计和功能验证。经过几年的发展通用串行总线(USB)已经演化成了电脑和外设的连接标准。在众多嵌入式应用里从鼠标键盘到相机移动电话等都可以通过USB方便地与电脑互连。随着新的USB标准的诞生,数据高速传输已经成为了可能,然而与之而来的是使用的多样化和复杂化。当前主流的解决方案是使用USB控制器来检测并对USB端口发生的事件进行回应。目前市场上供应的USB控制器主要有两种,一种是把微处理器集成在一个芯片里打包处理,另一种则是利用外部的微控制器来管理USB控制器的寄存器、设备描述符的内容读取和外部数据交换,这里的USB芯片仅处理USB通信。本文所设计的控制器属于后者。IP核(知识产权核,intellectual property core),是指某一方提供的、形式为逻辑单元、芯片设计的可征用模块。它分为软核、硬核和固核。软核通常是与工艺无关、具有寄存器传输级硬件描述语言描述的设计代码,可以进行后续设计;硬核是前者通过逻辑综合、布局、布线之后的一些列工艺文件,具有特定的工艺形式、物理实现方式;固核则通常介于上面两者之间,它已经通过功能验证、时序分析等过程,设计人员可以以逻辑门级网表的形式获取。本文所介绍的USB IP核处于软核阶段,以Verilog HDL语言描述文本的形式提交使用,并经过仿真验证,可以用它综合出正确的门级网表。第一章 控制器结构原理本文所设计的USB2.0设备控制器可以用来进行USB协议处理和数据间交换,实现USB通讯。根据USB2.0协议,控制器对USB总线上的差分信号进行NRZI解码和位解填充,然后经过串行转并行转换接着分组拆装,把需要的数据放入RAM区;也可以进一步把RAM区里的数据组装成协议所规定形式(分组),再利用差分驱动电路并行转串行、位填充NRZI编码输出到USB总线然后传回主机(逆过程)。按照USB2.0设备控制器的希望功能,控制器可以划分为如下模块:UTMI(USB TransceiverMacmcell Interface)、协议层PL(Protocol Layer)、存储器接口和仲裁器、控制和状态寄存器及功能接口。如图1.1。图1.1 USB2.0控制器结构第二章控制器与外部芯片的接口USB2.0控制器和外部芯片的接口包括下列3种情况:和单口同步静态存储器(SSRAM)间的、与MCU(微控制器)间的以及和外部UTMI间的接口。USB有两个时钟域。UTMI块执行的时钟来源于PHY。PHY提供的最大时钟输出能达到60MHz。实际时钟频率依据操作模式(全速/高速)的改变作调整。UTMI块和USB核保持同步的逻辑。所有模块执行的时钟来源于主机接口。由于USB延迟的需要,主机接口需要频率不少于60MHz的时钟。控制器和UTMI的接口遵循UTMI规范。UTMI接口信号含有:USB总线状态信号LineState1:0、设置UTMI工作模式的信号位、检验或标志发送数据的信号(TxValid、TxReady等等)、检验或标志接收数据的信号(RxActive、RxValid、RxError等等)以及8位双向数据线、60MHz时钟信号。根据之前时钟描述,USB的时钟域完全可以满足数据传输的要求。控制器要求的外部存储器使用标准单口SRAM,容量大小为215*16 bit=64 kB。其中读写信号(SSRAM_RD和SSRAM_WE)、16位数据线SSRAM_DATA和15位地址线SRAM_ADDR均属于信号接口。和微控制器间的接口信号则包括:16位数据线DATA、16位地址线ADDR、读写请求信号、中断请求信号和DMA请求响应信号(DMA_REQ与DMA_ACK)。其中对于16位地址线,低15位addr14:0用于存放存储器SSRAM的地址内容,高16位则用来选通SSRAM和USB控制器的内部寄存器,值为高时选择缓冲存储器,低则是内部寄存器。第三章 USB核数据读取3.1结点 该USB核支持16个结点。具体结点数已经内置。功能控制器必须设置结点,具体操作是对结点寄存器:EPn_CSR,EPn_INT,EPn_BUFx进行赋值。功能控制器必须为每个使用的结点分配准确的结点数(EP_NO)。这里的结点数与物理结点相对应。软件上的处理是必须确保所有结点在给定的处理类型上是不一样的。3.1.1 缓冲器指针 缓冲器指针指向存储器中输入/输出数据的结构。对所有个体而言7FFFh这个值表示缓冲器尚未被分配。如果所有的的缓冲器都没有被分配,该核会返回NAK确认信息给USB主机。 USB核支持双缓冲器,它能够减少对于功能微控制器和驱动软件的潜在需求。当所有的缓冲器指针都被调用的时候双缓冲器自动设为使能的。数据将会以循环的方式被找回到或填充缓冲器。当数据被送到或来自一个结点,缓冲器0将会优先被使用。当第一个缓冲器是空的/满的,功能控制器可能经由一个中断被唤醒。此时功能控制器的可以重新填充/清空缓冲器0。USB核现在可以使用缓冲器1进行下一步操作。当第二个缓冲器是满/空的,功能控制器将会中断,并且USB核会再次使用缓冲器0等等。没有被声明的缓冲器将会被跳过。一个缓冲区有设置过使用位将会导致核的停止,返回NAK/NYET标志给主机。 当一个缓冲区被使用的时候其使用位将会作出相应提示(这个信息也提供给中断资源寄存器)。功能控制器在清空/重新填充缓冲区后必须清除这些位。 缓冲区可以比最大有效负载大。因此,可以将多个数据包从缓冲区里取出或者放入。缓冲器用于输出结点必须是有效负载的倍数。当缓冲器剩余空间少于最大有效负载(因为一个或者多个数据包在少于最大有效负载情况也会被接收),缓冲区会被认为是填满,然后USB核会自动切换到下一个缓冲区。例如,如果最大有效装载量是512bytes,这个缓冲器的大小可能是512,1024,1536,2048比特等等。软件应该检查缓冲区域的大小,在整个缓冲区都被使用的时候它应该是置0。如果缓冲区的大小不是0,那么域的大小会显示还剩多少比特没被使用。对于输入缓冲器没有这些限制。核总会试图传输最大数量的比特。最大可能数量的比特总是比一个最大有效负载和剩余缓冲器容量小。 图3.1.1缓冲器指针示意3.1.2缓冲区过溢与下溢当一个超过缓冲器大小的数据包被接收的时候会发生缓冲区过溢。这个数据包会被丢弃并且一个NACK会被送入主机。典型地缓冲区能够容纳一个或更多的MAX_PL_SZ数据包。由于无法保证主机实际使用上会送出MAX_PL_SZ数据包,所以每次传输的时候缓冲区可能不完全填满MAX_PL_SZ数据包。 当缓冲区发生过溢,USB核将会丢弃已接收的数据并返回一个NACK信号到主机。当有效负载不能兼容缓冲区时它会继续丢弃已接收到的数据并返回NACK信号到每个输出令牌。当两个缓冲器都没被声明或者置空,此时如果接收到一个输出令牌的时候USB核会快速返回一个NACK(它不会等待来自主机的数据)。下溢同理。3.1.3数据组织由于缓冲存储器有32位宽并且USB定义所有字节边界上的数据交换,理解缓冲器上的数据关系对于实际USB比特序列来说关系重大。USB核支持小端字节序列。图3.1.3 数据组织架构 缓冲区指针总是指向0字节。USB核总是从缓冲区存储器读取4个字节。实际上通过第N个交换的最后字节取决于缓冲区的大小。最大数据包的大小必须是4个字节的倍数。3.2DMA操作DMA操作允许介于USB核和Wishbone总线之间完全透明的数据移动。一旦开启之后,正常的操作便不需要功能微控制器的干预。每个结点都有一对相关的DMA_REQ和DMA_ACK信号。当位于CSR寄存器里的DMAEN位被设置,USB核便会使用DMA_REQ和DMA_ACK信号来控制DMA数据流。当缓冲区里有数据或者空的需要填充,DMA_REQ信号便会被声明。每传输一个字DMA必须返回一个DMA_ACK信号。在DMA模式,USED位不再被使用并且经常是清零的。在DMA模式,只有缓冲区0被使用。缓冲区1在DMA模式不会被使用。在USB存储器缓冲区内缓冲区0和外部DMA必须被设置成同样的地址。当指定数量的字节通过时它们应该被设置成同样的缓冲区大小并被打包一起。 缓冲区必须至少能装载一个MAX_PL_SZ数据包。取决于DMA和外部总线潜在可能需要装载更多的数据包。由于USB核不支持数据转换,MAX_PL_SZ被设置成4字节的倍数。对于输出结点无法保证接收数据包是4字节的倍数。USB核提供了一个机制去解决这些问题:无论何时只要接收的数据包小于MAX_PL_SZ,系统便会自动产生一个中断来通知该状态的功能控制器。缓冲区1的域的大小会提示该数据包的实际大小。USB核会填补MAX_PL_SZ的字节让DMA转换不中断。如果位于结点CSR寄存器的OTS_STOP被设置,该结点会失去作用并给予功能控制器足够的时间去处理短的数据包。功能控制器可以通过设置位于结点CSR寄存器的EP_DIS域来重新使能该结点。3.3PID序列USB使用PID序列来保持数据同步传输。它也提供了一个机制去恢复和同步数据当同步过程出现紊乱。由于包的破碎同步可能出现问题,进而导致产生不良的CRC码。USB核完全实施USB相关的PID同步和恢复规定。同步结点不提供关于自动恢复因不同步而丢失数据的处理办法。USB核会自动和主机同步,然而由于同步结点没有相关的握手状态,因此无法告诉主机相关的失败情况。USB核提供一个“PID序列中断”来为上述情况提供中断以此告诉功能控制器相关事件。这个中断仅会被同步结点声明。对于其它结点来说它没有任何意义并且自动关闭。第四章控制器设计4.1UTMI接口UTMI(USB Transceiver Macrocell Interface)为协议层和设备物理层芯片提供了一个标准的接口。这个接口主要负责:一提供收发器芯片和协议层控制器模块间的数据传输通道,即在不改变其原有时序的情况下利用寄存器对收发数据缓存一个周期;二是侦测USB总线上的事件,实现设备在不同状态间的转换,控制IP在不同模式下工作。在高速接收状态下,RXActive和RXValid两个信号位在复位同时被置0,当收发器侦测到总线上的同步数据序列时,RXActive信号位置1,然后在侦测到PID后再将RXValid置1,这时进入数据接收状态。发送状态和接收类似,即也是TXValid和TXReady的先后赋值。图4.1a UTMI发送数据 时序仿真图UTMI接口模块根据侦测到的事件发出一系列控制信号来进行相应的处理。因而在UTMI模块中设计了一个状态机来实现上述功能。下图描述该状态机的转换机制。 图4.1b 状态机转换机制USB设备接口有4个状态:上电/复位、正常状态、暂停和复位。正常状态时USB设备控制器可以和UTMI进行数据交换,其它状态则不行。复位时,设备控制器可以进行速度模式间的切换。暂停时的设备控制器内部停止工作,直到主机通过USB总线传递唤醒信号才会退出暂停模式。下图则为UTMI电路综合图。图4.1c UTMI电路综合图4.2协议层(Protocol Layer)协议层由三个模块组成,分别是:组包模块、协议引擎模块、解包模块。它负责解释和处理USB的绝大部分基本功能。通过对数据包进行解析/组装,去除/加上PID和CRC校验字段,将处理过的数据缓存到USB2.0的缓冲区内进行再处理。组包模块(Packets Assembler)得到协议引擎模块的控制信号后,从缓冲区获取原始数据并加上包好的PID和CRC校验码,然后将处理后的数据发送给UTMI,最后数据将经由收发器进行并串转换传输出去。协议引擎模块(Protocol Engine)是整个PL层的核心。它根据解包模块对接收到的数据包进行PID解码,并做出相应的处理;控制组包模块的数据包装处理以及发送,实时监测USB设备的状态寄存器并对之进行更新;利用USB状态寄存器内置中断位信息提出中断;提供对传输错误的恢复机制。解包模块(Packets Disassembler)和PA模块的工作机制相反,它通过对每个数据包的剥离解析来得到其对应的设备地址、结点号等。当收发器得到SYNC码之后就会通知PD模块做好接收准备,然后在收发器芯片收到同步码后的第一个时钟周期后PD模块就会开始进行数据采样。所以类型的包前8位都是其PID和校验位,可以通过这点进行判断接收数据是否正确。判断数据无误后再根据PID字段来分析该包是令牌包、数据包或者握手包,并把分析结果传送给协议引擎模块。可通过如下语言描述这一过程:assign pid_TOKEN=pid_SETUP|pid_PING |pid_OUT|pid_IN| pid_SOF;assign pid_DATA=pid_DATA0|pid_DATA|pid_DATA2 |pid_MDATA;下图是PL层的时序仿真情况:图4.2a PL层时序仿真图图4.2b PL层电路综合图4.3控制和状态寄存器寄存器可以用来暂存状态、指令、数据,是控制器内重要的组成部分。根据之前所述,控制器中所定义的寄存器均为32位,分为两种:一是负责描述控制器环境的状态寄存器,包括总线状态、传输模式以及中断的设置;另一种则是针对每个结点的寄存器。数据的传输通过结点(Endpoint)进行。控制器通过写结点寄存器来配置使用结点。该控制器最多可以使用16个结点,每个结点对应有4个寄存器,分别是Ep*_CSR、Ep*_INT、Ep*_BUF0和Ep*_BUF1。可以利用地址addr8:4来选择结点号,addr3:2选择寄存器类型。具体使用方式可以参照下图:图4.3a 寄存器使用相关USB设备工作时候,会根据当前操作状态而把对应的值写入状态寄存器内,使USB协议层只需要访问其寄存器就可以获得当前系统状态信息。其中的包含了中断寄存器,它的每一位代表一种中断请求,有:断点未配置、不支持的PID、收到错误数据包、握手错误等等情况。下图是对该模块进行的模拟状况:图4.3a 控制和状态寄存器电路综合图4.3b 控制和状态寄存器时序仿真图4.4缓存接口和仲裁器缓存(存储器)接口和仲裁器的硬件实现机制如图所示。它们主要由多路选择器构成。图4.4a 存储器和仲裁器的硬件实现机制图实际操作上大部分数据通讯都必须经由该模块,然后根据当前状况把缓冲区中的数据送往接口电路或总线上的其它连接设备并暂存。根据传输方式和方向的区别,该模块存在有四种传输途径:1.USB协议控制器到存储接口和仲裁器到控制器2.控制器到存储接口和仲裁器到USB协议控制器3.USB协议控制器到存储接口和仲裁器到缓冲区4.缓冲区到存储控制器到USB协议控制器存储器接口和仲裁器两者都利用内部DMA方式来访问SSRAM。当外部总线传递访问SSRAM请求且PL层没有请求访问存储器时,控制逻辑引用Verilog HDL语言描述如下:assign wsel=(wreq | wack) & ! mreq;always (wsel or wdin or mdin)if(wsel) sram_dout=wdin;else sram_dout=mdin;always (wsel or wadr or madr)if(wsel) sram_adr=wadr;else sram_adr=madr;always (wsel or wack or wwe or wreq or mwe or mcyc)if(wsel) sram_we=wreq & wwe;else sram_we=mwe & mreq;其中wreq、wack分别是外部总线和存储器之间的请求和响应信号,wwe、wadr、wdin分别是外部总线给出的数据写入、地址和数据,mreq是内部DMA向存储器发送的信号请求,mdin、madr和mwe分别为内部DMA给的数据、地址与信号写入。图4.4b 仲裁器电路综合图图4.4a 仲裁器时序仿真图第五章 IP核的仿真与综合整个USB IP核的代码在编写完毕之后,需要对其进行语法功能等的验证。验证过程贯穿整个IC设计流程,对从行为级HDL设计到tape-out之前都需要做足够多的验证工作。验证旨在保证设计时所实现的功能特性是正确无误的,是和设计计划中的目的功能特性是一致的。验证的目的在于证明设计没有逻辑和功能错误,不过实际操作过程中,它只能证明某些错误的存在而不能完全解决或避免后续问题的发生,因而它是一个穷举设计中可能存在的错误的过程。验证一般包括以下步骤:根据系统设计方案创建一个功能验证平台,整个验证计划构成了功能验证环境的基本框架。创建验证的平台按照验证计划对待验证对象给予一定激励,在仿真器

温馨提示

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

评论

0/150

提交评论