0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

怎么使用DMA在FPGA中的HDL和嵌入式C之間傳輸數(shù)據(jù)?

OpenFPGA ? 來(lái)源:OpenFPGA ? 2023-11-27 09:12 ? 次閱讀

該項(xiàng)目介紹了如何在 PL 中的 HDL 與 FPGA 中的處理器上運(yùn)行的嵌入式 C 之間傳輸數(shù)據(jù)的基本結(jié)構(gòu)。

08f4d728-8cbd-11ee-939d-92fbcf53809c.png

介紹

鑒于機(jī)器學(xué)習(xí)人工智能等應(yīng)用的 FPGA 設(shè)計(jì)中硬件加速的興起,現(xiàn)在是剝開(kāi)幾層“云霧”并討論 HDL 之間來(lái)回傳遞數(shù)據(jù)(主要指FPGA 的可編程邏輯 (PL) 中運(yùn)行的代碼以及 FPGA 中的硬核或軟核處理器上運(yùn)行的相應(yīng)軟件之間傳輸數(shù)據(jù))的基礎(chǔ)知識(shí)的好時(shí)機(jī)。

硬件加速可以總結(jié)為在硬件(也稱(chēng)為 FPGA 的可編程邏輯)中實(shí)現(xiàn)某些功能的基本思想,這些功能之前在位于主機(jī) PC 上或在 FPGA 上處理器(軟核或者硬核)運(yùn)行的軟件。因此,要成為一名高效的設(shè)計(jì)人員,就必須掌握如何在硬件和軟件之間來(lái)回傳遞數(shù)據(jù)的技巧。

在本例中,使用的是 Zynq SoC(片上系統(tǒng))FPGA,它具有硬核 ARM 處理器。該 ARM 核心和外設(shè)稱(chēng)為處理系統(tǒng)或 PS。

雖然有幾種不同的方法可以完成 PL 和 PS 之間的數(shù)據(jù)傳輸,包括編寫(xiě)自己的自定義接口,但我認(rèn)為最常見(jiàn)的機(jī)制是通過(guò)直接內(nèi)存訪問(wèn) (DMA) 傳輸。這是因?yàn)?DMA 允許 ARM 內(nèi)核的 CPU 簡(jiǎn)單地啟動(dòng)自身與 DDR 之間的數(shù)據(jù)傳輸,而 CPU 無(wú)需等待傳輸完成后再執(zhí)行任何其他任務(wù)。DMA 還允許 CPU 啟動(dòng)外部設(shè)備和 DDR 之間的傳輸。

在此項(xiàng)目中,將通過(guò)使用 Xilinx DMA IP 演示 DMA 的功能,該IP可通過(guò) AXIS 總線將內(nèi)存映射接口轉(zhuǎn)換為stream接口。將 32 字節(jié)寫(xiě)入嵌入式 C 中的內(nèi)存,然后通過(guò)內(nèi)存映射將其傳輸?shù)?PL 到流 (MM2S) AXIS,通過(guò)寄存器處理每個(gè)值,然后通過(guò)流將數(shù)據(jù)傳輸回內(nèi)存DMA IP 的內(nèi)存映射 (S2MM) 端口。

雖然這個(gè)示例對(duì)于重型硬件加速應(yīng)用來(lái)說(shuō)過(guò)于簡(jiǎn)單,但當(dāng)剛接觸 FPGA 時(shí),這種高速數(shù)據(jù)傳輸水平可能會(huì)變得非常復(fù)雜/難以學(xué)習(xí)。該項(xiàng)目重點(diǎn)介紹 DMA 的使用及其行為。雖然打算讓這個(gè)項(xiàng)目更多地關(guān)注數(shù)據(jù)處理方面,但在 DMA 事務(wù)實(shí)現(xiàn)中發(fā)現(xiàn)了很多小“陷阱”,因此不得不將數(shù)據(jù)處理重點(diǎn)留給另一個(gè)項(xiàng)目。

0918b17a-8cbd-11ee-939d-92fbcf53809c.png

使用 AXI DMA 控制 PL 中的 HDL 與 PS 中的 C 代碼之間的數(shù)據(jù)傳輸有兩個(gè)主要層:

Memory Map to Stream (MM2S) 和 Stream to Memory Map (S2MM) 通道上 PL 的 HDL 代碼中的 AXI 流握手信號(hào)(DMA 的控制通道是使用普通 AXI 寫(xiě)入的,但這就是全部由 Vivado 自動(dòng)處理,因此在這里只關(guān)注 AXI stream接口)。

