|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本篇只有目录的第一部分,其余部分请查看(中)、(下)篇 * r. k# H; J3 B
5 a+ q& d# |8 ~/ z $ D5 y3 d; [1 S0 U* |
8 I9 G( p+ o+ J1 X
3 `, Z. y' R' T, ^. q7 b; W7 t1 }0 t: ?6 a: @( G) z% [
背景:很多时候需要PS与PL共享DDR作为global memory,例如卷积之中,PS将weight in与feature写入DDR,然后PL调用DDR进行运算,再将结果写入DDR进行下一次迭代。
8 }1 f8 @! C* q$ V# _1 J/ a; B4 p
+ v6 f1 D, K: y. ]5 }目的:1. PS与PL共享DDR,读和写。并且像卷积一样需要三个指针。2. IPcore设置变量,能通过PS能查看到IPcore运行位置。3. 运用BRAM实现一定的数据搬运。: Y8 X. B0 ^. ^6 d
( I$ a/ k0 d5 h: @, g( v0 }+ Z# a
目录
& |3 k( V$ Y" t7 _# B; p( ^# e
! [ a# U }; `$ O1 g: d$ M+ i+ J7 j1 E' }2 N% b0 K0 w4 C4 [
一、IPcore编写; J8 W8 V3 V7 z( k4 ]" X$ ]3 w
" O3 z( S1 m" {0 H! K( z! h" o
# E7 t- e/ k" H. J, a% y! w \ 1.1 一种错误的接口
8 a, m- p. [2 \
, Y" y8 G# R2 t' T+ v5 X2 ]5 B4 F- I/ M1 A& M# e# R
1.2 IPcore代码
) V1 X# W% e1 u( Y/ J; s; g/ U) N2 _' P
+ c0 K5 f) z: u- z9 C
1.3 位置信息% _+ t5 s. F' d* x% H1 Z0 q! u6 K
$ ^7 Z0 [" B p' V* M0 e" s1 e
, K6 F5 Q5 V; J5 q- @% i; ]
1.4 接口1 g) I2 s6 }8 q, c: y8 l
9 R1 r! v! M1 W! d; q& [* S, D
. F5 j7 F" w6 R
s_axilite
l% c1 A0 B; i: m1 ~
1 L: m/ ~# T8 ] a6 C4 P, a, f1 J5 Z p% [" D9 R
m_axi) h; e: M' x6 d
$ @! g, N6 W: Z' [
& {) J/ J' v" I/ h% _, G! t二、testBench
5 L5 S7 [* T# W4 r2 ~8 n' r5 W: m C u0 N! a. V4 [0 A% P3 r/ Q
# j0 p2 g- D# {) u5 E 2.1 程序编写) h3 s' w- D0 O) K
; u6 t' V7 U" r1 c5 v' E8 h2 x6 F4 m+ T7 a e4 Y
2.2 PS与PL的交互: x7 i# Y3 w/ m7 E P
' h" ?1 t: h9 \+ r
' E& m6 H9 w; J: v$ L, x三、系统搭建与hdf生成% F* [, [ j3 O- b7 f+ N `
5 q0 l' ^/ ]; b
% N, m. o0 S) {$ h4 z5 D, l% i. t
四、SDK1 H% Y3 F9 g1 N' n
( b" s2 g( z& {
6 R% ]: f$ ^% |
4.1 用malloc的方式开辟内存% F* G8 c9 A8 \7 N- ~, D+ q
% ^' m3 ? s" Z9 E; V+ i, A' N
! k$ ~* B% p6 k [0 q 4.2 指定指针位置
: ]: k1 K: g& l9 Q9 g1 T/ e9 i
* o, c( w3 x2 u% E% G% ?/ V/ g- @2 |" ~, M
五、SoC
4 e6 p* s3 V( A1 ^, [$ c6 @, z6 |. f ] W" g w0 m
3 g# V6 N8 C& b4 e
5.1 交叉编译) ~7 g' m \7 i; s9 V5 j- x+ X
3 n# c( z3 F/ R% {* F
7 h' F5 u: p9 b9 j, h- g! Q 5.2 驱动
" L7 ~9 q3 _* U6 m. {9 b
$ c& Z9 a+ J0 R& i7 Q1 R. u
$ ~$ X& P& P& Q 5.3 运行
. l8 q0 z! ?: ^$ z
9 W' D7 s/ ~7 p! b
7 |& @ L+ v6 ~# C9 x) W) j: J
7 r2 K: w0 u" S. Z" b3 M, u" f* d, g( d6 k. e' c
& ~! L2 {& S$ f- X
一、IPcore编写 [* K1 R' Q" l' n
! Y7 A( U# ^' R; b' @
1.1 一种错误的接口* j& y; `0 R' H* b) q6 W
" c3 K5 J, S' I) ^8 X------------------------------------------
, H" ^; J" [% W# n$ Z. f: N& U2 y& K) z" r* R5 ~/ p. k3 V
int share_dram_core(int write_nums,int read_nums,
6 }% P/ C6 M, _6 @% [# D; d/ a. ]; K6 N9 b% e8 o; l1 G4 u
volatile float * write_ptr,volatile float *read_ptr,
* G6 w; k! _3 }4 d) U2 O
5 M. d+ H3 K ~, B0 }0 N( i int location_idx,int write_loop_idx,int read_loop_idx,
% B2 U; C$ ]0 K; T) B1 C9 W7 h& w* l2 N7 H- \( _0 }
int read_sum){
& Z* Z+ ]: x7 k5 [6 }: M
' }7 K- K' i+ Y4 R( R) h9 f1 k" m3 _' z7 z, Z6 }4 u) d
) H0 X2 }' J- t. D9 b
# v+ s/ _0 r+ w7 w# u5 q _( r# M7 l8 T
|
|