嵌入式开发者社区

标题: 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]! I& i$ I+ l+ k
邮箱:604285180@qq.com
5 {- |& w. K: m4 v  [2 p; x9 K
作者: Lewis    时间: 2015-4-16 09:51
只需要把(下图中)向FPGA写数据的部分注释掉就行,其他地方都不需要修改。6 B% E" j* g) Y. C6 v' u
[attach]223[/attach]
( p- d* T2 N  s
作者: Lewis    时间: 2015-4-16 09:55
还要注意数据在FPGA存储的地址,跟dsp读的地址要对应
作者: 水瓶    时间: 2015-4-16 22:14
Lewis 发表于 2015-4-16 09:55
& j' Y6 F" K" }/ w" F还要注意数据在FPGA存储的地址,跟dsp读的地址要对应
! y" r1 C: }* ?8 Z- J9 d0 R
FPGA端RAM的地址是从0开始的,DSP端地址是0x6000 0000的地址去读,请问如何映射地址?
作者: Lewis    时间: 2015-4-17 10:10
[attach]225[/attach]
9 [' L6 K& z0 E+ `: S( }- uEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址5 o! v& }% x" U+ k

作者: 水瓶    时间: 2015-4-20 17:17
本帖最后由 水瓶 于 2015-4-20 17:24 编辑
* k" ~- w; k: r! N
Lewis 发表于 2015-4-17 10:10. }5 v4 }- A* J
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
" q- D2 I8 ?; h  H ...
  1. `timescale 1ns / 1ps% w6 v' B9 B2 h8 S, B4 |
  2. module emif_test
    0 F! m, _# |! v! a. m6 p8 U% K) l" r
  3. (     , W5 Z6 @( y/ d1 E3 C
  4.    input clk,6 {# w6 R/ g# N5 h* i6 X
  5.         input    emifa_clk,    // 时钟                         8 }1 e2 l  @" c! f4 k6 H) P
  6.         input    emifa_cs2,    //  低电平有效异步器件使能引脚  (与异步器件片选信号相连,只在访问异步存储器时有效)      1 e! o; a7 D0 L
  7.         input    emifa_oe_n,    //  低电平有效异步器件使能引脚         
    & l( j  b& B' x! v
  8.         input    emifa_we_n,     // 低电平有效写使能引脚      
    ) l: X( o9 P! z$ P# \" O
  9.         inout    emifa_wait0,    //等待输入引脚      
    " h; V( ~3 g. s! L! J* r- ]
  10.         inout    emifa_wait1,             , ]% ^$ W) `% Y: ^- ?4 m
  11.         input    emifa_ba1,         // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。            % }8 d* D- g  i3 Q  f& E
  12.         input    [13:0]emifa_addr,  // EMIF 地址总线            # @" i: i3 E& ~3 B! A  F3 r; \
  13.         output    [15:0]emifa_data   // EMIF 数据总线4 D$ c* O  C5 f/ c" v5 t
  14. );, }/ F/ O4 R" `2 i* U
  15.         # D  t2 U0 R- {' Q! p
  16. /****************EMIF Interface****************/        
    0 E( ?2 q8 S! l8 F4 Z
  17. //信号声明
    2 _* N" g# u/ E9 m
  18. wire emif_clk;
    7 e, b( w5 O5 {  t+ _- T
  19. reg emifa_cs2_reg;      6 r3 j8 u8 a1 \
  20. reg emifa_rnw_reg;     ; V* ^) b# h1 q& [: I$ P
  21. reg emifa_oe_n_reg;   
    $ D; H7 N. ?% ~1 l0 E
  22. reg emifa_we_n_reg;   
    - L5 x) L5 B9 ~5 X" B
  23. reg emifa_wait0_reg;   
    - B$ I# ?. C4 q3 \' I" F
  24. reg emifa_wait1_reg;  
    & h  F$ ^( K  ~
  25. reg emifa_ba1_reg;     8 |# L- j3 |7 k. W5 n! X- @
  26. reg [13:0] emifa_addr_reg;      
    4 _; c) ]& Y# ^0 x3 \; X
  27. reg [15:0] emifa_data_reg; 0 s0 h3 v% a$ p/ e* ^

  28. ) l" j; _& t6 O( M8 {
  29. //元件例化! \: R# m6 b$ k# y6 e
  30. BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));6 J( `) E. \# F2 M
  31. //寄存器赋值  i3 g9 O6 z1 a
  32. always@(posedge emif_clk)begin
    1 {' r) [# G+ O4 R1 S/ J& [
  33.                 emifa_cs2_reg       <= emifa_cs2;
    * v/ h9 d% D) n( Y1 l& @8 S2 i
  34.                 emifa_oe_n_reg      <= emifa_oe_n;
    ! A8 N6 \% n# K6 A
  35.                 emifa_we_n_reg      <= emifa_we_n;  k  g* `# _+ ]2 f: X% c7 w
  36.                 emifa_wait0_reg     <= emifa_wait0;3 R% J9 x  F0 m
  37.                 emifa_wait1_reg     <= emifa_wait1;+ [2 U5 o) c' x
  38.                 emifa_ba1_reg       <= emifa_ba1;0 M* `! i4 k9 V3 A
  39.                 emifa_addr_reg      <= emifa_addr;1 [- h, a, G4 ~; Q: D9 d, m
  40.                 emifa_data_reg      <= emifa_data;5 O: n* I0 M( I& J; S  K
  41. end
    " j  X  s! C2 H; A% |  Y7 S/ e
  42. ) b6 p' O* U& h5 M
  43. //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;( b. O% T: L9 r: M& c& g/ t- B
  44. assign emifa_data = dpram_douta;
    9 x! N# F3 V3 @( H! _: v  ]- W
  45. . I1 r) f9 V  I! u
  46. /****************Dual Port RAM****************/: Y8 v9 |- q/ M! [/ Z
  47. //PORTA( Y# N9 A( `% a, K& }8 o/ {
  48. reg  [14:0]dpram_addra;       ( G) Q8 k  @; p. r- ]1 O# q5 T+ @
  49. reg  dpram_wea;         , i9 {3 S; i4 a$ l
  50. reg  [15:0]dpram_dina;      
    # o( ~1 z0 \5 F1 @- A
  51. wire [15:0]dpram_douta;           
    9 ]9 J) F( w; }' n4 b$ _
  52. //PORTB
    1 g, [) H3 c" p4 n% y9 J- }/ T" ?- J
  53. reg  [14:0]dpram_addrb;      
    8 d6 l4 p, _+ [; w2 F" n" K8 \
  54. wire  dpram_web;% b$ I5 M9 K! W$ q! R
  55. reg  [15:0]dpram_dinb;8 |. @( G+ a; l  O3 o% m7 }
  56. wire [15:0]dpram_doutb; . r4 C- Y) S6 F4 c
  57.    5 F1 Q; @' z9 T
  58. //元件例化8 @) \% y" K, p0 D/ q3 Y1 a  h
  59. dpram dpram_unit(+ }6 t. k1 ~* W- l7 v) p
  60.   .clka(emif_clk), // input clka
    0 [+ X" \3 A& P  m
  61.   .wea(dpram_wea), // input [0 : 0] wea
    - B5 V( B: v; C4 `, n
  62.   .addra(dpram_addra), // input [14 : 0] addra
    ) l" A) n8 P& i4 K
  63.   .dina(dpram_dina), // input [15 : 0] dina; c: e7 l% d7 J" y, g
  64.   .douta(dpram_douta), // output [15 : 0] douta2 z+ d; Q! y8 T& P2 x2 \2 }
  65.         //clkb                  => sys_clk,
    + p0 D, B5 h  [# k0 L3 E+ E( F
  66.   .clkb(clk), // input clkb
    / X3 i5 m( d2 v$ ?1 I/ d9 G
  67.   .web(dpram_web), // input [0 : 0] web- V' i1 G1 E# l8 p
  68.   .addrb(dpram_addrb), // input [14 : 0] addrb
    * |7 v) j# h8 e) H9 {8 l+ w
  69.   .dinb(dpram_dinb), // input [15 : 0] dinb6 q; O$ w5 Z6 L: f
  70.   .doutb(dpram_doutb));// output [15 : 0] doutb)
    % k6 Q5 u+ g2 @) ?* Q+ {5 e0 R! K
  71. ) g' v2 ?5 Q$ ~7 t/ g# E
  72. always@(emif_clk)begin
    $ S4 n6 c# Z" L2 d, ~8 m1 z; [
  73.                 dpram_wea             <= 0;, G  ]! b; m1 T- m
  74.                 dpram_addra           <= {emifa_addr_reg[13:0],emifa_ba1_reg};
    1 f8 q& u& D5 ~, e* T( Z) i& g
  75.                 dpram_dina            <= emifa_data_reg;
    & X5 W" @! N) P! G
  76. end
    & G5 I% \) P5 `/ ]5 a
  77. assign dpram_web = 1'b1;
    " t0 F) Y# o' Y
  78. 7 P! z; n1 ~  r
  79. always@( clk )8 P, l1 |% m8 x. R! ~
  80. begin
    - C* c3 u- A2 D9 c; T
  81.         dpram_addrb  <= 100;
    9 c: Z% ~, r! K# G( B9 ^" {
  82.         dpram_dinb   <= 16'd2048;5 I: y* k5 J8 E/ H" g0 M( S3 c9 C: u
  83. end
    2 v3 X3 c( M% |# n1 a: f5 ?

  84. . z- T9 x6 z: D- }' E3 i
  85. endmodule
    " d( |1 b! M$ q9 }9 v7 q
  86. 0 M# @: o8 V! r* ^+ v+ f% m1 d/ B9 S* v
复制代码
嗯,谢谢,这个懂了,但是读出来的数还是不正确,fpga端具体代码如上。
! B2 @/ G/ N  l9 f( \这段代码相当于RAM的A口只用来读,并且dpram_wea一直置零,RAM的B口用来写入一个数据。
) k! X1 ^' b$ h代码下载进FPGA后,DSP端先注释掉向fpga写入数据的部分,直接读取,读取的结果都为0,包括  dpram_addrb  <= 100;这个地址下应该的2048.; t" {9 E+ K' L+ G. t% R. e
然后把注释去掉,DSP端可以正常的写入数据并且正确的读出数据,但是我的FPGA端已经将  dpram_wea             <= 0;这里置零,是没法写入的,所以对于DSP端还能照常写入读出产生疑问。0 k6 W7 L; z" u
# e0 e& y; {- R4 Z+ Y

作者: 水瓶    时间: 2015-4-20 17:31
Lewis 发表于 2015-4-17 10:10
2 [, w  n; N- n5 `' MEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
6 K5 a9 l9 w* P6 c4 a  B ...

, j3 z3 A% M- S* r- m2 ~) c; w# w, g我的硬件平台是:TL138F-EasyEVM(浮点DSP C6748+ARM9 +Xilinx Spartn-6 FPGA核)/ S9 N$ u" P8 Y! c- n
调试例程为:DSP端:EMIF_FPGA----EMIF总线FPGA读写测试3 q( G) O  M9 d& T$ Z
                    FPGA端:emif_test
作者: 水瓶    时间: 2015-4-21 19:19
Lewis 发表于 2015-4-17 10:10
! i1 R- s6 R& ~6 S' ]& ^EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
' n6 `4 @* u* Y5 f" }+ X& E ...

0 S2 @) }5 ]+ V  }$ b" l还望版主指导,卡了好多天了,原理都弄明白了,就是不知道问什么读出的数据不对。若是在您那里可以正确读取数据,还望发一份程序给我。谢谢了。
作者: jj909305    时间: 2017-8-12 10:01
楼主你好,这里你弄出来了吗?




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