|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本篇只有目录的第一部分,其余部分请查看(中)、(下)篇 7 @) K* e5 _ A$ n2 x
: `) u+ S) k e( M
/ G/ M+ f7 H2 c. O
( n( z( q/ q" L" G3 ~) @, A7 n
- I8 P7 a! f2 S9 g- B
: h$ A9 Y5 [( D5 l背景:很多时候需要PS与PL共享DDR作为global memory,例如卷积之中,PS将weight in与feature写入DDR,然后PL调用DDR进行运算,再将结果写入DDR进行下一次迭代。
. h; i! X- E. m4 ^
% a5 _- S4 z! d* d" [0 E1 I. |1 J9 A目的:1. PS与PL共享DDR,读和写。并且像卷积一样需要三个指针。2. IPcore设置变量,能通过PS能查看到IPcore运行位置。3. 运用BRAM实现一定的数据搬运。
9 M4 ^: j0 ]) y; i. L3 ` d. X8 ]" Y3 |. R8 L) e# S
目录
# N' |: S% `( e2 e6 k. R B
- I" V. F/ O7 w' k* Z) S1 s7 n& y. h7 ^/ o4 p: B
一、IPcore编写" e) k3 l6 X7 O0 e. B
y& _, m" F! A) a3 ]3 v. S; F. T5 m
9 ]( s N( E( q; k/ N9 ? 1.1 一种错误的接口8 G- a8 [& u: ~& ^* H, j
j. B6 K* d; n
* s3 K5 Y( G8 w 1.2 IPcore代码
, t# h' j& W! o" ~& s1 V6 d2 X; ?* Z* n5 B
9 Z. G" g3 l& S/ F2 ~
1.3 位置信息( ^9 T q/ J* \, q4 e f
- N. h5 W* K4 s) ^2 \7 @4 D$ I- E% t! E
1.4 接口 ?4 C. Z3 F: S; W; e/ M
) }. k- i* d( z
( \# ^6 g9 B0 Y- q" m
s_axilite
( h+ x- f0 ^3 v" B3 z
4 ] n8 K. Q7 G* \2 p) e4 ~# ]# `# @4 O6 A
m_axi
2 X0 h, h$ |" m, I7 |1 C
7 H0 b7 h, F5 a! Y' V5 ~; ?
/ E! H3 U5 Z; u二、testBench7 a7 `6 K2 ?+ d0 q7 l6 s
+ m+ H+ g# ~+ X6 B+ o- s; n& V
6 B) w, n; p( c f: G! b
2.1 程序编写6 c8 W$ ]; O5 ~
8 W1 U9 ~% n) N: {9 ~
k8 I, g6 n! d6 J; H 2.2 PS与PL的交互0 H( T9 A [) Q# w% C# g
1 x5 i- v) D3 D/ p! h% x& a3 q/ y3 a" i* ]! F9 \! X2 O
三、系统搭建与hdf生成
" x c3 o- Q, S$ Z* ?# S+ |7 R0 K# o
9 G# Y N+ z \+ k! m7 D! q四、SDK- u1 x- D- w: G; t; o, x& N Z
* L5 n; o' U! E
% d. Q W0 H: F$ A! C! Q2 u: V
4.1 用malloc的方式开辟内存
# p/ b+ p% Z+ \, s' ^6 F3 i K( F; v1 z% U
& |2 \& B( v# T: u. s/ Y
4.2 指定指针位置
2 Q' G: ]; k+ ]$ q5 v- i R) M8 _8 L4 s6 c1 D5 y$ K3 V- I
7 [9 a8 P! P. r% |8 F0 x2 }
五、SoC
/ p3 i( [3 [% u5 m3 t9 W' t* e3 ^; o5 X* n3 k2 B( ?1 p
/ _6 @) L6 a$ }( e5 |* A9 C5 c/ b
5.1 交叉编译4 s4 v# _" Q& ]2 s9 f7 ^( ^
6 t% a+ |5 [ E5 B" f5 E
/ W) l* m# t4 p8 W 5.2 驱动4 P8 u! s8 `6 I8 p D7 [
3 B; [! G1 i1 n, M# s: H' _6 \2 Y5 l+ W& Z8 R- x2 Z }$ i
5.3 运行" f+ z% n! S. t% W6 H, f( n, W1 d+ Z9 s
- g% E A" t7 q6 n6 S& X: m
! S9 e5 a& y3 K `: g
4 R3 m$ o6 x+ e7 ^3 m2 c+ l) Q
! X- c) ]# ?0 a6 K6 Z* N0 n
]2 u' X2 i! R L/ e- m一、IPcore编写
* y1 A" B2 Q0 I" T' @; a+ u% z4 D" j9 D0 h& g$ r
1.1 一种错误的接口
% s; A4 f: V7 o8 A! a- U! e
$ K9 r& A- @- Q4 W. M9 {4 `------------------------------------------
" F/ ?! Q( Y. n/ @ ]" J% F
% F# }, T |; P, H# jint share_dram_core(int write_nums,int read_nums,: I! B, W" Q8 e, {- x4 B
& w' a- \% V$ a1 R, K2 U volatile float * write_ptr,volatile float *read_ptr,8 C; G6 S* B& t) M9 U: |
/ d, {# y, p8 E1 X0 r7 i& _$ z
int location_idx,int write_loop_idx,int read_loop_idx,
" t. H! b, J, e3 H- j% G
9 L" X9 _ R& D# U int read_sum){
1 z9 p+ o% R# v8 v
" n6 {8 E( ~: y+ L5 K/ a
) b, I3 d& z, f- e) P! m
. [& k, } Q7 L/ D2 l3 a+ H6 r8 p4 ]( B
2 |: w" ]# `' W( e
|
|