PS 的 C 代碼中寄存器讀/寫(xiě) DMA 的順序。

Verilog 中的 AXI-Stream握手

AXI stream接口使用一組簡(jiǎn)單的握手信號(hào)機(jī)制,用于嵌入式設(shè)計(jì)中的數(shù)據(jù)交換。AXI stream接口中有許多可選信號(hào),但與 DMA MM2S 和 S2MM 數(shù)據(jù)交換相關(guān)且必需的信號(hào)是 tdata、tvalid、tready、tlast 和 tkeep。AXI stream中發(fā)送數(shù)據(jù)為主接口,接收數(shù)據(jù)為從接口。

tdata:數(shù)據(jù)總線

tvalid:當(dāng)放置在 tdata 總線上的數(shù)據(jù)有效時(shí),由主接口置位

tredy:當(dāng)從機(jī)處于準(zhǔn)備接收 tdata 總線上的數(shù)據(jù)的狀態(tài)時(shí),由從機(jī)置位

tlast:由主設(shè)備在 tdata 總線上流中最后一個(gè)數(shù)據(jù)包的持續(xù)時(shí)間內(nèi)斷言,以告訴從設(shè)備該數(shù)據(jù)包之后不會(huì)有數(shù)據(jù)

tkeep:由主設(shè)備設(shè)置的 tdata 總線上數(shù)據(jù)包的二次驗(yàn)證,指示數(shù)據(jù)包是否是流的一部分

AXI DMA IP 究竟如何實(shí)現(xiàn)此握手接口將數(shù)據(jù)傳輸出內(nèi)存 (MM2S) 并傳輸?shù)絻?nèi)存 (S2MM),這一點(diǎn)非常變化無(wú)常,尤其是在 S2MM 方面……

然而,我們首先需要了解的是有關(guān) AXI DMA 的 S2MM 事務(wù)的信息,大部分可以總結(jié)為一句話:必須設(shè)置 S2MM 事務(wù),并且在嘗試向 DMA 發(fā)送任何數(shù)據(jù)之前,以適當(dāng)?shù)捻樞驅(qū)懭?DMA 中的適當(dāng)控制寄存器來(lái)啟動(dòng)事務(wù),一旦 S2MM 通道看到 tlast 信號(hào),它就會(huì)停止事務(wù)。

數(shù)據(jù)傳輸發(fā)生在每個(gè)時(shí)鐘周期的 S2MM 和 MM2S 事務(wù)中的 tdata 總線上,其中tready 和 tvalid 均被置位(true)。因此,當(dāng)負(fù)責(zé)斷言 tvalid 時(shí),在 AXI 接口的主端必須小心,當(dāng)從從機(jī)傳入的 trety 信號(hào)也為 tvalid 斷言時(shí),不要讓 tvalid 斷言超過(guò)一個(gè)時(shí)鐘周期。否則,從設(shè)備將在同一個(gè)數(shù)據(jù)包計(jì)時(shí)兩次,作為兩個(gè)單獨(dú)的數(shù)據(jù)包。并且因?yàn)楸仨氃诳刂萍拇嫫髦兄付▊鬏斨杏卸嗌僮止?jié),所以 DMA 通道(在本例中為 S2MM)會(huì)在看到提供 tlast 信號(hào)之前認(rèn)為交換已結(jié)束,因?yàn)橛?jì)數(shù)已關(guān)閉。

092c285e-8cbd-11ee-939d-92fbcf53809c.png

我用 Verilog 編寫(xiě)了一個(gè)簡(jiǎn)單的狀態(tài)機(jī),它實(shí)現(xiàn)了一個(gè)從 AXI stream接口來(lái)從 DMA 的 MM2S 通道接收數(shù)據(jù),通過(guò)寄存器傳遞stream中的每個(gè)數(shù)據(jù)包,然后實(shí)現(xiàn)一個(gè)主 AXI strean接口來(lái)將數(shù)據(jù)流發(fā)回到S2MM通道。來(lái)自 tdata 總線的數(shù)據(jù)通過(guò)的寄存器旨在充當(dāng)占位符,用于為硬件加速進(jìn)行任何自定義數(shù)據(jù)處理。

從 Vivado 中的 ILA 中截取了一張屏幕截圖,顯示使用狀態(tài)機(jī)實(shí)現(xiàn)的時(shí)序圖。頂部是 MM2S 側(cè),底部是 S2MM 側(cè)。

這是 Verilog 狀態(tài)機(jī)的流程圖,實(shí)際文件附在本文末尾。值得注意的是,流程圖中的主/從接口是從 Verilog 狀態(tài)機(jī)的角度來(lái)看的。

0947dc20-8cbd-11ee-939d-92fbcf53809c.png

對(duì)于 DMA IP 的具體設(shè)置,因?yàn)樵谥苯蛹拇嫫髂J较率褂?DMA,所以未選中分散收集選項(xiàng)。然后,將其他所有設(shè)置保留為默認(rèn)設(shè)置,并選中允許未對(duì)齊傳輸?shù)倪x項(xiàng),我發(fā)現(xiàn)在將自定義 AXI 流接口寫(xiě)入 DMA 時(shí),這給了更多的自由空間。

09588b88-8cbd-11ee-939d-92fbcf53809c.png

為了將 Verilog 狀態(tài)機(jī)添加到模塊設(shè)計(jì)中,我右鍵單擊模塊設(shè)計(jì)的空白區(qū)域,然后選擇“添加模塊...”選項(xiàng),該選項(xiàng)將顯示 Vivado 可以在設(shè)計(jì)源中找到的所有有效 Verilog 模塊在BD中使用的文件。

09759c28-8cbd-11ee-939d-92fbcf53809c.png

值得注意的是,信號(hào)命名約定分別遵循從接口和主接口的“s_axis”和“m_axis”標(biāo)準(zhǔn)。

0996099a-8cbd-11ee-939d-92fbcf53809c.png

DMA 寄存器讀/寫(xiě)控制序列

以下是裸機(jī)使用 DMA 時(shí)更簡(jiǎn)單的順序:

1.通過(guò)將 1 寫(xiě)入 MM2S(偏移量 0x00)和 S2MM(偏移量 0x30)控制寄存器的位 2 來(lái)復(fù)位 DMA。

2.將 S2MM 通道要寫(xiě)入數(shù)據(jù)的 DDR 中位置的目標(biāo)地址寫(xiě)入 S2MM DMA 目標(biāo)地址寄存器(偏移量 0x48)。

3.通過(guò)將 1 寫(xiě)入 S2MM 控制寄存器(偏移量 0x30)的位 0 來(lái)啟動(dòng) DMA S2MM 通道。

4.通過(guò)將 S2MM 通道上要讀入內(nèi)存的總字節(jié)數(shù)值寫(xiě)入 S2MM 緩沖區(qū)長(zhǎng)度寄存器(偏移量 0x58),寫(xiě)入 S2MM 通道緩沖區(qū)的長(zhǎng)度。這將啟動(dòng) S2MM 傳輸,以便 DMA 準(zhǔn)備好從 FPGA 邏輯中的設(shè)備接收數(shù)據(jù)流(直到實(shí)際饋送數(shù)據(jù)并且 AXI 流總線上的 tvalid 由 FPGA 邏輯中的設(shè)備斷言后,該過(guò)程才會(huì)真正啟動(dòng))邏輯)。

5.將 MM2S 通道要讀取的數(shù)據(jù)的 DDR 中的源地址寫(xiě)入 MM2S DMA 源地址寄存器(偏移量 0x18)。

6.通過(guò)將 1 寫(xiě)入 MM2S 控制寄存器的位 0(偏移量 0x00)來(lái)啟動(dòng) DMA MM2S 通道。

7.通過(guò)將要發(fā)送的總字節(jié)數(shù)值寫(xiě)入 MM2S 傳輸長(zhǎng)度寄存器(偏移量 0x28),寫(xiě)入 MM2S 通道的傳輸長(zhǎng)度。這將啟動(dòng)從 DMA 到 FPGA 邏輯中的接收設(shè)備的 MM2S 傳輸。

還記得之前提到過(guò),在 PL 中的設(shè)備嘗試向 S2MM 通道發(fā)送數(shù)據(jù)之前,必須啟動(dòng)并運(yùn)行 S2MM 通道嗎?嗯,這就是為什么要按順序執(zhí)行上述步驟。步驟 2 - 4 配置并啟動(dòng) S2MM 通道,步驟 5 - 7 配置并啟動(dòng) MM2S 通道。

