嵌入式开发者社区

标题: 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]
& }/ k. ~) p4 S# }' s) b邮箱:604285180@qq.com
( b! B4 N. y5 k( \- o7 h  z, [
作者: Lewis    时间: 2015-4-16 09:51
只需要把(下图中)向FPGA写数据的部分注释掉就行,其他地方都不需要修改。
3 v* E* t2 K# r+ X/ L$ x[attach]223[/attach]
- b3 [& \  {7 z
作者: Lewis    时间: 2015-4-16 09:55
还要注意数据在FPGA存储的地址,跟dsp读的地址要对应
作者: 水瓶    时间: 2015-4-16 22:14
Lewis 发表于 2015-4-16 09:55+ [0 c2 A# j3 G: t4 k( T# Y/ r
还要注意数据在FPGA存储的地址,跟dsp读的地址要对应

* H6 W! T* |9 M# L7 ^FPGA端RAM的地址是从0开始的,DSP端地址是0x6000 0000的地址去读,请问如何映射地址?
作者: Lewis    时间: 2015-4-17 10:10
[attach]225[/attach]
- }& N) G# S6 @$ Q$ P6 BEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
( Q, L! a& L$ W
作者: 水瓶    时间: 2015-4-20 17:17
本帖最后由 水瓶 于 2015-4-20 17:24 编辑
9 w6 c% v+ I: d  I
Lewis 发表于 2015-4-17 10:10' A* U3 Q9 Q  S$ t
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址# y' B! o3 `6 C
...
  1. `timescale 1ns / 1ps3 P8 `, J2 b# R9 u' S
  2. module emif_test
    ) |- e; q$ L( _$ s1 l2 k
  3. (     
    , |) J, T- h6 @
  4.    input clk,1 x5 {# p8 p# _8 g% J3 ]6 F
  5.         input    emifa_clk,    // 时钟                         5 F# y* A% f, g  `
  6.         input    emifa_cs2,    //  低电平有效异步器件使能引脚  (与异步器件片选信号相连,只在访问异步存储器时有效)      
    ; i3 m; b0 W. n5 t3 X
  7.         input    emifa_oe_n,    //  低电平有效异步器件使能引脚         
    ( Q/ F: A1 q. t+ |( y" n
  8.         input    emifa_we_n,     // 低电平有效写使能引脚      
    % `3 V% r/ y$ N' s  |
  9.         inout    emifa_wait0,    //等待输入引脚      
    $ X/ T- k# R  k6 u/ S1 w5 _
  10.         inout    emifa_wait1,            
    1 q5 x; T% ]8 Q; y% x
  11.         input    emifa_ba1,         // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。            
    $ J+ X0 E3 |  }( }& H
  12.         input    [13:0]emifa_addr,  // EMIF 地址总线            
    / A! Y$ M$ x/ f
  13.         output    [15:0]emifa_data   // EMIF 数据总线
      \* O+ \: _. {  }+ j
  14. );
    - `! w5 u3 S) k) k/ s
  15.         1 T  V# s2 j% P; s2 v, h+ \
  16. /****************EMIF Interface****************/        
    $ T, P/ p; i9 D) D3 E/ j
  17. //信号声明
    8 [( F3 `! R7 x$ B2 P- n0 c
  18. wire emif_clk;' }3 S5 ^* n- a: {$ |/ T2 W
  19. reg emifa_cs2_reg;      - ?5 s8 S/ ]0 B  n/ B) h5 b
  20. reg emifa_rnw_reg;     - s! ~2 q; s! T) f+ A& ^
  21. reg emifa_oe_n_reg;   
    ; P) _8 @3 R& p# S& R- ?
  22. reg emifa_we_n_reg;    ' C+ G1 J1 L# z
  23. reg emifa_wait0_reg;   
    , K6 D$ R( {0 r: v- t8 A
  24. reg emifa_wait1_reg;  
    8 R' R  e2 U' y0 a& D$ r; k
  25. reg emifa_ba1_reg;     ; ?2 o3 h: d$ m) \
  26. reg [13:0] emifa_addr_reg;      
    9 M/ J# s# C) f1 F' z3 v
  27. reg [15:0] emifa_data_reg; : q% E& e% u0 Q% f6 Z. P% k
  28. , V- B* ?, B- E2 }0 ^
  29. //元件例化
    8 Q2 I" @7 T5 W) k" I  r( {
  30. BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));! L2 `# C7 x& m  }; u+ }( d
  31. //寄存器赋值. _/ Y7 }: B" ?8 K1 X7 X1 D
  32. always@(posedge emif_clk)begin
    ! y* t) P& P! m# q; {
  33.                 emifa_cs2_reg       <= emifa_cs2;- C1 \9 s' o1 x; p8 e. s
  34.                 emifa_oe_n_reg      <= emifa_oe_n;: j5 `, ^% F* ?
  35.                 emifa_we_n_reg      <= emifa_we_n;
    $ e0 \8 D. H* b" u
  36.                 emifa_wait0_reg     <= emifa_wait0;! F7 c; B8 g2 I8 z$ o; Q. h0 _
  37.                 emifa_wait1_reg     <= emifa_wait1;( t' ^( R. f! B, H
  38.                 emifa_ba1_reg       <= emifa_ba1;: E9 o' {0 Q' r. O
  39.                 emifa_addr_reg      <= emifa_addr;7 {0 b( `4 w  e! F, w1 B
  40.                 emifa_data_reg      <= emifa_data;
    6 r* F$ A/ H' n  z. V0 O
  41. end
    * a7 C- s3 Z9 V5 C/ ^, J1 I. Z

  42. " X- [! `4 `( B5 b$ X  t, j$ G# a
  43. //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;
    0 m3 m. O4 ?4 O, c
  44. assign emifa_data = dpram_douta;! _) w6 {( y1 F3 o) j" [/ d5 c
  45. / P1 X: s  }3 U: j6 |0 }
  46. /****************Dual Port RAM****************/
    5 K: F' F6 @; g9 B8 S7 A3 R" \
  47. //PORTA
    - k! o8 U2 u, n1 e2 o
  48. reg  [14:0]dpram_addra;       - `6 I, B( c. P* ^
  49. reg  dpram_wea;         , c! P8 _( x% J; J, n  a" `
  50. reg  [15:0]dpram_dina;      
    ' |/ a' s0 V$ E2 q6 k
  51. wire [15:0]dpram_douta;           - b/ `6 S) y" F$ N8 c4 N; B
  52. //PORTB$ l1 I& P" ~% }9 D/ _
  53. reg  [14:0]dpram_addrb;       ( p, Q$ V; a2 {3 o- M
  54. wire  dpram_web;: M/ f8 N" t1 |7 r1 a
  55. reg  [15:0]dpram_dinb;
    % N7 O! h2 B2 H) `+ [
  56. wire [15:0]dpram_doutb;
    6 g3 H5 y* h7 \# }5 e9 _
  57.    
    8 V' v6 ^0 ^; ~  }. v4 j
  58. //元件例化2 y6 o0 n5 e4 D  Q8 k
  59. dpram dpram_unit(
    ) G. ?( N' K& l8 D+ ^
  60.   .clka(emif_clk), // input clka1 h/ q* t. u6 ~7 ~( \$ o$ l
  61.   .wea(dpram_wea), // input [0 : 0] wea
    " ]  a/ y- n" }; F4 w2 Q
  62.   .addra(dpram_addra), // input [14 : 0] addra. f4 g& {$ c* e: \" P4 ?
  63.   .dina(dpram_dina), // input [15 : 0] dina4 {+ l, `* f7 J/ a( _$ ^* z
  64.   .douta(dpram_douta), // output [15 : 0] douta
    4 n- e! }! \6 S* R7 c
  65.         //clkb                  => sys_clk,
    & k+ c7 x3 W; x  a
  66.   .clkb(clk), // input clkb" E  k; `7 b9 i, w' g
  67.   .web(dpram_web), // input [0 : 0] web
    0 q# C3 Y* u  @* e% ?& B2 [
  68.   .addrb(dpram_addrb), // input [14 : 0] addrb9 \0 V% W5 n7 x" ?' G$ G2 Y7 g
  69.   .dinb(dpram_dinb), // input [15 : 0] dinb: ]+ P3 e$ Z3 C2 p' w  G
  70.   .doutb(dpram_doutb));// output [15 : 0] doutb)% n: \! U+ E1 m; u% R4 k
  71. 8 H6 K$ i2 T. N) `8 Y- z& X. f
  72. always@(emif_clk)begin
    5 W0 z! O; S3 }$ k( W
  73.                 dpram_wea             <= 0;
    ! x) t7 e  l- }# n
  74.                 dpram_addra           <= {emifa_addr_reg[13:0],emifa_ba1_reg};
    : [4 Q4 F) M% _
  75.                 dpram_dina            <= emifa_data_reg;
    ; S3 T% r, M0 H4 @
  76. end
    6 m0 ?. ]3 z2 H' `  k! k
  77. assign dpram_web = 1'b1;6 m8 |5 @4 V2 M4 |# D: O2 c

  78. ! u- y$ {! e8 H% r( C* X4 O! \, _3 ~& w
  79. always@( clk )8 o5 C. y2 k1 q
  80. begin
    9 y9 m2 n9 ]7 M1 m$ _6 ^$ ]$ e
  81.         dpram_addrb  <= 100;2 Y6 c/ E3 x% }, |
  82.         dpram_dinb   <= 16'd2048;
    , C' i' q  N& d& _9 I- h  c- `  ]9 J
  83. end4 z* L  a5 T, I2 _. P6 M; f

  84. # B0 V% s9 y7 N7 v9 g* a0 G
  85. endmodule
    , G0 F  w; ~( s
  86.   o# s" I1 H9 @
复制代码
嗯,谢谢,这个懂了,但是读出来的数还是不正确,fpga端具体代码如上。
& z& K8 a: W( }6 y6 B- d2 ^1 t这段代码相当于RAM的A口只用来读,并且dpram_wea一直置零,RAM的B口用来写入一个数据。. w  U/ ~  V6 f2 K6 p8 @
代码下载进FPGA后,DSP端先注释掉向fpga写入数据的部分,直接读取,读取的结果都为0,包括  dpram_addrb  <= 100;这个地址下应该的2048.1 ?1 k' ~- M- o( f8 w
然后把注释去掉,DSP端可以正常的写入数据并且正确的读出数据,但是我的FPGA端已经将  dpram_wea             <= 0;这里置零,是没法写入的,所以对于DSP端还能照常写入读出产生疑问。
8 D, P, j$ E3 i: w
3 ?$ c6 o4 q: X; T- H6 q: N8 P
作者: 水瓶    时间: 2015-4-20 17:31
Lewis 发表于 2015-4-17 10:10
3 r5 Q8 N* J) w$ k. rEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
2 l# b& ~, [9 ]6 }, o6 n1 S ...

- D; X3 v1 G$ u# z% K我的硬件平台是:TL138F-EasyEVM(浮点DSP C6748+ARM9 +Xilinx Spartn-6 FPGA核), t+ Y0 w7 X" P+ T( _6 W  b1 @  o
调试例程为:DSP端:EMIF_FPGA----EMIF总线FPGA读写测试
# m8 W8 z, c  t. v- q                    FPGA端:emif_test
作者: 水瓶    时间: 2015-4-21 19:19
Lewis 发表于 2015-4-17 10:10
5 ]7 T" l6 O% vEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
0 H& p+ O) s" G; L* o ...

9 Y0 S7 C0 Q) V4 q8 Z6 f9 x" R还望版主指导,卡了好多天了,原理都弄明白了,就是不知道问什么读出的数据不对。若是在您那里可以正确读取数据,还望发一份程序给我。谢谢了。
作者: jj909305    时间: 2017-8-12 10:01
楼主你好,这里你弄出来了吗?




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