|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本篇只有目录的第一部分,其余部分请查看(中)、(下)篇
/ H5 N( q+ C2 D3 Z$ J" A/ X
4 B& m; H* V) |' e& \# J
. n' g, @3 Q$ Z/ }1 T
* G L) e' E, V4 v! b
( @' E7 \. \8 F7 @9 j
/ {& N5 ]6 P% R9 R1 X% `背景:很多时候需要PS与PL共享DDR作为global memory,例如卷积之中,PS将weight in与feature写入DDR,然后PL调用DDR进行运算,再将结果写入DDR进行下一次迭代。/ Z7 D8 ]1 E' p" t2 z3 f
5 s& [1 q4 {+ O& L. Z
目的:1. PS与PL共享DDR,读和写。并且像卷积一样需要三个指针。2. IPcore设置变量,能通过PS能查看到IPcore运行位置。3. 运用BRAM实现一定的数据搬运。
3 H! O, u# s0 n& K& [8 }
+ d% H7 P. I6 K3 H3 \目录7 {9 `7 t. p2 {7 {- h% \1 J
0 Q4 P7 \0 @$ t! r' u2 _) c/ R
" G8 E z* h2 I
一、IPcore编写) M( z8 D4 L% b3 U% p- A0 A( a( n
' C) t, r# V# C: a. w$ B6 R7 C6 S) M8 M8 H% C3 O& |& w
1.1 一种错误的接口# a- T2 N$ Z! c' @: O! `
! c% [' Y7 }3 V3 ?2 o2 y& S1 I* [% K; ]+ E6 d" V2 [) u
1.2 IPcore代码
7 ^/ e7 b& Z, u. ?7 @3 ?/ _9 J8 e' |/ y/ D6 t, C
8 g0 y* x4 M) p S5 ?9 i 1.3 位置信息; P4 Z( n8 q4 n; X* D2 P6 ?
4 `0 [% X3 a( U% \) y1 T
; L5 e4 H, Z. z) r! P( ~% k1 G* w 1.4 接口0 k- m# w- S# x- G" f! f" X+ p& u, `
, l0 |4 [$ H! q) {
' v2 j7 T: d: x7 [7 k; V4 p _) A
s_axilite0 q: W: D! ]9 J5 h% w8 h
4 E, t, j X2 N' D) Q
: h5 F3 Z0 I* H- V$ N& S" y
m_axi
; Y8 W3 @3 P7 s4 y8 C, R2 d8 E2 k, `) X( J v% O
J6 N5 K0 \( g, R' F/ G \
二、testBench/ G0 e& \0 B+ F4 Q! I, d
: l1 d, z# \/ I- Z4 j
* S" k% [. Q1 c" A2 g4 b
2.1 程序编写! `# a4 F8 [% s" [
( [: G9 y% u: B% B m2 a
z+ a3 Z6 D% G# S0 t* n) u 2.2 PS与PL的交互3 E7 u0 {" V5 H/ x( L% d4 Q4 B
+ j3 z# ~+ e6 ]4 _0 B/ V
/ e: I' |" r2 z, @
三、系统搭建与hdf生成5 e; Q2 J7 `+ p2 K0 J
# e( R* i( O( w3 j. h) u
0 N1 _- l4 A7 d四、SDK3 M5 k+ X# c& j9 Q/ I
8 O' p/ \ K# |* |
$ l' e% M; h$ R( E. _$ J 4.1 用malloc的方式开辟内存9 y+ j1 _5 c( L1 _; C
1 \: _7 j/ j$ u, h; s- X: O" U( f$ I9 T a7 S. d
4.2 指定指针位置2 e* h* }+ [$ O( i) N: i# I
. p; H3 f' R4 s4 T4 c
/ r: W+ u" n9 _五、SoC
9 u) D, q! T5 u, n @6 z# B; d
/ [8 [% w* n9 O, j' R8 G
) e V2 x" l9 r0 v' ? H7 m 5.1 交叉编译& h% d% n& r. m4 L- \5 c
$ M! |8 V$ s- W5 f$ P& D% B# i9 v C4 o8 b
) ]* \' d- W% v- L& }5 t$ f
5.2 驱动
% g/ F( ]- i+ O( O: ~1 L, E
, j, M2 o! ~' P' t5 S1 m4 P/ t8 c, w. {, ]6 ]
5.3 运行) q% m; D* |) j" `" T/ {# n2 a
. v3 A1 q4 X7 V6 C; b
2 S9 W4 m/ L# K* q- x8 ^, y5 C' y0 g% H; t
1 R" h; d+ |6 Z8 ~/ U
1 T) u. n) W1 F8 H; H一、IPcore编写
8 K% a) F) m5 }" C
4 w, d& k1 C `+ o ?$ B1.1 一种错误的接口% G, C. w5 K# g7 k1 |9 h5 z
- c2 F& O$ y" M" D2 j0 t& |
------------------------------------------" s6 w+ @- ^0 w* \" z
) f3 Z% H$ f: Y8 e& q$ Y5 iint share_dram_core(int write_nums,int read_nums,# E% q: X% D4 m
2 e5 p, _6 V6 X5 P" B9 x volatile float * write_ptr,volatile float *read_ptr,
- ?) _6 C4 I7 L7 o. k. p, v9 @1 M2 X( h. Y" B8 Q/ c
int location_idx,int write_loop_idx,int read_loop_idx,
0 s- v" ~% f E/ I( b# W& c* X4 L* ]: z4 P! e! E) i- G2 U5 Z
int read_sum){
2 b( `- Z8 R# ~9 _% I" P% j# q" S* ?
5 j- c2 r% }0 j7 K3 V" J- d( c1 [
$ J/ E, A8 {3 O' L& J) c/ {, g4 e3 {' S8 y7 ], ^& A
" L g) e( U" y
|
|