在步驟 4 和 5 之間發(fā)生一些其他進(jìn)程是可以的,但步驟 2 - 4 必須在步驟 5 - 7 之前發(fā)生。執(zhí)行步驟 4 后,S2MM AXI 流通道將斷言其 Tready 信號(hào),此時(shí) HDL 代碼可以開(kāi)始向其發(fā)送數(shù)據(jù)。

這也解釋了當(dāng)我第一次開(kāi)始使用 DMA 時(shí),在 SDK/Vitis 中的示例 DMA 項(xiàng)目中注意到的一些事情??偸钦J(rèn)為示例代碼似乎是在使用 MM2S - XAXIDMA_DMA_TO_DEVICE 傳輸從 DDR 中寫(xiě)入任何內(nèi)容之前嘗試將數(shù)據(jù)拉入 DDR(通過(guò)首先執(zhí)行 S2MM - XAXIDMA_DEVICE_TO_DMA 傳輸)。然而,S2MM 通道必須準(zhǔn)備好并等待接收數(shù)據(jù)才能正常工作并且不會(huì)鎖定。

在 FPGA 設(shè)計(jì)中,DMA 似乎是一種棘手的入門(mén)方法,但一旦你弄清楚它就會(huì)非常有幫助。







審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1624

    文章

    21556

    瀏覽量

    600555
  • 嵌入式
    +關(guān)注

    關(guān)注

    5052

    文章

    18915

    瀏覽量

    300851
  • HDL
    HDL
    +關(guān)注

    關(guān)注

    8

    文章

    325

    瀏覽量

    47285
  • 片上系統(tǒng)
    +關(guān)注

    關(guān)注

    0

    文章

    185

    瀏覽量

    26730
  • dma
    dma
    +關(guān)注

    關(guān)注

    3

    文章

    555

    瀏覽量

    100227

原文標(biāo)題:使用 DMA 在 FPGA 中的 HDL 和嵌入式 C 之間傳輸數(shù)據(jù)

