FPGA+DSP SRIO通信(一)——DSP端参数设置(通道)
FPGA+DSP SRIO通信(一)——DSP端參數設置(通道)
原創?2017年04月19日 18:56:45經過漫長的探索之后,博主發現關于TI的板子調試和開發要遵循的規律,稱其為潛規則也不為過。
1、文檔?
文檔是程序的基礎,是思想和靈魂,所以文檔的閱讀必須認真,但由于所有的TI文檔都是英文,非英語母語者讀起來非常不通暢。我說說我的方法:使用谷歌翻譯。不是硬著頭皮逐句看,看不懂了再翻譯,這非常耗費時間,往往看了后面忘了前面。我給出的方法是大段翻譯,直接粘貼到谷歌翻譯中,在遇到晦澀的部分時再去細看英文,這樣效率就會高起來。
2、例程?
以SRIO調試為例,我在調試SRIO時的初始目標就是使SRIO兩端的設備能互相讀寫,初期看完SRIO文檔后一頭霧水,多虧北航學長給了SRIO_Read代碼之后我漸漸明白,我們所要調試的大部分工作官方例程都幫我們做了,我們要做的只是明白官方例程做了什么,和我們需要增加哪些東西就夠了。例程一般就在你的TI安裝目錄下的形如PDK6678的文件夾中。如果找不到可以去官方論壇搜索。
3、實踐(調試)?
程序最終是要在板子上跑起來的,所以在寫好程序并不確定程序的功能能不能實現后,最好的辦法是在板子上進行在線調試,不要因為怕麻煩而使用SIMLATOR進行仿真,這種軟件仿真的意義在于調通算法,而不是調通硬件板卡,所以硬件調試必須上板,不然就是紙上談兵。
以上就是我的一些學習經驗,分享出來,也是對自己以后學習DSP的一個指導思想。
下面開始正題。
DSP端參數設置
我們所使用的FPGA+DSP是:K7325t+TI6678。FPGA端的情況我不太了解,是我師兄做的,所以我的這個系列的博客只說DSP的配置。
使用的官方例程路徑:
ti\pdk_C6678_1_1_2_5\packages\ti\transport\ipc\examples\srioIpcBenchmark\device_srio.c
port mode(port模式)
SRIO通道有自回環(loopback)模式和普通模式(Normal),要使用SRIO實現FPGA和DSP的通信,必須將各port調至Normal模式,即:
/* Configure SRIO to operate in loopback mode.(原始例程代碼)*/// CSL_SRIO_SetLoopbackMode(hSrio,0);// CSL_SRIO_SetLoopbackMode(hSrio,1);// CSL_SRIO_SetLoopbackMode(hSrio,2);// CSL_SRIO_SetLoopbackMode(hSrio,3); /* Configure SRIO to operate in normal mode.(修改后例程代碼) */ CSL_SRIO_SetNormalMode(hSrio,0); CSL_SRIO_SetNormalMode(hSrio,1); CSL_SRIO_SetNormalMode(hSrio,2); CSL_SRIO_SetNormalMode(hSrio,3);- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
不懂的函數可以去路徑:
D:\ti\pdk_C6678_1_1_2_5\packages\ti\csl\docs\doxygen\html\csl__srio_aux_8h.html?
查看相關函數定義和功能
鏈接速率配置(link rate)
/* Assuming the ref_clock of 312.5 MHz and link rate is 3.125Gbps; program the PLL accordingly. */ CSL_BootCfgSetSRIOSERDESConfigPLL (0x229);- 1
- 2
- 3
該語句是對link rate的配置,假設參考時鐘是312.5MHz(對于不同的C66x系列DSP,其參考時鐘是不同的,所以該配置因板子型號而異),而你想要配置的link rate是3.125Gbps,那么就可以使用0x229作為該函數的參數,如果需要配置為其他link rate,就需要改變該函數參數。該函數參數的設定依據是:?
首先,該函數就是對SRIO_SERDES_CFGPLL寄存器做配置,而該寄存器最重要的,就是上圖所示的0-9bit。其中,ENPLL是對PLL(鎖相環)的使能,該位必須置1;MPY是選擇PLL的倍頻倍數,拿圖中的8.25x為例,其對SRIO_SERDES_CFGPLL的1-8位寫001000 01,高六位是整數部分,001000b是十進制的8,低兩位是小數部分,01b是小數0.25;至于VRANGE,寫1就行,如果想了解可以自行谷歌。
而0x229的1-8bit為:000101 00b,整數部分是5。那有人就會問了,你說參考時鐘是312.5MHz,現在鎖相環的倍頻5倍,倍頻出來的時鐘頻率不是3.125G啊?
不要著急,最終的link rate不只有鎖相環決定,真正起傳輸作用的是RX和TX,所以對他們的配置也影響link rate,RX和TX的配置我后面會講到,RX和TX的配置寄存器中有個域叫RATE,就是配置每個鎖相環時鐘采樣幾個數據。
TX和RX的RATE域描述如下圖所示:?
然后然后!!我們看一下下面這張表,就明白了:?
?
很明顯我們在配置RX和TX時將RATE配成了Half,也就是一個PLL時鐘采樣2個數據,這樣數據率不就變成了3.125G嗎!
所以,在對link rate進行配置時,需要考慮的只有RX和TX的Rate域和PLL的MPY域。
RX和TX的配置
接下來就到了我們通道配置的重頭戲,傳輸器和接收器的配置,RX負責接收數據,TX負責傳輸數據,對RX和TX不太了解的可以看我之前的博客。大概了解即可。首先來看一下例程中這部分的寫法:
/* Configure the SRIO SERDES Receive Configuration. *//* loopback mode */// CSL_BootCfgSetSRIOSERDESRxConfig (0, 0x01C40495);// CSL_BootCfgSetSRIOSERDESRxConfig (1, 0x01C40495);// CSL_BootCfgSetSRIOSERDESRxConfig (2, 0x01C40495); // CSL_BootCfgSetSRIOSERDESRxConfig (3, 0x01C40495); /* Non-loopback */ CSL_BootCfgSetSRIOSERDESRxConfig (0, 0x00440495); CSL_BootCfgSetSRIOSERDESRxConfig (1, 0x00440495); CSL_BootCfgSetSRIOSERDESRxConfig (2, 0x00440495); CSL_BootCfgSetSRIOSERDESRxConfig (3, 0x00440495); /* Configure the SRIO SERDES Transmit Configuration. */ /* loopback mode */ // CSL_BootCfgSetSRIOSERDESTxConfig (0, 0x00780795); // CSL_BootCfgSetSRIOSERDESTxConfig (1, 0x00780795); // CSL_BootCfgSetSRIOSERDESTxConfig (2, 0x00780795); // CSL_BootCfgSetSRIOSERDESTxConfig (3, 0x00780795); /* Non-loopback */ CSL_BootCfgSetSRIOSERDESTxConfig (0, 0x00180795); CSL_BootCfgSetSRIOSERDESTxConfig (1, 0x00180795); CSL_BootCfgSetSRIOSERDESTxConfig (2, 0x00180795); CSL_BootCfgSetSRIOSERDESTxConfig (3, 0x00180795);- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
這兩個函數的功能就是對RX和TX進行配置,具體寫入的寄存器是:SRIO_SERDES_CFGRX[0-3]和SRIO_SERDES_CFGTX[0-3]。由于我們使用的是Normal模式,所以對loopback模式下的RX和TX配置不作解釋。我把這部分分為兩塊來講。
RX配置
對SRIO_SERDES_CFGRX的寫入值為0x00440495。我們一步一步講:?
先看0-3bit:?
最低位是RX使能位,所以不管你要怎樣花式配置RX,3-0bit必須是0101b。
第4-5bit的rate域已經在上文說過了。
第6bit是極性轉換域,確定高電平使能和低電平使能。沒有什么特殊要求置0即可。
第7-9bit只能是001b,想詳細了解可以自行查閱相關資料。
第10-11bit是對齊設置域,一般設置為01b即可,需要特殊的對齊設置時可以對該域進行修改。
第12-14bit是丟失信號檢測域,一般設置為000b。設置為001b,適用于infiniband通信,設置為100b,適用于PCIE和S-SATA通信。
第15-17bit是時鐘/數據恢復算法設置,初級配置中用處不大。設置為000即可。
第18-20bit是均衡器配置,一般設置為001即可。
第21bit是均衡器使能位,默認為使能,即將該位設置為0.
第22bit是漂移補償使能位,一般要設置為1。
第23-24bit是loopback使能位,設置為00,即關閉loopback模式。
不知道大家發現沒有,除了rate位,幾乎所有的域都是固定配置的,所以大家在配置RX時只需要修改rate位,其余位與0x00440495保持相同即可。
TX配置
對SRIO_SERDES_CFGTX的寫入值為0x00180795。我們一步一步講:
0-6bit與RX相同。?
7-10bit用來設置TX輸出電壓的振幅。一般設置為1111。
11-18bit用來設置TX輸出波形調整的權重,這個我也不太懂,不過一般設置為0000 0000 即可。
19bit用來設置一個FIR濾波器的權重更新使能。該FIR是對TX的波形進行調整的濾波器,該位應該設置為1。
20bit用來設置同步主線。同步時需要一個master,如果要將該位設置為1,就是同步主線,該位設置為0就是同步被動線,單線時該位必須置高,如果為多線,那么必須有一個TX的該位要設置為1。一般設置為1即可。?
注意20bit在拓撲結構中的使用,只能有一個TX被設置為1。
同樣除了rate位,幾乎所有的域都是固定配置的,所以大家在配置TX時只需要修改rate位,其余位與0x00180795保持相同即可。
參考文獻
http://www.ti.com/cn/litv/pdf/sprugw1b
PS:歡迎大家與我討論文章中的問題,包括反對我的觀點。
版權聲明:本文為博主原創文章,未經博主允許不得轉載。 ?-
warmbeast
2017-07-25 11:403樓 - “其中,ENPLL是對PLL(鎖相環)的使能,該位必須置0”,使能PLL,不是應該置1嗎
- 回復?1條回復
-
haiyonghao
2017-07-18 22:452樓 - 我自己探索的東西,沒什么好泄密的
- 回復?1條回復
-
Nevermore_NO1
2017-07-21 10:42 - 回復haiyonghao:樓主寫的很棒,大大的贊~至于樓下說的泄密,從何談起啊。Ti巴不得有人把這些文章翻譯成中文,把配置都簡化了,這些工作都是替Ti在干活,有什么泄密的。
-
Jiangguannan
2017-07-06 22:041樓 - 樓主你這個就是開發手冊,不怕泄密么~
- 回復
-
?
?
轉載自:http://blog.csdn.net/haiyonghao/article/details/70244003
總結
以上是生活随笔為你收集整理的FPGA+DSP SRIO通信(一)——DSP端参数设置(通道)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 老男孩Linux运维第41期201710
- 下一篇: 虚拟机与系统文件互传(VMware To