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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 12417|回复: 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中初始化的数据。请问问题出在哪里了?还望版主大侠指导。
& H! Z/ S, E) v% A
邮箱:604285180@qq.com
( i) \* z) K. B+ Q

本帖子中包含更多资源

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

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

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

积分
1137
沙发
发表于 2015-4-16 09:51:44 | 只看该作者
只需要把(下图中)向FPGA写数据的部分注释掉就行,其他地方都不需要修改。8 _) O: \- _& v% A/ \0 J* B/ L

  x1 ?# X( s+ @7 K

本帖子中包含更多资源

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

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:554 h6 u/ H) E+ y- S( }
还要注意数据在FPGA存储的地址,跟dsp读的地址要对应
4 o/ z/ x; J$ J" O
FPGA端RAM的地址是从0开始的,DSP端地址是0x6000 0000的地址去读,请问如何映射地址?
回复 支持 反对

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

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

4 d8 r8 g! D8 _EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址  p+ M5 N8 h0 K3 B# i

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
6#
 楼主| 发表于 2015-4-20 17:17:38 | 只看该作者
本帖最后由 水瓶 于 2015-4-20 17:24 编辑
: L& E5 o) @) V2 T3 o
Lewis 发表于 2015-4-17 10:10
1 p$ q( [- F' g3 R0 y* w7 XEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址  y4 J/ m8 `: h0 h. N2 l1 w
...
  1. `timescale 1ns / 1ps
    2 h/ M% c, |2 E; J1 e$ p
  2. module emif_test
    1 h+ g( X: c3 U# ]7 I
  3. (     
    9 p; q! ?* r9 F+ j
  4.    input clk,
    : \) L4 T4 s: d+ X# j4 e  [
  5.         input    emifa_clk,    // 时钟                         4 E$ B* q3 H4 L+ O) U% o
  6.         input    emifa_cs2,    //  低电平有效异步器件使能引脚  (与异步器件片选信号相连,只在访问异步存储器时有效)      $ I4 U, s9 J- p+ T3 f: g
  7.         input    emifa_oe_n,    //  低电平有效异步器件使能引脚          # J/ u& _; s1 l+ ]5 J
  8.         input    emifa_we_n,     // 低电平有效写使能引脚       7 e' x& W2 z- p( |* ]0 n  k# o
  9.         inout    emifa_wait0,    //等待输入引脚      
    / N# u0 Z: c' [6 l1 }. f2 |, u
  10.         inout    emifa_wait1,             8 T  |% L$ ^" l0 ^+ u. z% @4 H
  11.         input    emifa_ba1,         // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。            " {/ N7 W! {3 h3 ]3 B# R
  12.         input    [13:0]emifa_addr,  // EMIF 地址总线            / F  D/ ]2 Z; e: _
  13.         output    [15:0]emifa_data   // EMIF 数据总线, Y: M! {8 n4 ]
  14. );& x" ^" {. T+ E9 n; w1 Q
  15.         9 ?. q) y' [( U  G) l: a! N1 C
  16. /****************EMIF Interface****************/        0 E5 S& e* j7 T  j1 k( M( k  |
  17. //信号声明
    + R" t  L2 J0 f# z
  18. wire emif_clk;
    3 o6 @4 ]; C7 ], I# q8 M& m
  19. reg emifa_cs2_reg;      : R, Z" |1 B+ A6 Z% S& B3 v9 ~
  20. reg emifa_rnw_reg;     
    ) P2 @# g5 D/ B0 ~! L/ L
  21. reg emifa_oe_n_reg;    ' \- L' E  W2 O, T8 F4 m4 T- `
  22. reg emifa_we_n_reg;    ' |$ }0 d8 o" L  g$ E0 H& j
  23. reg emifa_wait0_reg;   
    - m% |1 ?7 u( s% N9 _
  24. reg emifa_wait1_reg;  
    7 `$ [1 a8 W+ Z/ m, V" v
  25. reg emifa_ba1_reg;     
    ' H; T" @7 e+ \
  26. reg [13:0] emifa_addr_reg;      ! l: W1 j9 A# \) [' y: N+ }7 ?7 [
  27. reg [15:0] emifa_data_reg; , t5 P" Q  ~6 `( C4 A
  28. ; C& h, r& b: M3 Y5 q
  29. //元件例化  s, I9 U2 o% {% W5 w1 E1 l
  30. BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));+ r8 u7 H4 f3 }' F, n! @
  31. //寄存器赋值1 t7 V) V9 o: f( Z
  32. always@(posedge emif_clk)begin+ l# V3 n% t6 g' g& A# B
  33.                 emifa_cs2_reg       <= emifa_cs2;$ N3 f# B1 ]) R, S% \5 u7 c; J- }
  34.                 emifa_oe_n_reg      <= emifa_oe_n;
    6 {* n9 i3 |% O9 \* k
  35.                 emifa_we_n_reg      <= emifa_we_n;& T  A, n! @! B, o* e  f4 z  J. _
  36.                 emifa_wait0_reg     <= emifa_wait0;) t' d  z" ~/ D5 k0 Z9 j  m6 w
  37.                 emifa_wait1_reg     <= emifa_wait1;
    ( O5 D1 U9 ?) T2 Q( ^+ u' a
  38.                 emifa_ba1_reg       <= emifa_ba1;$ L8 B6 B- n3 k+ v* s6 w% e
  39.                 emifa_addr_reg      <= emifa_addr;
    - a" y8 r1 y. Q/ W2 J& A; b
  40.                 emifa_data_reg      <= emifa_data;% |5 ^+ ^; A7 M1 w1 }# n
  41. end
    ) l) B0 V! C. T8 n' ^
  42. ' i% B6 k  `, ?* _/ P# b  ]
  43. //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;
    7 G* H% u) C2 Q( m
  44. assign emifa_data = dpram_douta;2 `  z  d  v! _( ^
  45. % h/ e: n' w$ S; i; E: O
  46. /****************Dual Port RAM****************/
    * m/ L6 a% u% H7 d
  47. //PORTA3 ^1 g9 }/ T2 A' B& N
  48. reg  [14:0]dpram_addra;      
    ; l* ^( a2 I: m- B2 G/ x
  49. reg  dpram_wea;         % D5 q: z1 ]/ G# q, J5 S
  50. reg  [15:0]dpram_dina;      
      d) t# ^% C  `
  51. wire [15:0]dpram_douta;           7 z" S" R; O* o# c, y
  52. //PORTB
    1 D. m1 {, @* |% D% H0 T/ {
  53. reg  [14:0]dpram_addrb;       2 K" d2 _+ R' F  @- Y6 x4 d6 @
  54. wire  dpram_web;
    $ X4 R' H* e' ]" @8 `) e
  55. reg  [15:0]dpram_dinb;$ s/ y8 `) i' N  i
  56. wire [15:0]dpram_doutb;
    3 W* ^; c5 N# C' O' V! X1 q5 C3 ?
  57.    
    $ ~- o, b' v$ n, a; S
  58. //元件例化
    9 ^6 J/ B# p% w& e
  59. dpram dpram_unit(3 A7 ]! O8 x: l1 O0 w% T
  60.   .clka(emif_clk), // input clka" N2 j9 u0 i9 k" r! y) u5 S
  61.   .wea(dpram_wea), // input [0 : 0] wea
    . t6 n; _0 `% \' M. t, R2 f
  62.   .addra(dpram_addra), // input [14 : 0] addra4 `$ G/ I+ q# B4 J, P6 w& n$ f
  63.   .dina(dpram_dina), // input [15 : 0] dina
    5 G, E9 J; s' Z% N& _
  64.   .douta(dpram_douta), // output [15 : 0] douta
      c! D6 r( X. ?+ L& J
  65.         //clkb                  => sys_clk,) l# i2 h! _# a
  66.   .clkb(clk), // input clkb: F$ Z- c0 L; N+ i3 x
  67.   .web(dpram_web), // input [0 : 0] web
    0 ~- X: I  {/ A+ p) _) F  y
  68.   .addrb(dpram_addrb), // input [14 : 0] addrb, a8 N' k3 P+ s7 c5 @5 ^5 V/ P
  69.   .dinb(dpram_dinb), // input [15 : 0] dinb8 N2 P3 ?+ n6 D$ ?
  70.   .doutb(dpram_doutb));// output [15 : 0] doutb)
    2 _. a9 r- @4 W* V/ w" q

  71. 2 L+ J: d6 ~5 M$ R. m
  72. always@(emif_clk)begin
    5 ?/ h0 }6 \4 B% V% G
  73.                 dpram_wea             <= 0;- R% }7 b# c/ U" x. f" A
  74.                 dpram_addra           <= {emifa_addr_reg[13:0],emifa_ba1_reg};
    ! d! ^* K* {/ `! p9 z
  75.                 dpram_dina            <= emifa_data_reg;
    / F$ C4 R, r" u6 p: b
  76. end# u7 g' i4 W+ u2 n
  77. assign dpram_web = 1'b1;! H" H: L8 t* O6 k" i8 t/ t

  78. $ J7 j* `5 P8 W: i0 _
  79. always@( clk )
    8 [! L) v% @% k$ S7 g, M; u+ O
  80. begin6 }) W+ e# J- O& m5 G- l( W) i
  81.         dpram_addrb  <= 100;
    2 E% f0 j$ B" x) a( I
  82.         dpram_dinb   <= 16'd2048;
    5 z' b3 {' z. p3 Z
  83. end2 L& _. ~4 a& n7 ~# R5 K* B( t
  84. - t/ @" ^. N$ b/ C7 M' j' x
  85. endmodule
    ) N! D0 x! r, f: d. v$ N0 o
  86. ' T, H$ h$ p4 t+ l% s
