APP下载

基于FPGA的USB PD控制器的设计与实现∗

2020-07-13牛雨萌焦继业

计算机与数字工程 2020年5期
关键词:状态机校验数据包

牛雨萌 焦继业 李 晨

(西安邮电大学电子工程学院 西安 710121)

1 引言

目前市场上新发布的主流手机机型,已全面开始使用 USB Type-C[1]接口,且飞利浦、乐视等厂商已经推出USB Type-C接口的数字耳机,USB Type-C在消费类电子市场中得到了广泛应用[2]。相比于传统USB接口[3],最大的不同在于USB Type-C接口中新定义了一条CC线,USB PD[4]协议就是基于USB Type-C接口中的CC线实现的,它是一种主从单线通讯协议,不仅是用于实现快速充电的协议,实际上,USB PD是USB Type-C的灵魂所在。它与USB Type-C接口的结合可支持高达20V/5A的标准电能传输,利用协议中的VDM[5]消息建立 Type-C 替代模式的连接,可实现 DisplayPort[6~7]、HDMI[8]等高速数据传输,具有良好的应用前景[9]。

本文设计并实现了一种USB PD控制器,完成了PD数据包的正确发送、接收及校验,并利用FP⁃GA进行验证[10]。FPGA(Field-Programmable Gate Array),即现场可编程门阵列,具有丰富的可编程逻辑单元、嵌入式块RAM、可编程输入输出单元等硬件资源,可以在其内部灵活实现各种数字电路设计。因此,采用FPGA技术进行验证,可以快速修改代码中的错误,为后续的IC设计提供正确保障。

2 PD控制器总体方案

USB PD协议采用BMC编码,标准数据包格式如图1。每个包的起始和结束分别以固定的64bit0/1交替的序列和01101作为标志;SOP*定义了通信类型;Message Header定义了数据对象的个数、Mes⁃sage ID、电力角色、数据角色、版本信息、消息类型等信息;Data Object是0~7个32bit数据对象,若该部分不存在则此条消息为控制消息,CRC为校验码,用于检测包内容在传输过程中是否出错。

图1 PD控制器总体框图

本文采用自顶向下的设计方法,先根据功能要求设计总体方案,再针对核心模块逐步细化[11]。如图2为PD控制器的总体框图。系统时钟clkin为20Mhz,rst为系统复位信号,高有效。PD控制器主要由PD_TX、PD_RX、CRC32校验、波特率控制四个模块组成,其中PD_TX和PD_RX是设计的核心模块,负责PD数据包的发送和接收。CRC32[12]校验模块负责数据在传输过程中的检错。波特率控制模块用于控制数据传输的速度。

图2 PD控制器总体框图

3 PD控制器模块设计

3.1 波特率控制模块设计

本文将标准时间设为300kHz,系统时钟为20MHz,因此设定波特率控制寄存器mcpr0的值为20MHz/300kHz-1=66;采样波特率控制寄存器mcsamp的值应设为20MHz/300kHz/4=16。

3.2 PD_TX模块设计

PD_TX模块[13]主要完成以下功能:接收从协议层发送来的PD消息数据包、将CRC32值添加至数据包尾、完成数据包的4b5b编码、BMC编码并将编码后的数据包发送至CC线。如图3为PD_TX的模块内部结构图,可细化为四个部分:4b5b编码模块、移位控制模块、发送控制模块和BMC编码模块。TX_STATE与外部信号交互,控制着整个发送过程。bmctl[4:0]、bmcth[4:0]及bmct4t5[7:0]用于存放待发送的数据,CRC32校验值需要调用CRC32校验模块进行计算。存入bmct4t5[7:0]的值分为高四位bmct4t5[7:4]和低四位bmct4t5[3:0]两部分,经过4b5b编码模块输出至由Loaden0控制的数据选择器。数据选择器的输出经过移位寄存器的右移操作每次将最低位tx_buf[0]输出至CO_STATE状态机进行BMC编码。loaden0、load⁃en1、pdtxbf、dly_ok、tx_ok为内部控制信号,pdtx_da⁃ta为最终发送的数据。

