嵌入式开发者社区
标题: 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]
8 M% H# a, ^" Z, h0 p" a. l+ n! ]: m邮箱:604285180@qq.com4 i; n6 [4 m6 n! J8 f
作者: Lewis 时间: 2015-4-16 09:51
只需要把(下图中)向FPGA写数据的部分注释掉就行,其他地方都不需要修改。, b" k. ~9 i( W) M7 u; h- j
[attach]223[/attach]& r+ ` X$ ]6 U4 |2 H5 G
作者: Lewis 时间: 2015-4-16 09:55
还要注意数据在FPGA存储的地址,跟dsp读的地址要对应
作者: 水瓶 时间: 2015-4-16 22:14
* x c5 w _/ }
FPGA端RAM的地址是从0开始的,DSP端地址是0x6000 0000的地址去读,请问如何映射地址?
作者: Lewis 时间: 2015-4-17 10:10
[attach]225[/attach]
' b; y$ A8 A0 C# v7 P' R0 D$ MEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF 其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址+ j2 _1 \3 s" l
作者: 水瓶 时间: 2015-4-20 17:17
本帖最后由 水瓶 于 2015-4-20 17:24 编辑 0 T- A; V% Z7 w% d
Lewis 发表于 2015-4-17 10:10
0 q% D9 a# X+ }7 @EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF 其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址" j, U4 w: W% H. K G
...
- `timescale 1ns / 1ps+ s% K2 ^. H8 S
- module emif_test
: g q/ b& ~ P1 ~! e8 F - ( * Q5 Y( j j( a& l
- input clk,
2 `0 a' \. F" g! v5 R8 }3 r1 P - input emifa_clk, // 时钟 # f9 y# x F& U1 s* s# X# ?
- input emifa_cs2, // 低电平有效异步器件使能引脚 (与异步器件片选信号相连,只在访问异步存储器时有效) : g! ]" T: `2 |0 H: y7 ^
- input emifa_oe_n, // 低电平有效异步器件使能引脚
9 ]: @$ L1 H9 A' u3 a - input emifa_we_n, // 低电平有效写使能引脚
% z3 H! M& h2 a& v; |5 c - inout emifa_wait0, //等待输入引脚 * p9 b& O" x, M6 u. p
- inout emifa_wait1,
4 v6 x J% Z' p - input emifa_ba1, // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。 ' G+ H" N& [. c: ]$ `( a
- input [13:0]emifa_addr, // EMIF 地址总线 * _3 d1 Z! ]+ _2 \1 v: U2 z
- output [15:0]emifa_data // EMIF 数据总线! x! v" Q5 A5 U7 d4 h
- );+ c; R+ R) D# f3 @* l" c1 q
- 1 `- A# s/ r) y$ [9 Z" D8 K9 _
- /****************EMIF Interface****************/
& b) T; m& }# P9 s' H+ V8 `" ` - //信号声明* x9 ~! u( W/ q: C
- wire emif_clk;
2 O8 c& J" ]! d4 I) e d1 V - reg emifa_cs2_reg;
2 s5 C( J' s% _' O9 m" o8 H+ m) V" o - reg emifa_rnw_reg;
, @! r' F) ?' D; H0 H$ ?! ~9 D - reg emifa_oe_n_reg; . D4 w, R" `7 E" }0 S
- reg emifa_we_n_reg;
% p) F+ |6 R$ v' v - reg emifa_wait0_reg; * s; T4 |; W, K+ F" _6 T1 _# k
- reg emifa_wait1_reg;
/ R5 M# s' g; B( m$ [$ } - reg emifa_ba1_reg; , m8 t. R% \4 u% P! p
- reg [13:0] emifa_addr_reg;
: K8 D' p( j# X& v8 F( _ - reg [15:0] emifa_data_reg;
+ f! ^% V5 ]$ y4 d2 x1 i - ' x6 \% Y( E6 `& Z( U
- //元件例化
( s( X- t j: l$ j$ A2 J - BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));
* ?3 _. ~% [" Q; [ - //寄存器赋值$ t# r, W" s9 Q1 d
- always@(posedge emif_clk)begin
- D6 C7 M6 H* C2 Y- T) N - emifa_cs2_reg <= emifa_cs2;' U3 i( Y/ d0 f7 @# @8 X
- emifa_oe_n_reg <= emifa_oe_n;$ V, d( A* D8 I
- emifa_we_n_reg <= emifa_we_n;" J8 D( J0 U: S( ?# o" w+ p1 F. b1 r; D
- emifa_wait0_reg <= emifa_wait0;
2 d2 T. u, N2 f2 S5 Y1 H: Y, K - emifa_wait1_reg <= emifa_wait1;% e0 x2 q( e: P- G
- emifa_ba1_reg <= emifa_ba1;0 \1 |* }7 U4 O' D" c
- emifa_addr_reg <= emifa_addr;
3 d6 p" E5 V! H( i8 c - emifa_data_reg <= emifa_data;
. L( Z) B& x1 ~6 w! W - end3 b& X8 P' K1 C% g; x( V
- / Q' A: ]/ N) ~& \, S7 O$ D5 k: X
- //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;' t2 @% E1 J( o, f! ?8 U
- assign emifa_data = dpram_douta;
3 w/ K8 I3 N7 k$ G
4 d0 b) L; ], Z- h0 r- /****************Dual Port RAM****************/
2 m: J1 N9 ?* f: B' H - //PORTA; u1 i( `4 ~- w5 c
- reg [14:0]dpram_addra;
0 I3 { l8 x) [3 \$ l( d - reg dpram_wea;
1 L& m" ?9 n% S, T% {0 c. T - reg [15:0]dpram_dina;
# w$ a4 e5 N0 T/ }1 S) m5 Z - wire [15:0]dpram_douta;
+ k7 Q8 r$ p- D$ h( z - //PORTB
, m. g' o8 J4 Y" l: z7 ] - reg [14:0]dpram_addrb;
! Z6 R7 F5 D; B: L3 K" f4 ] - wire dpram_web;) B. y S r0 _+ X8 c$ ^
- reg [15:0]dpram_dinb;/ K( _8 u+ s$ S- g
- wire [15:0]dpram_doutb;
1 R7 r( I1 \- X8 j, p - ' x1 h) H7 k5 X+ w1 S
- //元件例化 v8 w2 F! D N. d
- dpram dpram_unit(
9 b. l4 ]( d0 T- ^; S - .clka(emif_clk), // input clka
+ m0 H( K# k) i% B, Q. X6 }! d - .wea(dpram_wea), // input [0 : 0] wea+ b+ ? s7 D! K3 d% C
- .addra(dpram_addra), // input [14 : 0] addra& o1 |6 Y; q! d% @ X) ~
- .dina(dpram_dina), // input [15 : 0] dina
* o% I8 c6 t2 w. x - .douta(dpram_douta), // output [15 : 0] douta) R# X& M* D. n' l* T* q" d
- //clkb => sys_clk,4 Q( j. g7 @. A8 A
- .clkb(clk), // input clkb
& F3 d6 o' G& U' x: f - .web(dpram_web), // input [0 : 0] web
, Y4 k- ?) O! ~$ d V - .addrb(dpram_addrb), // input [14 : 0] addrb
% q; {' Z2 [/ ?$ t - .dinb(dpram_dinb), // input [15 : 0] dinb
1 k L' u5 A- r+ L0 n - .doutb(dpram_doutb));// output [15 : 0] doutb)) t6 ?/ Y2 g% r9 w4 i* R
# Q i) `. y8 C5 m( s# l; Q1 z8 N- always@(emif_clk)begin
: F9 V1 e5 [8 o5 L6 `! z a - dpram_wea <= 0;8 \: ?9 U* F/ U- f- G5 w4 p
- dpram_addra <= {emifa_addr_reg[13:0],emifa_ba1_reg};
% L* b% C2 d5 U+ [( H- Q - dpram_dina <= emifa_data_reg;+ Z. h j& B- _ {. \
- end
( o- x: Q$ j7 p( s' ~" [# a; Z - assign dpram_web = 1'b1;5 U' Y0 s) k/ A, a% n; ^$ x
7 W/ A: d5 g5 a' x7 Z( z- always@( clk )6 O" J; S6 h( Z* k# Y+ c1 [: O# C+ g
- begin
$ G* |' ^- u, B - dpram_addrb <= 100; w% X5 S: B- @# m/ G5 i- z9 o
- dpram_dinb <= 16'd2048;
) n8 t; U! m/ p; \ - end
8 d& `- X& H( k+ x9 T( B, \6 Y) w( }# z - 3 d- g9 q: l, `! a
- endmodule
4 A# D" g& z4 `4 H, q+ a3 m" X% o - 1 d) J" G$ U, q1 n
复制代码 嗯,谢谢,这个懂了,但是读出来的数还是不正确,fpga端具体代码如上。6 \4 d; ?: f0 J% h' O) J0 u
这段代码相当于RAM的A口只用来读,并且dpram_wea一直置零,RAM的B口用来写入一个数据。* W9 E7 G2 {% X4 M! q
代码下载进FPGA后,DSP端先注释掉向fpga写入数据的部分,直接读取,读取的结果都为0,包括 dpram_addrb <= 100;这个地址下应该的2048.! b5 G Q$ C9 S
然后把注释去掉,DSP端可以正常的写入数据并且正确的读出数据,但是我的FPGA端已经将 dpram_wea <= 0;这里置零,是没法写入的,所以对于DSP端还能照常写入读出产生疑问。
, d* z' e- {9 o* X$ R' f) P: z `
; f0 U' k% `4 O
作者: 水瓶 时间: 2015-4-20 17:31
Lewis 发表于 2015-4-17 10:10
( \- v2 o3 i- Y, z0 i) PEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF 其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址7 G' Y7 n F- a3 b
...
, V8 \# P, W( H; d' H
我的硬件平台是:TL138F-EasyEVM(浮点DSP C6748+ARM9 +Xilinx Spartn-6 FPGA核)9 r. d# U" {- D9 C" s4 ^
调试例程为:DSP端:EMIF_FPGA----EMIF总线FPGA读写测试6 q0 H' T4 c. K8 H' v- n
FPGA端:emif_test
作者: 水瓶 时间: 2015-4-21 19:19
Lewis 发表于 2015-4-17 10:10( y% p3 x* \# X" c
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF 其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址: |! H" @& b& W$ _
...
9 C$ _5 n" M* o* D; ]
还望版主指导,卡了好多天了,原理都弄明白了,就是不知道问什么读出的数据不对。若是在您那里可以正确读取数据,还望发一份程序给我。谢谢了。
作者: jj909305 时间: 2017-8-12 10:01
楼主你好,这里你弄出来了吗?
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |