|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
DMA简介) _9 f- J2 p' D6 `6 r
; A7 { \8 M4 P/ I+ s- v: K o
: E! D' o( L' ~8 n直接内存访问(Direct Memory Access,DMA)在嵌入式系统中扮演了一个不可或缺的角色,不论是各种主控DMA,功能类DMA,还是内嵌在各个高速低速接口模块中的DMA引擎,都能对各种类型的数据起到高效搬运的作用。本文作为嵌入式FPGA设计系列的一个子专题,将会带大家一起了解一下,DMA功能以及其衍生的开发方式在嵌入式FPGA中扮演的作用,及其具体的一些使用方法。
2 n# |7 J3 _5 g& Z
6 D9 a7 |& d9 E! L% d$ e& L* d; f* l; S/ `
DMA的由来. a8 {, p& `" N4 S
3 c2 m5 m- L* w5 ?3 c: x! \
+ N0 `9 q1 o v/ j# l+ L% a在DMA出现之前,CPU与外设之间的数据传送方式有程序传送方式、中断传送方式。不论哪一种,都只能通过CPU通过系统总线与其他部件连接并进行数据传输。
, b! Z; X- }& E* P; ^
) M6 N) L/ B$ F8 q3 B, k
3 S% d' e5 n/ q; f& Y由于CPU的运作方式是顺序的取指执行的方式,一方面在单纯的数据传输任务上对CPU的负荷太大,另一方面,CPU在数据搬移中的效率也不高,因此就产生了设计一个卸载CPU搬运任务的控制模块—DMA。) K% k- {: u: {- _* J2 O7 K
增加了DMA的SOC系统如下图所示,当需要做内存内的数据块搬移,或者内存与外设之间的数据搬移的时候,CPU会通过编程DMA发起对应的搬移工作,在此期间,CPU只需要等待DMA发送搬运完成的中断知晓任务完成即可,剩下的事情就交给DMA来货拉拉了,特别的,在与外设传输的过程中,往往外设的缓存深度有限,所以是需要外设与DMA握手协同来搬运的,否则以DMA的高速搬运,很容易造成外设的上溢或者下溢。这样一来,CPU的双手就从重复性劳动中解放出来,可以去干更有意义的事情啦。
8 q3 f* X6 a! N" ]0 V
' @5 a4 i# h0 z9 }; W
6 H3 q) t# [# V2 P* l* ]( N$ K' Y+ WDMA传输方式2 a- Y; M5 U/ ~) g' P4 x8 H- V% \
# w3 M0 Q" B4 K/ W' ^! z4 C3 l
7 {3 C. |% R5 |+ b* ^/ j
9 m0 d9 ]: M- iDMA的传输方式主要涉及四种情况的数据传输,但本质上是一样的,都是从内存的某一区域传输到内存的另一区域(外设的数据寄存器本质上就是内存的一个存储单元)。四种情况的数据传输如下:
) n3 i. e2 u. o1 i
* A8 g2 u8 _/ J4 r4 p外设到内存
0 }" r; `; J2 w: G5 D$ X# E) t0 D* q |4 f4 @5 {- C' l" s0 |
内存到外设
0 B) Q/ y; ]* ?) A+ ]5 G9 W
# _/ _/ [* Q' f* m. u7 q内存到内存
4 R5 P4 b5 Q6 t! t% W, M' A/ K! c0 X0 ]: F3 t7 J
外设到外设
1 n6 Y% o2 o' _% z4 n* l) Y9 G5 B( t6 i# r; R1 b. S, Z
" U- K9 T3 p" L% F) O$ P; p9 Y
0 G' D! {& f! U9 |# E, g. e
DMA的工作原理: s. `% ^( P6 D, H6 s
7 h5 A2 G. ^1 R
+ [9 w0 ]9 F2 {4 X1 K3 C% d
9 S0 N& z3 g/ [7 B" W, H11 c7 t4 q" I! e4 c: [/ S
常规传输模式
6 R# B: A0 W2 M' ]9 E, y8 B. u% {: T9 ^0 m A
) Q" M% ~- k8 N2 \7 v) x/ q7 K) J% i7 d4 T( s' N$ K
9 L# G7 n2 `5 n- A( Y8 z以AXI DMA这个IP的寄存器格式为例说明下,MM2S指的是从DDR搬运出来转成axi stream流,S2MM指的是从AXI stream流搬进来转为DDR内容,分别对应上面说的内存到外设,外设到内存的搬运方式。一次有效的DMA传输需要一套控制字,即若干寄存器配置组合,包括:
* \8 |1 R. V3 c9 S) P4 VDMA控制寄存器:包含传输通道的设置,中断设置等
. M( ^4 B7 D, T8 s- ?6 V; Y: P) `% W0 F% X( j, [9 e
DMA状态寄存器:包含传输状态,错误状态,中断相关状态等
9 O8 x( u$ g! W: h( I" ]源地址寄存器:数据从哪里开始搬(MM2S通道不支持)
3 {" }0 x, H k& H/ q目的地址寄存器:数据搬去哪里(S2MM通道不支持)
- M4 X! `* o e0 E7 O: s6 z1 _, z+ Z传输长度:搬运多少字节
6 T" n) [, m( W# g$ ~在配置好上述参数后,DMA就会开始哗哗的传输数据直到完成发出中断通知CPU啦,或者也可以是传输一半发生各种问题,保存错误状态供CPU查看。
7 }) k/ ~' K- O: }, c' i* `7 {% v+ _2 n$ [) ?
2
+ |5 N7 x7 r$ U4 a( f5 Y, z链表传输模式
8 Q; A% S9 B5 ~/ D. u8 s0 D; v' j9 w. T/ q6 w
上文提到的一套DMA传输控制字, 经常又被称为 BD(BufferDescription,缓存描述符),一套控制字是一张BD表中的一个单元,由不同的BD组成一张BD表,存放在某个内存空间里。
* R8 W. e8 \: R6 u+ T) P- M* Q5 H, ]# j3 X9 ~& k- ~2 X
5 \' ]) R' Q, U8 ]) _" fBD表的存在是应对于DMA的链表功能出现的,简言之就是进一步简化了CPU的负荷,让DMA自己取指执行数据搬运任务。BD表对应的控制字比上文的控制字一般会多出一个BD地址指针寄存器,用于存放下一个BD的地址向量,DMA控制器在每次搬运结束的时候,就会从内存中获取下一个BD,重新对自己的通道做完初始化,并开始新一个搬运工作,一般的,DMA会孜孜不倦的搬运到最后一个BD,才会发送出中断给CPU。* D% E, z. D/ w) ?
4 h+ f0 [) }3 x: N; t
; [7 {' a( ~% H |( p& K这种应用非常的广泛,并且十分的灵活多变,尤其在网络应用中,因此一般的以太网控制器会内嵌DMA引擎用BD的方式来应对数量庞大且长短不一的网络报文格式传输, 可以极大的减少CPU的配置开销。% y* x9 V' g! t: W2 ?8 j2 l
8 Y" `# K+ H# ]
3
: A5 e2 _1 {" L5 m; m' T: ~其他传输模式+ N+ h; y+ U) q" a" I" \; o
* J% z8 o2 b# O F+ `DMA是嵌入式系统中的IP,设计方式并没有非常的固定,原则上是怎么高效怎么来。除了通用DMA外,还有外设内嵌的DMA引擎,专用于视频处理的Video DMA,甚至在嵌入式FPGA中可以用户自定义的IP形式,所以怎么好用怎么来。7 P8 s5 L+ c/ J# w+ S
上述这些就是DMA传输的基本原理,在此基础上还可以设计很多衍生功能,比如二维搬运,交织解交织等,这个在后续的篇章中有机会再介绍。
7 W" M' C( q0 f( ]1 Y' O# J/ ]( _$ R
+ p" }. z2 K$ J) N' J, e$ r. B* q7 |' c" |; v( w0 A- y! y" I
嵌入式FPGA中的DMA
3 H" _& v3 |. n. s. d( L( N% I; x
如今,嵌入式SOC和FPGA相结合的全可编程器件无疑是一种很成功的产品,它的成功无疑有很大一部分得益于CPU和FPGA之间的紧耦合和内存共享等特点,使得CPU与FPGA在大数据流的配合上具有很大的灵活性和便利性。在此之前,CPU+FPGA的结构里,FPGA是无法通过DMA方式去获取CPU的内存数据的,即使过PCIE的形式虽然也具备DMA功能可达到高效访问,但似乎又显得不是那么的集成化。
+ x3 r2 t' m! ?3 _4 V4 i, }7 U# |# C1 A: X/ `" w+ ~) R
- F0 ?1 f+ i. ]& P, N% v2 {/ L
* r" n! Y V) d自从以ZYNQ为代表的SOC FPGA诞生以后,CPU与FPGA之间的数据互通,都可以通过AXI总线,就几乎都是DMA形式了,具体如下:
3 s1 }( c6 t4 h% z" @0 {
5 n4 B9 J, S( r' ~: ?- |+ b
1. PS端的DMA,可以通过GP口,直接完成DDR与PL端设备的数据搬运
, f/ Q0 M' L9 B! B7 Y
8 |8 y- O. x) z: @0 a2. PS端的DMA可以同步PL端的外设请求,完成小流量搬运
: T5 |0 Z% j) h. A, g
2 Z0 ], g/ d1 n, K, n) g3. PL端可以实现的任何需要缓存到PS DDR的IP,通过HP口直接读写DDR,此类IP都属于DMA操作,可完成如:" m4 d/ u7 t( i0 b
: h0 j) g6 {8 [" I# d, }0 s8 l* ^! T高速接口数据可直接搬进搬出DDR
- n c& E o& E& m6 a$ k! b以太网功能所需要的BD传输类型4 E) @8 @" u# M
: c: V! G' e" F! z8 |' P. y" h
视频流缓存,配合各种视频流IP,各种中间数据直接缓存于PSDDR,完成如图层叠加,OSD,去隔行,缩放等功能+ y" D f5 A. r
' C/ ^" H; D; q$ M, e用户自定义的各种对DDR的直接访问
+ a2 }* Y6 C0 F
* H4 e! C6 `9 Y, G: ~: c! c# g- e3 b, Q. V8 P! e8 B1 [' ^2 t
有了上述系统理念以后,进一步的,在诸如高层次综合HLS,SDSOC,Vits等工具中,就慢慢衍生出了更加高效的PL加速引擎中间数据DMA缓存模式,其意义在于,在数据流中产生的许多中间数据都可直接申请DDR空间来缓存,存储读取都十分方便,提高了整个系统运作的效率。
" U1 }9 A, s8 S0 L: I2 B- g8 e# f0 B# `
$ O. h$ h5 Z( |# G5 e! U% a
结束语
( R4 r; o! P* p* X0 z1 L* G G% T8 @( Q$ b$ r
现如今SOC FPGA的应用十分广泛,PL端作为PS SOC系统的自定义衍生部分,既可配合CPU做加速引擎,又可以扩展各种自定义外设,在产品形态上很具备竞争力。& f* T7 K5 h7 x" y- }
|
|