复制代码
嗯,谢谢,这个懂了,但是读出来的数还是不正确,fpga端具体代码如上。
5 ]/ n' U: y5 r* ?) Y$ c3 f. x这段代码相当于RAM的A口只用来读,并且dpram_wea一直置零,RAM的B口用来写入一个数据。
6 t" l! w4 a( J7 }; r) {  }代码下载进FPGA后,DSP端先注释掉向fpga写入数据的部分,直接读取,读取的结果都为0,包括  dpram_addrb  <= 100;这个地址下应该的2048.
2 g, M; x4 i1 T' F3 B  s4 ?然后把注释去掉,DSP端可以正常的写入数据并且正确的读出数据,但是我的FPGA端已经将  dpram_wea             <= 0;这里置零,是没法写入的,所以对于DSP端还能照常写入读出产生疑问。3 _; V5 |4 {! v1 J

* B: Y9 Z: d2 R) W9 J
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
7#
 楼主| 发表于 2015-4-20 17:31:45 | 只看该作者
Lewis 发表于 2015-4-17 10:10
6 |3 B+ t* P; p" k/ s4 v5 L$ t) p& {EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址- T3 H) e  j* P# Y
...
; i, A$ }8 r+ {
我的硬件平台是:TL138F-EasyEVM(浮点DSP C6748+ARM9 +Xilinx Spartn-6 FPGA核)( Y4 j1 I" E6 ^5 a+ y1 k/ u! v/ w4 h3 i
调试例程为:DSP端:EMIF_FPGA----EMIF总线FPGA读写测试; d" l% Y5 w6 {0 Y/ q
                    FPGA端:emif_test
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
8#
 楼主| 发表于 2015-4-21 19:19:07 | 只看该作者
Lewis 发表于 2015-4-17 10:10) }! k9 P4 y6 f' q) z
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址' J8 g# X1 e8 o( j" P% c
...
  }( _2 s( p  F; n& U; `
还望版主指导,卡了好多天了,原理都弄明白了,就是不知道问什么读出的数据不对。若是在您那里可以正确读取数据,还望发一份程序给我。谢谢了。
回复 支持 反对

使用道具 举报

20

主题

65

帖子

341

积分

中级会员

Rank: 3Rank: 3

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

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-17 05:19 , Processed in 0.067221 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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