图3 PD_TX内部结构图

发送控制模块是该模块的核心,采用状态机设计实现,该状态机的状态转移图如图4所示。其中,pdtxen是发送使能信号;mcpr0是波特率控制器寄存器;mct0是一个七位计数器,其值与mcpr0的值相等时则发送一位数据并清零;bmcr_cnt是一个两位计数器,当计数器mct0计数到mcsamp的值时自加1,当mct0计数到mcpr0时清零,最大计数到2'b11。当系统复位或发送使能信号无效时保持在TX_IDLE状态,发送使能信号有效则转移到TX_WAIT状态,该状态在等待待发送数据写入相应寄存器,loaden1和loaden0作为写入标志位,当其中任何一个为0时,则转移到TX_SYNC状态。pdtxdly[3:0]表示在发送第一个前导码之前延时的0的个数,用于控制TX_SYNC至TX_DLY或TX_OK的转移。dly_ok是延迟结束标志位,由初值为 pdtxdly的自减 1计数器 dly_cnt[3:0]控制,当dly_cnt=1时,dly_ok标志位置1,此时从TX_DLY转移到TX_OK。TX_BUF为发送状态,tx_buf[9:0]的值被{1'b0,tx_buf[9:1]}的值更新。tx_ok为数据发送完成标志,由一个初值为4、5或10的自减1计数器tx_cnt控制。pdtxbf为1时表示发送正在进行,应由TX_OK跳转到TX_BUF。

图4 发送状态机状态转移图

PD协议中规定数据以BMC码的形式传输,图3中的CO_STATE用来实现BMC编码,具体的状态转移图如图5所示。当TX_STATE=TX_BUF时状态机开始工作,根据 bmcr_cnt,mct0,mcpr0及 txbuf[0]的值来控制状态转移。若发送的数据为0则在一个发送波特率时间段内保持不变,若发送的数据为1则有翻转。

图5 BMC编码状态转移图

3.3 PD_RX模块设计

PD_RX模块主要完成以下功能:接收CC线上发来的数据、进行BMC解码、探测SOP和EOP、进行5b4b解码、验证CRC32的值,若正确则将PD数据包发送至协议层解析,若不正确则丢弃。如图6为PD_RX的内部结构图,可细化为BMC解码模块、移位控制模块、接收双缓存、5b4b解码模块、控制信号产生模块和RX_STATE控制模块。控制信号产生模块和RX_STATE与外部信号交互,控制着整个接收过程。接收到的数据由bmcr_ccdat进入BMC解码模块。移位控制模块将经过BMC解码的数据^bmcr_sdat依次右移进bmcr5b[4:0]作为接收双缓存模块的输入,该模块受bmcrcnt[2:0]控制,当该计数器计数到5即接收完一个5b数据时将bmcr5b的值赋给bmc_rlbf[4:0],同时bmc_rlbf[4:0]的值将赋值给bmc_rhbf[4:0],这两个寄存器的值经过5b4b解码模块输出最终结果bmcr5t4[7:0]。rcover为接收溢出标志,pd_rcif为接收中断标志,err_flag为错误标志。

图6 PD_RX内部结构图

从CC线接收数据之后应先进行BMC解码,如图7为BMC解码采样原理图,在一个发送波特率时间段内采样两次,如采样点①和采样点②的采样值分别为1和0,取它们的异或值则为BMC解码后的值。采样点③和采样点④同理。

图7 BMC解码采样原理图

