一种高速USB设备控制器IP核的设计与实现
据PID 确定数据及传输类型。因此该模块实际上是4 个进程处理:IN、OUT、SETUP 事务以及特殊事务。在具体的模块设计实现中, 由于解包(Packet disassemble)、打包(Packet assemble)过程在4 个进程中都必不可少,所以统一编写而在PL 顶层调用。内部状态机的翻转以及复位都是以事务为周期,所以实现起来比较容易。在接收数据时,解析出各种令牌以及把数据包的内容写入RAM 中, 完毕以后填写相应的接收信息。发送数据时,从RAM 中读取数据并形成正确的数据PID。如果是0 长度的数据,则只有2 个字节的全0 CRC16 校验码。在一个事务的握手(handshake)阶段,则根据接收情况提交握手信号。图4(b)中给出了一个PID 为IN 令牌包的流程。 在USB 规范中,PID 为SETUP 标志的控制传输也称作消息(Message)传输,其实际上可以理解成为一种特殊的OUT 传输, 主要用来对USB 设备的配置以及向设备发送和数据传输相关的命令字。有着固定的格式:以PID[3:0]=1101 的SETUP 令牌包开始的建立阶段+数据阶段+状态阶段。数据阶段可以没有, 如HOST 给设备下放地址时的控制传输,但是状态阶段是必需的,以确保传输的正确性。 3.2.4 MIA 存储接口仲裁。存储管理设计的好坏直接影响控制器整体性能,需要谨慎处理。对存储单元进行读、写操作者是HOST 与MCU 两者。设计中要注意的是MCU 的读写信号与内部时钟的同步问题,这在后面部分还会进一步讨论。 3.2.5 DPRAM 与CSR DPRAM 暂存传输中事务的数据, 同时把该次事务的接收状态信息写入对应的CSR(状态控制寄存器)。本设计把DPRAM 配置成端点FIFO,共16个, 总容量为8K。MCU 的工作是基于中断的,当SIE 给出中断时,首先会读出相应端点的CSR 从而知道中断产生的原因以及上次事务的状态:成功或失败。若失败则进入相应的中断例行程序。 3.3 设计中若干问题及其解决 3.3.1 端点的存储管理单元(MMU) 在USB1.x 规范中,由于数据有效载荷较小,纯粹意义上的FIFO, 由于不需寻址即可实现存取操作、逻辑控制简单等原因而作为端点的最好实现方法。但在USB2.0 规范中,由于带宽、吞吐量剧增,且FIFO 不便动态配置等原因, 故端点存储选择RAM来实现。无论在FPGA 设计还是ASIC 设计中,都可使用两种类型的RAM:单口(single port)RAM 与双口(dual port)RAM。对于双口RAM,其特别之处在于可同时读写, 即HOST 与MCU 可以同时对同一个端点进行读写操作。比如在由HOST 到设备方向的高速同步传输中,如果使用SPRAM 的话,同步端点的深度至少应配置为1024 (除非使用双缓冲)且必须等到端点"Full"然后才产生中断让MCU 读取端点内的数据。因此为了实现同步传输,SPRAM 配置实现的话,为了节省存储单元而一般需要双缓冲机制, 但增加了端点读写控制的复杂性; 而双口RAM 由于能够同时对不同地址的存储单元进行读写(如果同时读写相同地址的话,则看RAM 具体的时序了),因此双口RAM 只需要很少的缓冲存储容量就可以满足了, 为了使MCU 能够及时地读取数据,同时,又不致对MCU 的中断过于频繁,只要在写入到端点深度的一半处产生中断信号即可。因此设计中采用DPRAM,既可节省存储资源(减小了芯片面积),又可提高同步传输的"实时同步"性。 3.3.2 异步时钟域之间的数据交互 从前面的功能划分可以看到,整个USB 设备控制器分成3 个不同的时钟域。时域1 和时域2 之间实际上是同步的, 因为PHY 为时域2 提供了与数据同步的30MHz 的时钟,所以这里的异步时钟域主要是指时域2 与时域3 之间, 这在SIE 与MCU 之间的读写信号很容易看到。由于MCU 发出的最小读写有效脉宽比时域2 内的时钟周期要小很多,比如在本设计中最小读写脉宽为15ns,而内部的时钟为30MHz(T=33.3ns)。当MCU 要读取数据时,可以采用"超前送数"策略,即根据MCU 的读写命令字在读有效信号来之前把数据放入三态数据输出端口的输入端, 用读有效电平作为三态的开关即可。 MCU 读完本次数据以后,SIE 内部的异步读写控制逻辑立即对内部的MMU 产生一个读请求(如果还没有读空),准备好下一个数据。整个MMU 收到的读写信号是由异步读写控制逻辑内部产生的,对MCU 接口透明, 该方法在FPGA 验证中实现通过。 上述异步读写控制逻辑的设计是基于8051 类MCU的,值得注意的是,若MCU 是wishbone SoC 总线规范兼容的接口, 则不需上述复杂的读写控制逻辑,在这两个时钟域之间交换数据时,为了解决亚稳态问题,只须增加一级由本地时钟触发的寄存器实现作为过渡即可。 3.3.3 传输中一些错误检测及其处理 为了精简MCU 的编程,设
- STM32F407高速USB口速度测试(11-23)
- 为什么高速USB并不一定表示手机拥有高速性能(03-14)
- 高速USB IP核的设计与开发(08-31)
- PCI总线从设备控制器的设计与实现(11-14)
- μC/GUI在基于NiosⅡ嵌入式开发平台的环境智能监控系统中的移植与应用(01-14)
- 基于Zynq的OLED驱动设计(10-04)