嵌入式开发者社区

标题: 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]5 u+ e# a2 {8 G( L( i
邮箱:604285180@qq.com, g# c( @( c+ k1 r- O

作者: Lewis    时间: 2015-4-16 09:51
只需要把(下图中)向FPGA写数据的部分注释掉就行,其他地方都不需要修改。
# L/ N" B/ G, l9 N[attach]223[/attach]; V+ s* C! x, |, @6 I9 y

作者: Lewis    时间: 2015-4-16 09:55
还要注意数据在FPGA存储的地址,跟dsp读的地址要对应
作者: 水瓶    时间: 2015-4-16 22:14
Lewis 发表于 2015-4-16 09:553 `# _7 J+ z' p; W3 g& |7 Q
还要注意数据在FPGA存储的地址,跟dsp读的地址要对应

! r6 S/ V& \3 `! ?- g6 lFPGA端RAM的地址是从0开始的,DSP端地址是0x6000 0000的地址去读,请问如何映射地址?
作者: Lewis    时间: 2015-4-17 10:10
[attach]225[/attach]: L7 |% P& b; p3 A
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址3 H# v4 J7 g$ y, v

作者: 水瓶    时间: 2015-4-20 17:17
本帖最后由 水瓶 于 2015-4-20 17:24 编辑
6 v9 R* A7 c3 `7 c* J, u5 ?: z
Lewis 发表于 2015-4-17 10:10' w0 D9 F5 v; _
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
% E+ D3 _. I% E, O5 a, L& h. F/ F& K ...
  1. `timescale 1ns / 1ps) ?; B; t$ S0 c% }, w2 f
  2. module emif_test
    , N3 y3 @( }. F7 A- X" k6 K% ^; k8 i
  3. (     
    , N: y$ s- j/ C* p! y7 e. K" C
  4.    input clk,8 m, F7 E: N" Q  ~
  5.         input    emifa_clk,    // 时钟                         ! ^! a, h+ h& j9 A' |3 T
  6.         input    emifa_cs2,    //  低电平有效异步器件使能引脚  (与异步器件片选信号相连,只在访问异步存储器时有效)      
    # v+ h( f9 F/ D( l
  7.         input    emifa_oe_n,    //  低电平有效异步器件使能引脚          / s2 G$ v; a, t7 _. c* {- Y! e- {
  8.         input    emifa_we_n,     // 低电平有效写使能引脚         \& N- r/ }9 m! v5 ^+ [, A+ W
  9.         inout    emifa_wait0,    //等待输入引脚      % X, [+ f) I. S. M; K
  10.         inout    emifa_wait1,             0 }; Q( i1 S4 p
  11.         input    emifa_ba1,         // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。            + Z' d$ |) F% ]3 H
  12.         input    [13:0]emifa_addr,  // EMIF 地址总线            7 M+ D7 \0 G. h( Y4 a6 y
  13.         output    [15:0]emifa_data   // EMIF 数据总线, }" n7 I6 S1 `" `7 B: d8 @
  14. );5 m, v9 R% b2 Z! f. K
  15.         ! v0 x" ~6 V& A* e
  16. /****************EMIF Interface****************/        6 h4 W) c6 R; u( y% h, Z
  17. //信号声明
    $ F  r+ H6 M! i& \
  18. wire emif_clk;
    2 I* y# U* I, ?
  19. reg emifa_cs2_reg;      
    ( y2 Q: D% E2 ^6 w& J
  20. reg emifa_rnw_reg;     
    ( {4 q- J- i& ]) p$ ~: s7 t4 {& W
  21. reg emifa_oe_n_reg;    ; J# ]! c3 t) u; Q' d8 }+ L1 ~: c
  22. reg emifa_we_n_reg;    6 ~% m% e' j* j
  23. reg emifa_wait0_reg;   ; H/ F% b7 w1 G4 Y) u  Q, X3 G3 \
  24. reg emifa_wait1_reg;  
    # ^, j0 M* u/ V  S+ u8 w/ a
  25. reg emifa_ba1_reg;     : n+ f' U0 V$ r' |. l8 i0 ]$ i' m
  26. reg [13:0] emifa_addr_reg;      - X/ B" a% [5 M! E- s# z) Z1 U
  27. reg [15:0] emifa_data_reg; & _# ?- F! g( H  b

  28. $ N# d5 F: Y# i" ?$ z( v  p
  29. //元件例化
    % r  e1 |1 f7 K2 h1 g
  30. BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));
    " k3 U+ ?- v8 V2 p
  31. //寄存器赋值
    & r2 M+ M, n' z; S6 M" G- N
  32. always@(posedge emif_clk)begin+ z9 O( C. [4 a
  33.                 emifa_cs2_reg       <= emifa_cs2;
    # }; `. v7 V4 W7 X
  34.                 emifa_oe_n_reg      <= emifa_oe_n;
    + f% i9 I- z9 `; M: b! P
  35.                 emifa_we_n_reg      <= emifa_we_n;
    ' H: F+ Q4 i7 O& @. m6 X
  36.                 emifa_wait0_reg     <= emifa_wait0;
    $ m' C1 h; Q+ x3 {# ?) \* o
  37.                 emifa_wait1_reg     <= emifa_wait1;# b, m7 k0 [* k3 e! N$ A; h; E  y( n8 @
  38.                 emifa_ba1_reg       <= emifa_ba1;9 h. _/ E# w0 G5 |1 k0 p$ }
  39.                 emifa_addr_reg      <= emifa_addr;; H3 |& F& E! O+ ]2 q  T
  40.                 emifa_data_reg      <= emifa_data;
    8 a; P6 ]: c* Y% s: m6 q+ C
  41. end
    7 ?  e5 U; J; ^  T; H' i  S) @3 g
  42. ' Z! j& y7 k' O+ W- O
  43. //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;
    - \" ]+ W2 x8 R; {# p
  44. assign emifa_data = dpram_douta;( ^$ k1 z3 K! I" C+ G0 L5 y

  45. ( {1 W: O! {: P7 I
  46. /****************Dual Port RAM****************/
    ) U5 G8 n; p( U6 e: u( Z+ m- H
  47. //PORTA1 z  @" P" x. i4 f( ?3 ]
  48. reg  [14:0]dpram_addra;      
    + `& P4 f5 p8 z( L
  49. reg  dpram_wea;         0 C! n: k; I) Q3 U  ^6 r
  50. reg  [15:0]dpram_dina;      
    , P3 v1 j+ A5 m3 X
  51. wire [15:0]dpram_douta;           
    : m4 L. ^7 f0 {. r2 W7 b
  52. //PORTB
    5 A. j5 Z0 q- r3 d
  53. reg  [14:0]dpram_addrb;      
    3 B7 A7 v' G! ~6 q
  54. wire  dpram_web;
    - g4 |- X1 L. s
  55. reg  [15:0]dpram_dinb;6 p" n* f0 Q3 G! B  w, J8 u
  56. wire [15:0]dpram_doutb; 1 W; `& I, u; n! P' h) H# ^9 _
  57.    
    4 t$ T' F2 H( X9 o: ^0 }. M
  58. //元件例化2 h, q. D% T0 r/ [1 S
  59. dpram dpram_unit(2 v9 }# I% R3 k! k6 Y) O
  60.   .clka(emif_clk), // input clka
    , K8 q4 x8 c$ c2 A' v
  61.   .wea(dpram_wea), // input [0 : 0] wea. n& g+ d0 s$ E
  62.   .addra(dpram_addra), // input [14 : 0] addra
    7 E- I: d! e7 A. d1 \' Y
  63.   .dina(dpram_dina), // input [15 : 0] dina0 }/ {' @9 Z' _
  64.   .douta(dpram_douta), // output [15 : 0] douta
    0 m6 m7 P. d8 q& J" C/ [" u7 P  y
  65.         //clkb                  => sys_clk,
    ; [0 t. c: s9 H% x
  66.   .clkb(clk), // input clkb& D- @1 U* f# e" H) Z9 a- Y7 f1 n2 [! g
  67.   .web(dpram_web), // input [0 : 0] web* s& W& q1 V$ c6 B7 {
  68.   .addrb(dpram_addrb), // input [14 : 0] addrb
    : F3 E/ B& a1 `" }/ Y0 I
  69.   .dinb(dpram_dinb), // input [15 : 0] dinb0 Y+ ?; `- k9 j/ J9 n! M$ \/ |$ N- X
  70.   .doutb(dpram_doutb));// output [15 : 0] doutb)( h  o. W/ ]: b; i
  71. $ z7 c% S1 R7 z3 n) a  u3 j
  72. always@(emif_clk)begin+ i# e& q( t  w  J
  73.                 dpram_wea             <= 0;
    ' T, m' M0 H+ V$ ?: B$ H& W+ O% w
  74.                 dpram_addra           <= {emifa_addr_reg[13:0],emifa_ba1_reg};
      u( g1 }0 S5 ^9 T7 z8 H
  75.                 dpram_dina            <= emifa_data_reg;
    # o: ]; N" f( X9 R9 X/ V
  76. end
    % E3 \, x4 l$ a' D, c  P
  77. assign dpram_web = 1'b1;; D3 S% `" T8 v- ]& {

  78. 4 ~7 U+ i/ Y1 \9 @) L$ T% z
  79. always@( clk )
    & Y4 L% j3 {5 f7 [
  80. begin. L' Y* S4 C+ {* J
  81.         dpram_addrb  <= 100;
    4 ^8 o' k* e9 a/ N2 U6 R
  82.         dpram_dinb   <= 16'd2048;
    5 ?) T, J, y+ Z' B( ?
  83. end5 ?& L! S; d% \' l- L

  84. 3 a+ A0 X. t/ G0 e
  85. endmodule
    ; y* j+ w4 P2 c

  86. 8 P3 k; h+ |# J+ I$ u1 c7 q
复制代码
嗯,谢谢,这个懂了,但是读出来的数还是不正确,fpga端具体代码如上。. v# K7 K9 r2 E% i
这段代码相当于RAM的A口只用来读,并且dpram_wea一直置零,RAM的B口用来写入一个数据。
' ^- e, s. K" y) K- [; M* C代码下载进FPGA后,DSP端先注释掉向fpga写入数据的部分,直接读取,读取的结果都为0,包括  dpram_addrb  <= 100;这个地址下应该的2048., }5 a/ d2 }1 h& x: O/ j& J+ A/ W
然后把注释去掉,DSP端可以正常的写入数据并且正确的读出数据,但是我的FPGA端已经将  dpram_wea             <= 0;这里置零,是没法写入的,所以对于DSP端还能照常写入读出产生疑问。
  \* F8 u- b; T. q; |0 Q* [/ z9 u' m2 h

作者: 水瓶    时间: 2015-4-20 17:31
Lewis 发表于 2015-4-17 10:108 T& i% [+ b+ _$ i% e( K
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址7 O  l3 D0 j7 v& x4 [# A9 [
...
$ J( _, u/ L; ?/ c/ K0 R# _
我的硬件平台是:TL138F-EasyEVM(浮点DSP C6748+ARM9 +Xilinx Spartn-6 FPGA核)
: @7 c6 f  X* i+ T6 a. M调试例程为:DSP端:EMIF_FPGA----EMIF总线FPGA读写测试
( }. A6 l9 X8 a9 U                    FPGA端:emif_test
作者: 水瓶    时间: 2015-4-21 19:19
Lewis 发表于 2015-4-17 10:10% f3 w5 T+ c' E  G8 a% d4 ]
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址( I/ z) L" V  a) Z
...

2 i6 `7 X0 s( i) x5 O. l/ ]还望版主指导,卡了好多天了,原理都弄明白了,就是不知道问什么读出的数据不对。若是在您那里可以正确读取数据,还望发一份程序给我。谢谢了。
作者: jj909305    时间: 2017-8-12 10:01
楼主你好,这里你弄出来了吗?




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4