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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 11475|回复: 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中初始化的数据。请问问题出在哪里了?还望版主大侠指导。
6 M0 G& ?; R5 E% V- B9 }" `; p6 I# Z
邮箱:604285180@qq.com
: L2 W! P5 K1 E: q6 n( y+ H. z

本帖子中包含更多资源

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

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

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

积分
1137
沙发
发表于 2015-4-16 09:51:44 | 只看该作者
只需要把(下图中)向FPGA写数据的部分注释掉就行,其他地方都不需要修改。/ H4 t& Y; @, [( a
( }: ]( b; O+ s

本帖子中包含更多资源

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

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
9 t* i3 j2 E5 l还要注意数据在FPGA存储的地址,跟dsp读的地址要对应

6 Q( n7 e! S+ Y6 i2 AFPGA端RAM的地址是从0开始的,DSP端地址是0x6000 0000的地址去读,请问如何映射地址?
回复 支持 反对

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

积分
1137
5#
发表于 2015-4-17 10:10:29 | 只看该作者
! \; F2 G2 H  h5 q* b" ^7 R6 j
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
7 D7 |& E+ N) d- j

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
6#
 楼主| 发表于 2015-4-20 17:17:38 | 只看该作者
本帖最后由 水瓶 于 2015-4-20 17:24 编辑
  h- H- E7 R, @# l& Y: N
Lewis 发表于 2015-4-17 10:10
4 s- `: b( @# P7 B8 M$ ZEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
! N3 D2 j$ I: {1 Q. b ...
  1. `timescale 1ns / 1ps: H3 d. u' T# H
  2. module emif_test
    ) q1 x* d" e. s) S6 K* S% W# {( h
  3. (     
    * V) y6 S; a2 ~5 P# p5 q# i, v
  4.    input clk,5 ]. V1 U# {1 a$ f
  5.         input    emifa_clk,    // 时钟                         + L3 R) b( B9 H/ ~
  6.         input    emifa_cs2,    //  低电平有效异步器件使能引脚  (与异步器件片选信号相连,只在访问异步存储器时有效)      / y7 N/ y( s( {) c
  7.         input    emifa_oe_n,    //  低电平有效异步器件使能引脚         
    $ z' r9 G# k2 a0 V+ V9 {, K
  8.         input    emifa_we_n,     // 低电平有效写使能引脚       + A: W4 M9 l# p
  9.         inout    emifa_wait0,    //等待输入引脚      
    # w' s$ e/ `9 g7 u5 |9 X
  10.         inout    emifa_wait1,             ! Q9 v& C" H. L/ u2 @5 }) p
  11.         input    emifa_ba1,         // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。            
    % q4 k2 Y% X# d& F
  12.         input    [13:0]emifa_addr,  // EMIF 地址总线            , E2 V" C+ D' R/ g
  13.         output    [15:0]emifa_data   // EMIF 数据总线0 ^' e3 N5 B, a+ q: m
  14. );0 l* p/ C  ?1 h. ?( B$ }" ^4 i* Z
  15.         & G  v% D9 J( t' t# w& F! Q$ J& h" F
  16. /****************EMIF Interface****************/        9 k5 E" o" C0 J% V3 M+ W! A0 w
  17. //信号声明
    1 r5 T' ~; S) _! a8 F
  18. wire emif_clk;
    1 G( l* j9 s( W( u4 V
  19. reg emifa_cs2_reg;      $ Y; q( }& u* W+ q. [9 d
  20. reg emifa_rnw_reg;     # l% D* ?5 ^2 f% `9 N# J) d
  21. reg emifa_oe_n_reg;    6 B; C; m: p; B/ R
  22. reg emifa_we_n_reg;    ( O9 I' T0 h$ m1 J' [) C
  23. reg emifa_wait0_reg;   
    , f: w- Y7 X, r0 ?
  24. reg emifa_wait1_reg;  
    # [, X+ h& B1 ^. w* d
  25. reg emifa_ba1_reg;     
    # z, S" g5 `( V6 j; Y; x
  26. reg [13:0] emifa_addr_reg;      
    ( N) o% {$ W* M. T7 F
  27. reg [15:0] emifa_data_reg;
    ( }8 H( e0 q& t9 W8 ]

  28. * ^$ o6 M6 A  A; b- _/ A
  29. //元件例化
    : J0 W3 O8 q; r) b- {% c( ?8 n
  30. BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));
    3 e  q3 }1 v; O4 \8 r! Z$ A8 s9 w
  31. //寄存器赋值
    + J! u7 y. a1 p% O  Z1 o" x
  32. always@(posedge emif_clk)begin
    6 @- @  h, w+ j6 P
  33.                 emifa_cs2_reg       <= emifa_cs2;) t' R! J' R4 E7 x9 x( \
  34.                 emifa_oe_n_reg      <= emifa_oe_n;
    + P! Y7 i' F& s9 p( U
  35.                 emifa_we_n_reg      <= emifa_we_n;; F' ]) V. _/ D
  36.                 emifa_wait0_reg     <= emifa_wait0;
    $ u  p& m$ Y2 M7 K
  37.                 emifa_wait1_reg     <= emifa_wait1;. q) C8 b  z4 L
  38.                 emifa_ba1_reg       <= emifa_ba1;
    # F2 c9 f4 F# p
  39.                 emifa_addr_reg      <= emifa_addr;
    ( d0 e0 T; u' X7 a: N
  40.                 emifa_data_reg      <= emifa_data;
    4 v! j  J5 v- C; T* i8 V
  41. end1 `7 K- |  t2 M) r  @

  42. 0 ?- w- u; V, }6 x3 X
  43. //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;+ C* {. Y+ N" p8 X- L! q8 |4 n/ S
  44. assign emifa_data = dpram_douta;: e0 l) ^+ G5 i5 }6 A

  45. + A* v* j) Q! v* z/ A% V" g
  46. /****************Dual Port RAM****************/- o8 u2 W! q1 O1 b  K
  47. //PORTA
    / |2 z. ]6 f( C
  48. reg  [14:0]dpram_addra;      
    % b9 q: o) C( j( \" P2 |
  49. reg  dpram_wea;         , E8 c8 U/ `" t- o
  50. reg  [15:0]dpram_dina;      
    $ v: e2 O; n: z" _# r& M
  51. wire [15:0]dpram_douta;           - S! ?% A4 M" J( o6 {8 B/ `
  52. //PORTB( c$ E# W7 Q+ L6 T3 c  P4 Y
  53. reg  [14:0]dpram_addrb;       ) d. w7 H* Q! j
  54. wire  dpram_web;# O7 o4 B1 ^- `2 d$ U  z
  55. reg  [15:0]dpram_dinb;
    0 w5 w9 u% e4 _. O, T
  56. wire [15:0]dpram_doutb; , G2 g3 _3 T4 Y! r9 M0 o. ~2 }+ C
  57.    
    & U1 ]5 L  C: n: n
  58. //元件例化
    ( Z' ^7 v6 G2 X, z
  59. dpram dpram_unit(3 X0 f! q' S! j! q+ r
  60.   .clka(emif_clk), // input clka" b8 ]0 Q1 P* E- N; h
  61.   .wea(dpram_wea), // input [0 : 0] wea: I: {% n$ V; H/ o. a) U, y
  62.   .addra(dpram_addra), // input [14 : 0] addra
    / g3 k4 V# R) K+ i5 m
  63.   .dina(dpram_dina), // input [15 : 0] dina) J+ J  j: x, P) a4 w6 k0 k% I5 ^
  64.   .douta(dpram_douta), // output [15 : 0] douta6 w( t) X( I9 E# E
  65.         //clkb                  => sys_clk,; o& M" f- ~( n( G* j
  66.   .clkb(clk), // input clkb; O. T$ z" L& K4 i) w
  67.   .web(dpram_web), // input [0 : 0] web: v3 P4 c% T& g" N) L: h. L
  68.   .addrb(dpram_addrb), // input [14 : 0] addrb
    $ K0 q2 A: S4 I1 G3 s4 c& u
  69.   .dinb(dpram_dinb), // input [15 : 0] dinb' e5 C/ T* k& A; A- B
  70.   .doutb(dpram_doutb));// output [15 : 0] doutb)
    " ?4 {1 N6 w% {, K( g0 f7 ?) G
  71. ( S7 p) H2 f8 p- r5 J9 q
  72. always@(emif_clk)begin' }2 }) s* ]+ _- Y- C& U
  73.                 dpram_wea             <= 0;
    : o" I0 f! Q  v
  74.                 dpram_addra           <= {emifa_addr_reg[13:0],emifa_ba1_reg};
    + I; r$ `: s8 q$ q* q8 d% `8 u
  75.                 dpram_dina            <= emifa_data_reg;
    ; D! x# s' i+ l' X
  76. end9 J  O' Y: y. [4 p
  77. assign dpram_web = 1'b1;. E, h5 V' f& B
  78. 0 z7 _$ a4 S" A8 r" E0 _  s) Q  ]
  79. always@( clk )3 M( C/ G! U. \, H
  80. begin
    ) t7 p3 B) d7 k7 c8 `% _+ a" g/ |3 D
  81.         dpram_addrb  <= 100;
    / @7 H% S  g2 s* c# q
  82.         dpram_dinb   <= 16'd2048;8 J9 P5 ~1 H7 A- F; e
  83. end
      j+ s2 N, P5 T$ Q3 l

  84. 2 N. O) @6 o. E/ N
  85. endmodule
    ) }  @0 w, e$ y+ S
  86. $ x+ Z, R4 P, ~  `
