嵌入式开发者社区
标题: 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]
, I2 ~( H7 h2 G9 ^/ F" i邮箱:604285180@qq.com
" a% H4 \4 w2 p5 I
作者: Lewis 时间: 2015-4-16 09:51
只需要把(下图中)向FPGA写数据的部分注释掉就行,其他地方都不需要修改。
( t/ K) B! {7 s$ @* L! P- o2 l[attach]223[/attach]' S* ]) `! g% c6 y( \& r
作者: Lewis 时间: 2015-4-16 09:55
还要注意数据在FPGA存储的地址,跟dsp读的地址要对应
作者: 水瓶 时间: 2015-4-16 22:14
) t. h2 s \7 X D' NFPGA端RAM的地址是从0开始的,DSP端地址是0x6000 0000的地址去读,请问如何映射地址?
作者: Lewis 时间: 2015-4-17 10:10
[attach]225[/attach]
% V/ D6 _, P6 \' I0 ]EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF 其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址3 ?$ w- y) N2 N$ M& g. p& I
作者: 水瓶 时间: 2015-4-20 17:17
本帖最后由 水瓶 于 2015-4-20 17:24 编辑
- n& t G0 {6 J' p3 Z- e& lLewis 发表于 2015-4-17 10:100 x! _5 C4 J) }( `$ ?% E. A/ H
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF 其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址+ ?6 x4 h1 U& h, X" q
...
- `timescale 1ns / 1ps) ^' a, f% U4 r f9 M. e
- module emif_test8 ]: n8 S8 F+ L6 B- C$ d8 g% D
- (
/ k& f/ W5 ~' b& z" k - input clk,
: a1 H8 I6 c. K2 V5 C - input emifa_clk, // 时钟
9 U( Z) x/ f0 k8 m# T - input emifa_cs2, // 低电平有效异步器件使能引脚 (与异步器件片选信号相连,只在访问异步存储器时有效)
: Z1 R/ a' _7 S# \( q& Y6 h& F - input emifa_oe_n, // 低电平有效异步器件使能引脚
0 F) Q$ Z' E' ?' n/ t3 p - input emifa_we_n, // 低电平有效写使能引脚 - M& p7 ?! v; [& ^- M% ~- q
- inout emifa_wait0, //等待输入引脚 ; r6 ~& y* @0 P6 P& s
- inout emifa_wait1,
) E `% V9 b7 G8 b- D% P - input emifa_ba1, // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。
$ ~$ l: Q% h! t6 o0 f6 z - input [13:0]emifa_addr, // EMIF 地址总线
3 ]/ V' J$ Q! l - output [15:0]emifa_data // EMIF 数据总线
# K5 |& z" r- `5 e: u0 S - );& f# ~# \/ K( f1 S' ^: ]% i
-
9 ?- l9 {# l1 M* } - /****************EMIF Interface****************/
# e( Y, u% {4 w2 f - //信号声明9 H% U4 Q4 y4 u7 w/ Z! ?0 K
- wire emif_clk;
$ p/ {& j. q/ g( h' c( W8 o - reg emifa_cs2_reg;
9 M) o0 ?; _; b4 S - reg emifa_rnw_reg; 4 p- i9 R5 L' i4 u& t& G$ [4 w6 |
- reg emifa_oe_n_reg; ) P! g# `' R% y c9 x- |6 k
- reg emifa_we_n_reg;
$ I7 b6 @6 i( T6 {7 l - reg emifa_wait0_reg; , Y$ A6 `; Z- J/ t! ~# |9 L. S- a
- reg emifa_wait1_reg; " T* \8 R7 C, a3 m+ _& x$ j
- reg emifa_ba1_reg; 0 w X. J" L4 }9 S
- reg [13:0] emifa_addr_reg;
7 Q/ l/ {* b2 h' t" B/ {$ c - reg [15:0] emifa_data_reg; * ~5 j4 \9 Q0 r, E4 W% h% S
- _2 Y$ }; C9 R N- //元件例化" }, X6 G. `: ?- V% N& @
- BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));2 E& D" o- Y5 a1 B4 j+ H9 x# U
- //寄存器赋值: _$ {* f( P) C) d/ z' `. D/ L
- always@(posedge emif_clk)begin
% j2 d3 A9 V+ T$ ^* q6 `# E - emifa_cs2_reg <= emifa_cs2;$ }8 U u8 B+ j. @
- emifa_oe_n_reg <= emifa_oe_n;5 }# o% `: Y9 [7 @; ?
- emifa_we_n_reg <= emifa_we_n;
) u) w+ m( j' o3 o+ J j4 y; E3 D - emifa_wait0_reg <= emifa_wait0;! u' c' o' A+ K. K+ r6 _7 k
- emifa_wait1_reg <= emifa_wait1;5 X9 H& ^3 l' q8 @& r g) v; J
- emifa_ba1_reg <= emifa_ba1;
4 V* U- e' K# l$ b! @' O8 N5 j - emifa_addr_reg <= emifa_addr;
$ Z# S/ t) k+ |7 U - emifa_data_reg <= emifa_data;
' b F) u: H7 {7 T( i a$ w3 K - end, S5 W; f; ]7 t, A5 d; y
* M$ x `6 ?+ i' q- //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;
- s) f% a! M6 T, H% C9 B - assign emifa_data = dpram_douta;
# x3 ]1 V) z/ f5 m l - 9 m# Y M9 Y6 s3 a7 v4 w8 \4 p
- /****************Dual Port RAM****************/
, u: j5 O3 r4 E% ?4 V" A - //PORTA
9 U! ^+ U( ` g) y - reg [14:0]dpram_addra;
1 F, O/ k6 |9 Z5 f! G! z6 Q, \ - reg dpram_wea; ; O5 C5 G% k V$ k. H9 l4 t& ]
- reg [15:0]dpram_dina;
! }/ R1 d. ?# s: { - wire [15:0]dpram_douta;
. u1 [% h& B! G( k1 S5 k - //PORTB
" `/ D: A: n( @) H6 f/ s: U - reg [14:0]dpram_addrb;
5 V6 H: Z7 f' `0 ` - wire dpram_web;% g1 V. D; e, B8 l V
- reg [15:0]dpram_dinb;
( ]5 e, q+ g# ~. d2 J8 S: h - wire [15:0]dpram_doutb; 8 y8 K. {. G5 r4 m* L g8 P
-
$ r3 g0 H! W8 h7 s1 U2 E; x - //元件例化6 Y0 ^) A# z, I6 [
- dpram dpram_unit(
. q2 a. p" i' R" f - .clka(emif_clk), // input clka4 }. e, N! s6 X5 R$ K0 |/ [ T1 B) t
- .wea(dpram_wea), // input [0 : 0] wea
# v6 D6 _5 V9 [3 r+ i+ C% q - .addra(dpram_addra), // input [14 : 0] addra! R2 g# o8 p, Y9 t/ P2 x: J
- .dina(dpram_dina), // input [15 : 0] dina' G' X8 y/ Y/ T
- .douta(dpram_douta), // output [15 : 0] douta- Z$ i* I9 d# H% C4 y% |, P
- //clkb => sys_clk,+ Y9 l0 t2 E: X
- .clkb(clk), // input clkb
+ j6 S( x/ N: V- W - .web(dpram_web), // input [0 : 0] web/ K# ]3 Z( @% E% ^9 s) c; P
- .addrb(dpram_addrb), // input [14 : 0] addrb
: T2 u; D c/ [9 h - .dinb(dpram_dinb), // input [15 : 0] dinb
8 a* ]$ _( w: D! U$ L! F - .doutb(dpram_doutb));// output [15 : 0] doutb)
* Z& r2 r" g' m8 V6 x, l - 8 H7 n& N0 ]+ A
- always@(emif_clk)begin+ U/ ?6 q4 a6 z5 k) p* F4 l
- dpram_wea <= 0;
. c( B7 P( h* ?9 I5 j+ h - dpram_addra <= {emifa_addr_reg[13:0],emifa_ba1_reg};2 V& E- g/ d1 k: n1 b$ H
- dpram_dina <= emifa_data_reg;' m; {: J" U0 Q7 u4 d% X2 |
- end
! `, l4 {& J% ~. t7 z, V - assign dpram_web = 1'b1;/ ?+ N( g7 H- Q$ y7 N+ N- w: U
, Z/ e1 { H4 c' i" p& Y$ b- always@( clk )& d- a% B% D" L
- begin
+ j, ^$ U0 g% W3 O, y - dpram_addrb <= 100;
/ o$ d* k5 P6 A - dpram_dinb <= 16'd2048;) B- z. b( [, I5 _$ ~/ \, Y$ v2 h0 ~
- end* J, ~1 p- t+ z& u
- 9 H) ?) U1 `6 v& Y& P8 L1 T k; i" E
- endmodule
+ I* K4 X& I/ ]! G6 b1 h/ c& o( E
; T2 W4 ?* ~- T+ o0 g7 K w
复制代码 嗯,谢谢,这个懂了,但是读出来的数还是不正确,fpga端具体代码如上。* f+ O/ ^) [! m/ s
这段代码相当于RAM的A口只用来读,并且dpram_wea一直置零,RAM的B口用来写入一个数据。8 a. e: p4 n& w0 z! q
代码下载进FPGA后,DSP端先注释掉向fpga写入数据的部分,直接读取,读取的结果都为0,包括 dpram_addrb <= 100;这个地址下应该的2048.
, r$ \, Y, \+ W% p0 [0 t然后把注释去掉,DSP端可以正常的写入数据并且正确的读出数据,但是我的FPGA端已经将 dpram_wea <= 0;这里置零,是没法写入的,所以对于DSP端还能照常写入读出产生疑问。
0 l! W t) ~0 r& r& v
& f1 u0 ^/ m# D6 l/ D
作者: 水瓶 时间: 2015-4-20 17:31
Lewis 发表于 2015-4-17 10:10
5 x/ n# ]' U% z; x; Y) KEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF 其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址% g5 g$ W. e: Z* N1 f" T$ C" H
...
/ M0 c& K# N( O8 `9 y我的硬件平台是:TL138F-EasyEVM(浮点DSP C6748+ARM9 +Xilinx Spartn-6 FPGA核)
9 }) o- p3 E) ^3 H; l调试例程为:DSP端:EMIF_FPGA----EMIF总线FPGA读写测试6 f+ ?( M) E& {, j- v/ M
FPGA端:emif_test
作者: 水瓶 时间: 2015-4-21 19:19
Lewis 发表于 2015-4-17 10:10
: z' ^" n1 m0 v8 k4 bEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF 其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
/ j2 q- K3 _' U, W' ? ...
1 Q" q l1 Q4 x# J3 X还望版主指导,卡了好多天了,原理都弄明白了,就是不知道问什么读出的数据不对。若是在您那里可以正确读取数据,还望发一份程序给我。谢谢了。
作者: jj909305 时间: 2017-8-12 10:01
楼主你好,这里你弄出来了吗?
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |