嵌入式开发者社区

标题: 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
Lewis 发表于 2015-4-16 09:55
4 B' K, ~( ~% U" c, D还要注意数据在FPGA存储的地址,跟dsp读的地址要对应

% 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 ...
  1. `timescale 1ns / 1ps% J7 {5 I6 c6 h3 e
  2. module emif_test" z5 V# ^. d9 Z) D! z& [
  3. (     - `& b, `  y/ M6 }
  4.    input clk,- b" B- M* j- }+ s5 Q# t: g
  5.         input    emifa_clk,    // 时钟                        
    ( V0 \( y; a% h9 G9 C4 W0 o4 @
  6.         input    emifa_cs2,    //  低电平有效异步器件使能引脚  (与异步器件片选信号相连,只在访问异步存储器时有效)      0 j4 M7 [! y2 Y" z) w9 ^7 h
  7.         input    emifa_oe_n,    //  低电平有效异步器件使能引脚          ' K0 D' ^7 x% g4 K" W
  8.         input    emifa_we_n,     // 低电平有效写使能引脚       0 C0 Z: H% h) a+ h
  9.         inout    emifa_wait0,    //等待输入引脚      ( g2 c; b9 B  @7 q9 w
  10.         inout    emifa_wait1,            
    * W) p; M! F8 M' \. S3 }
  11.         input    emifa_ba1,         // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。            
    . {/ q, ^+ G. y  }  l
  12.         input    [13:0]emifa_addr,  // EMIF 地址总线            0 K% O/ f  e4 \3 z( h
  13.         output    [15:0]emifa_data   // EMIF 数据总线
    8 ~2 h4 L) v' f3 r3 e; z
  14. );
    7 i# Z  N3 q& Y: Y2 E' D
  15.         
    2 U0 C! ?$ h7 X, V/ v$ i
  16. /****************EMIF Interface****************/        
    % M! y3 t* L( B0 ?5 M
  17. //信号声明: Z4 t: Z3 m9 P# y" e0 S3 h
  18. wire emif_clk;" ?+ |! J# ]2 k4 B
  19. reg emifa_cs2_reg;      5 F4 P! M( \* A6 a
  20. reg emifa_rnw_reg;     $ o' T8 C9 Y/ {" I
  21. reg emifa_oe_n_reg;   
    ; J1 _, x, |3 k0 N/ B+ u
  22. reg emifa_we_n_reg;   
    3 V4 R) l8 z, B
  23. reg emifa_wait0_reg;   " `6 U8 \+ I. A1 D
  24. reg emifa_wait1_reg;  9 K8 U- M+ D" y+ k: i
  25. reg emifa_ba1_reg;     + T) b) ^1 J% }! R' g# R. I7 k
  26. reg [13:0] emifa_addr_reg;      
    - L4 r6 @* e0 e5 W
  27. reg [15:0] emifa_data_reg; 8 {  ?. a9 G% L3 q7 j1 Z3 D6 s2 `9 m1 V
  28. 7 _- P3 u- ]6 d6 o
  29. //元件例化# v( P# Z; _; S; J4 s7 t0 O
  30. BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));
    ) [1 o% h& Z% w4 e
  31. //寄存器赋值
    . m  f4 }9 M: b; P3 d
  32. always@(posedge emif_clk)begin
    - A! T0 v" ?$ o4 |% ?# m: u) T7 a
  33.                 emifa_cs2_reg       <= emifa_cs2;+ d$ J. w* ]7 v+ Z5 G  r/ ?8 V+ j
  34.                 emifa_oe_n_reg      <= emifa_oe_n;
    % b& w5 x6 e. |5 I9 m3 E
  35.                 emifa_we_n_reg      <= emifa_we_n;/ ]1 K3 v% I7 O" W; J7 `  _( a
  36.                 emifa_wait0_reg     <= emifa_wait0;  L. {  R! F8 m! F( k  w9 B( n+ w
  37.                 emifa_wait1_reg     <= emifa_wait1;2 O/ B( S8 R0 ^9 Q) c0 N7 z0 M
  38.                 emifa_ba1_reg       <= emifa_ba1;
    , r4 X4 a# h) F
  39.                 emifa_addr_reg      <= emifa_addr;3 @6 W8 y) W+ l% l, s9 ?7 j& J5 X
  40.                 emifa_data_reg      <= emifa_data;
    4 r. ~- E7 X1 q$ J4 ]0 `, L
  41. end3 m% s  n) s) F. y

  42. ) v- s! c. N5 x6 o
  43. //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;. H& d7 k3 w! P8 e2 J1 p
  44. assign emifa_data = dpram_douta;
    ) P' [; q8 z$ P7 o) Y# @

  45. ' _0 E* c4 e" d
  46. /****************Dual Port RAM****************/
    2 k" O! J7 e1 \
  47. //PORTA
    ) d) d( s6 N, P- j
  48. reg  [14:0]dpram_addra;         ?& @* {6 F& ?8 W+ w! @
  49. reg  dpram_wea;         
    ! e. q' H! S) K+ J
  50. reg  [15:0]dpram_dina;       4 ]& _; W$ k. R, p" L- |' u$ O
  51. wire [15:0]dpram_douta;           2 a) t6 @# P* v: W
  52. //PORTB
    ; ]* Y/ C7 A1 |
  53. reg  [14:0]dpram_addrb;       ' e" c# T; R# ]! F5 j
  54. wire  dpram_web;
    ! l1 h- [  j; u
  55. reg  [15:0]dpram_dinb;
      H+ n! S/ P" P7 Z% U( f
  56. wire [15:0]dpram_doutb;
    % E- {6 K: o7 z3 @% M; `
  57.    , `, Z6 R: l9 Y
  58. //元件例化' d! u1 _" t+ i6 ?3 q
  59. dpram dpram_unit(% C* a. D: N2 x5 W) g8 `8 @
  60.   .clka(emif_clk), // input clka! w2 |+ {: J- M2 {
  61.   .wea(dpram_wea), // input [0 : 0] wea
    8 c/ i+ U1 M/ g* W" S+ P
  62.   .addra(dpram_addra), // input [14 : 0] addra
    & `3 O8 `/ o5 u( g% S# r/ U
  63.   .dina(dpram_dina), // input [15 : 0] dina
    9 K, s1 d$ g: \; x1 Z9 P
  64.   .douta(dpram_douta), // output [15 : 0] douta
    1 @  G9 Q$ y# |- W% Q8 T
  65.         //clkb                  => sys_clk,
    - Y1 k6 K# B0 A; {8 B* p+ w4 U
  66.   .clkb(clk), // input clkb
    $ G+ G+ I5 q/ }( f
  67.   .web(dpram_web), // input [0 : 0] web
    # i- Y1 I4 H5 o* d# p
  68.   .addrb(dpram_addrb), // input [14 : 0] addrb+ D: k( k7 H8 _  w
  69.   .dinb(dpram_dinb), // input [15 : 0] dinb
    ( L9 I+ C( j, `$ R. k" J
  70.   .doutb(dpram_doutb));// output [15 : 0] doutb)
    4 \9 z& x) j; e& x. a' y3 d) ]  S
  71. - }  r1 n/ F. M% P+ J, u
  72. always@(emif_clk)begin
      Z7 k7 J: {/ H. }6 I7 E
  73.                 dpram_wea             <= 0;8 l/ W( p2 _6 u; N" \, \
  74.                 dpram_addra           <= {emifa_addr_reg[13:0],emifa_ba1_reg};
    0 `3 \6 a* ]. h, \5 I
  75.                 dpram_dina            <= emifa_data_reg;
    4 W, V+ G6 x: p4 `& A# F! j2 ]0 C
  76. end
    1 ?+ K+ z% x5 Q
  77. assign dpram_web = 1'b1;+ A% H4 u$ \4 f
  78.   @' W3 C1 r2 w4 ^9 U
  79. always@( clk )8 e! p, k( i) \" p" ]7 k& i' m5 j
  80. begin
    6 x" l, X; [* \0 j1 K
  81.         dpram_addrb  <= 100;7 k5 u0 [( _$ K
  82.         dpram_dinb   <= 16'd2048;
    . B# W: T9 Y$ a8 K# i; M
  83. end1 w4 I+ D4 Y) b$ Z4 n
  84.   g  H" T4 F& A# @0 v, |) b
  85. endmodule0 o9 ]- a4 a4 w
  86. 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