xapp1052是xilinx官方給出的一個(gè)有關(guān)DMA數(shù)據(jù)傳輸?shù)臉永?,用于PC端和FPGA端之間的DMA數(shù)據(jù)傳輸。首先需要說的是,xapp1052并不是一個(gè)完整的DMA數(shù)據(jù)傳輸?shù)慕K端硬件設(shè)計(jì),這在下面會(huì)有詳細(xì)解釋。
首先說一下xapp1052模塊的組成結(jié)構(gòu):頂層模塊是xilinx_pci_exp_ep,在頂層模塊中包含pci_exp_64b_app和bmd_design兩個(gè)模塊,其中pci_exp_64b_app就是我們要介紹的重點(diǎn),而bmd_design則是實(shí)現(xiàn)PCIE協(xié)議的底層模塊。
下面就詳細(xì)說一下pci_exp_64b_app的模塊結(jié)構(gòu):
pci_exp_64b_app
|
|__BMD
|
|__BMD_EP
| |
| |__BMD_EP_MEM_ACCESS
| | |_BMD_EP_MEM
| |
| |__BMD_RX_ENGINE
| |__BMD_TX_ENGINE
| |__BMD_INTR_CTRL
|
| |__BMD_GEN2
| |__BMD_RD_THROTTLE
|
|__BMD_TO_CTRL
|__BMD_CFG_CTRL
1,BMD_RX_ENGINE的設(shè)計(jì):這個(gè)模塊的作用就是接受來自PC的TLP包(trn_rd[63:0]),并根據(jù)不同的情況對(duì)包進(jìn)行拆解,首先根據(jù)trn_rd[62:56]位判斷包的類型,如果是32位地址讀請(qǐng)求(BMD_MEM_RD32_FMT_TYPE),那么就轉(zhuǎn)到32位讀對(duì)應(yīng)的狀態(tài)(BMD_64_RX_MEM_RD32_QW1);如果是32位地址寫請(qǐng)求(BMD_MEM_WR32_FMT_TYPE),那么久轉(zhuǎn)到32位寫對(duì)應(yīng)的狀態(tài)(BMD_64_RX_MEM_WR32_QW1);如果是不帶數(shù)據(jù)的完成類型(BMD_CPL_FMT_TYPE),那么就轉(zhuǎn)到完成請(qǐng)求對(duì)應(yīng)的狀態(tài)(BMD_64_RX_CPL_QW1);如果是帶數(shù)據(jù)的完成類型(BMD_CPLD_FMT_TYPE),那么就轉(zhuǎn)到帶數(shù)據(jù)完成對(duì)應(yīng)的狀態(tài)(BMD_64_RX_CPLD_QW1)。
上面是狀態(tài)機(jī)的第一次過渡,下面看狀態(tài)的第二次過渡,在狀態(tài)是BMD_MEM_RD32_FMT_QW1時(shí),這個(gè)時(shí)候TLP包的第二個(gè)DWORD已經(jīng)傳來,從第二個(gè)DWORD中可以得到讀請(qǐng)求的地址addr_o,這個(gè)地址時(shí)輸入到memory模塊下用于讀出對(duì)應(yīng)地址下的數(shù)據(jù)的;然后過渡到下一個(gè)狀態(tài)(BMD_64_RX_MEM_32_WT),在這個(gè)狀態(tài)下,RX模塊會(huì)一直檢測(cè)從TX返回的compl_done_i信號(hào),當(dāng)讀請(qǐng)求申請(qǐng)的對(duì)應(yīng)地址下的數(shù)據(jù)由TX發(fā)送出去時(shí),compl_done_i信號(hào)就為1,這個(gè)時(shí)候RX就會(huì)返回到RST狀態(tài)。當(dāng)狀態(tài)是BMD_MEM_WR32_FMT_QW1時(shí),這個(gè)時(shí)候RX也接受到了TLP包的第二個(gè)DWORD,從這個(gè)DWORD中可以拆分出地址(addr_o)和要寫的數(shù)據(jù)(wr_data_o),同時(shí)在這個(gè)狀態(tài)寫使能值為有效(we_en_o),然后過渡到下一個(gè)狀態(tài)(BMD_64_RX_MEM_WR32_WT),在這一個(gè)狀態(tài),RX會(huì)一直檢測(cè)從memory模塊出來的信號(hào)(wr_busy_i)是不是為0,如果為0,說明寫操作完成,RX回到RST狀態(tài)。當(dāng)狀態(tài)是BMD_64_RX_CPL_QW1的時(shí)候,說明這是一個(gè)不帶數(shù)據(jù)的完成,其他并沒有什么操作。當(dāng)狀態(tài)是BMD_64_RX_CPLD_QW1時(shí),說明這是一個(gè)帶數(shù)據(jù)的完成,為什么完成信號(hào)要攜帶數(shù)據(jù)呢,原因就是為了檢驗(yàn)傳輸?shù)臄?shù)據(jù)是否正確,在這個(gè)狀態(tài)下以及它的過渡狀態(tài)中,RX會(huì)一次檢測(cè)傳輸?shù)絇C端的數(shù)據(jù)和設(shè)備內(nèi)存的數(shù)據(jù)是否相同,如果不相同,說明數(shù)據(jù)傳輸失敗,返回失敗傳輸信號(hào)(cpld_malformed)。
從上面的描述可以看出,BMD中的RX是不支持連續(xù)的寫數(shù)據(jù)的(往設(shè)備內(nèi)存寫數(shù)據(jù)),所以往設(shè)備內(nèi)存寫數(shù)據(jù)的DMA操作,xapp1052是不支持的,那么這里發(fā)送和接收的數(shù)據(jù)到底是什么呢,其實(shí)這里RX并不是要發(fā)送和接收存儲(chǔ)數(shù)據(jù),而是發(fā)送和接收配置數(shù)據(jù),即DMA的配置數(shù)據(jù)。
2,BMD_TX_ENGINE的設(shè)計(jì):這個(gè)模塊是往PC端發(fā)送TLP包(trn_td[63:0]),這個(gè)模塊是xapp1052DMA的核心模塊,它包含DMA控制器的所有操作,當(dāng)然這里只是發(fā)送端的DMA控制器。TX要解決的問題就是要在不同的情況下發(fā)送對(duì)應(yīng)的TLP包。
第一種情況:發(fā)送帶數(shù)據(jù)的完成TLP,這是TX最優(yōu)先處理的(這一點(diǎn)不是很確定,個(gè)人感覺xapp1052寫的有點(diǎn)問題)。首先在RST狀態(tài)會(huì)產(chǎn)生一個(gè)帶數(shù)據(jù)類型的包頭。然后過渡到下一個(gè)狀態(tài):BMD_64_TX_CPLD_QW1。在這個(gè)狀態(tài)里要發(fā)送TLP的第二個(gè)DWORD,主要包含地址和數(shù)據(jù),然后進(jìn)入下一個(gè)狀態(tài)(BMD_64_TX_CPLD_QW1)。
第二種情況:開啟DMA發(fā)送操作,在mwr_start_i和cfg_bm_en有效的情況下,開始發(fā)送TLP的包頭,DMA的包頭也只是一個(gè)普通的寫數(shù)據(jù)請(qǐng)求;在DMA發(fā)送模式下,有幾個(gè)參數(shù)是特別重要的:要發(fā)送的TLP數(shù)目、每個(gè)TLP中包含的數(shù)據(jù)長度、每個(gè)TLP對(duì)應(yīng)PC端的起始寫入地址。進(jìn)入下一個(gè)狀態(tài)(BMD_64_TX_MWR_QW1)的時(shí)候,TX首先會(huì)根據(jù)已經(jīng)發(fā)送的TLP包的個(gè)數(shù)來計(jì)算PC端寫入的起始地址(tmwr_addr),根據(jù)計(jì)算出的起始地址發(fā)送TLP的第二個(gè)DWORD,然后進(jìn)入下一個(gè)狀態(tài):BMD_64_TX_MWR_QWN。在這個(gè)狀態(tài)中,TX首先會(huì)判斷一個(gè)TLP包中的數(shù)據(jù)長度是多少,如果是1,則在發(fā)送下一個(gè)DWORD之后,TX會(huì)進(jìn)入RST狀態(tài);如果是2,則下一個(gè)DWORD會(huì)包含兩個(gè)數(shù)據(jù),但是同樣在發(fā)送完下一個(gè)DWORD之后,TX會(huì)進(jìn)入RST狀態(tài),在進(jìn)入RST狀態(tài)之前,TX又會(huì)判斷當(dāng)前發(fā)送的TLP數(shù)目是否已經(jīng)等于預(yù)先設(shè)定的數(shù),如果相等,則會(huì)返回mwr_done_o信號(hào);如果當(dāng)前數(shù)據(jù)長度大于2,那么在發(fā)完下一個(gè)DWORD的時(shí)候,TX還會(huì)繼續(xù)發(fā)送數(shù)據(jù),知道余下的數(shù)據(jù)長度小于2。這就是TX的發(fā)送DMA操作,但是現(xiàn)在有一個(gè)問題就是在每個(gè)TLP中的數(shù)據(jù)長度大于2的時(shí)候,發(fā)向PC端的地址該由誰控制累加呢,這在TX模塊中并沒有體現(xiàn),這里我猜測(cè)是在PC端地址會(huì)由相應(yīng)的模塊控制自動(dòng)累加。還有這里的TX的DMA其實(shí)也是有一定問題的,DMA發(fā)送的數(shù)據(jù)不是由內(nèi)存讀取出來的,而是一個(gè)始終不變的數(shù),雖然表面上看是由內(nèi)存中讀取出來的,說明xapp1052的TX的DMA設(shè)計(jì)也只是存粹驗(yàn)證一下DMA控制器的正確性,數(shù)據(jù)的來源xapp1052卻并沒有涉及。
評(píng)論