C6678->SRIO和Virtex6->FPGA
設計的板子到了SRIO調試階段了,在板子上,一片V6和兩片6678通過4XSRIO互聯,中間沒有Switch,總算搞定了相互之間的通信。
首先,感謝Ti論壇提供的SRIO程序范例,但是其硬件平台是EVM板,更多的只能用於loopback測試,但是可以在其基礎上修改。
1.初始化DSP的SRIO,主要是對SerDes進行配置,然后是Lane和Speed的配置,最后需要等待FPGA的LinK建立,我們在建立時候碰到一點困難,每次建立並不都是4X,一直沒有找到問題,我們使用了一個別的辦法來保證link為4X。
2.數據發送,DSP上提供的數據發送方法主要有兩種,DirectIO和Message,主要區別為DirectIO需要TX和RX雙方知道地址映射關系,而Message是通過Message中mail信息得到數據需要保存的地址,我們使用的為DirectIO方法,6678上提供了8組LSU來進行DirectIO數據發送,每個LSU有6個寄存器,當5th寄存器寫完后,數據會發送出去,第6個寄存器主要用於檢測當前的LSU狀態。LSU還有16(32)個影子寄存器
3.SWRITE/NWRITE/NREAD:對DSP來說,初始化完SRIO后,FPGA便可以通過SRIO來發送數據,但是要注意,Designer並不知道什么時候FPGA會發送數據,所以通常會先發送一個DoorBell信息來告知DSP,FPGA要發送數據了,DoorBell可以觸發中斷,對於NREAD來說,FPGA發送這個命令后,DSP會自動的將請求的數據發送出去,Designer也並不知道數據發送出去,這些都需要DoorBell來支持。
1 問題:
你好,我們現在也能DSP發數據到fpga,但是存在如下問題:
dsp用Nwrite給fpga寫數據,fpga能收到數據但是沒有響應數據給dsp?(請問需不要兩邊都確認下 讀寫的地址??)
dsp用Nread給fpga發,嘗試着讀取fpga里的數據,但是fpga這邊沒反應?
fpga主動發起給dsp讀寫數據,dsp那邊該怎么寫程序啊?
答:
采用DirectIO模式,FPGA不會主動響應的
DSP發送Nread命令,FPGA應該使用用戶接口將Nread命令中請求的地址空間中的數據發送出去
可以采用先發送Doorbell,再發送數據
2 問:
現在我們已經能dsp主動發起對fpga進行讀寫,但可是fpga無法主動發起對dsp進行讀寫? 不知道fpga這邊需要怎樣配置ip核才能實現 dsp,fpga都能主動發起讀寫數據請求??
答:
如果沒記錯的話,FPGA發送NREAD命令就可以了,DSP會自動將數據發送過去,注意NREAD命令中的地址是DSP的實際訪問地址
3 問:
你好,請問用DirectIO傳輸數據是用DMA傳輸的嗎?
這個需要寄存器配置還是直接默認的就是?
還有,FPGA這端有沒有DMA這個說法?需不需要進行配置啊?
答:
應該不需要 FPGA沒有DMA這個東西 一般FPGA的DMA都是和上位機配合完成的本身沒有DMA的吧
注:在編輯模式下可以看到詳細問答
PS:我用一代核V5.6和二代核都試過,都是這樣的情況;
1.DSP和FPGA,四對LVDS收發線相連。
2.我們准備FPGA發數據給DSP,DSP再發送給FPGA;后期會DSP處理完后再發回給FPGA。
請問,FPGA如何通知DSP接收數據?FPGA何時開始發送數據?DSP怎么知道何時接收完畢;完畢后,又怎么通知FPGA接收數據?FPGA何時開始接收數據?
我只了解一些大概,真正實現,還有很多疑惑。
期待您的回復,能否留下您的QQ號?即時向您請教幾個問題?非常感謝!
轉載自:http://www.cnblogs.com/fpga/archive/2012/07/13/2590929.html
C6678 SRIO DSP接收Doorbell中斷問題
-
在公司自己開發的板卡上調試SRIO
使用的DSP是TMS320C6678,FPGA是K7系列芯片,芯片間通過SRIO連接
C6678使用的開發環境是CCS5.3,編譯器版本為C6000_7.4.1,MCSDK版本為2.1.2.6。
在調試過程中,C6678與FPGA互相用nwrite方式寫數據均成功。調試Doorbell中斷時,C6678向FPGA發送Doorbell沒有問題,
但是FPGA向C6678發送Doorbell中斷時,C6678最多只能接收999次Doorbell中斷,之后就再也不能響應,此時FPGA在ChipScope中還能觀察到Doorbell已發送出去。
附上調試用的C6678 SRIO程序,請各位工程師幫我看看程序中哪里配置有問題,導致有這個現象產生
謝謝!
-
-
-
-
謝謝 Thomas Yang1,問題有了進展,增加了FPGA發送門鈴的間隔,DSP就不丟門鈴中斷了。DSP測試程序然雖然開了幾個中斷,但只有一個門鈴中斷會被觸發。
我使用的是FPGA的SRIO IP核,IP核中測試例程會向外發起多個SRIO通信(寫、讀、門鈴、stream等),每種SRIO通信的間隔都很小,我就是把這些SRIO通信都改為門鈴,就出現了DSP了丟失門鈴中斷問題。我現在的困惑是FPGA的SRIO IP核測試例程為什么不增加每種SRIO通信的間隔。
-
DSP門鈴中斷服務程序只有三行代碼,除了下面2行,另外一行就是給一個全局變量置位。
//read doorbell. this test only use doorbell reg 0
doorbell= gpSRIO_regs->DOORBELL_ICSR_ICCR[0].RIO_DOORBELL_ICSR;//clear doorbell interrupt
gpSRIO_regs->DOORBELL_ICSR_ICCR[0].RIO_DOORBELL_ICCR= doorbell;另外,我們的C6657與FPGA通信不太穩定,經常會出現無法建立連接的問題,也就時等不到port OK。關於這些問題我會在另外的帖子中提問,這個問題基本算有個結論了。謝謝大家。
-
-
只能進一次中斷,主要是這兩個寄存器設置有問題(6678 DSP):
3.8.9.2 Interrupt Rate Counter Register(對於映射到INTDST0-INTDST15):
INTDSTn_RATE_CNTL Interrupt Rate Control Counter 和 INTDST_RATE_DIS Interrupt Pacing Disable (Address Offset 0x0310)這兩個寄存器沒有設置正確。如果
在INTDST_RATE_DIS Interrupt Pacing Disable = 0x0000的情況下,不重復寫INTDSTn_RATE_CNTL Interrupt Rate Control Counter寄存器的話中斷就只能進去一
次。如果你不想重復寫INTDSTn_RATE_CNTL Interrupt Rate Control Counter寄存器,就將INTDST_RATE_DIS Interrupt Pacing Disable = 0xFFFF。
-
我在調試的過程中發現如果DSP(6678)中斷服務程序占用時間較長的話,在Doorbell間隔比較小的情況下會造成doorbell丟包(可以從chipscope看到Doorbell應答消息
(Hello Format)的錯誤標志位有時候為1),如果想分析問題,在調試程序時,盡量減少printf這些語句的使用。我覺得應該是中斷服務子程序的時間決定doorbell的
時間間隔。而要及時的觸發中斷(INTDST0-INTDST15),則可以設置INTDST_RATE_DIS Interrupt Pacing Disable 和 INTDSTn_RATE_CNTL Interrupt Rate Control Counter寄存器。
我主要負責FPGA這一部分,用的是IP核V5.6,核程序里面用到了 ILA VIO 的核,請問我能不用這些核嗎? 我想直接自己建立.cdc文件抓自己想抓的數據? 如果是自己建立的.cdc文件,那該怎么去觸發核呢(該怎么去給核發Nread,Nwrite之類的請求?)?原來是用VIO 觸發的吧。
因為是新手,所以可能問的也不是很清楚,還望多包涵包涵~~~~