嵌入式开发者社区

标题: 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]7 _% [1 v4 d8 z
邮箱:604285180@qq.com
  }: I' O& J" `& v; |: ~
作者: Lewis    时间: 2015-4-16 09:51
只需要把(下图中)向FPGA写数据的部分注释掉就行,其他地方都不需要修改。& B" A9 ?5 K* a& R8 {
[attach]223[/attach]  S) V- ^$ o+ e7 [2 d4 r- L2 R5 H

作者: Lewis    时间: 2015-4-16 09:55
还要注意数据在FPGA存储的地址,跟dsp读的地址要对应
作者: 水瓶    时间: 2015-4-16 22:14
Lewis 发表于 2015-4-16 09:555 S6 F) s) Q$ i' J# E
还要注意数据在FPGA存储的地址,跟dsp读的地址要对应

) C) a- {' d" r; uFPGA端RAM的地址是从0开始的,DSP端地址是0x6000 0000的地址去读,请问如何映射地址?
作者: Lewis    时间: 2015-4-17 10:10
[attach]225[/attach]4 i/ V. ?+ Q2 _
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
% N( m. ]8 i% }9 @5 }* L
作者: 水瓶    时间: 2015-4-20 17:17
本帖最后由 水瓶 于 2015-4-20 17:24 编辑
6 H4 f' J9 O0 S. ^8 \$ w
Lewis 发表于 2015-4-17 10:10# v3 h7 ]1 R% G; o0 j
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
4 {5 ]) D, F9 M ...
  1. `timescale 1ns / 1ps! z3 C9 G+ K+ H' k: I- M
  2. module emif_test
    * B; K3 K# y& b: H* v; C
  3. (     + \/ ~' S  S3 F$ Y& h
  4.    input clk,
    2 c7 w2 G2 e' @( w* N9 ]
  5.         input    emifa_clk,    // 时钟                        
      }: v: J6 x0 n& c& b8 X/ P
  6.         input    emifa_cs2,    //  低电平有效异步器件使能引脚  (与异步器件片选信号相连,只在访问异步存储器时有效)      
    + n1 F/ Y3 P# l: N' {3 X
  7.         input    emifa_oe_n,    //  低电平有效异步器件使能引脚         
    * `: Q( m( a$ @; p+ p2 z2 B( p1 A
  8.         input    emifa_we_n,     // 低电平有效写使能引脚       7 P+ X' G7 n/ n. j$ N5 z) q( p9 J
  9.         inout    emifa_wait0,    //等待输入引脚      , y6 x/ A/ m$ k( Y9 q% ]
  10.         inout    emifa_wait1,            
    0 Z! i! B$ |! z! p/ Q9 T
  11.         input    emifa_ba1,         // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。            7 R$ @. y+ h3 g4 I
  12.         input    [13:0]emifa_addr,  // EMIF 地址总线            
    3 N7 ?/ A% t+ x/ l2 ~( D  l- H
  13.         output    [15:0]emifa_data   // EMIF 数据总线
    2 Z: M6 y  k7 p
  14. );# B0 s' ^4 ^3 h  w/ \
  15.         
    # B. a" S6 B' Z) E$ z1 ^
  16. /****************EMIF Interface****************/        * q3 v3 t$ \3 I9 v* b
  17. //信号声明7 T, e. m6 v4 P. V
  18. wire emif_clk;
    % Y; f# A0 K3 p
  19. reg emifa_cs2_reg;      7 P& A$ h' ^& @- h1 @
  20. reg emifa_rnw_reg;     
    4 {. e, {. B! a. H
  21. reg emifa_oe_n_reg;    . R0 v; h" H) q) u, b# j7 J
  22. reg emifa_we_n_reg;   
    3 f0 ^  i1 P, @/ F/ b+ ~
  23. reg emifa_wait0_reg;   
    4 Q$ s6 w; \% W' N% ^
  24. reg emifa_wait1_reg;  
    - u8 ~- z, [# f) E6 M5 z
  25. reg emifa_ba1_reg;     
    % ^% e# e. j" V; \2 k
  26. reg [13:0] emifa_addr_reg;      
    9 G8 {* k8 I4 ~+ ]% B1 H# n+ x. X/ |
  27. reg [15:0] emifa_data_reg;
    % m5 V5 Z; z: L  p5 Z- j) V1 d& ~& p6 n

  28. ; Z1 q; q, o4 q9 y5 q4 Q# Y
  29. //元件例化
    & U. [6 k8 S5 D. C; e+ o+ o3 J8 R
  30. BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));
    $ {- D* q* x9 K( @7 ]( @: ?
  31. //寄存器赋值
    ( O( G( |7 [* L& `# f6 n% _: X
  32. always@(posedge emif_clk)begin3 c2 L8 A0 p2 C# e$ i- F
  33.                 emifa_cs2_reg       <= emifa_cs2;; Y( \  H' f) E1 V) ^
  34.                 emifa_oe_n_reg      <= emifa_oe_n;% m" r' N: X# S
  35.                 emifa_we_n_reg      <= emifa_we_n;
    . x3 B% G- q7 {+ X9 B
  36.                 emifa_wait0_reg     <= emifa_wait0;
    " L: B2 f! |) g% p: g" P- x
  37.                 emifa_wait1_reg     <= emifa_wait1;3 l' A2 s9 @2 L$ }3 C
  38.                 emifa_ba1_reg       <= emifa_ba1;
    / l' W, j  ?! V; P( L+ c' _
  39.                 emifa_addr_reg      <= emifa_addr;' U6 K! P, m7 K, c
  40.                 emifa_data_reg      <= emifa_data;- y. W% X5 q7 N/ W
  41. end+ i; e" e  ]5 a9 |3 F7 A  H
  42. 4 l3 H$ x* W& j+ v/ T; z. d
  43. //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;
    3 J1 ?- M$ R+ ^. [
  44. assign emifa_data = dpram_douta;
    ( k- w# t, z8 \  A/ U- H0 ]

  45. + O, q  N7 r/ W% J2 @
  46. /****************Dual Port RAM****************/
    * x$ h" k# j: G% N! a; V
  47. //PORTA
    * h6 C5 Y2 y9 F* B% L$ f# N
  48. reg  [14:0]dpram_addra;       $ L8 c4 `( v2 i
  49. reg  dpram_wea;         
    2 A4 `+ s. n  e+ \
  50. reg  [15:0]dpram_dina;       / J5 h9 X" X2 c* o  z7 @
  51. wire [15:0]dpram_douta;           - \: o! ]" {3 V: y: M/ N7 b4 p
  52. //PORTB2 {  k5 q! `7 v7 F
  53. reg  [14:0]dpram_addrb;       / K, P! {( L, N9 A) Q. G5 K9 l6 ]7 @
  54. wire  dpram_web;+ p/ M, o) ?  Y3 ~2 {3 [
  55. reg  [15:0]dpram_dinb;$ i+ `5 Q; k" q( g' p
  56. wire [15:0]dpram_doutb; ' Y. Y( j1 f& B5 A! t: c- P3 u1 l5 K
  57.    ) Q: ~" R/ H, ^8 R8 b$ ]5 |
  58. //元件例化
    ) d; h# |2 f  W1 W5 |
  59. dpram dpram_unit(
    ; I7 V: n# g) n5 P; O: X2 b5 j
  60.   .clka(emif_clk), // input clka( w1 Y% O0 F3 B/ r" P6 c
  61.   .wea(dpram_wea), // input [0 : 0] wea
    - u6 i$ {8 @# a" G+ ~! b. l
  62.   .addra(dpram_addra), // input [14 : 0] addra
    1 v: y6 K7 B# _3 O' J
  63.   .dina(dpram_dina), // input [15 : 0] dina. g0 R3 S: k1 o# X3 }( g
  64.   .douta(dpram_douta), // output [15 : 0] douta7 r1 H5 ^5 A5 d5 |! u4 G8 p( y
  65.         //clkb                  => sys_clk,. V4 U" \- E3 Q  L( V
  66.   .clkb(clk), // input clkb; z, s- {4 F) W# d$ O1 n3 d1 M6 v
  67.   .web(dpram_web), // input [0 : 0] web  C- d6 `: @; ^: t
  68.   .addrb(dpram_addrb), // input [14 : 0] addrb
    ; i: }" d) I& ^8 J9 _
  69.   .dinb(dpram_dinb), // input [15 : 0] dinb7 C9 v" m+ z( _; X* n- R! @
  70.   .doutb(dpram_doutb));// output [15 : 0] doutb)9 M% u+ A& I  Z: o

  71. & |6 L$ f$ A& a: v; {0 V
  72. always@(emif_clk)begin0 e$ j. ?: k7 {
  73.                 dpram_wea             <= 0;
    4 P5 B& O0 O. Y& }- [. x
  74.                 dpram_addra           <= {emifa_addr_reg[13:0],emifa_ba1_reg};
    7 G. \& t" y* @' Z
  75.                 dpram_dina            <= emifa_data_reg;
    ) Q  d# }* e7 i. J1 F1 m
  76. end
    , F" R/ J( Z* X" K
  77. assign dpram_web = 1'b1;6 b1 P4 y; T2 j( [9 D) a; G% s

  78. . C; `* u$ e7 C0 P0 O! m$ w+ s& j
  79. always@( clk )
    ) A1 T- M' _) t
  80. begin; p' A' t- V, R4 H  K4 b1 N7 t6 q
  81.         dpram_addrb  <= 100;* r/ ^0 t  V# H# [  `7 {$ g
  82.         dpram_dinb   <= 16'd2048;, x  R! p/ Z" `0 C
  83. end3 ]$ B' m- w" q. Y2 G2 y& ?. {/ a2 {$ @

  84. 7 E+ _: Z' S1 F: C; B4 @' S' [
  85. endmodule  d* N5 ^2 ^/ _: B
  86. $ t* a4 E- @, A0 r9 @
复制代码
嗯,谢谢,这个懂了,但是读出来的数还是不正确,fpga端具体代码如上。
! F" p( B; }$ S0 X1 R9 v这段代码相当于RAM的A口只用来读,并且dpram_wea一直置零,RAM的B口用来写入一个数据。( d' g8 u: K6 S; W) z
代码下载进FPGA后,DSP端先注释掉向fpga写入数据的部分,直接读取,读取的结果都为0,包括  dpram_addrb  <= 100;这个地址下应该的2048.
# i. b7 R% j3 b* r9 g然后把注释去掉,DSP端可以正常的写入数据并且正确的读出数据,但是我的FPGA端已经将  dpram_wea             <= 0;这里置零,是没法写入的,所以对于DSP端还能照常写入读出产生疑问。
& v. R& D. `# J) j+ t% ?+ \9 b, F% H  B  z, n

作者: 水瓶    时间: 2015-4-20 17:31
Lewis 发表于 2015-4-17 10:10
0 c6 y& l8 G5 Q' y$ fEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
* x' |1 X% I* H' B8 ^9 f ...

- j9 P& ?8 u8 ^8 [$ ^6 K$ C我的硬件平台是:TL138F-EasyEVM(浮点DSP C6748+ARM9 +Xilinx Spartn-6 FPGA核)* z$ C' ?/ K" z( z
调试例程为:DSP端:EMIF_FPGA----EMIF总线FPGA读写测试, n8 v. x  K  Z% T. j& b; u2 F
                    FPGA端:emif_test
作者: 水瓶    时间: 2015-4-21 19:19
Lewis 发表于 2015-4-17 10:10
+ X* O# n' g, C" k( b! MEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址" X- i  }# [( ?
...
' H+ ]* S: p1 o9 R8 f
还望版主指导,卡了好多天了,原理都弄明白了,就是不知道问什么读出的数据不对。若是在您那里可以正确读取数据,还望发一份程序给我。谢谢了。
作者: jj909305    时间: 2017-8-12 10:01
楼主你好,这里你弄出来了吗?




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