FPGA与DSP通信问题。 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 11520|回复: 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中初始化的数据。请问问题出在哪里了?还望版主大侠指导。

& r7 b! t, T; S% u/ a! ^邮箱:604285180@qq.com
6 n# e: y/ A& i) |6 E, ~" u. B0 t

本帖子中包含更多资源

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

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

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

积分
1137
沙发
发表于 2015-4-16 09:51:44 | 只看该作者
只需要把(下图中)向FPGA写数据的部分注释掉就行,其他地方都不需要修改。: T/ m: C. F5 V9 c4 P% w/ a
/ k/ Q1 {: z  b2 v" r

本帖子中包含更多资源

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

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
/ i8 ^0 f/ D& U* D% y3 R$ L, b: b还要注意数据在FPGA存储的地址,跟dsp读的地址要对应
: O0 N5 N) a& Q/ y
FPGA端RAM的地址是从0开始的,DSP端地址是0x6000 0000的地址去读,请问如何映射地址?
回复 支持 反对

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

积分
1137
5#
发表于 2015-4-17 10:10:29 | 只看该作者
5 X3 g  {5 J5 k0 ~/ u1 Z) M* y: f
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
" e) b& I6 v: S% @

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
6#
 楼主| 发表于 2015-4-20 17:17:38 | 只看该作者