RX_STATE和控制信号产生模块为接收模块的核心,其中接收状态机的状态转移图如图8所示。当系统复位或接收使能信号pdrcen无效时保持在IDLE状态,当pdrcen有效时转移到WAIT状态,等待接收数据。SYN64、SYN1、DATA和EOP分别对应接收一个标准的PD数据包中的64位前导码、SOP中的 sync-1、Data Object及 EOP状态。sync_flag64是PD数据包中前导码接收完毕标志位。由于前导码的0/1交替性,且每次计数到奇数所对应的值为0,每次计数到偶数所对应的值为1,利用此规则作为计数器preamble_cnt[5:0]自加1的条件,如不满足则清零。当前导码被判断正确时,从SYNC64跳转到SYNC1状态。sync1_flag、sync2_flag、sync3_flag、eop_flag分 别 为 接 收 到sync1、sync2、sync3及EOP标志位,均用5b数据寄存器bmcr5b的值来判定。当bmcr5b的值不等于sync-1、sync-2、sync-3、rst_1、rst_2及EOP中的任何一个并且5b4b译码失败时,表明接收到的数据有误,此时接收错误标志err_flag置1,并不再继续接收数据,直接跳转到IDLE状态。当位于EOP状态时,整个PD数据包已被正确接受完毕,此时无条件跳转到IDLE状态。

图8 接收状态机状态转移图

3.4 CRC32校验模块设计

为防止PD消息在传输的过程中出错或者丢失,PD_TX和PD_RX都要调用CRC32校验模块[14]。循环冗余检验(Cyclic Redundancy Check,CRC)作为数据传输中差错控制的基本方法之一,广泛应用于测控及通信领域中。PD_TX调用该模块对PD消息的Message Header和Data Object部分进行CRC32计算,PD_RX调用该模块对接收到的数据的相应部分再次进行CRC32计算,并与原来的CRC32的值进行比较,若一致表明数据接收正确,若不一致该数据包会被丢弃。CRC32校验的生成多项式为 G(x)=x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1,初始值为FFFF FFFFh。

4 设计验证

4.1 仿真

本设计在VCS+Verdi环境下进行功能仿真,仿真结果完全正确,由于仿真波形图较大,在此不再贴出。

4.2 验证

选用型号为EP4CE6E22C8N的FPGA作为验证平台,用mplab编写C文件配置相应寄存器,将编译生成的hex文件下载进FPGA,并与POWER-Z PD诱骗器连接,用逻辑分析仪抓取Type-C接口中的CC线上的PD通信波形,验证环境如图9所示。

图9 验证平台实物图

如图10为逻辑分析仪抓出来的PD通信波形:FPGA先给PD诱骗器发送一个标准PD数据包,PD诱骗器接收到之后应回复一个GOODCRC包;PD诱骗器给FPGA发送一个标准数据包,FPGA接收到之后也回复一个GOODCRC包。

图10 PD通信波形图

此外,由于PD数据包格式复杂且数据量很大,手动分析耗时耗力且不准确。为了更好地说明验证结果及方便未来进一步的研究与调试,用Python将逻辑分析仪导出的txt文件按格式读入,深入分析PD协议并编写PD数据包解析程序,程序运行结果可显示PD通信的细节,方便设计的调试与检错。

5 结语

本文深入研究了USB PD协议中的消息类型、消息格式、消息发送、接收和校验的机制,在此基础上设计并实现了一种基于FPGA的USB PD控制器,完成了接收模块、发送模块、CRC32校验模块、波特率控制模块的设计,并对每个模块的设计思路进行了说明[15],在VCS+Verdi仿真环境下通过了功能仿真,并且经过FPGA验证,验证结果表明该控制器可实现PD数据包的正确发送、接收及校验。后续将在此基础上做进一步研究,实现PD协议中VDM消息的通讯,使USB Type-C接口进入替代模式,完成视频的传输。

猜你喜欢

状态机校验数据包
复杂多耦合仿真模型校验工具研究
使用Excel朗读功能校验工作表中的数据
二维隐蔽时间信道构建的研究*
电能表在线不停电校验技术
基于Verilog 的有限状态机编程方式及研究
FPGA状态机综合可靠性探究 ①
民用飞机飞行模拟机数据包试飞任务优化结合方法研究
基于有限状态机的交会对接飞行任务规划方法
C#串口高效可靠的接收方案设计
精通文件校验的“门道”