本文為明德?lián)P原創(chuàng)文章,轉(zhuǎn)載請注明出處!
Sgmii協(xié)議是串行協(xié)議,區(qū)別于rgmii和gmii的并行接口,使實驗電路更加簡單方便。
Sgmii協(xié)議如果是在FPGA上實現(xiàn),那么要求FPGA支持Serdes接口或者FPGA有支持sgmii的IP核。
Sgmii是采用差分對信號線進行數(shù)據(jù)傳輸?shù)模惶峁╇S路時鐘,依靠數(shù)據(jù)信息進行CDR的時鐘恢復(fù),在數(shù)據(jù)鏈路上采用8b/10b編碼,所以當(dāng)傳輸?shù)氖乔д滓蕴W(wǎng)(1Gbps)的時候,數(shù)據(jù)鏈路上的傳輸?shù)乃俾适?.25Gbps,也就是說FPGA例化Serdes的IP核的時候的數(shù)據(jù)速率是1.25Gbps。
一、 sgmii的數(shù)據(jù)鏈路層的握手過程
Sgmii在通信過程中首先要進行PHY和sgmii的數(shù)據(jù)鏈路層的鏈接,即FPGA的sgmii或者Serdes和sgmii_phy芯片的握手,在握手建立之后才進行數(shù)據(jù)傳輸。握手的過程首先是sgmii_phy芯片(以AR8031為例)發(fā)送準(zhǔn)備好狀態(tài)(0xBC 0x42 0x01 0x98 0xBC 0xB5 0x01 0x98),然后FPGA回復(fù)sgmii_phy的信息為(0xbc 0xb5 0x01 0xd8 0xbc 0x42 0x01 0xd8)。在數(shù)據(jù)鏈路握手之后才是數(shù)據(jù)的發(fā)送。數(shù)據(jù)鏈路層每隔1.6ms進行一次狀態(tài)信息的更新,也就是說FPGA每隔1.6ms發(fā)送一次自身的狀態(tài)給PHY芯片
二、 數(shù)據(jù)的發(fā)送
Sgmii協(xié)議傳輸數(shù)據(jù)包的過程中,以K27.7為起始符,以K29.7為結(jié)束符。數(shù)據(jù)鏈路空閑的時候要發(fā)送空閑碼。空閑碼(IDLE碼)有兩種/K28.5/D5.6或者/K28.5/D16.2。在發(fā)送數(shù)據(jù)的過程中的需要注意在發(fā)送完畢空閑碼的時候才能發(fā)送數(shù)據(jù),也就是說發(fā)送數(shù)據(jù)的時候先發(fā)送(0xBC 0x50)完畢,接著發(fā)送起始符(K27.7),然后發(fā)送千兆以太網(wǎng)協(xié)議(/0x55/ 0x55/ 0x55/ 0x55/ /0x55/ 0x55/ 0x55/0xD5),接著發(fā)送的數(shù)據(jù)是遵循千兆網(wǎng)以太網(wǎng)的協(xié)議數(shù)據(jù)(具體請自行查看),發(fā)送完數(shù)據(jù)之后再發(fā)送一個字節(jié)的結(jié)束符(K29.7)。
三、 FPGA數(shù)據(jù)傳輸過程中的K碼解析
在上面的數(shù)據(jù)傳輸?shù)倪^程中有IDLE碼(0xbc 0x50),起始符K27.7(0xFB),結(jié)束符K29.7(0xFD)等。在以上的特殊碼的傳輸?shù)倪^程中有K碼要相對的置1。即空閑碼的(0xbc 0x50)的0xbc要K碼與之對應(yīng),K27.7和K29.7也是K碼與之對應(yīng)。
總結(jié):sgmii的傳輸數(shù)據(jù)的過程為:每隔1.6ms 時間 FPGA和PHY的握手過程,握手建立之后發(fā)送空閑碼,要發(fā)送數(shù)據(jù)的時候要在空閑碼發(fā)送完畢之后才能去發(fā)送數(shù)據(jù)(起始碼+數(shù)據(jù)+結(jié)束碼)即可。
有不明白的朋友可以在留言中與我進行討論,想要了解更多的朋友可以聯(lián)系明德?lián)P獲取更多學(xué)習(xí)資料!