嵌入式开发者社区

标题: 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
Lewis 发表于 2015-4-16 09:55
; f+ r# d0 Q3 K! l( h8 E还要注意数据在FPGA存储的地址,跟dsp读的地址要对应

) 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& l
Lewis 发表于 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
...
  1. `timescale 1ns / 1ps) ^' a, f% U4 r  f9 M. e
  2. module emif_test8 ]: n8 S8 F+ L6 B- C$ d8 g% D
  3. (     
    / k& f/ W5 ~' b& z" k
  4.    input clk,
    : a1 H8 I6 c. K2 V5 C
  5.         input    emifa_clk,    // 时钟                        
    9 U( Z) x/ f0 k8 m# T
  6.         input    emifa_cs2,    //  低电平有效异步器件使能引脚  (与异步器件片选信号相连,只在访问异步存储器时有效)      
    : Z1 R/ a' _7 S# \( q& Y6 h& F
  7.         input    emifa_oe_n,    //  低电平有效异步器件使能引脚         
    0 F) Q$ Z' E' ?' n/ t3 p
  8.         input    emifa_we_n,     // 低电平有效写使能引脚       - M& p7 ?! v; [& ^- M% ~- q
  9.         inout    emifa_wait0,    //等待输入引脚      ; r6 ~& y* @0 P6 P& s
  10.         inout    emifa_wait1,            
    ) E  `% V9 b7 G8 b- D% P
  11.         input    emifa_ba1,         // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。            
    $ ~$ l: Q% h! t6 o0 f6 z
  12.         input    [13:0]emifa_addr,  // EMIF 地址总线            
    3 ]/ V' J$ Q! l
  13.         output    [15:0]emifa_data   // EMIF 数据总线
    # K5 |& z" r- `5 e: u0 S
  14. );& f# ~# \/ K( f1 S' ^: ]% i
  15.         
    9 ?- l9 {# l1 M* }
  16. /****************EMIF Interface****************/        
    # e( Y, u% {4 w2 f
  17. //信号声明9 H% U4 Q4 y4 u7 w/ Z! ?0 K
  18. wire emif_clk;
    $ p/ {& j. q/ g( h' c( W8 o
  19. reg emifa_cs2_reg;      
    9 M) o0 ?; _; b4 S
  20. reg emifa_rnw_reg;     4 p- i9 R5 L' i4 u& t& G$ [4 w6 |
  21. reg emifa_oe_n_reg;    ) P! g# `' R% y  c9 x- |6 k
  22. reg emifa_we_n_reg;   
    $ I7 b6 @6 i( T6 {7 l
  23. reg emifa_wait0_reg;   , Y$ A6 `; Z- J/ t! ~# |9 L. S- a
  24. reg emifa_wait1_reg;  " T* \8 R7 C, a3 m+ _& x$ j
  25. reg emifa_ba1_reg;     0 w  X. J" L4 }9 S
  26. reg [13:0] emifa_addr_reg;      
    7 Q/ l/ {* b2 h' t" B/ {$ c
  27. reg [15:0] emifa_data_reg; * ~5 j4 \9 Q0 r, E4 W% h% S

  28. - _2 Y$ }; C9 R  N
  29. //元件例化" }, X6 G. `: ?- V% N& @
  30. BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));2 E& D" o- Y5 a1 B4 j+ H9 x# U
  31. //寄存器赋值: _$ {* f( P) C) d/ z' `. D/ L
  32. always@(posedge emif_clk)begin
    % j2 d3 A9 V+ T$ ^* q6 `# E
  33.                 emifa_cs2_reg       <= emifa_cs2;$ }8 U  u8 B+ j. @
  34.                 emifa_oe_n_reg      <= emifa_oe_n;5 }# o% `: Y9 [7 @; ?
  35.                 emifa_we_n_reg      <= emifa_we_n;
    ) u) w+ m( j' o3 o+ J  j4 y; E3 D
  36.                 emifa_wait0_reg     <= emifa_wait0;! u' c' o' A+ K. K+ r6 _7 k
  37.                 emifa_wait1_reg     <= emifa_wait1;5 X9 H& ^3 l' q8 @& r  g) v; J
  38.                 emifa_ba1_reg       <= emifa_ba1;
    4 V* U- e' K# l$ b! @' O8 N5 j
  39.                 emifa_addr_reg      <= emifa_addr;
    $ Z# S/ t) k+ |7 U
  40.                 emifa_data_reg      <= emifa_data;
    ' b  F) u: H7 {7 T( i  a$ w3 K
  41. end, S5 W; f; ]7 t, A5 d; y

  42. * M$ x  `6 ?+ i' q
  43. //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;
    - s) f% a! M6 T, H% C9 B
  44. assign emifa_data = dpram_douta;
    # x3 ]1 V) z/ f5 m  l
  45. 9 m# Y  M9 Y6 s3 a7 v4 w8 \4 p
  46. /****************Dual Port RAM****************/
    , u: j5 O3 r4 E% ?4 V" A
  47. //PORTA
    9 U! ^+ U( `  g) y
  48. reg  [14:0]dpram_addra;      
    1 F, O/ k6 |9 Z5 f! G! z6 Q, \
  49. reg  dpram_wea;         ; O5 C5 G% k  V$ k. H9 l4 t& ]
  50. reg  [15:0]dpram_dina;      
    ! }/ R1 d. ?# s: {
  51. wire [15:0]dpram_douta;           
    . u1 [% h& B! G( k1 S5 k
  52. //PORTB
    " `/ D: A: n( @) H6 f/ s: U
  53. reg  [14:0]dpram_addrb;      
    5 V6 H: Z7 f' `0 `
  54. wire  dpram_web;% g1 V. D; e, B8 l  V
  55. reg  [15:0]dpram_dinb;
    ( ]5 e, q+ g# ~. d2 J8 S: h
  56. wire [15:0]dpram_doutb; 8 y8 K. {. G5 r4 m* L  g8 P
  57.    
    $ r3 g0 H! W8 h7 s1 U2 E; x
  58. //元件例化6 Y0 ^) A# z, I6 [
  59. dpram dpram_unit(
    . q2 a. p" i' R" f
  60.   .clka(emif_clk), // input clka4 }. e, N! s6 X5 R$ K0 |/ [  T1 B) t
  61.   .wea(dpram_wea), // input [0 : 0] wea
    # v6 D6 _5 V9 [3 r+ i+ C% q
  62.   .addra(dpram_addra), // input [14 : 0] addra! R2 g# o8 p, Y9 t/ P2 x: J
  63.   .dina(dpram_dina), // input [15 : 0] dina' G' X8 y/ Y/ T
  64.   .douta(dpram_douta), // output [15 : 0] douta- Z$ i* I9 d# H% C4 y% |, P
  65.         //clkb                  => sys_clk,+ Y9 l0 t2 E: X
  66.   .clkb(clk), // input clkb
    + j6 S( x/ N: V- W
  67.   .web(dpram_web), // input [0 : 0] web/ K# ]3 Z( @% E% ^9 s) c; P
  68.   .addrb(dpram_addrb), // input [14 : 0] addrb
    : T2 u; D  c/ [9 h
  69.   .dinb(dpram_dinb), // input [15 : 0] dinb
    8 a* ]$ _( w: D! U$ L! F
  70.   .doutb(dpram_doutb));// output [15 : 0] doutb)
    * Z& r2 r" g' m8 V6 x, l
  71. 8 H7 n& N0 ]+ A
  72. always@(emif_clk)begin+ U/ ?6 q4 a6 z5 k) p* F4 l
  73.                 dpram_wea             <= 0;
    . c( B7 P( h* ?9 I5 j+ h
  74.                 dpram_addra           <= {emifa_addr_reg[13:0],emifa_ba1_reg};2 V& E- g/ d1 k: n1 b$ H
  75.                 dpram_dina            <= emifa_data_reg;' m; {: J" U0 Q7 u4 d% X2 |
  76. end
    ! `, l4 {& J% ~. t7 z, V
  77. assign dpram_web = 1'b1;/ ?+ N( g7 H- Q$ y7 N+ N- w: U

  78. , Z/ e1 {  H4 c' i" p& Y$ b
  79. always@( clk )& d- a% B% D" L
  80. begin
    + j, ^$ U0 g% W3 O, y
  81.         dpram_addrb  <= 100;
    / o$ d* k5 P6 A
  82.         dpram_dinb   <= 16'd2048;) B- z. b( [, I5 _$ ~/ \, Y$ v2 h0 ~
  83. end* J, ~1 p- t+ z& u
  84. 9 H) ?) U1 `6 v& Y& P8 L1 T  k; i" E
  85. endmodule
    + I* K4 X& I/ ]! G6 b1 h/ c& o( E

  86. ; 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