王才能,劉慧紅,吳晉成
(中國電子科技集團(tuán)公司第三十研究所,四川 成都 610041)
隨著時(shí)代的發(fā)展,信息技術(shù)和設(shè)備已經(jīng)深入地影響到人類社會(huì)的各方面。同時(shí),社會(huì)的新需求,反過來要求信息系統(tǒng)或設(shè)備的功能越來越多,繼而規(guī)模也越來越大。把多種功能集成到一個(gè)系統(tǒng)或設(shè)備中,已成為電子信息設(shè)備發(fā)展的一個(gè)趨勢(shì)。設(shè)備中不同的功能由獨(dú)立的硬件板卡實(shí)現(xiàn),板卡之間需要交互大量數(shù)據(jù)。現(xiàn)在一般采用總線技術(shù)互連多個(gè)板卡。
現(xiàn)有的并行總線,需要的物理線路多,印制板布線要求高,傳輸距離和傳輸速率都有限。通用的串行總線有集成電路總線(Inter-Integrated Circuit,I2C)、串行外設(shè)接口(Serial Peripheral Interface,SPI)等,在實(shí)際傳輸中有一個(gè)主方,多個(gè)從方。傳輸過程完全由主方控制,從方之間不能直接進(jìn)行數(shù)據(jù)交互,不夠靈活。
Rapid IO是一種新型交換式總線,它有著輕量型的傳輸協(xié)議;總線框架層次清晰,對(duì)軟件的制約要少;適用于設(shè)備內(nèi)部芯片與芯片之間,板卡與板卡之間的互連。
Rapid IO的框架共有3層(見圖1),即:物理層、傳輸層和邏輯層。物理層規(guī)定電氣特性、鏈路控制、流量控制、低級(jí)錯(cuò)誤管理等;傳輸層規(guī)定包交換、路由和尋址機(jī)制等;邏輯層規(guī)定總體協(xié)議和包格式[1]。
圖1 Rapid IO協(xié)議框架
(1)物理層
物理層定義了串行和并行兩種方式。其中1x/4x串行Rapid IO僅4或16個(gè)信號(hào)線,采用差分交流耦合信號(hào),具有抗干擾強(qiáng)、速率高、傳輸距離較遠(yuǎn)等優(yōu)點(diǎn),是現(xiàn)在應(yīng)用最多的物理層傳輸方式。串行Rapid IO(Serial Rapid IO,SRIO)的物理層使用了可靠傳輸協(xié)議。
(2)傳輸層
Rapid IO傳輸層定義了數(shù)據(jù)包交換的路由和尋址機(jī)制。采用單一的公用傳輸層規(guī)范來會(huì)聚不同的邏輯層和物理層,即使有新的邏輯層、物理層規(guī)范出現(xiàn),也可以用這個(gè)單一的傳輸層。
Rapid IO網(wǎng)絡(luò)中主要由兩種器件,即終端器件和交換器件。Rapid IO的路由和交換是通過每個(gè)終端設(shè)備的ID號(hào)來實(shí)現(xiàn)的。
(3)邏輯層
邏輯層定義了業(yè)務(wù)協(xié)議和相應(yīng)的包格式。RapidIO支持的邏輯層業(yè)務(wù)主要是:直接IO/DMA(Direct IO/Direct Memory Access)和消息傳遞(Message Passing)。直接IO/DMA模式是最簡(jiǎn)單實(shí)用的傳輸方式。在這種模式下,發(fā)送端知道接收端的存儲(chǔ)器地址,可以直接讀寫接收端的存儲(chǔ)器。直接IO/DMA在接收端的功能往往完全由硬件實(shí)現(xiàn),所以接收端的器件不會(huì)有任何軟件負(fù)擔(dān)。
(4)Rapid IO的基本傳輸流程
Rapid IO數(shù)據(jù)傳輸基于請(qǐng)求和響應(yīng)數(shù)據(jù)包。在圖2中,發(fā)送器件通過產(chǎn)生一個(gè)請(qǐng)求包開始一次傳輸。該請(qǐng)求包被傳送到交換機(jī)構(gòu)。交換機(jī)構(gòu)發(fā)出控制符號(hào)確認(rèn)收到了該請(qǐng)求包,隨后交換機(jī)構(gòu)將該包轉(zhuǎn)發(fā)至目標(biāo)器件,這就完成了此次傳輸中的請(qǐng)求階段。目標(biāo)器件完成要求的操作后產(chǎn)生響應(yīng)事務(wù)包,通過交換機(jī)構(gòu)將該響應(yīng)事務(wù)包傳送回發(fā)送器件,以完成此次傳輸[2]。
圖2 Rapid IO傳輸流程
TMS320C6455是德州儀器(Texas Instruments,TI)公司推出的一款高性能定點(diǎn)型數(shù)字信號(hào)處理器(簡(jiǎn)稱DSP6455)。該處理器運(yùn)行主頻最高為1.2 GHz,最大峰值計(jì)算速度達(dá)到9600MIPS;每個(gè)周期能夠執(zhí)行8個(gè)32位的指令。DSP6455的SRIO模塊,具有4個(gè)全雙工的端口,可配置為4個(gè)1X通信端口,也可配置為1個(gè)4X通信端口;每個(gè)通信端口波特率可配置為 1.25 Gb/s、2.5 Gb/s、3.125 Gb/s[3]。
圖3展示組成DSP6455 SRIO的功能模塊。該圖描述DSP6455如何實(shí)現(xiàn)SRIO三層協(xié)議。加載/存儲(chǔ)單元(Load Store Unit,LSU)控制直接IO數(shù)據(jù)包的發(fā)送和維護(hù)包的發(fā)送;存儲(chǔ)器訪問單元(Memory Access Unite,MAU)控制直接IO數(shù)據(jù)包的接收。發(fā)送單元(Transmit(tx) Unite,TXU)和接收單元(Receive(rx) Unite,RXU)負(fù)責(zé)消息數(shù)據(jù)包的發(fā)送和接收。LSU、存儲(chǔ)器訪問單元(Memory Access Unit,MAU)、TXU和RXU都使用直接存儲(chǔ)器訪問(Direct Memory Access,DMA)通道與DSP的內(nèi)存交互數(shù)據(jù),使用緩存器和接收/發(fā)送端口與外部設(shè)備交互數(shù)據(jù)。串行/解串器(Serializer/deserializer,SERDES)在發(fā)送數(shù)據(jù)時(shí)完成并行數(shù)據(jù)轉(zhuǎn)換為串行數(shù)據(jù),在接收數(shù)據(jù)時(shí)完成串行數(shù)據(jù)轉(zhuǎn)換為并行數(shù)據(jù)。
圖3 DSP6455 SRIO功能框圖
SRIO模塊在DSP處理器中是一個(gè)數(shù)據(jù)傳輸?shù)闹鲃?dòng)方,不需要產(chǎn)生中斷給DSP處理器的CPU或借助EDMA,就能夠?qū)?shù)據(jù)傳送到DSP處理器的內(nèi)存。
DSP6455 SRIO的SERDES(串行/解串器)由差分接收器(Rx)、差分發(fā)送器(Tx)、串轉(zhuǎn)并行器、并轉(zhuǎn)串行器、時(shí)鐘恢復(fù)器、8b/10b解碼器、8b/10b編碼器、8位FIFO、收發(fā)通道對(duì)齊模塊、循環(huán)冗余校驗(yàn)(Cyclic Redundancy Check,CRC)錯(cuò)誤校驗(yàn)器、CRC產(chǎn)生器和鎖相環(huán)(Phase Locked Loop,PLL)等組成。SRIO模塊的PLL需要外部參考時(shí)鐘源,通常要求該時(shí)鐘源是低電壓差分晶振。PLL將外部時(shí)鐘倍頻后送給時(shí)鐘恢復(fù)器使用。外部晶振的頻率根據(jù)SRIO的傳輸速率決定[4]。
SRIO總線的線路少,硬件布線方便;傳輸速率快,能夠適用于各種高速互聯(lián)需求;協(xié)議框架相對(duì)簡(jiǎn)單,易于進(jìn)行軟件開發(fā);SRIO支持兩個(gè)設(shè)備直連,點(diǎn)對(duì)點(diǎn)地交互數(shù)據(jù);如果使用交換芯片,可以實(shí)現(xiàn)多個(gè)設(shè)備間的任一互聯(lián),數(shù)據(jù)互聯(lián)通道的拓?fù)浣Y(jié)構(gòu)靈活。本文設(shè)計(jì)了一個(gè)多任務(wù)處理平臺(tái),采用DSP6455作為主處理器,同時(shí)使用DSP 6455的SRIO接口完成板卡之間的互聯(lián)。
圖4為多任務(wù)平臺(tái)的硬件框圖。業(yè)務(wù)卡1、2、3實(shí)現(xiàn)不同的數(shù)據(jù)業(yè)務(wù)處理功能,采用DSP6455作為各個(gè)業(yè)務(wù)卡的主處理器。各個(gè)業(yè)務(wù)卡和主控卡通過SRIO交互數(shù)據(jù)。SRIO交換芯片布置在主控卡。各個(gè)板卡的SRIO都接入交換芯片,通過交換芯片的路由控制功能,實(shí)現(xiàn)各板卡之間的數(shù)據(jù)交互。
圖4 多任務(wù)平臺(tái)硬件框圖
主控及交換卡實(shí)現(xiàn)整個(gè)平臺(tái)控制功能和SRIO路由交換功能。電源及接口卡完成220 V交流電到直流電12 V、5 V、-12 V的變換,通過對(duì)外接口電路和外部設(shè)備連接,完成平臺(tái)的對(duì)外數(shù)據(jù)交互功能。平臺(tái)的SRIO總線采用1X模式,速率設(shè)為1.25 Gbit/s。
該平臺(tái)具有很強(qiáng)通用性,能夠適應(yīng)多種不同的需求,實(shí)現(xiàn)相應(yīng)的功能。交換芯片采用Integrated Device Technology(IDT)公司的80HCPS1432系列芯片,該芯片可同時(shí)連接8個(gè)4X模式通道或14個(gè)1X模式通道。由于交換芯片有多個(gè)SRIO端口,所以可以連接多個(gè)業(yè)務(wù)板卡,具有很強(qiáng)擴(kuò)展能力。業(yè)務(wù)卡的數(shù)量不限于圖中描述的3個(gè),可以根據(jù)需求進(jìn)行增減。
需要注意的是SRIO的SERDES(串行/解串器)需要單獨(dú)提供差分晶振時(shí)鐘,以便進(jìn)行串行數(shù)據(jù)的收發(fā)。由于本平臺(tái)的SRIO速率為1.25 Gbit/s,所以選擇的差分晶振的時(shí)鐘頻率為125 MHz。
DSP6455上電后,首先進(jìn)行芯片配置,主要是設(shè)置主時(shí)鐘頻率、和其他系統(tǒng)時(shí)鐘。接著進(jìn)行SRIO的初始化。然后進(jìn)行其他外設(shè)的初始化,如外部存儲(chǔ)器接口A(External Memory Interface A,EMIFA)、通用輸入輸出接口(General-purpose input/output,GPIO)、多通道緩存串口(MultiChannel Buffered Serial Port,MCBSP)、以太網(wǎng)口等。中斷初始化完成后進(jìn)入主循環(huán),處理業(yè)務(wù)數(shù)據(jù)。SRIO對(duì)平臺(tái)至關(guān)重要。在某些情況下,SRIO可能初始化失敗。為此在主循環(huán)中設(shè)計(jì)了一套SRIO重新初始化機(jī)制。程序在主循環(huán)中定期檢查SRIO成功標(biāo)志是否正常,當(dāng)SRIO成功標(biāo)志異常時(shí),程序再次進(jìn)入SRIO初始化過程,重新配置SRIO的寄存器。DSP6455的軟件流程圖如圖5所示。
圖5 DSP6455軟件流程圖
下面重點(diǎn)描述SRIO相關(guān)程序設(shè)計(jì),平臺(tái)中采用SRIO的1X模式,具體使用DSP6455的SRIO通道0。
(1)SRIO初始化
1)設(shè)置寄存器PERCFG0的SRIOCTL(bit31:bit30)字段,使能整個(gè)DSP6455的SRIO。
2)將錯(cuò)誤狀態(tài)寄存器SP0_ERR_STAT設(shè)置為0。
3)打開SRIO的全局使能寄存器GBL_EN,打 開 寄 存 器 BLK0_EN、BLK5_EN、BLK1_EN、BLK2_EN相應(yīng)使能字段,分別使能SRIO的寄存器MMR、打開通道0、使能LSU單元和MAU單元。
4)對(duì)SRIO外設(shè)設(shè)置寄存器PER_SET_CNTL進(jìn)行設(shè)置,該寄存器主要規(guī)定了SRIO與DSP內(nèi)核交互數(shù)據(jù)的要點(diǎn)。
5)設(shè)置SERDES的配置寄存器SERDES_CFG0_CNTL,DSP6455有4個(gè)SERDES配置寄存器,但其他3個(gè)配置寄存器沒有使用,暫無意義,程序上賦值為全0。把SERDES_CFG0_CNTL的ENPLL字段置為1,使能SERDES的PLL。MPY字段代表PLL的倍頻系數(shù),本文平臺(tái)設(shè)為10X。本文為SRIO選用125 MHz的差分晶振。所以PLL輸出的用于串行收發(fā)的時(shí)鐘為1.25 GHz。
6)設(shè)置通道0的SERDES接收、發(fā)送配置寄存 器 SERDES_CFGRX0_CNTL、SERDES_CFGTX0_CNTL。上述兩個(gè)寄存器字段多,關(guān)系到SERDES能否正常工作和數(shù)據(jù)傳輸?shù)目煽啃?,須正確設(shè)置。本文平臺(tái)將SERDES_CFGRX0_CNTL賦值為0x81121,將SERDES_CFGTX0_CNTL賦值為0x00010a21,采用半速率模式,SRIO的傳輸速率為1.25 Gbit/s。
7)設(shè)置設(shè)備ID寄存器DEVICEID_REG1、DEVICEID_REG2。寄存器DEVICEID_REG1需要與寄存器BASE_ID賦值一致。寄存器DEVICEID_REG1決定了發(fā)送數(shù)據(jù)包中的源ID。寄存器DEVICEID_REG2用于接收時(shí)比對(duì)接收數(shù)據(jù)包的目的ID,判斷是否接收處理該數(shù)據(jù)包。
8)完成上述設(shè)置后,要把寄存器PER_SET_CNTL的字段BOOT_COMPLETE設(shè)為1,以便SRIO物理層啟動(dòng)狀態(tài)機(jī),按照上述配置進(jìn)行初始化。
9)在寄存器SP_IP_MODE中設(shè)置SRIO為1X模式。
10)寄存器SP_LT_CTL、SP_RT_CTL最好賦值為0xFFFFFF00,以便給鏈路維護(hù)、數(shù)據(jù)包傳輸提供足夠的超時(shí)時(shí)間,增強(qiáng)SRIO傳輸?shù)目煽啃浴?/p>
11)寄存器SP0_CTL是端口控制寄存器。在該寄存器中,將字段PORT_DISABLE置為0,將字段OUTPUT_PORT_ENABLE、INPUT_PORT_ENABLE置為1,使能該端口接收發(fā)送數(shù)據(jù)包;其他可寫的bit位置為0,打開相應(yīng)功能,讓端口進(jìn)行數(shù)據(jù)包CRC校驗(yàn),重傳錯(cuò)誤包,處理任何數(shù)據(jù)包等。
12)完成上述設(shè)置后,要再次把寄存器PER_SET_CNTL的字段BOOT_COMPLETE設(shè)為1,以便再次讓SRIO物理層啟動(dòng)狀態(tài)機(jī),按照上述配置進(jìn)行初始化。
13)程序等待約10 ms,判斷寄存器SP0_ERR_STAT的字段PORT_OK(即bit位1)是否為1,為1則SRIO初始化成功。SRIO初始化成功后,才可以正常使用。
14)最后要將寄存器PCR的字段PEREN置為1,使能數(shù)據(jù)流控功能。需要注意的是:當(dāng)DSP從復(fù)位或設(shè)置狀態(tài)進(jìn)入正常工作時(shí),該bit位應(yīng)是最后使能的bit位。
(2)直接IO方式的操作
直接IO方式時(shí),SRIO可以直接訪問CPU的內(nèi)存。發(fā)送時(shí),SRIO從內(nèi)存讀取數(shù)據(jù),封裝成數(shù)據(jù)包,通過端口發(fā)送出去。接收時(shí),SRIO將接收到的數(shù)據(jù)包凈荷存入指定的內(nèi)存空間,CPU直接使用數(shù)據(jù)凈荷。所以接收過程一般由硬件完成,不需要程序參與。本文采用NWRITE方式實(shí)現(xiàn)直接IO的發(fā)送。NWRITE方式一包最大為256 bytes,且不要求接收端回復(fù)響應(yīng)包。
DSP6455提 供 寄 存 器 LSUn_REG0、LSUn_REG1、LSUn_REG2、LSUn_REG3、LSUn_REG4、LSUn_REG5、LSUn_REG6(n=1、2、3、4) 來 完成直接IO的發(fā)送。LSUn_REG0為擴(kuò)展尋址方式時(shí)目的地址(接收端內(nèi)存地址)的高32位;LSUn_REG1為目的地址,或者擴(kuò)展尋址方式時(shí)目的地址的低32位;LSUn_REG2為源地址(發(fā)送端內(nèi)存地址),LSUn_REG3為數(shù)據(jù)凈荷的長(zhǎng)度(以字節(jié)為單位);LSUn_REG4寄存器規(guī)定了發(fā)送端ID、目的端ID、數(shù)據(jù)包優(yōu)先級(jí)等。LSUn_REG5寄存器規(guī)定門鈴包的信息、數(shù)據(jù)包的類型(其中0x54表示NWRITE包,0xA0表示門鈴包)。LSUn_REG6寄存器的COMPLETION_CODE字段表示SRIO數(shù)據(jù)包的傳輸狀態(tài),BSY字段表示LSU的上述7個(gè)寄存器是否可用。
在寫完寄存器LSUn_REG0到LSUn_REG5后,SRIO開始進(jìn)行封包并發(fā)送,需要等待一段時(shí)間SRIO才能完成發(fā)送。程序定時(shí)查詢寄存器LSU1_REG6的bit位0,如果為0,表示LSU的寄存器已處于空閑可用狀態(tài),本次發(fā)送成功,可以再次發(fā)送。
NWRITE方式的程序代碼如下:
(3)門鈴中斷
發(fā)送方采用直接IO方式將數(shù)據(jù)直接寫入接收方的內(nèi)存中。該過程不需要接收方的CPU參與,CPU也就不知道是否接收到數(shù)據(jù)。此時(shí)需要采用中斷方式通知接收方CPU去讀取內(nèi)存接收到的數(shù)據(jù)。發(fā)送方在采用直接IO方式完成數(shù)據(jù)傳輸后,緊接著發(fā)送一包門鈴數(shù)據(jù)包,接收方收到門鈴數(shù)據(jù)包后,會(huì)產(chǎn)生中斷,通知CPU及時(shí)處理接收到的數(shù)據(jù)。
SRIO提供4個(gè)門鈴,每個(gè)門鈴包含16個(gè)bit的信息,其中每個(gè)bit可以表示一個(gè)單獨(dú)的中斷請(qǐng)求。所以SRIO有64個(gè)門鈴中斷請(qǐng)求。DSP6455中斷機(jī)制有別與TI公司之前的DSP。在DSP6455中,各種外設(shè)可以產(chǎn)生很多中斷請(qǐng)求,由中斷請(qǐng)求映射到中斷事件,中斷事件再映射到CPU的中斷。其中用戶可編程的中斷事件有124個(gè),分別為EVT4~EVT127。CPU可以響應(yīng)的中斷有16個(gè),其中用戶可以編程控制的中斷有12個(gè),分別為INT4~ INT15。
DOORBELLn_ICSR(n=0、1、2、3)為門鈴中斷狀態(tài)寄存器,其中低16 bit位有效,對(duì)應(yīng)門鈴包中的16個(gè)信息bit。DOORBELLn_ICCR(n=0、1、2、3)為門鈴中斷條件清除寄存器,其中低16 bit位有效,將該16個(gè)bit置為1時(shí),會(huì)清除DOORBELLn_ICSR中的對(duì)應(yīng)bit位。DOORBELLn_ICRR、DOORBELLn_ICRR2為門鈴中斷條件映射寄存器,每4個(gè)bit一組,共有16組。它的每組和一個(gè)門鈴信息bit對(duì)應(yīng)。如此,可以將某個(gè)門鈴信息bit(即門鈴中斷請(qǐng)求)通過該4 bit組映射到中斷事件。中斷條件映射寄存器每個(gè)4 bit組為0000時(shí),對(duì)應(yīng)的中斷事件為INTDST0,4 bit為0111時(shí),對(duì)應(yīng)的中斷事件為INTDST7,共有8個(gè)中斷事件組合。4 bit的值大于7時(shí)無意義。需要注意的事:DSP6455中給SRIO分配的中斷事件只有3個(gè),分別為INTDST0(中斷事件編號(hào)20)、INTDST1(中斷事件編號(hào)21)、INTDST4(中斷事件編號(hào)22)。所以將門鈴中斷請(qǐng)求映射到中斷事件時(shí),只能選擇上述3個(gè)事件。上述3個(gè)中斷事件經(jīng)過中斷選擇寄存器INTMUXn(n=0、1、2、3)可以映射到DSP6455的12個(gè)中斷。
此處在實(shí)際設(shè)計(jì)開發(fā)時(shí),需要特別注意的是:INTDSTn_RATE_CNTL(n=0~7) 是 8個(gè) 中斷事件的中斷速率控制寄存器。只有當(dāng)程序?qū)懥薎NTDSTn_RATE_CNTL的值后,在收到門鈴包時(shí),才會(huì)產(chǎn)生相應(yīng)的中斷邏輯信號(hào)。所以在程序初始化時(shí)或者門鈴中斷處理完成后,必須重新寫一次INTDSTn_RATE_CNTL。
本文對(duì)SRIO的實(shí)際傳輸速率進(jìn)行了測(cè)試。測(cè)試方法:發(fā)送一包或多包NWRITE數(shù)據(jù)包,接著再發(fā)送一個(gè)門鈴包。發(fā)方開始發(fā)送時(shí)由DSP輸出一個(gè)低脈沖,收方接收到門鈴信號(hào)后由DSP輸出一個(gè)低脈沖,兩個(gè)脈沖的下降沿之間的時(shí)間差即為傳輸時(shí)間T1。發(fā)方僅發(fā)送門鈴包,該時(shí)間差為門鈴包傳輸時(shí)間T2。T=T1-T2,T即為NWRITE數(shù)據(jù)包的傳輸時(shí)間。每個(gè)NWRITE數(shù)據(jù)包發(fā)送的有效信息為256字節(jié),有效數(shù)據(jù)傳輸速率S=256*8*n/T,n為NWRITE數(shù)據(jù)包數(shù)。用示波器測(cè)量出兩個(gè)低脈沖的時(shí)間差值T1、門鈴包傳輸時(shí)間T2。示波器實(shí)測(cè)的數(shù)據(jù)和有效數(shù)據(jù)傳輸速率測(cè)試結(jié)果見表1。
表1 SRIO傳輸速率
本文接著進(jìn)行了穩(wěn)定性測(cè)試。發(fā)方在發(fā)送NWRITE數(shù)據(jù)包時(shí),計(jì)算出數(shù)據(jù)的校驗(yàn)值CRC16,并將CRC16放在數(shù)據(jù)包的最后。收方接收數(shù)據(jù)后,進(jìn)行CRC16校驗(yàn),并統(tǒng)計(jì)正確包數(shù)。測(cè)試結(jié)果如表2所示。
表2 SRIO傳輸穩(wěn)定性
相較于以前的總線傳輸技術(shù),SRIO技術(shù)傳輸速率快,連線少,并且可以靈活構(gòu)成多種形式的傳輸網(wǎng)絡(luò)。DSP6455作為一款TI公司高速處理器,其CPU主頻高,數(shù)據(jù)處理能力強(qiáng)。本文利用DSP6455,作為實(shí)現(xiàn)SRIO互連的物理器件,設(shè)計(jì)了通過SRIO高速連接多個(gè)板卡的多任務(wù)處理平臺(tái)。描述了平臺(tái)總體設(shè)計(jì)和軟件設(shè)計(jì)思路,并詳細(xì)介紹了SRIO模塊的軟件設(shè)計(jì)和實(shí)現(xiàn)。通過實(shí)驗(yàn)驗(yàn)證項(xiàng)目,測(cè)得了SRIO高速的有效數(shù)據(jù)傳輸速率;通過大數(shù)據(jù)量的傳輸實(shí)驗(yàn),驗(yàn)證了SRIO的傳輸可靠性。