复制代码
嗯,谢谢,这个懂了,但是读出来的数还是不正确,fpga端具体代码如上。
5 f3 C/ `7 T4 q& l" R2 x6 I这段代码相当于RAM的A口只用来读,并且dpram_wea一直置零,RAM的B口用来写入一个数据。
0 H/ ]- J& k6 t% n  K! ~# W% N代码下载进FPGA后,DSP端先注释掉向fpga写入数据的部分,直接读取,读取的结果都为0,包括  dpram_addrb  <= 100;这个地址下应该的2048.
6 X- K  H5 S1 k然后把注释去掉,DSP端可以正常的写入数据并且正确的读出数据,但是我的FPGA端已经将  dpram_wea             <= 0;这里置零,是没法写入的,所以对于DSP端还能照常写入读出产生疑问。# s$ K% d) s3 n6 H3 }) J- V

2 o% e$ _, f1 ]. V) }: r
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
7#
 楼主| 发表于 2015-4-20 17:31:45 | 只看该作者
Lewis 发表于 2015-4-17 10:10
5 ]* @( p6 X" \& t" w& b! R( REMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址3 ]0 O+ o/ \) K$ U5 }4 I1 Y
...
# O, D8 ?! U. {! o! W1 ?
我的硬件平台是:TL138F-EasyEVM(浮点DSP C6748+ARM9 +Xilinx Spartn-6 FPGA核)) J- P; V+ B" h6 O8 Z
调试例程为:DSP端:EMIF_FPGA----EMIF总线FPGA读写测试
9 w1 @: T0 k7 j% Z( |                    FPGA端:emif_test
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
8#
 楼主| 发表于 2015-4-21 19:19:07 | 只看该作者
Lewis 发表于 2015-4-17 10:10. b* a+ ^% ^3 w8 O% B
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
  E; t" A$ [% \" G7 k ...
: ?% {/ i# y8 ^- S4 R; m
还望版主指导,卡了好多天了,原理都弄明白了,就是不知道问什么读出的数据不对。若是在您那里可以正确读取数据,还望发一份程序给我。谢谢了。
回复 支持 反对

使用道具 举报

20

主题

65

帖子

341

积分

中级会员

Rank: 3Rank: 3

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-18 22:16 , Processed in 0.043350 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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