USB2IP核的设计与FPGA实现.docx
《USB2IP核的设计与FPGA实现.docx》由会员分享,可在线阅读,更多相关《USB2IP核的设计与FPGA实现.docx(21页珍藏版)》请在冰豆网上搜索。
![USB2IP核的设计与FPGA实现.docx](https://file1.bdocx.com/fileroot1/2023-2/3/ee372cf3-eabd-410f-aa67-f24e7fa09f54/ee372cf3-eabd-410f-aa67-f24e7fa09f541.gif)
USB2IP核的设计与FPGA实现
USB2IP核的设计与FPG◎现
本文介绍了一种USB2.0设备控制IP核的设计方法。
先总结控制器的功能和
内部结构。
再来是控制器的接口和扩展芯片。
然后是内部数据读取方式。
接着是
UTMI接口、PL层、存储器接口和仲裁器,控制状态寄存器,最后通过verilogHDL
实现IP核的的设计和功能验证。
经过几年的发展通用串行总线(USB)已经演化成了电脑和外设的连接标准。
在众多嵌入式应用里从鼠标键盘到相机移动电话等都可以通过USB方便地与电脑互连。
随着新的USEB准的诞生,数据高速传输已经成为了可能,然而与之而来的是使用的多样化和复杂化。
当前主流的解决方案是使用USBfi制器来检测并对US端口发生的事件进行回应。
目前市场上供应的USB空制器主要有两种,一种是把微处理器集成在一个芯片里打包处理,另一种则是利用外部的微控制器来
管理USB空制器的寄存器、设备描述符的内容读取和外部数据交换,这里的USB芯片仅处理USB通信。
本文所设计的控制器属于后者。
IP核(知识产权核,intellectualpropertycore),是指某一方提供的、形式为逻辑单元、芯片设计的可征用模块。
它分为软核、硬核和固核。
软核通常是与工艺无关、具有寄存器传输级硬件描述语言描述的设计代码,可以进行后续设计;硬核是前者通过逻辑综合、
布局、布线之后的一些列工艺文件,具有特定的工艺形式、物理实现方式;固核则通常介于上面两者之间,它已经通过功能验证、时序分析等过程,设计人员可
以以逻辑门级网表的形式获取。
本文所介绍的USBIP核处于软核阶段,以Verilog
HDL语言描述文本的形式提交使用,并经过仿真验证,可以用它综合出正确的门级网表。
第一章控制器结构原理
本文所设计的USB2.0设备控制器可以用来进行USB协议处理和数据间交换,实现USB通讯。
根据USB2.0协议,控制器对USB总线上的差分信号进行NRZI解码和位解填充,然后经过用行转并行转换接着分组拆装,把需要的数据放入RAM区;也可以进一步把RAM区里的数据组装成协议所规定形式(分组),再利用差分驱动电路并行转用行、位填充NRZI编码输出到USB总线然后传回主机(逆过程)。
按照USB2.0设备控制器的希望功能,控制器可以划分为如下模块:
UTMI(USBTransceiverMacmcellInterface)、协议层PL(ProtocolLayer)、存储器
图1.1USB2.0控制器结构
第二章控制器与外部芯片的接口
USB2.0控制器和外部芯片的接口包括下列3种情况:
和单口同步静态存储器(SSRAM)间的、与MCU(微控制器)间的以及和外部UTMI间的接口。
USB有两个时钟域。
UTMI块执行的时钟来源于PHY。
PHY提供的最大时
钟输出能达到60MHz。
实际时钟频率依据操作模式(全速/高速)的改变作调整。
UTMI块和USB核保持同步的逻辑。
所有模块执行的时钟来源于主机接口。
由
于USB延迟的需要,主机接口需要频率不少于60MHz的时钟。
控制器和UTMI的接口遵循UTMI规范。
UTMI接口信号含有:
USB总线状
态信号LineState[1:
0]、设置UTMI工作模式的信号位、检验或标志发送数据的信
号(TxValid、TxReady等等)、检验或标志接收数据的信号(RxActive、RxValid、RxError等等)以及8位双向数据线、60MHz时钟信号。
根据之前时钟描述,USB
的时钟域完全可以满足数据传输的要求。
控制器要求的外部存储器使用标准单口SRAM,容量大小为215*16bit=64kB。
其中读写信号(SSRAM_RD和SSRAM_WE)、16位数据线SSRAM_DATA和15位地址线SRAM_ADDR均属于信号接口。
和微控制器间的接口信号则包括:
16位数据线DATA、16位地址线ADDR、
读写请求信号、中断请求信号和DMA请求响应信号(DMA_REQ与DMA_ACK)。
其中对于16位地址线,低15位addr[14:
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,那么域的大小会显示还剩多少比特没被使用。
对
于输入缓冲器没有这些限制。
核总会试图传输最大数量的比特。
最大可能数量的
比特总是比一个最大有效负载和剩余缓冲器容量小。
BufferSEeafter1sttransaction
LocalButlerMemory
图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核支持小端字节序列。
B/te3
By的2
Byte1
By由0
37
0
24231615
图3.1.3数据组织架构
缓冲区指针总是指向0字节。
USB核总是从缓冲区存储器读取4个字节。
实际上通过第N个交换的最后字节取决于缓冲区的大小。
最大数据包的大小必须是4个字节的倍数。
3.2DMA!
作
DMAM乍允许介于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(USBTransceiverMacrocellInteface)为协议层和设备物理层芯片提供了一个标准的接口。
这个接口主要负责:
一提供收发器芯片和协议层控制器模块间的数据传输通道,即在不改变其原有时序的情况下利用寄存器对收发数据缓存一个周期;二是侦测USB总线上的事件,实现设备在不同状态间的转换,控制IP在不同模式下工作。
在高速接收状态下,RXActive和RXValid两个信号位在复位同时被置0,当收发器侦测到总线上的同步数据序列时,RXActive信号位置1,然后在侦测到PID后再将RXValid置1,这时进入数据接收状态。
发送状态和接收类似,即也是TXValid和TXReady的先后赋值。
图4.1aUTMI发送数据时序仿真图
UTMI接口模块根据侦测到的事件发出一系列控制信号来进行相应的处理。
因而在UTMI模块中设计了一个状态机来实现上述功能。
下图描述该状态机的转换机制。
设为F5槿式井笥带100m与
置也设各迂接
设为HS
帽式
图4.1b状态机转换机制
USB设备接口有4个状态:
上电/复位、正常状态、暂停和复位。
正常状态时USB设备控制器可以和UTMI进行数据交换,其它状态则不行。
复位时,设备控制器可以进行速度模式间的切换。
暂停时的设备控制器内部停止工作,直到主机通过USB总线传递唤醒信号才会退出暂停模式。
下图则为UTMI电路综合图。
4.2协议层(ProtocolLayer)
协议层由三个模块组成,分别是:
组包模块、协议引擎模块、解包模块。
它负责解释和处理USB的绝大部分基本功能。
通过对数据包进行解析/组装,去除/加上PID和CRC校验字段,将处理过的数据缓存到USB2.0的缓冲区内进行再处理。
组包模块(PacketsAssembler)得到协议引擎模块的控制信号后,从缓冲区获取原始数据并加上包好的PID和CRC校验码,然后将处理后的数据发送给UTMI,最后数据将经由收发器进行并用转换传输出去。
协议引擎模块(ProtocolEngine)是整个PL层的核心。
它根据解包模块对接收到的数据包进行PID解码,并做出相应的处理;控制组包模块的数据包装处理以及发送,实时监测USB设备的状态寄存器并对之进行更新;利用USB状态寄存器内置中断位信息提出中断;提供对传输错误的恢复机制。
解包模块(PacketsDisassembler和PA模块的工作机制相反,它通过对每个数据包的剥离解析来得到其对应的设备地址、结点号等。
当收发器得到SYNC码之后就会通知PD模块做好接收准备,然后在收发器芯片收到同步码后的第一个时钟周期后PD模块就会开始进行数据采样。
所以类型的包前8位都是其PID和校验位,可以通过这点进行判断接收数据是否正确。
判断数据无误后再根据PID字段来分析该包是令牌包、数据包或者握手包,并把分析结果传送给协议引擎模块。
可通过如下语言描述这一过程:
assignpid_TOKEN=pid_SETUP|pid_PING|pid_OUT|pid_IN|pid_SOF;
assignpid_DATA=pid_DATA0|pid_DATA|pid_DATA2|pid_MDATA;
下图是PL层的时序仿真情况:
图4.2aPL层时序仿真图
图4.2bPL层电路综合图
4.3控制和状态寄存器
寄存器可以用来暂存状态、指令、数据,是控制器内重要的组成部分。
根据之前所述,控制器中所定义的寄存器均为32位,分为两种:
一是负责描述控制
器环境的状态寄存器,包括总线状态、传输模式以及中断的设置;另一种则是针
对每个结点的寄存器。
数据的传输通过结点(Endpoint)进行。
控制器通过写结点寄存器来配置使用结点。
该控制器最多可以使用16个结点,每个结点对应有4个寄存器,分别是Ep*_CSR、Ep*_INT、Ep*_BUF0和Ep*_BUF1。
可以利用地址addr[8:
4]来选择结点号,addr[3:
2]选择寄存器类型。
具体使用方式可以参照下图:
addrf3r2]
3130
1716150
.(>H[17:
茹
端点更型LpCillf15-24悔手工型
Ep.厘
CD
m
净M理点00中南传嵯|
—IMT
01
1nlinrm|4IntrirujilSiiijky-
0)
INft*DI同心竹母
10
L
IhifEnOSn-
10
CM丁端点10鹏尼传%
3n刖F|
11
U
Mtri)Sinr
D
依用11球第
图4.3a寄存器使用相关
USB设备工作时候,会根据当前操作状态而把对应的值写入状态寄存器内,
使USBfe议层只需要访问其寄存器就可以获得当前系统状态信息。
其中的包含了中断寄存器,它的每一位代表一种中断请求,有:
断点未配置、不支持的PID、收到错误数据包、握手错误等等情况。
下图是对该模块进行的模拟状况:
图4.3a控制和状态寄存器电路综合图
4.3b控制和状态奇存器时序仿真图
4.4缓存接口和仲裁器
缓存(存储器)接口和仲裁器的硬件实现机制如图所示。
它们主要由多路选择器构成。
图4.4a存储器和仲裁器的硬件实现机制图
实际操作上大部分数据通讯都必须经由该模块,然后根据当前状况把缓冲区中的数据送往接口电路或总线上的其它连接设备并暂存。
根据传输方式和方向的区别,该模块存在有四种传输途径:
1.USB协议控制器到存储接口和仲裁器到控制器
2.控制器到存储接口和仲裁器到USB协议控制器
3.USB协议控制器到存储接口和仲裁器到缓冲区
4.缓冲区到存储控制器到USB协议控制器
存储器接口和仲裁器两者都利用内部DMA方式来访问SSRAM。
当外部总线传递访问SSRAM请求且PL层没有请求访问存储器时,控制逻辑引用VerilogHDL语言描述如下:
assignwsel=(wreq|wack)&!
mreq;
always@(wselorwdinormdin)
if(wsel)sram_dout=wdin;
elsesram_dout=mdin;
always@(wselorwadrormadr)
if(wsel)sram_adr=wadr;
elsesram_adr=madr;
always@(wselorwackorwweorwreqormweormcyc)
if(wsel)sram_we=wreq&wwe;
elsesram_we=mwe&mreq;
其中wreq、wack分别是外部总线和存储器之间的请求和响应信号,wwe、wadr、
wdin分别是外部总线给出的数据写入、地址和数据,mreq是内部DMA向存储器发送的信号请求,mdin、madr和mwe分别为内部DMA给的数据、地址与信
图4.4b仲裁器电路综合图
011*41
国ri4in
国,由,M
wgg*
rst[3.口』_,加国IxirWi_Jbn.13弛邮_„
Eirwri_r国Y国情dkTi
EITd:
7Tltw?
q
N1叫
[n:
l[nr:
n]:
n]
rn:
rr.iTarn]
OOHi]
ILI-山_山]」]⑪
K1F
DMl口而]Bdr
图4.4a仲裁器时序仿真图
第五章IP核的仿真与综合
整个USBIP核的代码在编写完毕之后,需要对其进行语法功能等的验证。
验证过程贯穿整个IC设计流程,对从行为级HDL设计到tape-out之前都需要做足够多的验证工作。
验证旨在保证设计时所实现的功能特性是正确无误的,是和设计计划中的目的功能特性是一致的。
验证的目的在于证明设计没有逻辑和功能错误,不过实际操作过程中,它只能证明某些错误的存在而不能完全解决或避免后续问题的发生,因而它是一个穷举设计中可能存在的错误的过程。
验证一般包括以下步骤:
根据系统设计方案创建一个功能验证平台,整个验证计划构成了功能验证环境的基本框架。
创建验证的平台
按照验证计划对待验证对象给予一定激励,在仿真器中进行仿真。
分析住址输出结果,与预期结果进行比较,直至满足覆盖目标。
功能仿真是验证的主要形式和目标,其对象是RTL模型,目的是检查寄存器传输级模型是否满足设计需要。
功能验证使用测试平台验证被测设计对象的功能,测试平台是根据设计对象的规约建立起来的。
本文使用的是Altera公司的设计的Quartusii软件进行仿真。
根据上文所描述的模块,先对各部分子模块进行仿真,接着对于TOP级进行整体的综合仿真。
以下是整体USB核的仿真结果。
下图是各部分主程序模块间的从属关系,可以比较清晰地看出整体程序的布局和调用情况。
血总Loy胤
usbftop,v
tisbldefines.isincludedbyallrriodjles.
图5b程序布局图
下图是整体USB核设计的时序图
21山w叵
JjT
1■心曲的2闻1
HciiirLel
-rjaiLi-免审日上Lr口LeSn.■『K7.■d_D
k『$」」&「
rm.」0口力5B皿Lo3jp3_0w的丁血力式”TCtBt.-3i._F*a_e.
lo^AkkCt_J>AX_tdKi*■*_,4*」*4*L。
LTt6_r-LSitte-
in
in
■nnnnjmnnmLwmnrmjmnnrjnnnnjLwmnnjumnnwijmnnrmnr
IFOIIDT
rit_L
图5cTOP层时序仿真图
第六章结束语
随着微电子技术的日新月异,越来越多的系统设计师们加入到设计专用集成
电路芯片的队伍里,并且对于芯片的设计周期的要求也越来越苛刻。
因此对于IP
核的数量和质量也成为了人们日益追求的目标。
本文对USB2.0协议进行了较为深入的研究,对于USB设备接口规范进行了详细的分析,在此基础上完成了USB2.0设备接口IP核的设计。
根据自下而上模块化的设计思想,将设计分成UTMI模块、PL协议层模块、控制和状态寄存器
模块、缓冲和仲裁器模块4个部分。
并对该设计进行功能仿真和综合。
当然因为时间和条件的限制,该设计也有不足的地方,即对整个设计的验证工作
仅仅进行了功能仿真而没有做FPGA验证和后续的工作。
今后可以针对以上不足进行展开,让整个系统的性能更加完备。
近年来,USB发展了OTG(On-The-Go)等新技术,该技术允许两个或两个以
上的USB设备不需要经由主机就可以进行通讯。
但是由于时间紧迫,本论文没
有对OTG技术进行讨论和实现,这些内容有待完成。
USB3.0的协议规范也已经
出台,更高速便利的USB正开始走入人们生活,希望它越来越好。