嵌入式开发者社区

标题: 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
Lewis 发表于 2015-4-16 09:55
2 o6 w4 ^* a; X' t+ G" H还要注意数据在FPGA存储的地址,跟dsp读的地址要对应
* 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
...
  1. `timescale 1ns / 1ps+ s% K2 ^. H8 S
  2. module emif_test
    : g  q/ b& ~  P1 ~! e8 F
  3. (     * Q5 Y( j  j( a& l
  4.    input clk,
    2 `0 a' \. F" g! v5 R8 }3 r1 P
  5.         input    emifa_clk,    // 时钟                         # f9 y# x  F& U1 s* s# X# ?
  6.         input    emifa_cs2,    //  低电平有效异步器件使能引脚  (与异步器件片选信号相连,只在访问异步存储器时有效)      : g! ]" T: `2 |0 H: y7 ^
  7.         input    emifa_oe_n,    //  低电平有效异步器件使能引脚         
    9 ]: @$ L1 H9 A' u3 a
  8.         input    emifa_we_n,     // 低电平有效写使能引脚      
    % z3 H! M& h2 a& v; |5 c
  9.         inout    emifa_wait0,    //等待输入引脚      * p9 b& O" x, M6 u. p
  10.         inout    emifa_wait1,            
    4 v6 x  J% Z' p
  11.         input    emifa_ba1,         // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。            ' G+ H" N& [. c: ]$ `( a
  12.         input    [13:0]emifa_addr,  // EMIF 地址总线            * _3 d1 Z! ]+ _2 \1 v: U2 z
  13.         output    [15:0]emifa_data   // EMIF 数据总线! x! v" Q5 A5 U7 d4 h
  14. );+ c; R+ R) D# f3 @* l" c1 q
  15.         1 `- A# s/ r) y$ [9 Z" D8 K9 _
  16. /****************EMIF Interface****************/        
    & b) T; m& }# P9 s' H+ V8 `" `
  17. //信号声明* x9 ~! u( W/ q: C
  18. wire emif_clk;
    2 O8 c& J" ]! d4 I) e  d1 V
  19. reg emifa_cs2_reg;      
    2 s5 C( J' s% _' O9 m" o8 H+ m) V" o
  20. reg emifa_rnw_reg;     
    , @! r' F) ?' D; H0 H$ ?! ~9 D
  21. reg emifa_oe_n_reg;    . D4 w, R" `7 E" }0 S
  22. reg emifa_we_n_reg;   
    % p) F+ |6 R$ v' v
  23. reg emifa_wait0_reg;   * s; T4 |; W, K+ F" _6 T1 _# k
  24. reg emifa_wait1_reg;  
    / R5 M# s' g; B( m$ [$ }
  25. reg emifa_ba1_reg;     , m8 t. R% \4 u% P! p
  26. reg [13:0] emifa_addr_reg;      
    : K8 D' p( j# X& v8 F( _
  27. reg [15:0] emifa_data_reg;
    + f! ^% V5 ]$ y4 d2 x1 i
  28. ' x6 \% Y( E6 `& Z( U
  29. //元件例化
    ( s( X- t  j: l$ j$ A2 J
  30. BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));
    * ?3 _. ~% [" Q; [
  31. //寄存器赋值$ t# r, W" s9 Q1 d
  32. always@(posedge emif_clk)begin
    - D6 C7 M6 H* C2 Y- T) N
  33.                 emifa_cs2_reg       <= emifa_cs2;' U3 i( Y/ d0 f7 @# @8 X
  34.                 emifa_oe_n_reg      <= emifa_oe_n;$ V, d( A* D8 I
  35.                 emifa_we_n_reg      <= emifa_we_n;" J8 D( J0 U: S( ?# o" w+ p1 F. b1 r; D
  36.                 emifa_wait0_reg     <= emifa_wait0;
    2 d2 T. u, N2 f2 S5 Y1 H: Y, K
  37.                 emifa_wait1_reg     <= emifa_wait1;% e0 x2 q( e: P- G
  38.                 emifa_ba1_reg       <= emifa_ba1;0 \1 |* }7 U4 O' D" c
  39.                 emifa_addr_reg      <= emifa_addr;
    3 d6 p" E5 V! H( i8 c
  40.                 emifa_data_reg      <= emifa_data;
    . L( Z) B& x1 ~6 w! W
  41. end3 b& X8 P' K1 C% g; x( V
  42. / Q' A: ]/ N) ~& \, S7 O$ D5 k: X
  43. //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;' t2 @% E1 J( o, f! ?8 U
  44. assign emifa_data = dpram_douta;
    3 w/ K8 I3 N7 k$ G

  45. 4 d0 b) L; ], Z- h0 r
  46. /****************Dual Port RAM****************/
    2 m: J1 N9 ?* f: B' H
  47. //PORTA; u1 i( `4 ~- w5 c
  48. reg  [14:0]dpram_addra;      
    0 I3 {  l8 x) [3 \$ l( d
  49. reg  dpram_wea;         
    1 L& m" ?9 n% S, T% {0 c. T
  50. reg  [15:0]dpram_dina;      
    # w$ a4 e5 N0 T/ }1 S) m5 Z
  51. wire [15:0]dpram_douta;           
    + k7 Q8 r$ p- D$ h( z
  52. //PORTB
    , m. g' o8 J4 Y" l: z7 ]
  53. reg  [14:0]dpram_addrb;      
    ! Z6 R7 F5 D; B: L3 K" f4 ]
  54. wire  dpram_web;) B. y  S  r0 _+ X8 c$ ^
  55. reg  [15:0]dpram_dinb;/ K( _8 u+ s$ S- g
  56. wire [15:0]dpram_doutb;
    1 R7 r( I1 \- X8 j, p
  57.    ' x1 h) H7 k5 X+ w1 S
  58. //元件例化  v8 w2 F! D  N. d
  59. dpram dpram_unit(
    9 b. l4 ]( d0 T- ^; S
  60.   .clka(emif_clk), // input clka
    + m0 H( K# k) i% B, Q. X6 }! d
  61.   .wea(dpram_wea), // input [0 : 0] wea+ b+ ?  s7 D! K3 d% C
  62.   .addra(dpram_addra), // input [14 : 0] addra& o1 |6 Y; q! d% @  X) ~
  63.   .dina(dpram_dina), // input [15 : 0] dina
    * o% I8 c6 t2 w. x
  64.   .douta(dpram_douta), // output [15 : 0] douta) R# X& M* D. n' l* T* q" d
  65.         //clkb                  => sys_clk,4 Q( j. g7 @. A8 A
  66.   .clkb(clk), // input clkb
    & F3 d6 o' G& U' x: f
  67.   .web(dpram_web), // input [0 : 0] web
    , Y4 k- ?) O! ~$ d  V
  68.   .addrb(dpram_addrb), // input [14 : 0] addrb
    % q; {' Z2 [/ ?$ t
  69.   .dinb(dpram_dinb), // input [15 : 0] dinb
    1 k  L' u5 A- r+ L0 n
  70.   .doutb(dpram_doutb));// output [15 : 0] doutb)) t6 ?/ Y2 g% r9 w4 i* R

  71. # Q  i) `. y8 C5 m( s# l; Q1 z8 N
  72. always@(emif_clk)begin
    : F9 V1 e5 [8 o5 L6 `! z  a
  73.                 dpram_wea             <= 0;8 \: ?9 U* F/ U- f- G5 w4 p
  74.                 dpram_addra           <= {emifa_addr_reg[13:0],emifa_ba1_reg};
    % L* b% C2 d5 U+ [( H- Q
  75.                 dpram_dina            <= emifa_data_reg;+ Z. h  j& B- _  {. \
  76. end
    ( o- x: Q$ j7 p( s' ~" [# a; Z
  77. assign dpram_web = 1'b1;5 U' Y0 s) k/ A, a% n; ^$ x

  78. 7 W/ A: d5 g5 a' x7 Z( z
  79. always@( clk )6 O" J; S6 h( Z* k# Y+ c1 [: O# C+ g
  80. begin
    $ G* |' ^- u, B
  81.         dpram_addrb  <= 100;  w% X5 S: B- @# m/ G5 i- z9 o
  82.         dpram_dinb   <= 16'd2048;
    ) n8 t; U! m/ p; \
  83. end
    8 d& `- X& H( k+ x9 T( B, \6 Y) w( }# z
  84. 3 d- g9 q: l, `! a
  85. endmodule
    4 A# D" g& z4 `4 H, q+ a3 m" X% o
  86. 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