牛雨萌 焦繼業(yè) 李 晨
(西安郵電大學(xué)電子工程學(xué)院 西安 710121)
目前市場(chǎng)上新發(fā)布的主流手機(jī)機(jī)型,已全面開(kāi)始使用 USB Type-C[1]接口,且飛利浦、樂(lè)視等廠商已經(jīng)推出USB Type-C接口的數(shù)字耳機(jī),USB Type-C在消費(fèi)類電子市場(chǎng)中得到了廣泛應(yīng)用[2]。相比于傳統(tǒng)USB接口[3],最大的不同在于USB Type-C接口中新定義了一條CC線,USB PD[4]協(xié)議就是基于USB Type-C接口中的CC線實(shí)現(xiàn)的,它是一種主從單線通訊協(xié)議,不僅是用于實(shí)現(xiàn)快速充電的協(xié)議,實(shí)際上,USB PD是USB Type-C的靈魂所在。它與USB Type-C接口的結(jié)合可支持高達(dá)20V/5A的標(biāo)準(zhǔn)電能傳輸,利用協(xié)議中的VDM[5]消息建立 Type-C 替代模式的連接,可實(shí)現(xiàn) DisplayPort[6~7]、HDMI[8]等高速數(shù)據(jù)傳輸,具有良好的應(yīng)用前景[9]。
本文設(shè)計(jì)并實(shí)現(xiàn)了一種USB PD控制器,完成了PD數(shù)據(jù)包的正確發(fā)送、接收及校驗(yàn),并利用FP?GA進(jìn)行驗(yàn)證[10]。FPGA(Field-Programmable Gate Array),即現(xiàn)場(chǎng)可編程門陣列,具有豐富的可編程邏輯單元、嵌入式塊RAM、可編程輸入輸出單元等硬件資源,可以在其內(nèi)部靈活實(shí)現(xiàn)各種數(shù)字電路設(shè)計(jì)。因此,采用FPGA技術(shù)進(jìn)行驗(yàn)證,可以快速修改代碼中的錯(cuò)誤,為后續(xù)的IC設(shè)計(jì)提供正確保障。
USB PD協(xié)議采用BMC編碼,標(biāo)準(zhǔn)數(shù)據(jù)包格式如圖1。每個(gè)包的起始和結(jié)束分別以固定的64bit0/1交替的序列和01101作為標(biāo)志;SOP*定義了通信類型;Message Header定義了數(shù)據(jù)對(duì)象的個(gè)數(shù)、Mes?sage ID、電力角色、數(shù)據(jù)角色、版本信息、消息類型等信息;Data Object是0~7個(gè)32bit數(shù)據(jù)對(duì)象,若該部分不存在則此條消息為控制消息,CRC為校驗(yàn)碼,用于檢測(cè)包內(nèi)容在傳輸過(guò)程中是否出錯(cuò)。
圖1 PD控制器總體框圖
本文采用自頂向下的設(shè)計(jì)方法,先根據(jù)功能要求設(shè)計(jì)總體方案,再針對(duì)核心模塊逐步細(xì)化[11]。如圖2為PD控制器的總體框圖。系統(tǒng)時(shí)鐘clkin為20Mhz,rst為系統(tǒng)復(fù)位信號(hào),高有效。PD控制器主要由PD_TX、PD_RX、CRC32校驗(yàn)、波特率控制四個(gè)模塊組成,其中PD_TX和PD_RX是設(shè)計(jì)的核心模塊,負(fù)責(zé)PD數(shù)據(jù)包的發(fā)送和接收。CRC32[12]校驗(yàn)?zāi)K負(fù)責(zé)數(shù)據(jù)在傳輸過(guò)程中的檢錯(cuò)。波特率控制模塊用于控制數(shù)據(jù)傳輸?shù)乃俣取?/p>
圖2 PD控制器總體框圖
本文將標(biāo)準(zhǔn)時(shí)間設(shè)為300kHz,系統(tǒng)時(shí)鐘為20MHz,因此設(shè)定波特率控制寄存器mcpr0的值為20MHz/300kHz-1=66;采樣波特率控制寄存器mcsamp的值應(yīng)設(shè)為20MHz/300kHz/4=16。
PD_TX模塊[13]主要完成以下功能:接收從協(xié)議層發(fā)送來(lái)的PD消息數(shù)據(jù)包、將CRC32值添加至數(shù)據(jù)包尾、完成數(shù)據(jù)包的4b5b編碼、BMC編碼并將編碼后的數(shù)據(jù)包發(fā)送至CC線。如圖3為PD_TX的模塊內(nèi)部結(jié)構(gòu)圖,可細(xì)化為四個(gè)部分:4b5b編碼模塊、移位控制模塊、發(fā)送控制模塊和BMC編碼模塊。TX_STATE與外部信號(hào)交互,控制著整個(gè)發(fā)送過(guò)程。bmctl[4:0]、bmcth[4:0]及bmct4t5[7:0]用于存放待發(fā)送的數(shù)據(jù),CRC32校驗(yàn)值需要調(diào)用CRC32校驗(yàn)?zāi)K進(jìn)行計(jì)算。存入bmct4t5[7:0]的值分為高四位bmct4t5[7:4]和低四位bmct4t5[3:0]兩部分,經(jīng)過(guò)4b5b編碼模塊輸出至由Loaden0控制的數(shù)據(jù)選擇器。數(shù)據(jù)選擇器的輸出經(jīng)過(guò)移位寄存器的右移操作每次將最低位tx_buf[0]輸出至CO_STATE狀態(tài)機(jī)進(jìn)行BMC編碼。loaden0、load?en1、pdtxbf、dly_ok、tx_ok為內(nèi)部控制信號(hào),pdtx_da?ta為最終發(fā)送的數(shù)據(jù)。
圖3 PD_TX內(nèi)部結(jié)構(gòu)圖
發(fā)送控制模塊是該模塊的核心,采用狀態(tài)機(jī)設(shè)計(jì)實(shí)現(xiàn),該狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)移圖如圖4所示。其中,pdtxen是發(fā)送使能信號(hào);mcpr0是波特率控制器寄存器;mct0是一個(gè)七位計(jì)數(shù)器,其值與mcpr0的值相等時(shí)則發(fā)送一位數(shù)據(jù)并清零;bmcr_cnt是一個(gè)兩位計(jì)數(shù)器,當(dāng)計(jì)數(shù)器mct0計(jì)數(shù)到mcsamp的值時(shí)自加1,當(dāng)mct0計(jì)數(shù)到mcpr0時(shí)清零,最大計(jì)數(shù)到2'b11。當(dāng)系統(tǒng)復(fù)位或發(fā)送使能信號(hào)無(wú)效時(shí)保持在TX_IDLE狀態(tài),發(fā)送使能信號(hào)有效則轉(zhuǎn)移到TX_WAIT狀態(tài),該狀態(tài)在等待待發(fā)送數(shù)據(jù)寫(xiě)入相應(yīng)寄存器,loaden1和loaden0作為寫(xiě)入標(biāo)志位,當(dāng)其中任何一個(gè)為0時(shí),則轉(zhuǎn)移到TX_SYNC狀態(tài)。pdtxdly[3:0]表示在發(fā)送第一個(gè)前導(dǎo)碼之前延時(shí)的0的個(gè)數(shù),用于控制TX_SYNC至TX_DLY或TX_OK的轉(zhuǎn)移。dly_ok是延遲結(jié)束標(biāo)志位,由初值為 pdtxdly的自減 1計(jì)數(shù)器 dly_cnt[3:0]控制,當(dāng)dly_cnt=1時(shí),dly_ok標(biāo)志位置1,此時(shí)從TX_DLY轉(zhuǎn)移到TX_OK。TX_BUF為發(fā)送狀態(tài),tx_buf[9:0]的值被{1'b0,tx_buf[9:1]}的值更新。tx_ok為數(shù)據(jù)發(fā)送完成標(biāo)志,由一個(gè)初值為4、5或10的自減1計(jì)數(shù)器tx_cnt控制。pdtxbf為1時(shí)表示發(fā)送正在進(jìn)行,應(yīng)由TX_OK跳轉(zhuǎn)到TX_BUF。
圖4 發(fā)送狀態(tài)機(jī)狀態(tài)轉(zhuǎn)移圖
PD協(xié)議中規(guī)定數(shù)據(jù)以BMC碼的形式傳輸,圖3中的CO_STATE用來(lái)實(shí)現(xiàn)BMC編碼,具體的狀態(tài)轉(zhuǎn)移圖如圖5所示。當(dāng)TX_STATE=TX_BUF時(shí)狀態(tài)機(jī)開(kāi)始工作,根據(jù) bmcr_cnt,mct0,mcpr0及 txbuf[0]的值來(lái)控制狀態(tài)轉(zhuǎn)移。若發(fā)送的數(shù)據(jù)為0則在一個(gè)發(fā)送波特率時(shí)間段內(nèi)保持不變,若發(fā)送的數(shù)據(jù)為1則有翻轉(zhuǎn)。
圖5 BMC編碼狀態(tài)轉(zhuǎn)移圖
PD_RX模塊主要完成以下功能:接收CC線上發(fā)來(lái)的數(shù)據(jù)、進(jìn)行BMC解碼、探測(cè)SOP和EOP、進(jìn)行5b4b解碼、驗(yàn)證CRC32的值,若正確則將PD數(shù)據(jù)包發(fā)送至協(xié)議層解析,若不正確則丟棄。如圖6為PD_RX的內(nèi)部結(jié)構(gòu)圖,可細(xì)化為BMC解碼模塊、移位控制模塊、接收雙緩存、5b4b解碼模塊、控制信號(hào)產(chǎn)生模塊和RX_STATE控制模塊??刂菩盘?hào)產(chǎn)生模塊和RX_STATE與外部信號(hào)交互,控制著整個(gè)接收過(guò)程。接收到的數(shù)據(jù)由bmcr_ccdat進(jìn)入BMC解碼模塊。移位控制模塊將經(jīng)過(guò)BMC解碼的數(shù)據(jù)^bmcr_sdat依次右移進(jìn)bmcr5b[4:0]作為接收雙緩存模塊的輸入,該模塊受bmcrcnt[2:0]控制,當(dāng)該計(jì)數(shù)器計(jì)數(shù)到5即接收完一個(gè)5b數(shù)據(jù)時(shí)將bmcr5b的值賦給bmc_rlbf[4:0],同時(shí)bmc_rlbf[4:0]的值將賦值給bmc_rhbf[4:0],這兩個(gè)寄存器的值經(jīng)過(guò)5b4b解碼模塊輸出最終結(jié)果bmcr5t4[7:0]。rcover為接收溢出標(biāo)志,pd_rcif為接收中斷標(biāo)志,err_flag為錯(cuò)誤標(biāo)志。
圖6 PD_RX內(nèi)部結(jié)構(gòu)圖
從CC線接收數(shù)據(jù)之后應(yīng)先進(jìn)行BMC解碼,如圖7為BMC解碼采樣原理圖,在一個(gè)發(fā)送波特率時(shí)間段內(nèi)采樣兩次,如采樣點(diǎn)①和采樣點(diǎn)②的采樣值分別為1和0,取它們的異或值則為BMC解碼后的值。采樣點(diǎn)③和采樣點(diǎn)④同理。
圖7 BMC解碼采樣原理圖
RX_STATE和控制信號(hào)產(chǎn)生模塊為接收模塊的核心,其中接收狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)移圖如圖8所示。當(dāng)系統(tǒng)復(fù)位或接收使能信號(hào)pdrcen無(wú)效時(shí)保持在IDLE狀態(tài),當(dāng)pdrcen有效時(shí)轉(zhuǎn)移到WAIT狀態(tài),等待接收數(shù)據(jù)。SYN64、SYN1、DATA和EOP分別對(duì)應(yīng)接收一個(gè)標(biāo)準(zhǔn)的PD數(shù)據(jù)包中的64位前導(dǎo)碼、SOP中的 sync-1、Data Object及 EOP狀態(tài)。sync_flag64是PD數(shù)據(jù)包中前導(dǎo)碼接收完畢標(biāo)志位。由于前導(dǎo)碼的0/1交替性,且每次計(jì)數(shù)到奇數(shù)所對(duì)應(yīng)的值為0,每次計(jì)數(shù)到偶數(shù)所對(duì)應(yīng)的值為1,利用此規(guī)則作為計(jì)數(shù)器preamble_cnt[5:0]自加1的條件,如不滿足則清零。當(dāng)前導(dǎo)碼被判斷正確時(shí),從SYNC64跳轉(zhuǎn)到SYNC1狀態(tài)。sync1_flag、sync2_flag、sync3_flag、eop_flag分 別 為 接 收 到sync1、sync2、sync3及EOP標(biāo)志位,均用5b數(shù)據(jù)寄存器bmcr5b的值來(lái)判定。當(dāng)bmcr5b的值不等于sync-1、sync-2、sync-3、rst_1、rst_2及EOP中的任何一個(gè)并且5b4b譯碼失敗時(shí),表明接收到的數(shù)據(jù)有誤,此時(shí)接收錯(cuò)誤標(biāo)志err_flag置1,并不再繼續(xù)接收數(shù)據(jù),直接跳轉(zhuǎn)到IDLE狀態(tài)。當(dāng)位于EOP狀態(tài)時(shí),整個(gè)PD數(shù)據(jù)包已被正確接受完畢,此時(shí)無(wú)條件跳轉(zhuǎn)到IDLE狀態(tài)。
圖8 接收狀態(tài)機(jī)狀態(tài)轉(zhuǎn)移圖
為防止PD消息在傳輸?shù)倪^(guò)程中出錯(cuò)或者丟失,PD_TX和PD_RX都要調(diào)用CRC32校驗(yàn)?zāi)K[14]。循環(huán)冗余檢驗(yàn)(Cyclic Redundancy Check,CRC)作為數(shù)據(jù)傳輸中差錯(cuò)控制的基本方法之一,廣泛應(yīng)用于測(cè)控及通信領(lǐng)域中。PD_TX調(diào)用該模塊對(duì)PD消息的Message Header和Data Object部分進(jìn)行CRC32計(jì)算,PD_RX調(diào)用該模塊對(duì)接收到的數(shù)據(jù)的相應(yīng)部分再次進(jìn)行CRC32計(jì)算,并與原來(lái)的CRC32的值進(jìn)行比較,若一致表明數(shù)據(jù)接收正確,若不一致該數(shù)據(jù)包會(huì)被丟棄。CRC32校驗(yàn)的生成多項(xiàng)式為 G(x)=x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1,初始值為FFFF FFFFh。
本設(shè)計(jì)在VCS+Verdi環(huán)境下進(jìn)行功能仿真,仿真結(jié)果完全正確,由于仿真波形圖較大,在此不再貼出。
選用型號(hào)為EP4CE6E22C8N的FPGA作為驗(yàn)證平臺(tái),用mplab編寫(xiě)C文件配置相應(yīng)寄存器,將編譯生成的hex文件下載進(jìn)FPGA,并與POWER-Z PD誘騙器連接,用邏輯分析儀抓取Type-C接口中的CC線上的PD通信波形,驗(yàn)證環(huán)境如圖9所示。
圖9 驗(yàn)證平臺(tái)實(shí)物圖
如圖10為邏輯分析儀抓出來(lái)的PD通信波形:FPGA先給PD誘騙器發(fā)送一個(gè)標(biāo)準(zhǔn)PD數(shù)據(jù)包,PD誘騙器接收到之后應(yīng)回復(fù)一個(gè)GOODCRC包;PD誘騙器給FPGA發(fā)送一個(gè)標(biāo)準(zhǔn)數(shù)據(jù)包,F(xiàn)PGA接收到之后也回復(fù)一個(gè)GOODCRC包。
圖10 PD通信波形圖
此外,由于PD數(shù)據(jù)包格式復(fù)雜且數(shù)據(jù)量很大,手動(dòng)分析耗時(shí)耗力且不準(zhǔn)確。為了更好地說(shuō)明驗(yàn)證結(jié)果及方便未來(lái)進(jìn)一步的研究與調(diào)試,用Python將邏輯分析儀導(dǎo)出的txt文件按格式讀入,深入分析PD協(xié)議并編寫(xiě)PD數(shù)據(jù)包解析程序,程序運(yùn)行結(jié)果可顯示PD通信的細(xì)節(jié),方便設(shè)計(jì)的調(diào)試與檢錯(cuò)。
本文深入研究了USB PD協(xié)議中的消息類型、消息格式、消息發(fā)送、接收和校驗(yàn)的機(jī)制,在此基礎(chǔ)上設(shè)計(jì)并實(shí)現(xiàn)了一種基于FPGA的USB PD控制器,完成了接收模塊、發(fā)送模塊、CRC32校驗(yàn)?zāi)K、波特率控制模塊的設(shè)計(jì),并對(duì)每個(gè)模塊的設(shè)計(jì)思路進(jìn)行了說(shuō)明[15],在VCS+Verdi仿真環(huán)境下通過(guò)了功能仿真,并且經(jīng)過(guò)FPGA驗(yàn)證,驗(yàn)證結(jié)果表明該控制器可實(shí)現(xiàn)PD數(shù)據(jù)包的正確發(fā)送、接收及校驗(yàn)。后續(xù)將在此基礎(chǔ)上做進(jìn)一步研究,實(shí)現(xiàn)PD協(xié)議中VDM消息的通訊,使USB Type-C接口進(jìn)入替代模式,完成視頻的傳輸。