嵌入式开发者社区
标题: FPGA与DSP通信问题。 [打印本页]
作者: 水瓶 时间: 2015-4-15 15:06
标题: FPGA与DSP通信问题。
1、 我现在要实现的基本功能是:一组数据给FPGA端的双口RAM,然后DSP通过EMIF读出。不需要DSP再给FPGA写入数据,如何更改贵公司的例程?我的更改是:DSP端注释掉写入FPGA部分,直接读取。FPGA部分是直接在双口RAM中初始化一组数据。然后读出的数据全是0,不是直接在双口RAM中初始化的数据。请问问题出在哪里了?还望版主大侠指导。
[attach]218[/attach]
. [% I1 C' ?, |8 ~% D& a邮箱:604285180@qq.com
) r: o+ G0 m* ^' x$ I5 o
作者: Lewis 时间: 2015-4-16 09:51
只需要把(下图中)向FPGA写数据的部分注释掉就行,其他地方都不需要修改。6 c/ Y' H: v/ w$ R' f) D. R" g# S8 c4 B
[attach]223[/attach]) R3 g# v" c0 X# c5 T
作者: Lewis 时间: 2015-4-16 09:55
还要注意数据在FPGA存储的地址,跟dsp读的地址要对应
作者: 水瓶 时间: 2015-4-16 22:14
% R9 U: k' a. C0 v7 PFPGA端RAM的地址是从0开始的,DSP端地址是0x6000 0000的地址去读,请问如何映射地址?
作者: Lewis 时间: 2015-4-17 10:10
[attach]225[/attach]2 R& f# V8 X; m2 R- L' J
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF 其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址# P6 M. g3 a' _; N9 t0 r# B. J
作者: 水瓶 时间: 2015-4-20 17:17
本帖最后由 水瓶 于 2015-4-20 17:24 编辑 * e) e! E0 R1 H3 N2 \ J
Lewis 发表于 2015-4-17 10:10
9 x) B) f m: p) ~- C0 Q6 y2 @' b% \/ mEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF 其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
" F7 J- s5 S5 b, Y ...
- `timescale 1ns / 1ps% J7 {5 I6 c6 h3 e
- module emif_test" z5 V# ^. d9 Z) D! z& [
- ( - `& b, ` y/ M6 }
- input clk,- b" B- M* j- }+ s5 Q# t: g
- input emifa_clk, // 时钟
( V0 \( y; a% h9 G9 C4 W0 o4 @ - input emifa_cs2, // 低电平有效异步器件使能引脚 (与异步器件片选信号相连,只在访问异步存储器时有效) 0 j4 M7 [! y2 Y" z) w9 ^7 h
- input emifa_oe_n, // 低电平有效异步器件使能引脚 ' K0 D' ^7 x% g4 K" W
- input emifa_we_n, // 低电平有效写使能引脚 0 C0 Z: H% h) a+ h
- inout emifa_wait0, //等待输入引脚 ( g2 c; b9 B @7 q9 w
- inout emifa_wait1,
* W) p; M! F8 M' \. S3 } - input emifa_ba1, // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。
. {/ q, ^+ G. y } l - input [13:0]emifa_addr, // EMIF 地址总线 0 K% O/ f e4 \3 z( h
- output [15:0]emifa_data // EMIF 数据总线
8 ~2 h4 L) v' f3 r3 e; z - );
7 i# Z N3 q& Y: Y2 E' D -
2 U0 C! ?$ h7 X, V/ v$ i - /****************EMIF Interface****************/
% M! y3 t* L( B0 ?5 M - //信号声明: Z4 t: Z3 m9 P# y" e0 S3 h
- wire emif_clk;" ?+ |! J# ]2 k4 B
- reg emifa_cs2_reg; 5 F4 P! M( \* A6 a
- reg emifa_rnw_reg; $ o' T8 C9 Y/ {" I
- reg emifa_oe_n_reg;
; J1 _, x, |3 k0 N/ B+ u - reg emifa_we_n_reg;
3 V4 R) l8 z, B - reg emifa_wait0_reg; " `6 U8 \+ I. A1 D
- reg emifa_wait1_reg; 9 K8 U- M+ D" y+ k: i
- reg emifa_ba1_reg; + T) b) ^1 J% }! R' g# R. I7 k
- reg [13:0] emifa_addr_reg;
- L4 r6 @* e0 e5 W - reg [15:0] emifa_data_reg; 8 { ?. a9 G% L3 q7 j1 Z3 D6 s2 `9 m1 V
- 7 _- P3 u- ]6 d6 o
- //元件例化# v( P# Z; _; S; J4 s7 t0 O
- BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));
) [1 o% h& Z% w4 e - //寄存器赋值
. m f4 }9 M: b; P3 d - always@(posedge emif_clk)begin
- A! T0 v" ?$ o4 |% ?# m: u) T7 a - emifa_cs2_reg <= emifa_cs2;+ d$ J. w* ]7 v+ Z5 G r/ ?8 V+ j
- emifa_oe_n_reg <= emifa_oe_n;
% b& w5 x6 e. |5 I9 m3 E - emifa_we_n_reg <= emifa_we_n;/ ]1 K3 v% I7 O" W; J7 ` _( a
- emifa_wait0_reg <= emifa_wait0; L. { R! F8 m! F( k w9 B( n+ w
- emifa_wait1_reg <= emifa_wait1;2 O/ B( S8 R0 ^9 Q) c0 N7 z0 M
- emifa_ba1_reg <= emifa_ba1;
, r4 X4 a# h) F - emifa_addr_reg <= emifa_addr;3 @6 W8 y) W+ l% l, s9 ?7 j& J5 X
- emifa_data_reg <= emifa_data;
4 r. ~- E7 X1 q$ J4 ]0 `, L - end3 m% s n) s) F. y
) v- s! c. N5 x6 o- //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;. H& d7 k3 w! P8 e2 J1 p
- assign emifa_data = dpram_douta;
) P' [; q8 z$ P7 o) Y# @
' _0 E* c4 e" d- /****************Dual Port RAM****************/
2 k" O! J7 e1 \ - //PORTA
) d) d( s6 N, P- j - reg [14:0]dpram_addra; ?& @* {6 F& ?8 W+ w! @
- reg dpram_wea;
! e. q' H! S) K+ J - reg [15:0]dpram_dina; 4 ]& _; W$ k. R, p" L- |' u$ O
- wire [15:0]dpram_douta; 2 a) t6 @# P* v: W
- //PORTB
; ]* Y/ C7 A1 | - reg [14:0]dpram_addrb; ' e" c# T; R# ]! F5 j
- wire dpram_web;
! l1 h- [ j; u - reg [15:0]dpram_dinb;
H+ n! S/ P" P7 Z% U( f - wire [15:0]dpram_doutb;
% E- {6 K: o7 z3 @% M; ` - , `, Z6 R: l9 Y
- //元件例化' d! u1 _" t+ i6 ?3 q
- dpram dpram_unit(% C* a. D: N2 x5 W) g8 `8 @
- .clka(emif_clk), // input clka! w2 |+ {: J- M2 {
- .wea(dpram_wea), // input [0 : 0] wea
8 c/ i+ U1 M/ g* W" S+ P - .addra(dpram_addra), // input [14 : 0] addra
& `3 O8 `/ o5 u( g% S# r/ U - .dina(dpram_dina), // input [15 : 0] dina
9 K, s1 d$ g: \; x1 Z9 P - .douta(dpram_douta), // output [15 : 0] douta
1 @ G9 Q$ y# |- W% Q8 T - //clkb => sys_clk,
- Y1 k6 K# B0 A; {8 B* p+ w4 U - .clkb(clk), // input clkb
$ G+ G+ I5 q/ }( f - .web(dpram_web), // input [0 : 0] web
# i- Y1 I4 H5 o* d# p - .addrb(dpram_addrb), // input [14 : 0] addrb+ D: k( k7 H8 _ w
- .dinb(dpram_dinb), // input [15 : 0] dinb
( L9 I+ C( j, `$ R. k" J - .doutb(dpram_doutb));// output [15 : 0] doutb)
4 \9 z& x) j; e& x. a' y3 d) ] S - - } r1 n/ F. M% P+ J, u
- always@(emif_clk)begin
Z7 k7 J: {/ H. }6 I7 E - dpram_wea <= 0;8 l/ W( p2 _6 u; N" \, \
- dpram_addra <= {emifa_addr_reg[13:0],emifa_ba1_reg};
0 `3 \6 a* ]. h, \5 I - dpram_dina <= emifa_data_reg;
4 W, V+ G6 x: p4 `& A# F! j2 ]0 C - end
1 ?+ K+ z% x5 Q - assign dpram_web = 1'b1;+ A% H4 u$ \4 f
- @' W3 C1 r2 w4 ^9 U
- always@( clk )8 e! p, k( i) \" p" ]7 k& i' m5 j
- begin
6 x" l, X; [* \0 j1 K - dpram_addrb <= 100;7 k5 u0 [( _$ K
- dpram_dinb <= 16'd2048;
. B# W: T9 Y$ a8 K# i; M - end1 w4 I+ D4 Y) b$ Z4 n
- g H" T4 F& A# @0 v, |) b
- endmodule0 o9 ]- a4 a4 w
- 8 d& z4 `! W) j! y6 ?
复制代码 嗯,谢谢,这个懂了,但是读出来的数还是不正确,fpga端具体代码如上。! @, P# I, {, o. y; T+ Q* y& `8 a
这段代码相当于RAM的A口只用来读,并且dpram_wea一直置零,RAM的B口用来写入一个数据。
1 t9 S' k$ q2 ?代码下载进FPGA后,DSP端先注释掉向fpga写入数据的部分,直接读取,读取的结果都为0,包括 dpram_addrb <= 100;这个地址下应该的2048.; Y' e5 h" F( E |9 I: T
然后把注释去掉,DSP端可以正常的写入数据并且正确的读出数据,但是我的FPGA端已经将 dpram_wea <= 0;这里置零,是没法写入的,所以对于DSP端还能照常写入读出产生疑问。1 ~' b1 S1 t& A' z
& j/ f# F0 ?& y
作者: 水瓶 时间: 2015-4-20 17:31
Lewis 发表于 2015-4-17 10:10
2 \, H" I9 @& E1 E' S5 @& A9 X% _EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF 其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
7 [; ^4 o! e9 u ...
: C7 V$ `2 g( h) a* E
我的硬件平台是:TL138F-EasyEVM(浮点DSP C6748+ARM9 +Xilinx Spartn-6 FPGA核)
# _9 ]) l7 @0 {调试例程为:DSP端:EMIF_FPGA----EMIF总线FPGA读写测试
. r5 T( \# _6 z2 q6 I$ ^; w% \ FPGA端:emif_test
作者: 水瓶 时间: 2015-4-21 19:19
Lewis 发表于 2015-4-17 10:10
: x2 W; y9 L3 i, b5 AEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF 其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址. v& w2 l T% o% _9 U& t& N% n
...
0 v% G% f5 v- b) H, D. n9 e M; ]' j9 p还望版主指导,卡了好多天了,原理都弄明白了,就是不知道问什么读出的数据不对。若是在您那里可以正确读取数据,还望发一份程序给我。谢谢了。
作者: jj909305 时间: 2017-8-12 10:01
楼主你好,这里你弄出来了吗?
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |