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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

" Z3 L6 u7 C0 X# n' @- @邮箱:604285180@qq.com
5 O/ T* N- n; `4 g  D5 ^

本帖子中包含更多资源

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

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

使用道具 举报

20

主题

65

帖子

341

积分

中级会员

Rank: 3Rank: 3

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

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
8#
 楼主| 发表于 2015-4-21 19:19:07 | 只看该作者
Lewis 发表于 2015-4-17 10:10
) g$ h+ `. O0 |' }% q3 x/ ?' EEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址+ k6 ]) G; E' d: J
...

: @6 V+ A  h) A* \# f还望版主指导,卡了好多天了,原理都弄明白了,就是不知道问什么读出的数据不对。若是在您那里可以正确读取数据,还望发一份程序给我。谢谢了。
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
7#
 楼主| 发表于 2015-4-20 17:31:45 | 只看该作者
Lewis 发表于 2015-4-17 10:10
5 u# u& h: s6 W. MEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
: M$ s" v3 P" ~( \* |, J ...
$ [' c+ a  L9 p0 }. s
我的硬件平台是:TL138F-EasyEVM(浮点DSP C6748+ARM9 +Xilinx Spartn-6 FPGA核)# \. x! A8 P$ R( ?0 F, @
调试例程为:DSP端:EMIF_FPGA----EMIF总线FPGA读写测试7 m0 \! R/ d  j1 ?" K
                    FPGA端:emif_test
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
6#
 楼主| 发表于 2015-4-20 17:17:38 | 只看该作者
本帖最后由 水瓶 于 2015-4-20 17:24 编辑
; O' F# @3 x) X+ Z0 v/ l3 t
Lewis 发表于 2015-4-17 10:10$ e& S9 Q% O, q$ w8 K: d
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址7 r# w/ a' r; F6 a1 l
...
  1. `timescale 1ns / 1ps
    - r8 c: ^& ?3 ^- t/ i; n/ s+ m
  2. module emif_test( m5 p1 _, X/ e
  3. (     
    % K- X* }3 X9 F) y) A5 h
  4.    input clk,
    8 U" M! T# J4 W
  5.         input    emifa_clk,    // 时钟                         $ D+ Y/ Z& l2 `  X3 S% E* Q( y$ S
  6.         input    emifa_cs2,    //  低电平有效异步器件使能引脚  (与异步器件片选信号相连,只在访问异步存储器时有效)      8 p$ R/ q: q$ \4 n# j  P
  7.         input    emifa_oe_n,    //  低电平有效异步器件使能引脚          ( s/ [7 p# D/ y) k  x7 J6 h
  8.         input    emifa_we_n,     // 低电平有效写使能引脚       + w, ~! I& i6 C
  9.         inout    emifa_wait0,    //等待输入引脚      ) k( H8 M, O9 C9 A, @& ?# y& r; I- G
  10.         inout    emifa_wait1,             + Q* f# F8 i- M/ n+ \
  11.         input    emifa_ba1,         // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。            
    8 m4 v. W8 Q8 A  Y. V9 F
  12.         input    [13:0]emifa_addr,  // EMIF 地址总线            + l8 |8 W+ Q( z8 `
  13.         output    [15:0]emifa_data   // EMIF 数据总线5 S7 s: P/ |5 W( X) G4 c  r1 ~
  14. );& C: Q4 J1 F7 M/ M' v
  15.         
    , u9 w% v  X; s5 w/ g3 B# N
  16. /****************EMIF Interface****************/        : [7 C, D2 @. N9 w" S
  17. //信号声明0 {8 O2 {$ @0 A9 y
  18. wire emif_clk;
    + s1 |  h, h' a4 r( K
  19. reg emifa_cs2_reg;      % I1 h9 i( |5 G5 Z2 ?' }
  20. reg emifa_rnw_reg;     
    2 T; a; [. I; T, i; `- b0 ~2 ^: Q
  21. reg emifa_oe_n_reg;   
    5 [- E# }  j: j  K8 \2 _
  22. reg emifa_we_n_reg;    % @- o" O0 u0 R, x! r
  23. reg emifa_wait0_reg;   
    " ^9 a& x5 F' {4 C
  24. reg emifa_wait1_reg;  1 x' J: _/ s+ M# Q6 g, t7 N( e
  25. reg emifa_ba1_reg;     9 v  k/ @, D0 h* J' d6 N% R& X+ a
  26. reg [13:0] emifa_addr_reg;      * O- i! ^, U9 j- s8 I3 r
  27. reg [15:0] emifa_data_reg;   [! [  h" k; H! p8 B

  28. ; s, y/ ^7 N2 _
  29. //元件例化/ w- j  p+ y9 y' w' A! H& r
  30. BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));
    2 e8 |- z! i$ F9 e3 M, ?; T- c
  31. //寄存器赋值
    $ d: S2 ^8 g3 V3 g1 A: [
  32. always@(posedge emif_clk)begin
    : x8 E3 D# [# [$ a) L+ z
  33.                 emifa_cs2_reg       <= emifa_cs2;
    7 |  s. V) c4 T
  34.                 emifa_oe_n_reg      <= emifa_oe_n;* p# ~) s# U0 ]  I) `9 D. l
  35.                 emifa_we_n_reg      <= emifa_we_n;9 ^* o' f3 M1 ]+ ~3 m
  36.                 emifa_wait0_reg     <= emifa_wait0;
    ' _% k1 |+ \6 |1 w( v9 r; J; E* _
  37.                 emifa_wait1_reg     <= emifa_wait1;, L; Q- ^  {/ e" T- N
  38.                 emifa_ba1_reg       <= emifa_ba1;
      O, R) ~9 j! F1 J
  39.                 emifa_addr_reg      <= emifa_addr;5 S8 A' ?' ?$ p$ D2 v
  40.                 emifa_data_reg      <= emifa_data;
    6 i! F. m. C% X
  41. end
    : d7 V- A& a+ Y7 x+ A* Y

  42. 9 {$ O3 Z" X8 P( s5 h2 I8 t) C1 x: I' `
  43. //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;4 U6 W. s7 R: ?: o6 j, P, H
  44. assign emifa_data = dpram_douta;
    , c, t0 D8 E, J* ^- B+ z& R+ O

  45. / N  E! @( I, p& F5 q
  46. /****************Dual Port RAM****************/4 j4 Y6 b, r2 o2 |, A, {& w) f" @
  47. //PORTA+ T* D6 ]9 q: ]* M& {. j
  48. reg  [14:0]dpram_addra;      
    8 g& K& @/ u8 N  J' ~0 c7 n3 e
  49. reg  dpram_wea;         
    $ u% |! _! k! A$ E# T" ~4 s
  50. reg  [15:0]dpram_dina;      
    0 x; ]! U2 N' @1 ]
  51. wire [15:0]dpram_douta;           ( [8 j6 D. w2 t
  52. //PORTB
    7 g$ p% v& J  s5 H
  53. reg  [14:0]dpram_addrb;       % }+ J. p# n1 t' e) u4 ?, [$ P
  54. wire  dpram_web;
      b4 {8 F2 _' ^$ z5 D3 d5 {
  55. reg  [15:0]dpram_dinb;
    ( J: ?( f$ l" H4 }
  56. wire [15:0]dpram_doutb;
    : Z# P; Q: i/ s5 h$ a( t
  57.    9 _' Y: z1 {7 p% @6 Q0 i
  58. //元件例化- o9 y7 e% C0 H, Q$ y$ P
  59. dpram dpram_unit(
    ) ?" l. x4 `7 u3 x6 U- [: i6 N
  60.   .clka(emif_clk), // input clka% K  S2 {& @7 m0 H2 x5 @3 j
  61.   .wea(dpram_wea), // input [0 : 0] wea
    " p9 ]/ W0 R' p) M. C5 y
  62.   .addra(dpram_addra), // input [14 : 0] addra4 x3 @, P: t0 \* G' C2 p4 _1 r! }
  63.   .dina(dpram_dina), // input [15 : 0] dina
    ; l- Q; I( j9 e) S; G
  64.   .douta(dpram_douta), // output [15 : 0] douta8 _2 c5 t' C6 V: Y/ v
  65.         //clkb                  => sys_clk,
    5 I0 j6 a3 t' I! N
  66.   .clkb(clk), // input clkb' M0 N  p1 f( H# _% j! J
  67.   .web(dpram_web), // input [0 : 0] web9 b* E: L( K' }* Y, X% K2 Z
  68.   .addrb(dpram_addrb), // input [14 : 0] addrb
    + `" c) ~- R8 M# |5 K- L
  69.   .dinb(dpram_dinb), // input [15 : 0] dinb! y1 A5 ]/ t  U
  70.   .doutb(dpram_doutb));// output [15 : 0] doutb). c: Y' Y. R; [% U

  71. 5 v- @: ]& G$ I  H1 S- ~
  72. always@(emif_clk)begin
    ! ^4 n* `  I$ L* l% N4 x4 L0 t8 b
  73.                 dpram_wea             <= 0;) t" q# D9 V& e7 H9 M) ^/ E+ ?
  74.                 dpram_addra           <= {emifa_addr_reg[13:0],emifa_ba1_reg};
    ( S: K' T" p# T5 f( O. x
  75.                 dpram_dina            <= emifa_data_reg;
    * y6 S8 V$ a( A- I
  76. end+ H& Q! E2 v  v) x0 d. c
  77. assign dpram_web = 1'b1;: c3 f' K8 B' J; i/ `. @

  78. 6 f3 z) o6 h) K+ ^" b* b' c/ |
  79. always@( clk )+ v' _, ~6 \# R; w$ D- e- S+ U
  80. begin8 J( O3 ^8 B+ Z% ^4 `; W
  81.         dpram_addrb  <= 100;
    ' P4 S" y1 p/ n
  82.         dpram_dinb   <= 16'd2048;
    6 a" d: R# \  l0 b! r
  83. end
    + A" x0 b, R' m0 b$ R/ m
  84. 5 _, B1 r& X8 ?4 H% M) ?4 O6 \
  85. endmodule# d- i' L# L' ]: A  i) t
  86. # T( B3 a, c+ ?0 u- e5 c2 O! Z+ C7 }
复制代码
嗯,谢谢,这个懂了,但是读出来的数还是不正确,fpga端具体代码如上。
- o7 T/ ]8 r8 I' d$ w) o  O这段代码相当于RAM的A口只用来读,并且dpram_wea一直置零,RAM的B口用来写入一个数据。' D8 B" w& r) z  k& q, u9 q
代码下载进FPGA后,DSP端先注释掉向fpga写入数据的部分,直接读取,读取的结果都为0,包括  dpram_addrb  <= 100;这个地址下应该的2048.6 h1 t+ S- v' v0 N2 X5 [8 F5 w
然后把注释去掉,DSP端可以正常的写入数据并且正确的读出数据,但是我的FPGA端已经将  dpram_wea             <= 0;这里置零,是没法写入的,所以对于DSP端还能照常写入读出产生疑问。
; `4 b) c8 [9 ~+ H5 ?& f: a0 C4 r6 {0 g  G
回复 支持 反对

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

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

" `( C4 @" c0 O2 v' fEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址# l  \# e/ C) g; r: E# J

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
地板
 楼主| 发表于 2015-4-16 22:14:25 | 只看该作者
Lewis 发表于 2015-4-16 09:55! _' j) Y0 b0 P. N
还要注意数据在FPGA存储的地址,跟dsp读的地址要对应
5 i1 ?) ^# ^2 b( y/ q
FPGA端RAM的地址是从0开始的,DSP端地址是0x6000 0000的地址去读,请问如何映射地址?
回复 支持 反对

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

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

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

积分
1137
沙发
发表于 2015-4-16 09:51:44 | 只看该作者
只需要把(下图中)向FPGA写数据的部分注释掉就行,其他地方都不需要修改。
' ~! P) ^9 H5 M# ~4 z3 t+ h
# @6 c+ w. x' N" M- S" ?

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-18 18:40 , Processed in 0.042992 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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