文章出處:【微信號(hào):Open_FPGA,微信公眾號(hào):OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于 DSP-dMAX 的嵌入式 FIFO 數(shù)據(jù)傳輸系統(tǒng)設(shè)計(jì)

    大量的CPU開(kāi)銷(xiāo),很多高速的數(shù)據(jù)采集和處理,將降低系統(tǒng)的整體性能。為此,采用dMAX實(shí)現(xiàn)嵌入式FIFO數(shù)據(jù)傳輸克服異步
    發(fā)表于 07-25 09:13

    FPGA嵌入式系統(tǒng)的區(qū)別

    ,都要了解基礎(chǔ)的原件的構(gòu)造。那就從這幾個(gè)方面來(lái)說(shuō)吧.代碼:FPGA要的是HDL語(yǔ)言,(本人用的是verilog)以前學(xué)習(xí)嵌入式的時(shí)候用的是C語(yǔ)言,剛開(kāi)始發(fā)現(xiàn)這兩種語(yǔ)言還是挺像的,在網(wǎng)上
    發(fā)表于 10-12 20:18

    FPGA嵌入式系統(tǒng)設(shè)計(jì)的理想選擇

    /C++語(yǔ)言實(shí)現(xiàn)嵌入式系統(tǒng)軟硬件功能開(kāi)發(fā),SDAccel則是一款基于OpenCL開(kāi)發(fā)框架的設(shè)計(jì)工具。由此可見(jiàn)FPGA/SoC供應(yīng)商已經(jīng)花費(fèi)大量的精力來(lái)優(yōu)化器件并且完善開(kāi)發(fā)工具,使它們更易于應(yīng)用到
    發(fā)表于 07-30 18:38

    為什么說(shuō)嵌入式系統(tǒng)設(shè)計(jì)采用FPGA是理想的選擇?

    作者:Steve Leibson ,編譯:stark隨著消費(fèi)電子、物聯(lián)網(wǎng)等領(lǐng)域的不斷發(fā)展,用戶(hù)需求也越來(lái)越復(fù)雜和多樣,因此我們嵌入式系統(tǒng)設(shè)計(jì)必須選擇合適的處理器(SoC)系統(tǒng),當(dāng)然我們也需要考慮
    發(fā)表于 07-31 09:59

    如何設(shè)計(jì)嵌入式FIFO數(shù)據(jù)傳輸系統(tǒng)?

    嵌入式設(shè)備由于具有硬件可在線配置,實(shí)現(xiàn)靈活等特點(diǎn),使得其應(yīng)用越來(lái)越廣泛。尤其基于FPGA的硬件系統(tǒng)應(yīng)用較多,目前許多產(chǎn)品
    發(fā)表于 08-08 07:03

    FPGA嵌入式測(cè)試系統(tǒng)的利與弊

    FPGA嵌入式測(cè)試系統(tǒng)的優(yōu)勢(shì)是什么?FPGA嵌入式
    發(fā)表于 05-06 07:19

    淺析MATLAB和Simulink嵌入式視覺(jué)應(yīng)用

    中選擇一種,快速開(kāi)始 MATLAB 和 Simulink 之間接收和發(fā)送真實(shí)數(shù)據(jù),并從您的算法自動(dòng)生成可執(zhí)行文件,嵌入式硬件平臺(tái)上運(yùn)行。
    發(fā)表于 12-04 08:00

    淺析嵌入式FPGAHDL硬件描述語(yǔ)言

    嵌入式FPGA (現(xiàn)場(chǎng)可編程邏輯門(mén)陣列)FPGA(Field Programmable Gate Array)是PAL、GAL等可編程器件的基礎(chǔ)上進(jìn)一步發(fā)展的產(chǎn)物。它是作為專(zhuān)用集成電
    發(fā)表于 12-22 07:39

    tftp嵌入式設(shè)備和主機(jī)之間傳輸文件的方法

    tftp嵌入式設(shè)備和主機(jī)之間傳輸文件的方法
    發(fā)表于 12-23 07:14

    嵌入式GPRS數(shù)據(jù)傳輸終端設(shè)計(jì)

    利用嵌入式平臺(tái)的硬件、軟件技術(shù)、開(kāi)發(fā)了基于GPRS網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)傳輸嵌入式數(shù)據(jù)傳輸終端設(shè)備。通過(guò)設(shè)計(jì)一種應(yīng)用層通信協(xié)議,很好地解決了不可靠
    發(fā)表于 09-13 11:02 ?62次下載
    <b class='flag-5'>嵌入式</b>GPRS<b class='flag-5'>數(shù)據(jù)傳輸</b>終端設(shè)計(jì)

    嵌入式系統(tǒng)中使用FPGA時(shí)的常見(jiàn)問(wèn)題及對(duì)策

    電子發(fā)燒友網(wǎng)核心提示 :嵌入式系統(tǒng)中使用FPGA時(shí)會(huì)經(jīng)常出現(xiàn)以下常見(jiàn)問(wèn)題,如在嵌入式設(shè)計(jì),怎樣使用F
    發(fā)表于 10-17 13:38 ?1007次閱讀

    嵌入式FIFO數(shù)據(jù)傳輸系統(tǒng)詳解

    嵌入式設(shè)備由于具有硬件可在線配置,實(shí)現(xiàn)靈活等特點(diǎn),使得其應(yīng)用越來(lái)越廣泛。尤其基于FPGA的硬件系統(tǒng)應(yīng)用較多,目前許多產(chǎn)品
    發(fā)表于 10-09 16:41 ?4214次閱讀
    <b class='flag-5'>嵌入式</b>FIFO<b class='flag-5'>數(shù)據(jù)傳輸</b>系統(tǒng)詳解

    FPGA嵌入式塊存儲(chǔ)器的設(shè)計(jì)

    FPGA嵌入式塊存儲(chǔ)器的設(shè)計(jì)(嵌入式開(kāi)發(fā)平臺(tái))-該文檔為FPGA
    發(fā)表于 08-04 10:14 ?6次下載
    <b class='flag-5'>FPGA</b><b class='flag-5'>中</b><b class='flag-5'>嵌入式</b>塊存儲(chǔ)器的設(shè)計(jì)

    fpga嵌入式

    FPGA(現(xiàn)場(chǎng)可編程門(mén)陣列)不是嵌入式系統(tǒng),但FPGA嵌入式系統(tǒng)中有著重要的應(yīng)用。
    的頭像 發(fā)表于 03-14 17:19 ?2002次閱讀

    嵌入式fpga是什么意思

    嵌入式FPGA是指將FPGA技術(shù)集成到嵌入式系統(tǒng)的一種解決方案。嵌入式系統(tǒng)是一種為特定應(yīng)用而設(shè)
    的頭像 發(fā)表于 03-15 14:29 ?1121次閱讀