嵌入式开发者社区
标题: 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]2 J4 o! J2 n4 D v
邮箱:604285180@qq.com
% M7 l' F7 U, f# H% J# o9 W8 e
作者: Lewis 时间: 2015-4-16 09:51
只需要把(下图中)向FPGA写数据的部分注释掉就行,其他地方都不需要修改。& D4 D# x0 W7 Z- C- ~2 O
[attach]223[/attach]
4 S6 j7 B. W# z' d, n' u3 s2 y
作者: Lewis 时间: 2015-4-16 09:55
还要注意数据在FPGA存储的地址,跟dsp读的地址要对应
作者: 水瓶 时间: 2015-4-16 22:14
: a# K5 e. }& _" c# g9 m6 S" J# y
FPGA端RAM的地址是从0开始的,DSP端地址是0x6000 0000的地址去读,请问如何映射地址?
作者: Lewis 时间: 2015-4-17 10:10
[attach]225[/attach]& @. L" Q% R& V
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF 其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
4 i# _+ ~$ {7 q" W; E% A; R
作者: 水瓶 时间: 2015-4-20 17:17
本帖最后由 水瓶 于 2015-4-20 17:24 编辑
3 G, F: @8 C/ e9 SLewis 发表于 2015-4-17 10:10
: ~4 X7 y2 X: o2 }8 AEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF 其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址* v1 W- V' U) g7 n$ }: U$ ^
...
- `timescale 1ns / 1ps
" h3 t. _0 X9 v' l& t% S! R - module emif_test1 ?0 R5 C; Q4 K( K9 @) o* Z; {
- (
# W' X1 j' X, z* B - input clk,9 q) G+ i; s: |4 h" T3 x5 x
- input emifa_clk, // 时钟
J. Y* G+ p2 k; z2 b" t - input emifa_cs2, // 低电平有效异步器件使能引脚 (与异步器件片选信号相连,只在访问异步存储器时有效)
0 S: C# `6 c3 f5 y6 k& r - input emifa_oe_n, // 低电平有效异步器件使能引脚
/ j8 s6 n, ]' D9 _% M) M4 X: r+ z - input emifa_we_n, // 低电平有效写使能引脚
4 o; Y+ ?5 R- @9 m3 c$ C! @ - inout emifa_wait0, //等待输入引脚 # k8 O, W5 \, ?
- inout emifa_wait1, 2 s8 ?" R9 D! I" z" h% [
- input emifa_ba1, // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。 7 `* D6 \; q$ ]( s
- input [13:0]emifa_addr, // EMIF 地址总线
5 c5 o2 b; k0 `- H0 d- v0 P - output [15:0]emifa_data // EMIF 数据总线
( N4 _! T+ ? \( n; V! @3 l# J - );' @9 @! V. r* G& {( n, l# _$ `
-
- d6 n) u( {9 B }" S8 E - /****************EMIF Interface****************/ ' V& a* L& b8 n4 t% b' ^
- //信号声明" c: Y; i1 S' R+ `# K& u% r
- wire emif_clk;" X" Q9 V" u+ k" {
- reg emifa_cs2_reg; c: R0 I7 E0 s# U* d
- reg emifa_rnw_reg;
; ~7 ?) x" M8 a$ F - reg emifa_oe_n_reg; 0 P0 S- Z/ }6 E9 i7 K2 ~! k% T' G
- reg emifa_we_n_reg;
- p, H+ j8 s8 R4 n4 G7 {7 b2 \ - reg emifa_wait0_reg;
1 B% M$ T r* |* O - reg emifa_wait1_reg;
, N5 P7 T2 ]- f3 y - reg emifa_ba1_reg; 0 y: R1 S4 Z/ a! \; _
- reg [13:0] emifa_addr_reg; : E$ S6 W7 V6 ] r A
- reg [15:0] emifa_data_reg;
( f+ J9 y" {( @5 X i& B" _4 a/ j+ C1 i
( |) b* F+ C4 x6 s! V/ |" \- //元件例化
. p8 Q: v3 F$ G! u9 T! t2 c$ B - BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));
0 `: z6 X) F* w - //寄存器赋值
. z2 B( w( e6 m- d- b T6 E/ E6 w - always@(posedge emif_clk)begin
4 i1 B. h- }5 _( d3 L/ ]: \- W - emifa_cs2_reg <= emifa_cs2;: A$ { L g) J9 `
- emifa_oe_n_reg <= emifa_oe_n;7 g! i; ?- P- ^5 Q1 O
- emifa_we_n_reg <= emifa_we_n;# S. i n: x; n# D( t0 N
- emifa_wait0_reg <= emifa_wait0;9 E/ X& @+ W, z3 G, p- A
- emifa_wait1_reg <= emifa_wait1;% u- K2 j4 W/ U$ B0 P
- emifa_ba1_reg <= emifa_ba1;( n% F& ~3 Z. E) i2 I; N6 q3 d6 h
- emifa_addr_reg <= emifa_addr;
& c3 m, l# j% N# O - emifa_data_reg <= emifa_data;
7 K. |+ Z5 d! X2 l0 j& y - end
4 E" ?; m7 O( p6 R. p1 g, V/ _& G - 8 F8 g8 g/ q' J$ D2 ]& M4 E. z8 J/ l7 ~
- //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;
9 h1 p7 z3 [4 r0 A - assign emifa_data = dpram_douta;" |# H! M+ X6 b* T3 u: ~1 {6 `
- p; U' b2 ^, l! w! t- /****************Dual Port RAM****************/
/ d% I* B6 e. t - //PORTA
8 Y2 F' v* Q) k9 j# A - reg [14:0]dpram_addra; $ _% ~2 i2 Y' v* ?7 |. B, i
- reg dpram_wea;
1 I8 ?4 A7 D, x% s - reg [15:0]dpram_dina; . i4 P3 q7 h) \) [4 q
- wire [15:0]dpram_douta;
W* I% ~2 X9 s: |9 d - //PORTB
% v* f [7 d' ^2 M - reg [14:0]dpram_addrb;
V7 l8 I$ A, F4 G - wire dpram_web;: s5 q! b! o0 I) C
- reg [15:0]dpram_dinb;1 \8 D8 `1 W1 K4 r8 r% M/ n+ k
- wire [15:0]dpram_doutb;
& ~* i3 p6 ]: U% I w/ E -
+ P' I3 j2 j' F& }5 H - //元件例化
* o- H+ _. H" x3 N) T" y - dpram dpram_unit(
3 y9 y9 e C4 w# q. v - .clka(emif_clk), // input clka) k F" H" l6 l) W
- .wea(dpram_wea), // input [0 : 0] wea
( E# h7 p, E( g; Z- F" K$ o/ G - .addra(dpram_addra), // input [14 : 0] addra
: k: u9 q2 E. q+ N; l# g k - .dina(dpram_dina), // input [15 : 0] dina
~) V8 u9 t- F6 C5 `, A - .douta(dpram_douta), // output [15 : 0] douta
/ G7 A5 k/ g& I+ H% H6 S - //clkb => sys_clk," A; I9 j5 G3 L# t
- .clkb(clk), // input clkb2 n) O* @! N% v6 s9 W0 \
- .web(dpram_web), // input [0 : 0] web, J8 c) h, N6 e# L+ I
- .addrb(dpram_addrb), // input [14 : 0] addrb5 w! K1 R* q& v G9 ^8 M$ Z* Q7 ^
- .dinb(dpram_dinb), // input [15 : 0] dinb; n+ H& }; F6 [. b0 _2 @4 ?( [
- .doutb(dpram_doutb));// output [15 : 0] doutb)
; k* i- _ |3 o2 j/ g; S/ u - + B% o4 U1 k) Z U
- always@(emif_clk)begin
" p# @2 B4 g+ G" o& T! W - dpram_wea <= 0;2 N" L. v! s( A' M$ z0 Q
- dpram_addra <= {emifa_addr_reg[13:0],emifa_ba1_reg};
" w: m8 h$ l* x: T. |. c% o - dpram_dina <= emifa_data_reg;
5 d& j: s" p- E/ `5 q" t& M% S - end
% T. e. F; `* H! h3 i - assign dpram_web = 1'b1;
1 X8 G" L5 e- O5 d) a8 y
4 J5 w8 d# b0 H/ c- w- @' x- always@( clk )& ]7 A: @# ]' O. D* M: b, O
- begin+ |: q. x i, h# q4 T) R8 N
- dpram_addrb <= 100;
7 m9 O& e7 e0 ]0 O4 ~3 D, f' y! z0 Y - dpram_dinb <= 16'd2048;
9 j, Q( |5 p8 r! u9 k a - end
& ^9 Z+ p/ D% k" d0 H - 0 |" Q0 I( _2 f& ] R3 k9 e
- endmodule; A1 _/ H9 \2 ~- e2 n/ S; G
- 9 u9 H, M& E8 p5 C
复制代码 嗯,谢谢,这个懂了,但是读出来的数还是不正确,fpga端具体代码如上。
3 @1 C: D$ @- r这段代码相当于RAM的A口只用来读,并且dpram_wea一直置零,RAM的B口用来写入一个数据。7 _. {8 d7 k4 L6 S1 s
代码下载进FPGA后,DSP端先注释掉向fpga写入数据的部分,直接读取,读取的结果都为0,包括 dpram_addrb <= 100;这个地址下应该的2048.* A0 j, l E+ b& L I H1 g. Z
然后把注释去掉,DSP端可以正常的写入数据并且正确的读出数据,但是我的FPGA端已经将 dpram_wea <= 0;这里置零,是没法写入的,所以对于DSP端还能照常写入读出产生疑问。
( g) _' p6 p" i
8 M, X) n9 S8 t: p% u7 T- \
作者: 水瓶 时间: 2015-4-20 17:31
Lewis 发表于 2015-4-17 10:10
! M0 z \; e2 v g/ [EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF 其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址3 n! K4 S% v- ?' @. d) f g
...
& R7 z6 W' C2 c) ^
我的硬件平台是:TL138F-EasyEVM(浮点DSP C6748+ARM9 +Xilinx Spartn-6 FPGA核)' O# R$ }5 ~- B" r9 o) l: P1 x
调试例程为:DSP端:EMIF_FPGA----EMIF总线FPGA读写测试
( f! J4 F3 |4 ~2 p4 q FPGA端:emif_test
作者: 水瓶 时间: 2015-4-21 19:19
Lewis 发表于 2015-4-17 10:106 _! N) o0 A& c1 S. i7 T
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF 其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
6 m, i8 W2 ~6 w% }, H/ f; l2 e9 V ...
: _; W$ D/ l! y# N9 j6 ^2 m! s
还望版主指导,卡了好多天了,原理都弄明白了,就是不知道问什么读出的数据不对。若是在您那里可以正确读取数据,还望发一份程序给我。谢谢了。
作者: jj909305 时间: 2017-8-12 10:01
楼主你好,这里你弄出来了吗?
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |