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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 12142|回复: 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中初始化的数据。请问问题出在哪里了?还望版主大侠指导。
2 Y7 _$ Y/ y0 @5 A% Z$ b
邮箱:604285180@qq.com# {, o1 {' \2 f) S) V; Y( A& ^

本帖子中包含更多资源

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

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

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

积分
1137
沙发
发表于 2015-4-16 09:51:44 | 只看该作者
只需要把(下图中)向FPGA写数据的部分注释掉就行,其他地方都不需要修改。
, X2 ?1 i) u  I0 s" n6 r2 L$ Y6 |& ]2 w

本帖子中包含更多资源

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

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
, H" J, a& U8 l2 h4 d# }" u  u还要注意数据在FPGA存储的地址,跟dsp读的地址要对应

: I, [/ n6 s; L* K7 [FPGA端RAM的地址是从0开始的,DSP端地址是0x6000 0000的地址去读,请问如何映射地址?
回复 支持 反对

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

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

$ t. c9 _' Z2 g5 i: n8 z- W' t9 ?, ?EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址) b8 ^3 u+ g; M- K5 o% n

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
6#
 楼主| 发表于 2015-4-20 17:17:38 | 只看该作者
本帖最后由 水瓶 于 2015-4-20 17:24 编辑 + P+ U1 D. j0 ^& P& x8 n; `
Lewis 发表于 2015-4-17 10:10
+ Z& S! o0 H; }EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址' ~0 u; o6 \% t  q* R" r
...
  1. `timescale 1ns / 1ps1 _) k$ Y# W% p7 k/ q8 `; p' I0 l
  2. module emif_test
    0 G' @$ v9 D# C' n2 x" c
  3. (     
    3 |3 ?4 q% Q4 j/ J: b" v
  4.    input clk,
    3 k2 e* G' H" s* w( V! q
  5.         input    emifa_clk,    // 时钟                        
    - j- x2 D, J( @  G( B7 E5 }8 r
  6.         input    emifa_cs2,    //  低电平有效异步器件使能引脚  (与异步器件片选信号相连,只在访问异步存储器时有效)      6 D1 G  u3 i: v! @& U* ^! F
  7.         input    emifa_oe_n,    //  低电平有效异步器件使能引脚         
    , N3 Z" u4 z$ b" g. |+ ~
  8.         input    emifa_we_n,     // 低电平有效写使能引脚       . j: X) m) D2 x( K: [& l
  9.         inout    emifa_wait0,    //等待输入引脚      * R8 q+ V2 J0 d
  10.         inout    emifa_wait1,            
    8 v: P' H' ?& m. G  C. x
  11.         input    emifa_ba1,         // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。            4 m1 S+ C% \* ]# u5 \$ Q
  12.         input    [13:0]emifa_addr,  // EMIF 地址总线            
    ' r% R4 B; y  J* B' y2 [! R
  13.         output    [15:0]emifa_data   // EMIF 数据总线
    ; W0 x0 Q1 f) N8 J
  14. );
    3 q! j% \# U/ S& ^( a
  15.         
    8 r9 a5 B  O% y  a
  16. /****************EMIF Interface****************/        & j5 _* y7 _; b. _( K# `: }
  17. //信号声明
    7 \/ y5 U: ~9 @! q+ D+ m7 ?1 y% m1 _
  18. wire emif_clk;
    4 r: ?8 X* Y7 T1 l3 i. k+ U
  19. reg emifa_cs2_reg;      : I: G4 }! W3 y# K
  20. reg emifa_rnw_reg;     
    & V% k$ |- p8 m: W( c4 k8 r" ?% i
  21. reg emifa_oe_n_reg;   
      G0 J8 Q1 F0 {
  22. reg emifa_we_n_reg;    , D5 E, n" Q7 c- y, q7 p
  23. reg emifa_wait0_reg;   
    ' p+ a- G! j) w# x
  24. reg emifa_wait1_reg;  ( W/ q3 x1 ^  U; C; W$ |+ T
  25. reg emifa_ba1_reg;     
    - j+ z7 B/ C- U
  26. reg [13:0] emifa_addr_reg;      
      [5 q; A: H% g- p8 H2 Q
  27. reg [15:0] emifa_data_reg;
    * \( j4 N5 K( T0 c# \

  28. ) y- V' u8 ?; b! d0 Q
  29. //元件例化
    4 r6 E4 p# e/ V6 }. a
  30. BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));0 S/ N: f$ w5 X# T9 v" U0 z
  31. //寄存器赋值/ C4 f4 g( S9 A% z
  32. always@(posedge emif_clk)begin- k) m/ @1 ?+ `3 K3 F
  33.                 emifa_cs2_reg       <= emifa_cs2;" z, d0 n4 j. Z% D
  34.                 emifa_oe_n_reg      <= emifa_oe_n;! L9 G  F# m8 B  M
  35.                 emifa_we_n_reg      <= emifa_we_n;
    0 h6 A8 X. B# _2 E
  36.                 emifa_wait0_reg     <= emifa_wait0;
    - z' G2 F- C7 c# v6 _2 v. z/ r
  37.                 emifa_wait1_reg     <= emifa_wait1;0 M3 r& b5 H. f8 G6 r7 ]5 k
  38.                 emifa_ba1_reg       <= emifa_ba1;
    2 ~0 N& A, t! i  [( J4 {
  39.                 emifa_addr_reg      <= emifa_addr;% S& K8 |, y* a& r$ u' e
  40.                 emifa_data_reg      <= emifa_data;
    8 l8 n0 I# }2 W: U( {# a" D
  41. end
    ! {# G' e2 u' v# V# r% `
  42. 5 ^; f' {, b6 a2 a  ]6 Y
  43. //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;2 w& d# E, |7 \/ i4 }
  44. assign emifa_data = dpram_douta;
    * q' f2 y2 B$ C3 r9 T  k6 N
  45. 6 ?  N8 s: R* ?8 j
  46. /****************Dual Port RAM****************/$ V8 ]) Z8 c5 |
  47. //PORTA
    $ G$ r" i: h$ s
  48. reg  [14:0]dpram_addra;      
    * M2 I) Y  C  T% j5 I- [. j) o
  49. reg  dpram_wea;         1 @* B) E) M  ~" v8 Z6 ?- O
  50. reg  [15:0]dpram_dina;      
    ; \5 E" Z  ~+ i  O
  51. wire [15:0]dpram_douta;           9 W5 k- p9 Y  {3 u- k) V- v, R4 G
  52. //PORTB
    " {; V0 j' G; z+ h
  53. reg  [14:0]dpram_addrb;       # H6 ?: g7 T8 _3 E) k, l$ H% ?4 f1 B
  54. wire  dpram_web;; n2 `" }4 }# K
  55. reg  [15:0]dpram_dinb;
    ' t' K! s0 C9 C$ }  X/ @4 t
  56. wire [15:0]dpram_doutb;
    2 X3 h! s' ?- w, k+ L' E$ v; `1 J/ b
  57.    * ^0 r: a6 f3 H3 G
  58. //元件例化& g0 ^, S/ G8 N% K! ~# p$ R9 ~: h! [
  59. dpram dpram_unit(3 D. i* Q+ d$ n, S# w+ x
  60.   .clka(emif_clk), // input clka
    9 K- [& P" v2 C4 c8 b. ~, H
  61.   .wea(dpram_wea), // input [0 : 0] wea
    & w5 ]4 F0 ?9 l; N
  62.   .addra(dpram_addra), // input [14 : 0] addra
    / K& a% t& {4 s: i' t$ b! s
  63.   .dina(dpram_dina), // input [15 : 0] dina8 j" T1 R) Z9 z1 H& |& |5 O
  64.   .douta(dpram_douta), // output [15 : 0] douta! k. a2 j. a1 J
  65.         //clkb                  => sys_clk,- A/ V+ x+ D: k- l& R3 a) M
  66.   .clkb(clk), // input clkb
    ! ]9 H5 L% b) K1 A1 d7 B. i
  67.   .web(dpram_web), // input [0 : 0] web9 k' J' J5 ?; ^1 i  C4 Q
  68.   .addrb(dpram_addrb), // input [14 : 0] addrb* z1 `' A1 J9 ?. e# s
  69.   .dinb(dpram_dinb), // input [15 : 0] dinb
    " M2 |9 e: k' i4 U( A1 Q/ c
  70.   .doutb(dpram_doutb));// output [15 : 0] doutb); T$ e4 b: e  t1 }% ^0 m6 y+ `

  71. 3 O+ }/ e/ c4 j5 O% }- v  c; |7 f+ y' h
  72. always@(emif_clk)begin
    ; i! s- m" m+ w! N2 I* X% T: j
  73.                 dpram_wea             <= 0;) U  a! \; F4 x7 h( q
  74.                 dpram_addra           <= {emifa_addr_reg[13:0],emifa_ba1_reg};* D3 s: _! \; i+ i7 I! f" A
  75.                 dpram_dina            <= emifa_data_reg;
    5 m) Q; q* ?8 a( B$ Y% Y7 u
  76. end
    " [- z- }8 v8 L  Z
  77. assign dpram_web = 1'b1;2 }( L7 N, q# ~7 k- |4 W
  78. % s5 Q1 I3 L4 d5 ^/ l& J
  79. always@( clk ). z% a9 c# K! Q) z. K6 }
  80. begin
    1 f/ N) H( I9 ]
  81.         dpram_addrb  <= 100;4 v3 j2 Q! s: z  I1 C& u
  82.         dpram_dinb   <= 16'd2048;# Q8 T* p$ T3 R$ _
  83. end( \' P3 L; P1 ~( [# r1 ]0 w

  84. * ]+ m8 H8 }- ~& l5 r
  85. endmodule6 s: B4 e+ J0 K
  86. : Z& r) G2 n7 _
复制代码
嗯,谢谢,这个懂了,但是读出来的数还是不正确,fpga端具体代码如上。
6 y" y4 |2 K3 v7 j" o) e2 v这段代码相当于RAM的A口只用来读,并且dpram_wea一直置零,RAM的B口用来写入一个数据。0 b& E: z+ A9 c4 y* u" d
代码下载进FPGA后,DSP端先注释掉向fpga写入数据的部分,直接读取,读取的结果都为0,包括  dpram_addrb  <= 100;这个地址下应该的2048.2 I$ [/ G: A+ w. A& {/ j7 ?# x
然后把注释去掉,DSP端可以正常的写入数据并且正确的读出数据,但是我的FPGA端已经将  dpram_wea             <= 0;这里置零,是没法写入的,所以对于DSP端还能照常写入读出产生疑问。, u$ h6 t, I% B- `: P' e" A, r
, H2 E# u1 W  H+ o) @2 z
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
7#
 楼主| 发表于 2015-4-20 17:31:45 | 只看该作者
Lewis 发表于 2015-4-17 10:10
% |. e1 f& L: @9 JEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址1 w6 J4 D7 B" M3 a' ~
...
: q6 s- V5 I  x$ m; [' o" j
我的硬件平台是:TL138F-EasyEVM(浮点DSP C6748+ARM9 +Xilinx Spartn-6 FPGA核)( O: i. @% j" }/ o# K5 R
调试例程为:DSP端:EMIF_FPGA----EMIF总线FPGA读写测试. c- L& ?, @; J+ Y3 H5 \
                    FPGA端:emif_test
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
8#
 楼主| 发表于 2015-4-21 19:19:07 | 只看该作者
Lewis 发表于 2015-4-17 10:105 t, T3 f$ O7 s. \9 x. @3 S2 R+ p! d
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址" u. `: l7 j: m( U* D% s. E7 q& h3 q
...
, ~9 Z& r) t4 O; m# Z- k
还望版主指导,卡了好多天了,原理都弄明白了,就是不知道问什么读出的数据不对。若是在您那里可以正确读取数据,还望发一份程序给我。谢谢了。
回复 支持 反对

使用道具 举报

20

主题

65

帖子

341

积分

中级会员

Rank: 3Rank: 3

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-14 20:31 , Processed in 0.043682 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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