FPGA与DSP通信问题。 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 12426|回复: 8
打印 上一主题 下一主题

FPGA与DSP通信问题。

[复制链接]

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
跳转到指定楼层
楼主
发表于 2015-4-15 15:06:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1、  我现在要实现的基本功能是:一组数据给FPGA端的双口RAM,然后DSP通过EMIF读出。不需要DSP再FPGA写入数据,如何更改贵公司的例程?我的更改是:DSP端注释掉写入FPGA部分,直接读取。FPGA部分是直接在双口RAM中初始化一组数据。然后读出的数据全是0,不是直接在双口RAM中初始化的数据。请问问题出在哪里了?还望版主大侠指导。

! b. O5 T: Q. w( i3 P' L) G邮箱:604285180@qq.com
' j. |' Y9 e/ F  J

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

积分
1137
沙发
发表于 2015-4-16 09:51:44 | 只看该作者
只需要把(下图中)向FPGA写数据的部分注释掉就行,其他地方都不需要修改。
" p8 j* q5 g. \6 L8 d8 [1 b+ f6 N4 b: d# c1 u1 C

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

积分
1137
板凳
发表于 2015-4-16 09:55:21 | 只看该作者
还要注意数据在FPGA存储的地址,跟dsp读的地址要对应
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
地板
 楼主| 发表于 2015-4-16 22:14:25 | 只看该作者
Lewis 发表于 2015-4-16 09:55
* F: @. N  K! P! J- @4 v还要注意数据在FPGA存储的地址,跟dsp读的地址要对应
0 _: ~7 V2 x- {4 C4 \. E" h
FPGA端RAM的地址是从0开始的,DSP端地址是0x6000 0000的地址去读,请问如何映射地址?
回复 支持 反对

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

积分
1137
5#
发表于 2015-4-17 10:10:29 | 只看该作者

, M5 o4 }; A7 @+ @0 x! n2 c4 A* _3 hEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
. f$ W% u1 @6 }7 q" V! a

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
6#
 楼主| 发表于 2015-4-20 17:17:38 | 只看该作者