本帖最后由 水瓶 于 2015-4-20 17:24 编辑 0 ]7 R" z! v+ f0 }
Lewis 发表于 2015-4-17 10:10: N& x# }6 h5 k. A6 o6 _( D
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址" j0 y6 G1 t2 o7 X9 E, `) v
...
  1. `timescale 1ns / 1ps0 P' `  E5 {9 O" q
  2. module emif_test( p' C/ w+ y- W/ W& b( P$ ^
  3. (     
    6 N. _: _# R2 B! Z7 f7 F
  4.    input clk,+ w- @# B/ Z' P0 v
  5.         input    emifa_clk,    // 时钟                         % X; L) ^# m* h7 d
  6.         input    emifa_cs2,    //  低电平有效异步器件使能引脚  (与异步器件片选信号相连,只在访问异步存储器时有效)      / t/ g3 |- K6 w3 u8 k- {
  7.         input    emifa_oe_n,    //  低电平有效异步器件使能引脚          4 W- `0 N+ q+ j/ K+ C8 K# F. }4 @; C$ ^
  8.         input    emifa_we_n,     // 低电平有效写使能引脚       8 x' z# o" k& x+ O; \% v. I* M
  9.         inout    emifa_wait0,    //等待输入引脚      
    ; D6 i" |' k" s& |: ^. ^  o
  10.         inout    emifa_wait1,             6 V$ J) I9 {& B( ?* W0 N- h2 X7 ?
  11.         input    emifa_ba1,         // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。            $ i, P. Q8 ~7 X9 i; I
  12.         input    [13:0]emifa_addr,  // EMIF 地址总线            
    ( G' f% K3 R2 B( b
  13.         output    [15:0]emifa_data   // EMIF 数据总线5 ~  {, R" Z  ]% X  n! w* r
  14. );
    $ g# U0 d1 z8 _6 M, c% M
  15.         8 L) c+ [: ^8 G. W# |% I; F0 o
  16. /****************EMIF Interface****************/        $ U) ^4 V8 m+ R+ A9 u( L
  17. //信号声明$ t' Z7 v4 A; ]9 s# S5 W  \
  18. wire emif_clk;
    2 e) y/ x/ f3 b$ z+ S2 _) C3 o0 d
  19. reg emifa_cs2_reg;      # Q* f* ~' X; W4 ]2 f7 ]
  20. reg emifa_rnw_reg;     
    ) W8 `" m% T+ C; ]
  21. reg emifa_oe_n_reg;   
    7 V. Y- D8 u: G6 m; |
  22. reg emifa_we_n_reg;    " ~, {  w! K8 U0 g, h8 W3 _
  23. reg emifa_wait0_reg;   
    ; d  X* p0 q9 U3 g* A( I. R6 u3 U
  24. reg emifa_wait1_reg;  
    7 p! H9 W3 U; Q3 W. v  O
  25. reg emifa_ba1_reg;     
    / j* b. L. B# u9 O- n6 ^/ N& s
  26. reg [13:0] emifa_addr_reg;      9 J+ ?6 g2 Y: m
  27. reg [15:0] emifa_data_reg; , e  }( [  Z' n) e# m4 t- }
  28. 3 M7 @+ ?; w# z' ?( O6 }9 W  d0 k
  29. //元件例化
    ' ~% e3 l7 J0 I5 T# x* u$ M2 ^
  30. BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));9 X2 q/ h! X8 G3 N* M
  31. //寄存器赋值( ?% P4 j6 [9 |6 G$ |
  32. always@(posedge emif_clk)begin8 I$ B1 u( v# e  |6 V8 u6 N; E
  33.                 emifa_cs2_reg       <= emifa_cs2;  W. I5 y* p- Q) }8 N* L& k1 A
  34.                 emifa_oe_n_reg      <= emifa_oe_n;
    8 |5 g" R0 o( Z! _0 w& u
  35.                 emifa_we_n_reg      <= emifa_we_n;
    : u; u4 Q5 M) i6 X% P( p. T
  36.                 emifa_wait0_reg     <= emifa_wait0;
    7 K" r3 _1 m: t( C& E3 N# ^
  37.                 emifa_wait1_reg     <= emifa_wait1;
    % l$ R! h. J4 |  C2 _
  38.                 emifa_ba1_reg       <= emifa_ba1;
    0 w: l& a* Z" F
  39.                 emifa_addr_reg      <= emifa_addr;: e$ |6 O1 F  z5 P
  40.                 emifa_data_reg      <= emifa_data;
    9 U1 Z2 }" X! G
  41. end
    & \" i. c7 J) a7 O/ z

  42. 0 ~- K- f- n7 {- m& n
  43. //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;
    : c( y7 g7 G8 F& n+ B/ q: w
  44. assign emifa_data = dpram_douta;
    ; f! U! G( f+ }) b

  45. " j$ A" t6 o0 A: i2 |5 }2 T5 \' M
  46. /****************Dual Port RAM****************/
    4 i% a" K7 Z4 h# Q% S
  47. //PORTA) ]; f) U! |2 B
  48. reg  [14:0]dpram_addra;       - K0 f3 c$ g* R+ G
  49. reg  dpram_wea;         ; z/ i& {& p) ]5 ~( P
  50. reg  [15:0]dpram_dina;      
    * m% ]! {9 z$ {! e0 e
  51. wire [15:0]dpram_douta;           
    % Y! T( [9 S1 n! ^- V
  52. //PORTB; p1 {5 ~9 r( B) l; J1 N4 w0 q% q* h
  53. reg  [14:0]dpram_addrb;      
    # Z1 X/ J% t  N0 D5 F, R
  54. wire  dpram_web;+ A5 H$ w- t3 u& z( X5 n0 g6 u
  55. reg  [15:0]dpram_dinb;
    # {) o; I" {, f+ C8 ]9 L4 `
  56. wire [15:0]dpram_doutb;
    ) i; m/ n1 `6 l6 `8 V' Q% _" j
  57.    
    4 N9 |# E: \" ]
  58. //元件例化
    : Z& W4 ^! O5 M$ o" S( r4 @
  59. dpram dpram_unit(
    2 k% [3 g3 p0 A' H. P  l  v
  60.   .clka(emif_clk), // input clka
    6 d  U* d; k8 x
  61.   .wea(dpram_wea), // input [0 : 0] wea
    8 V' c% w- |4 \/ V
  62.   .addra(dpram_addra), // input [14 : 0] addra
    4 m0 D! M4 h8 E" w# p6 b( W
  63.   .dina(dpram_dina), // input [15 : 0] dina
    ) }# |! q2 q. ]" ]- p  W5 ]
  64.   .douta(dpram_douta), // output [15 : 0] douta0 R' a& D4 Y( r# e" Z; p0 F) C
  65.         //clkb                  => sys_clk,
    ; D4 V7 n( o" r5 L7 F! {3 a7 O( f5 @
  66.   .clkb(clk), // input clkb
    , e* x6 \0 v) e
  67.   .web(dpram_web), // input [0 : 0] web
    ) y9 y; x, F7 t! W
  68.   .addrb(dpram_addrb), // input [14 : 0] addrb3 P* {7 s- _( u' O! f7 ?- x- O* e
  69.   .dinb(dpram_dinb), // input [15 : 0] dinb" \; p& k7 G* ?9 e/ c8 c4 L1 C
  70.   .doutb(dpram_doutb));// output [15 : 0] doutb)
    & ~8 v6 v/ J" C, X2 I, H$ K/ `) R
  71. % i4 H9 B- z3 X
  72. always@(emif_clk)begin
    8 K7 S/ G# J% `# a; I
  73.                 dpram_wea             <= 0;
    , A: a7 v- I' X
  74.                 dpram_addra           <= {emifa_addr_reg[13:0],emifa_ba1_reg};
    5 g8 q; `, C0 o: Y) h
  75.                 dpram_dina            <= emifa_data_reg;4 M  ^6 h" ?, l  @- g
  76. end
    0 k) U; t7 N6 S
  77. assign dpram_web = 1'b1;
    % y4 j4 I* I* V: i: \( y! H% A
  78. + B, e8 r8 h- q  L0 a& g8 ~
  79. always@( clk )- v' i+ u4 w2 g/ q# f$ {
  80. begin
    , l! N5 e& p+ a1 I
  81.         dpram_addrb  <= 100;9 s( d8 Z- ^+ {5 b2 ?
  82.         dpram_dinb   <= 16'd2048;! c& N$ J- v  g" P; l. B1 W6 M
  83. end" j2 {8 A; c* W) J. @) S
  84. 4 I: E: M$ w( M/ D% j
  85. endmodule: V8 m0 C  _9 u7 Z

  86. 7 l1 ?' t! \2 l$ H8 H
复制代码
嗯,谢谢,这个懂了,但是读出来的数还是不正确,fpga端具体代码如上。# W0 r& ]" U0 n! N8 m. B
这段代码相当于RAM的A口只用来读,并且dpram_wea一直置零,RAM的B口用来写入一个数据。+ c& p+ `# u, _( W  y8 g# H
代码下载进FPGA后,DSP端先注释掉向fpga写入数据的部分,直接读取,读取的结果都为0,包括  dpram_addrb  <= 100;这个地址下应该的2048.9 G. t; L! ]& v" H8 O" v7 G* P/ q
然后把注释去掉,DSP端可以正常的写入数据并且正确的读出数据,但是我的FPGA端已经将  dpram_wea             <= 0;这里置零,是没法写入的,所以对于DSP端还能照常写入读出产生疑问。
* n: g7 C, v, n2 j! U* J; R7 v/ r/ L2 |8 t5 d; W4 _( x
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
7#
 楼主| 发表于 2015-4-20 17:31:45 | 只看该作者
Lewis 发表于 2015-4-17 10:109 A- m9 o. z  d, p
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
% D# ~+ j0 h! d* i2 w3 @ ...

! m2 d: V! x9 ~( s) H我的硬件平台是:TL138F-EasyEVM(浮点DSP C6748+ARM9 +Xilinx Spartn-6 FPGA核)) n' _5 w  {# X" y1 R7 T! n
调试例程为:DSP端:EMIF_FPGA----EMIF总线FPGA读写测试: X. l$ N, X# W5 N9 |
                    FPGA端:emif_test
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
8#
 楼主| 发表于 2015-4-21 19:19:07 | 只看该作者
Lewis 发表于 2015-4-17 10:101 J1 R) O7 _3 a- z" Y% N
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
6 x5 _8 [1 A& N+ a, \ ...
5 V4 H. B4 N$ Y9 R7 h- o) |* T! j
还望版主指导,卡了好多天了,原理都弄明白了,就是不知道问什么读出的数据不对。若是在您那里可以正确读取数据,还望发一份程序给我。谢谢了。
回复 支持 反对

使用道具 举报

20

主题

65

帖子

341

积分

中级会员

Rank: 3Rank: 3

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-4 23:59 , Processed in 0.043037 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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