嵌入式开发者社区

标题: 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]2 J4 o! J2 n4 D  v
邮箱:604285180@qq.com
% M7 l' F7 U, f# H% J# o9 W8 e
作者: Lewis    时间: 2015-4-16 09:51
只需要把(下图中)向FPGA写数据的部分注释掉就行,其他地方都不需要修改。& D4 D# x0 W7 Z- C- ~2 O
[attach]223[/attach]
4 S6 j7 B. W# z' d, n' u3 s2 y
作者: Lewis    时间: 2015-4-16 09:55
还要注意数据在FPGA存储的地址,跟dsp读的地址要对应
作者: 水瓶    时间: 2015-4-16 22:14
Lewis 发表于 2015-4-16 09:55/ r+ N# |9 @3 O6 b8 ]
还要注意数据在FPGA存储的地址,跟dsp读的地址要对应
: a# K5 e. }& _" c# g9 m6 S" J# y
FPGA端RAM的地址是从0开始的,DSP端地址是0x6000 0000的地址去读,请问如何映射地址?
作者: Lewis    时间: 2015-4-17 10:10
[attach]225[/attach]& @. L" Q% R& V
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
4 i# _+ ~$ {7 q" W; E% A; R
作者: 水瓶    时间: 2015-4-20 17:17
本帖最后由 水瓶 于 2015-4-20 17:24 编辑
3 G, F: @8 C/ e9 S
Lewis 发表于 2015-4-17 10:10
: ~4 X7 y2 X: o2 }8 AEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址* v1 W- V' U) g7 n$ }: U$ ^
...
  1. `timescale 1ns / 1ps
    " h3 t. _0 X9 v' l& t% S! R
  2. module emif_test1 ?0 R5 C; Q4 K( K9 @) o* Z; {
  3. (     
    # W' X1 j' X, z* B
  4.    input clk,9 q) G+ i; s: |4 h" T3 x5 x
  5.         input    emifa_clk,    // 时钟                        
      J. Y* G+ p2 k; z2 b" t
  6.         input    emifa_cs2,    //  低电平有效异步器件使能引脚  (与异步器件片选信号相连,只在访问异步存储器时有效)      
    0 S: C# `6 c3 f5 y6 k& r
  7.         input    emifa_oe_n,    //  低电平有效异步器件使能引脚         
    / j8 s6 n, ]' D9 _% M) M4 X: r+ z
  8.         input    emifa_we_n,     // 低电平有效写使能引脚      
    4 o; Y+ ?5 R- @9 m3 c$ C! @
  9.         inout    emifa_wait0,    //等待输入引脚      # k8 O, W5 \, ?
  10.         inout    emifa_wait1,             2 s8 ?" R9 D! I" z" h% [
  11.         input    emifa_ba1,         // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。            7 `* D6 \; q$ ]( s
  12.         input    [13:0]emifa_addr,  // EMIF 地址总线            
    5 c5 o2 b; k0 `- H0 d- v0 P
  13.         output    [15:0]emifa_data   // EMIF 数据总线
    ( N4 _! T+ ?  \( n; V! @3 l# J
  14. );' @9 @! V. r* G& {( n, l# _$ `
  15.         
    - d6 n) u( {9 B  }" S8 E
  16. /****************EMIF Interface****************/        ' V& a* L& b8 n4 t% b' ^
  17. //信号声明" c: Y; i1 S' R+ `# K& u% r
  18. wire emif_clk;" X" Q9 V" u+ k" {
  19. reg emifa_cs2_reg;        c: R0 I7 E0 s# U* d
  20. reg emifa_rnw_reg;     
    ; ~7 ?) x" M8 a$ F
  21. reg emifa_oe_n_reg;    0 P0 S- Z/ }6 E9 i7 K2 ~! k% T' G
  22. reg emifa_we_n_reg;   
    - p, H+ j8 s8 R4 n4 G7 {7 b2 \
  23. reg emifa_wait0_reg;   
    1 B% M$ T  r* |* O
  24. reg emifa_wait1_reg;  
    , N5 P7 T2 ]- f3 y
  25. reg emifa_ba1_reg;     0 y: R1 S4 Z/ a! \; _
  26. reg [13:0] emifa_addr_reg;      : E$ S6 W7 V6 ]  r  A
  27. reg [15:0] emifa_data_reg;
    ( f+ J9 y" {( @5 X  i& B" _4 a/ j+ C1 i

  28. ( |) b* F+ C4 x6 s! V/ |" \
  29. //元件例化
    . p8 Q: v3 F$ G! u9 T! t2 c$ B
  30. BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));
    0 `: z6 X) F* w
  31. //寄存器赋值
    . z2 B( w( e6 m- d- b  T6 E/ E6 w
  32. always@(posedge emif_clk)begin
    4 i1 B. h- }5 _( d3 L/ ]: \- W
  33.                 emifa_cs2_reg       <= emifa_cs2;: A$ {  L  g) J9 `
  34.                 emifa_oe_n_reg      <= emifa_oe_n;7 g! i; ?- P- ^5 Q1 O
  35.                 emifa_we_n_reg      <= emifa_we_n;# S. i  n: x; n# D( t0 N
  36.                 emifa_wait0_reg     <= emifa_wait0;9 E/ X& @+ W, z3 G, p- A
  37.                 emifa_wait1_reg     <= emifa_wait1;% u- K2 j4 W/ U$ B0 P
  38.                 emifa_ba1_reg       <= emifa_ba1;( n% F& ~3 Z. E) i2 I; N6 q3 d6 h
  39.                 emifa_addr_reg      <= emifa_addr;
    & c3 m, l# j% N# O
  40.                 emifa_data_reg      <= emifa_data;
    7 K. |+ Z5 d! X2 l0 j& y
  41. end
    4 E" ?; m7 O( p6 R. p1 g, V/ _& G
  42. 8 F8 g8 g/ q' J$ D2 ]& M4 E. z8 J/ l7 ~
  43. //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;
    9 h1 p7 z3 [4 r0 A
  44. assign emifa_data = dpram_douta;" |# H! M+ X6 b* T3 u: ~1 {6 `

  45. - p; U' b2 ^, l! w! t
  46. /****************Dual Port RAM****************/
    / d% I* B6 e. t
  47. //PORTA
    8 Y2 F' v* Q) k9 j# A
  48. reg  [14:0]dpram_addra;       $ _% ~2 i2 Y' v* ?7 |. B, i
  49. reg  dpram_wea;         
    1 I8 ?4 A7 D, x% s
  50. reg  [15:0]dpram_dina;       . i4 P3 q7 h) \) [4 q
  51. wire [15:0]dpram_douta;           
      W* I% ~2 X9 s: |9 d
  52. //PORTB
    % v* f  [7 d' ^2 M
  53. reg  [14:0]dpram_addrb;      
      V7 l8 I$ A, F4 G
  54. wire  dpram_web;: s5 q! b! o0 I) C
  55. reg  [15:0]dpram_dinb;1 \8 D8 `1 W1 K4 r8 r% M/ n+ k
  56. wire [15:0]dpram_doutb;
    & ~* i3 p6 ]: U% I  w/ E
  57.    
    + P' I3 j2 j' F& }5 H
  58. //元件例化
    * o- H+ _. H" x3 N) T" y
  59. dpram dpram_unit(
    3 y9 y9 e  C4 w# q. v
  60.   .clka(emif_clk), // input clka) k  F" H" l6 l) W
  61.   .wea(dpram_wea), // input [0 : 0] wea
    ( E# h7 p, E( g; Z- F" K$ o/ G
  62.   .addra(dpram_addra), // input [14 : 0] addra
    : k: u9 q2 E. q+ N; l# g  k
  63.   .dina(dpram_dina), // input [15 : 0] dina
      ~) V8 u9 t- F6 C5 `, A
  64.   .douta(dpram_douta), // output [15 : 0] douta
    / G7 A5 k/ g& I+ H% H6 S
  65.         //clkb                  => sys_clk," A; I9 j5 G3 L# t
  66.   .clkb(clk), // input clkb2 n) O* @! N% v6 s9 W0 \
  67.   .web(dpram_web), // input [0 : 0] web, J8 c) h, N6 e# L+ I
  68.   .addrb(dpram_addrb), // input [14 : 0] addrb5 w! K1 R* q& v  G9 ^8 M$ Z* Q7 ^
  69.   .dinb(dpram_dinb), // input [15 : 0] dinb; n+ H& }; F6 [. b0 _2 @4 ?( [
  70.   .doutb(dpram_doutb));// output [15 : 0] doutb)
    ; k* i- _  |3 o2 j/ g; S/ u
  71. + B% o4 U1 k) Z  U
  72. always@(emif_clk)begin
    " p# @2 B4 g+ G" o& T! W
  73.                 dpram_wea             <= 0;2 N" L. v! s( A' M$ z0 Q
  74.                 dpram_addra           <= {emifa_addr_reg[13:0],emifa_ba1_reg};
    " w: m8 h$ l* x: T. |. c% o
  75.                 dpram_dina            <= emifa_data_reg;
    5 d& j: s" p- E/ `5 q" t& M% S
  76. end
    % T. e. F; `* H! h3 i
  77. assign dpram_web = 1'b1;
    1 X8 G" L5 e- O5 d) a8 y

  78. 4 J5 w8 d# b0 H/ c- w- @' x
  79. always@( clk )& ]7 A: @# ]' O. D* M: b, O
  80. begin+ |: q. x  i, h# q4 T) R8 N
  81.         dpram_addrb  <= 100;
    7 m9 O& e7 e0 ]0 O4 ~3 D, f' y! z0 Y
  82.         dpram_dinb   <= 16'd2048;
    9 j, Q( |5 p8 r! u9 k  a
  83. end
    & ^9 Z+ p/ D% k" d0 H
  84. 0 |" Q0 I( _2 f& ]  R3 k9 e
  85. endmodule; A1 _/ H9 \2 ~- e2 n/ S; G
  86. 9 u9 H, M& E8 p5 C
复制代码
嗯,谢谢,这个懂了,但是读出来的数还是不正确,fpga端具体代码如上。
3 @1 C: D$ @- r这段代码相当于RAM的A口只用来读,并且dpram_wea一直置零,RAM的B口用来写入一个数据。7 _. {8 d7 k4 L6 S1 s
代码下载进FPGA后,DSP端先注释掉向fpga写入数据的部分,直接读取,读取的结果都为0,包括  dpram_addrb  <= 100;这个地址下应该的2048.* A0 j, l  E+ b& L  I  H1 g. Z
然后把注释去掉,DSP端可以正常的写入数据并且正确的读出数据,但是我的FPGA端已经将  dpram_wea             <= 0;这里置零,是没法写入的,所以对于DSP端还能照常写入读出产生疑问。
( g) _' p6 p" i
8 M, X) n9 S8 t: p% u7 T- \
作者: 水瓶    时间: 2015-4-20 17:31
Lewis 发表于 2015-4-17 10:10
! M0 z  \; e2 v  g/ [EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址3 n! K4 S% v- ?' @. d) f  g
...
& R7 z6 W' C2 c) ^
我的硬件平台是:TL138F-EasyEVM(浮点DSP C6748+ARM9 +Xilinx Spartn-6 FPGA核)' O# R$ }5 ~- B" r9 o) l: P1 x
调试例程为:DSP端:EMIF_FPGA----EMIF总线FPGA读写测试
( f! J4 F3 |4 ~2 p4 q                    FPGA端:emif_test
作者: 水瓶    时间: 2015-4-21 19:19
Lewis 发表于 2015-4-17 10:106 _! N) o0 A& c1 S. i7 T
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
6 m, i8 W2 ~6 w% }, H/ f; l2 e9 V ...
: _; W$ D/ l! y# N9 j6 ^2 m! s
还望版主指导,卡了好多天了,原理都弄明白了,就是不知道问什么读出的数据不对。若是在您那里可以正确读取数据,还望发一份程序给我。谢谢了。
作者: jj909305    时间: 2017-8-12 10:01
楼主你好,这里你弄出来了吗?




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