找回密码
 注册
关于网站域名变更的通知
查看: 785|回复: 3
打印 上一主题 下一主题

嵌入式FPGA的那些事之DMA篇

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-8-9 09:19 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
DMA简介
! }/ u" [# C2 x. d' B: x8 m; H" x- q. z8 K
6 M! `$ p) g8 n* u# ~% {5 r' B
直接内存访问(Direct Memory Access,DMA)在嵌入式系统中扮演了一个不可或缺的角色,不论是各种主控DMA,功能类DMA,还是内嵌在各个高速低速接口模块中的DMA引擎,都能对各种类型的数据起到高效搬运的作用。本文作为嵌入式FPGA设计系列的一个子专题,将会带大家一起了解一下,DMA功能以及其衍生的开发方式在嵌入式FPGA中扮演的作用,及其具体的一些使用方法。
+ v' g; r/ P, x" z$ b3 f
6 `) p: F' h5 |& s  u3 D, V- V, d: G5 `3 x$ D1 u
DMA的由来+ H7 o9 i; v) i6 x
+ Q# V: H, v5 t6 \

/ ~6 p' |' e& C& a- E在DMA出现之前,CPU与外设之间的数据传送方式有程序传送方式、中断传送方式。不论哪一种,都只能通过CPU通过系统总线与其他部件连接并进行数据传输。
- T( q  m# D% r0 b1 U
' i& D: y8 A4 E2 [
& `" W& O! f; E% @5 C
由于CPU的运作方式是顺序的取指执行的方式,一方面在单纯的数据传输任务上对CPU的负荷太大,另一方面,CPU在数据搬移中的效率也不高,因此就产生了设计一个卸载CPU搬运任务的控制模块—DMA。
* g' q* d0 o3 F2 l- a' O增加了DMA的SOC系统如下图所示,当需要做内存内的数据块搬移,或者内存与外设之间的数据搬移的时候,CPU会通过编程DMA发起对应的搬移工作,在此期间,CPU只需要等待DMA发送搬运完成的中断知晓任务完成即可,剩下的事情就交给DMA来货拉拉了,特别的,在与外设传输的过程中,往往外设的缓存深度有限,所以是需要外设与DMA握手协同来搬运的,否则以DMA的高速搬运,很容易造成外设的上溢或者下溢。这样一来,CPU的双手就从重复性劳动中解放出来,可以去干更有意义的事情啦。
, e+ w% U0 o7 E/ `2 [: ]3 o+ n

( Z( n2 y; g. \; v- t* M2 A, ?9 T! L7 ^5 k6 L
DMA传输方式
8 H% W4 V, O6 F/ [% J/ A/ h! C; e( p( y/ N* m

/ U# O% n4 L3 i0 I! J1 o
$ b7 W9 \. D5 I2 {% K' P9 [DMA的传输方式主要涉及四种情况的数据传输,但本质上是一样的,都是从内存的某一区域传输到内存的另一区域(外设的数据寄存器本质上就是内存的一个存储单元)。四种情况的数据传输如下:; v* a: z; M$ {; E( `5 C2 V
/ a/ `8 d1 \( M; B# o
外设到内存! V9 t; H% e! C

' ?& h' w5 T1 h# v, g" M/ \内存到外设3 C; \; H  U0 |  q& S& f
/ Q$ o! F4 s3 h2 |6 G. r: c
内存到内存
8 y. |+ c) f$ k; g/ c# ?4 V& h- F5 D( I$ F2 \% y
外设到外设
; Q+ O9 f! l  [5 w6 e( g
' U& T/ `5 X/ V/ z1 s5 G3 @3 [8 Y6 Q- m) f

) n, h8 c" n! _. K! U: YDMA的工作原理, m  I7 ?: R- J
) z; G/ G, D9 |! A& r  ^/ L3 l
" d4 C) c$ n' j/ `5 J
# U6 R! }2 a# y- e5 N
16 v7 ?9 {1 w; y
常规传输模式. d7 K" O8 d+ q, s8 L& v  C
" v. e! l( ]& f0 p! y
, f0 }5 l6 P% U3 A# \$ L

0 H! C& b3 D; ?7 ^7 p& }2 p
8 d1 W& i: M9 r0 N+ k
以AXI DMA这个IP的寄存器格式为例说明下,MM2S指的是从DDR搬运出来转成axi stream流,S2MM指的是从AXI stream流搬进来转为DDR内容,分别对应上面说的内存到外设,外设到内存的搬运方式。一次有效的DMA传输需要一套控制字,即若干寄存器配置组合,包括:
4 t% f. [. R2 L1 LDMA控制寄存器:包含传输通道的设置,中断设置等! Y& Y9 {1 V8 ^* i+ b

, b# |) l5 B8 N- n9 r( BDMA状态寄存器:包含传输状态,错误状态,中断相关状态等+ \" y8 f! ?* o, j/ z
源地址寄存器:数据从哪里开始搬(MM2S通道不支持)2 P$ t. l, E3 r" Z8 ~: E8 V" e6 e
目的地址寄存器:数据搬去哪里(S2MM通道不支持). k, q$ z- g$ t& R
传输长度:搬运多少字节
* E0 H: m& [: K+ S6 C在配置好上述参数后,DMA就会开始哗哗的传输数据直到完成发出中断通知CPU啦,或者也可以是传输一半发生各种问题,保存错误状态供CPU查看。, H4 w( I7 f$ j9 c
8 M% S4 S& T0 H- q
2/ A) M. N8 E' j1 h
链表传输模式8 S$ f" q. `, U0 @8 l
% i/ L, \5 \' e  r4 G# c" O7 m
上文提到的一套DMA传输控制字, 经常又被称为 BD(BufferDescription,缓存描述符),一套控制字是一张BD表中的一个单元,由不同的BD组成一张BD表,存放在某个内存空间里。% p4 L1 T8 _( E$ ]+ B/ @: h
0 `# |' G5 r7 p7 P; n$ Y

$ s( A# K% G1 E3 aBD表的存在是应对于DMA的链表功能出现的,简言之就是进一步简化了CPU的负荷,让DMA自己取指执行数据搬运任务。BD表对应的控制字比上文的控制字一般会多出一个BD地址指针寄存器,用于存放下一个BD的地址向量,DMA控制器在每次搬运结束的时候,就会从内存中获取下一个BD,重新对自己的通道做完初始化,并开始新一个搬运工作,一般的,DMA会孜孜不倦的搬运到最后一个BD,才会发送出中断给CPU。# ]! q' v' J+ @

8 D! K- t' u5 j# ~8 |

8 {  J' G9 a' V" d# s这种应用非常的广泛,并且十分的灵活多变,尤其在网络应用中,因此一般的以太网控制器会内嵌DMA引擎用BD的方式来应对数量庞大且长短不一的网络报文格式传输, 可以极大的减少CPU的配置开销。3 Z( f: }2 |; g3 u

" ^( u* n& E" B* e3
2 Z+ o, }- U5 N+ h9 m- l其他传输模式
7 X% N- K! z: q1 k* b9 v
. r3 u( K3 t" \+ W" d: I; U7 D0 NDMA是嵌入式系统中的IP,设计方式并没有非常的固定,原则上是怎么高效怎么来。除了通用DMA外,还有外设内嵌的DMA引擎,专用于视频处理的Video DMA,甚至在嵌入式FPGA中可以用户自定义的IP形式,所以怎么好用怎么来。
9 e0 V9 q  u3 G0 b% X1 J8 F% A上述这些就是DMA传输的基本原理,在此基础上还可以设计很多衍生功能,比如二维搬运,交织解交织等,这个在后续的篇章中有机会再介绍。
% H/ A% w( G# \+ o6 r- E
" W( r: m# S7 q' S& t& @  V* t. }% C5 K& o& \0 w
嵌入式FPGA中的DMA 1 k2 w: w( k9 h! F! \

0 g. }+ ?- P" g$ _* X) H9 }$ Z如今,嵌入式SOC和FPGA相结合的全可编程器件无疑是一种很成功的产品,它的成功无疑有很大一部分得益于CPU和FPGA之间的紧耦合和内存共享等特点,使得CPU与FPGA在大数据流的配合上具有很大的灵活性和便利性。在此之前,CPU+FPGA的结构里,FPGA是无法通过DMA方式去获取CPU的内存数据的,即使过PCIE的形式虽然也具备DMA功能可达到高效访问,但似乎又显得不是那么的集成化。/ a2 W& h6 |- i& V6 n

( k8 k: k1 m$ R& t: E& v$ e
$ f5 k; O+ |0 O* l3 n* @" E
: w) H/ a9 R7 \4 X* W1 V+ r
自从以ZYNQ为代表的SOC FPGA诞生以后,CPU与FPGA之间的数据互通,都可以通过AXI总线,就几乎都是DMA形式了,具体如下:
* z7 Z, b) {4 `1 t9 }

; p$ p# u1 U) h% M! [1. PS端的DMA,可以通过GP口,直接完成DDR与PL端设备的数据搬运
+ {! @  L2 Q% n' ]5 }9 J' U* R$ `9 `" M- `( N3 D
2. PS端的DMA可以同步PL端的外设请求,完成小流量搬运" I) w' J' z- U; ]1 }! s$ c3 g, E
% K$ x) k1 [. Z1 e) g
3. PL端可以实现的任何需要缓存到PS DDR的IP,通过HP口直接读写DDR,此类IP都属于DMA操作,可完成如:
& R- z; M) N$ [% k0 |1 ?3 k: o" Y0 y- i1 o$ u8 `
高速接口数据可直接搬进搬出DDR
" B# N5 R- d; U. N! X9 n以太网功能所需要的BD传输类型
  E; n  e* M7 K& ]- q) \/ o( H$ }( D/ K- x. n  r) ~' D* r
视频流缓存,配合各种视频流IP,各种中间数据直接缓存于PSDDR,完成如图层叠加,OSD,去隔行,缩放等功能
9 Z" |0 t" s- p, z2 l
2 x# ^. g8 j) B) G+ Z, E用户自定义的各种对DDR的直接访问
# ^7 f  f, I3 Q; H0 |% J  `+ k$ t( W/ l1 F9 P2 A

1 d( ]) m  q, a: W有了上述系统理念以后,进一步的,在诸如高层次综合HLS,SDSOC,Vits等工具中,就慢慢衍生出了更加高效的PL加速引擎中间数据DMA缓存模式,其意义在于,在数据流中产生的许多中间数据都可直接申请DDR空间来缓存,存储读取都十分方便,提高了整个系统运作的效率。' W4 ]2 z  P" L. \( }

+ q+ U# g  Z. ?* B, ^; q6 i, G& T4 _2 a. g8 ]
结束语 6 ~, @% z( Q. c+ V. r% s# Q: M6 l
" L$ {; v+ Q) F& S
现如今SOC FPGA的应用十分广泛,PL端作为PS SOC系统的自定义衍生部分,既可配合CPU做加速引擎,又可以扩展各种自定义外设,在产品形态上很具备竞争力。

; Z1 E0 b& E- g& ]3 ^

该用户从未签到

2#
发表于 2021-8-9 10:32 | 只看该作者
在DMA出现之前,CPU与外设之间的数据传送方式有程序传送方式、中断传送方式。不论哪一种,都只能通过CPU通过系统总线与其他部件连接并进行数据传输。% X: u& w+ g) L

该用户从未签到

3#
发表于 2021-8-9 11:25 | 只看该作者
现如今SOC FPGA的应用十分广泛,PL端作为PS SOC系统的自定义衍生部分,既可配合CPU做加速引擎,又可以扩展各种自定义外设,在产品形态上很具备竞争力
) B5 D2 y. o" D1 _

该用户从未签到

4#
发表于 2021-8-9 13:17 | 只看该作者
在配置好上述参数后,DMA就会开始哗哗的传输数据直到完成发出中断通知CPU啦,或者也可以是传输一半发生各种问题,保存错误状态供CPU查看- \/ c. P* i* W; Z- H/ w. y/ ]# F
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-9 12:23 , Processed in 0.171875 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表