本帖最后由 水瓶 于 2015-4-20 17:24 编辑   ?/ H  k& f9 n- x2 V9 `0 l
Lewis 发表于 2015-4-17 10:10
; A/ c7 Q, J$ v& n8 b! OEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址4 y- p3 n2 W, ?
...
  1. `timescale 1ns / 1ps- Q5 ], _7 v- k% {* E
  2. module emif_test" I/ g9 L4 `  p( H! T$ I" @' O
  3. (     
    4 l' N; c4 @4 A  O5 ^
  4.    input clk,
    & O& G) I5 c( l: u0 r0 k4 H% k2 W
  5.         input    emifa_clk,    // 时钟                        
    0 Q, @8 `/ ?) _! ^! O# k
  6.         input    emifa_cs2,    //  低电平有效异步器件使能引脚  (与异步器件片选信号相连,只在访问异步存储器时有效)      " x1 L- d" r! _. C
  7.         input    emifa_oe_n,    //  低电平有效异步器件使能引脚          1 k. f; h6 f/ E1 B
  8.         input    emifa_we_n,     // 低电平有效写使能引脚       8 h8 z6 o+ k! i
  9.         inout    emifa_wait0,    //等待输入引脚      # V7 u) R/ r) s( d6 ]
  10.         inout    emifa_wait1,            
    ) ?; @: S5 Y2 N5 n6 |: K
  11.         input    emifa_ba1,         // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。            % D( C! j  T% J/ M8 w! u1 b
  12.         input    [13:0]emifa_addr,  // EMIF 地址总线            3 ^/ t+ F- ?: [" X  _' }* s# \
  13.         output    [15:0]emifa_data   // EMIF 数据总线
    ) G! \* F' ?6 Z0 A. F4 ]
  14. );
    . v6 d) S9 D/ H2 q& O4 d8 ?
  15.         6 q$ d# Z6 @5 V; A( ^( ]+ Z
  16. /****************EMIF Interface****************/        3 s& S  x. m! C% e4 g3 p" T6 u
  17. //信号声明
    ; k! q* Q: r) j" d9 q! v
  18. wire emif_clk;
    0 D) u- P% U5 k$ |2 E
  19. reg emifa_cs2_reg;      
    , D0 M# [0 E- \2 \; W7 q
  20. reg emifa_rnw_reg;     
    - _: e" w2 r/ h# F1 u( r
  21. reg emifa_oe_n_reg;    # v# T4 R% E7 t) x4 n
  22. reg emifa_we_n_reg;    5 Z" e: J) J2 w3 Y( L3 v! U
  23. reg emifa_wait0_reg;   
    . J3 |7 d4 }- h& c* j* M1 {+ j
  24. reg emifa_wait1_reg;  ; J$ h8 M, q  H9 z' w+ ?
  25. reg emifa_ba1_reg;     # m$ J( \  j8 w  ]3 E
  26. reg [13:0] emifa_addr_reg;      / M: x& M- W- V- O0 s. L6 g7 B, |4 F
  27. reg [15:0] emifa_data_reg; 6 G7 g9 u3 `7 G

  28. ! h& S6 V/ j; Z( U# N
  29. //元件例化& @  v" T( j$ s5 U
  30. BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));) g' y/ L; K, d$ K4 Y' {) c$ [3 q
  31. //寄存器赋值, p5 F+ E$ n. I/ i' j
  32. always@(posedge emif_clk)begin
    9 @$ E) a; T8 w
  33.                 emifa_cs2_reg       <= emifa_cs2;
    ! p$ P5 |; O$ i$ I1 M
  34.                 emifa_oe_n_reg      <= emifa_oe_n;2 z: N6 a1 A/ D+ b
  35.                 emifa_we_n_reg      <= emifa_we_n;
    8 U9 @/ }( A' P5 R$ f
  36.                 emifa_wait0_reg     <= emifa_wait0;& ?* D5 k: k/ M
  37.                 emifa_wait1_reg     <= emifa_wait1;
    # D6 C- B* ?% m9 M: @
  38.                 emifa_ba1_reg       <= emifa_ba1;
    3 ], V. Z9 v# v- j7 U& }
  39.                 emifa_addr_reg      <= emifa_addr;
    - G2 S0 u- G2 Q! a1 j7 v
  40.                 emifa_data_reg      <= emifa_data;
    ( @% J9 J! Q& v1 j7 V( P
  41. end
    1 z$ }/ _7 }% v/ {
  42. 8 {5 y- @. C* @0 Z% `8 k
  43. //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;+ B. l9 S9 {* i7 p+ u+ O" u$ n
  44. assign emifa_data = dpram_douta;
    / N5 G5 f- O) H) w/ \) a, y/ I

  45. 8 _/ g$ w. C1 o' _
  46. /****************Dual Port RAM****************/1 [# }  |: ?2 A$ j8 Y: L0 r
  47. //PORTA
    ( R5 t8 a3 Z: x1 ]
  48. reg  [14:0]dpram_addra;      
    , e$ s0 f8 p) B- }/ H. m
  49. reg  dpram_wea;         
    3 w! X1 \" @( f! b* Y5 j
  50. reg  [15:0]dpram_dina;       8 D! v9 u3 N9 s
  51. wire [15:0]dpram_douta;           4 t! G( [$ r2 G% _9 b- ~" _
  52. //PORTB" ^3 P% M# S+ V7 W& r& T. z
  53. reg  [14:0]dpram_addrb;      
    7 P1 B: }) O# P7 G
  54. wire  dpram_web;* Z/ N5 @+ Q. c! i1 \5 m
  55. reg  [15:0]dpram_dinb;
    . H" s2 q8 s: A/ S% m
  56. wire [15:0]dpram_doutb; 2 a" F% |: s- r; a' }0 Q7 i
  57.    ; C$ k# V7 Q: F! ?7 T8 `+ M* _
  58. //元件例化9 ]) N0 O4 r1 o5 l  C2 K
  59. dpram dpram_unit(
    9 ^- j! b  {, y' \& `- L
  60.   .clka(emif_clk), // input clka4 ^* c4 `5 ?, u0 A0 Y* m- x% u
  61.   .wea(dpram_wea), // input [0 : 0] wea
    " E6 J7 o' p  d5 h7 c: u  i
  62.   .addra(dpram_addra), // input [14 : 0] addra
    9 P6 \9 w4 ]6 _
  63.   .dina(dpram_dina), // input [15 : 0] dina1 w* j. P5 n5 D" k2 v
  64.   .douta(dpram_douta), // output [15 : 0] douta
    # V) G$ u  V( H% m
  65.         //clkb                  => sys_clk,- y! i& I6 {( Q* n4 m
  66.   .clkb(clk), // input clkb
    7 ]- y4 D) ]- W& D0 r- [: X
  67.   .web(dpram_web), // input [0 : 0] web) w8 x* ~* v0 m! _+ g
  68.   .addrb(dpram_addrb), // input [14 : 0] addrb* W/ D% v8 P8 B# G
  69.   .dinb(dpram_dinb), // input [15 : 0] dinb
    / s! N2 G3 `) A- ]
  70.   .doutb(dpram_doutb));// output [15 : 0] doutb)/ Q" o: c+ \- g: e4 \# D
  71. . ^3 N2 W& o( {6 g4 z4 q8 G
  72. always@(emif_clk)begin
    6 Q/ T1 E, F3 ?* w
  73.                 dpram_wea             <= 0;- f- G, Q  m8 L! b% A6 I8 b
  74.                 dpram_addra           <= {emifa_addr_reg[13:0],emifa_ba1_reg};
    1 j- @8 \2 ^/ u3 i, D* s( e' d
  75.                 dpram_dina            <= emifa_data_reg;
    ) p4 J) f) B* o$ b7 `
  76. end
    ' J3 V& l4 l0 T
  77. assign dpram_web = 1'b1;# H$ a: b9 Q6 m7 Y- o% k5 W
  78. 2 m1 ]2 a8 u, q; q( U( u- n
  79. always@( clk )2 Y$ Q. \/ ~/ E' Z3 b9 B6 M2 t( G3 I
  80. begin
    , L; H# e7 L- g, ?: T
  81.         dpram_addrb  <= 100;' |6 |  _- H: n) L
  82.         dpram_dinb   <= 16'd2048;% J$ M5 X6 o9 R  j$ U
  83. end2 I( J5 ^# H; U" ~1 H

  84. / Q, j/ s' ?; K8 r1 \2 T( u4 q
  85. endmodule
    # \7 P* @: z) `: I4 m, O
  86. 6 d1 X: N, O+ j# [+ `3 {1 y3 \
复制代码
嗯,谢谢,这个懂了,但是读出来的数还是不正确,fpga端具体代码如上。
% S+ _) I, S( ^. @6 q8 x5 Q这段代码相当于RAM的A口只用来读,并且dpram_wea一直置零,RAM的B口用来写入一个数据。! R2 V  G2 [5 K% ~
代码下载进FPGA后,DSP端先注释掉向fpga写入数据的部分,直接读取,读取的结果都为0,包括  dpram_addrb  <= 100;这个地址下应该的2048.% O5 f# [4 r. P3 M& H9 j, |& R
然后把注释去掉,DSP端可以正常的写入数据并且正确的读出数据,但是我的FPGA端已经将  dpram_wea             <= 0;这里置零,是没法写入的,所以对于DSP端还能照常写入读出产生疑问。$ `, M6 U0 P- B& G3 U
8 |3 s* K; A7 d& k1 k' N
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
7#
 楼主| 发表于 2015-4-20 17:31:45 | 只看该作者
Lewis 发表于 2015-4-17 10:10
( @4 U( u4 U6 k% [9 N+ J* NEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
# L( S7 ~0 j# X" h; S ...

$ ?5 T9 x8 a" T: S: n9 s我的硬件平台是:TL138F-EasyEVM(浮点DSP C6748+ARM9 +Xilinx Spartn-6 FPGA核)4 {6 V$ K/ l1 [) d" ^7 `4 a: U0 Z' \
调试例程为:DSP端:EMIF_FPGA----EMIF总线FPGA读写测试7 l- m0 M7 i6 w1 \  C
                    FPGA端:emif_test
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
8#
 楼主| 发表于 2015-4-21 19:19:07 | 只看该作者
Lewis 发表于 2015-4-17 10:107 t" w" s6 i4 g6 i  F
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址! j7 c3 c8 `4 P9 q$ O5 A
...

. N+ S$ x& p% L& o还望版主指导,卡了好多天了,原理都弄明白了,就是不知道问什么读出的数据不对。若是在您那里可以正确读取数据,还望发一份程序给我。谢谢了。
回复 支持 反对

使用道具 举报

20

主题

65

帖子

341

积分

中级会员

Rank: 3Rank: 3

积分
341
9#
发表于 2017-8-12 10:01:33 | 只看该作者
楼主你好,这里你弄出来了吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

点击跳转“创龙科技服务通”

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2026-3-17 14:25 , Processed in 0.054293 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表