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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 11736|回复: 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 O/ I1 q) `3 f3 I, l邮箱:604285180@qq.com
& l% K$ N5 z1 {. l& W2 r

本帖子中包含更多资源

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

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

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

积分
1137
沙发
发表于 2015-4-16 09:51:44 | 只看该作者
只需要把(下图中)向FPGA写数据的部分注释掉就行,其他地方都不需要修改。$ j" M% {  b  Q( x
" |, f# B2 x/ U3 `  E! c0 h

本帖子中包含更多资源

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

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
( A' M' ?, r1 z* I还要注意数据在FPGA存储的地址,跟dsp读的地址要对应

2 l) J# v1 ~7 l7 {1 c$ gFPGA端RAM的地址是从0开始的,DSP端地址是0x6000 0000的地址去读,请问如何映射地址?
回复 支持 反对

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

积分
1137
5#
发表于 2015-4-17 10:10:29 | 只看该作者
/ o5 n$ G, t4 R
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址; G/ R$ y0 _/ }0 R3 D, ]$ r

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
6#
 楼主| 发表于 2015-4-20 17:17:38 | 只看该作者
本帖最后由 水瓶 于 2015-4-20 17:24 编辑
2 N) {- t2 n! U  B+ f
Lewis 发表于 2015-4-17 10:10
+ X" p( a9 `4 B3 UEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
) l3 R) c- u4 H/ h& \5 {# C ...
  1. `timescale 1ns / 1ps( N! b' J* n1 J0 G: t: s
  2. module emif_test% b, M' t8 ]0 U4 @$ a
  3. (     : N1 S4 A( y. z  g
  4.    input clk,
    ( }1 o. e2 P& e3 Y. l
  5.         input    emifa_clk,    // 时钟                        
    0 D6 |: Y6 u3 K! G$ y6 Q! t0 `1 ?
  6.         input    emifa_cs2,    //  低电平有效异步器件使能引脚  (与异步器件片选信号相连,只在访问异步存储器时有效)      
    4 d9 A0 l& N% b0 X% }3 d
  7.         input    emifa_oe_n,    //  低电平有效异步器件使能引脚          2 r# V0 H4 `; X8 b* `
  8.         input    emifa_we_n,     // 低电平有效写使能引脚      
    8 L) g/ _1 {5 h9 G6 L$ Y
  9.         inout    emifa_wait0,    //等待输入引脚      
    ) L2 P" r% |; c2 B) h' \
  10.         inout    emifa_wait1,             / c% i9 t# ?! T9 o
  11.         input    emifa_ba1,         // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。            
    $ z! W" U) C! B- ?- F
  12.         input    [13:0]emifa_addr,  // EMIF 地址总线            7 j- J9 m) \% v; V8 C
  13.         output    [15:0]emifa_data   // EMIF 数据总线; I) f/ L7 J- q7 \5 X7 l) Z, n! J
  14. );
    # l- F/ r) I4 Y2 x) O
  15.         
    $ d+ `* r3 V6 w* e0 a* {
  16. /****************EMIF Interface****************/        
    # Z8 u1 D$ M9 K
  17. //信号声明
    # b1 ?7 Q# K$ C
  18. wire emif_clk;
    / L3 N1 \$ N  ~, w/ N
  19. reg emifa_cs2_reg;      
    5 L5 U/ D6 r  _5 W1 m" x
  20. reg emifa_rnw_reg;     
    " A, K9 o( a: A1 H0 S2 K
  21. reg emifa_oe_n_reg;   
    / o  g+ \+ M0 H: j: c
  22. reg emifa_we_n_reg;   
    / q- b9 {" T4 S( l* a6 f2 C
  23. reg emifa_wait0_reg;   
    ( z' P$ m* `7 R$ c, S) t1 [
  24. reg emifa_wait1_reg;  
    2 T7 x) G" S' ]; R  U
  25. reg emifa_ba1_reg;     
    - x) l+ U1 u. u( x- g
  26. reg [13:0] emifa_addr_reg;      % W- o. d2 [& A6 {' I6 B4 N
  27. reg [15:0] emifa_data_reg;
    6 ~3 f7 {' W, s9 T
  28. * v! l, J' S( X
  29. //元件例化6 I( r# x8 f: q2 R; T& A2 G" R# G! m2 E
  30. BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));
    7 H5 ~, \. c* F$ C
  31. //寄存器赋值
    9 M) K6 V* S1 N0 f5 z4 _
  32. always@(posedge emif_clk)begin
    " e# E+ V  F7 R# V3 s/ n* P  s
  33.                 emifa_cs2_reg       <= emifa_cs2;8 B" t0 ?5 i3 `! c. o7 n5 X
  34.                 emifa_oe_n_reg      <= emifa_oe_n;' U, p& ~9 U4 K9 A5 c/ C
  35.                 emifa_we_n_reg      <= emifa_we_n;3 \' F6 `/ z3 H4 v; }( m& P& C
  36.                 emifa_wait0_reg     <= emifa_wait0;
    6 F. F2 y) g7 ~, n% d
  37.                 emifa_wait1_reg     <= emifa_wait1;5 V$ k1 Z$ }# J! ]
  38.                 emifa_ba1_reg       <= emifa_ba1;
    ! j- o9 V9 y, c
  39.                 emifa_addr_reg      <= emifa_addr;/ K; P' a% N- B1 U
  40.                 emifa_data_reg      <= emifa_data;
    ' @7 r& F. @+ Y% ]0 o% q) a
  41. end
    0 B# U7 x5 Z2 r, y9 V9 X5 V: `' X
  42. ' |! ^" y% k4 M" [& D3 u) [3 T
  43. //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;- F" V! l+ ~1 d" Z
  44. assign emifa_data = dpram_douta;: y, G* s0 x, u4 E6 _
  45. " k1 {7 g9 k4 Z+ ]& I# a
  46. /****************Dual Port RAM****************/
    " y/ f8 x& g/ x: N6 _( W( S! J
  47. //PORTA$ @! V) }' l& Z' @
  48. reg  [14:0]dpram_addra;      
    & v% ?! W6 e5 L& t% j7 q
  49. reg  dpram_wea;         
    $ t; C. Q" S( j7 |5 _0 P
  50. reg  [15:0]dpram_dina;      
    + n9 F+ c( e  K9 h. C  A, B( u3 I
  51. wire [15:0]dpram_douta;           
    7 X% J4 I2 s, p, {% D" O4 @* ~
  52. //PORTB
    $ W% Y, b5 f  ?, y
  53. reg  [14:0]dpram_addrb;       ; f1 A( Z, G! c  e) E
  54. wire  dpram_web;2 B9 ^* l4 g& y# H
  55. reg  [15:0]dpram_dinb;
    , l4 u0 V# g! t# M: P
  56. wire [15:0]dpram_doutb;
    % K- r) C0 Z3 D( a( a4 E& U& }5 v
  57.    
    4 w1 @/ W$ o% b6 e
  58. //元件例化
    : N. A# s( C; o$ Z2 \
  59. dpram dpram_unit(4 `+ f, `) O# F* _0 w
  60.   .clka(emif_clk), // input clka
    $ {) `& p7 {" T0 R
  61.   .wea(dpram_wea), // input [0 : 0] wea% v/ e/ W" P& O. v) Y8 f' ]/ V& y
  62.   .addra(dpram_addra), // input [14 : 0] addra
    * A' b! }8 ^9 e& c7 X
  63.   .dina(dpram_dina), // input [15 : 0] dina
    / E0 S2 I3 a3 M1 e1 `" H8 L
  64.   .douta(dpram_douta), // output [15 : 0] douta5 B. o+ ^& ?: x/ m2 Z
  65.         //clkb                  => sys_clk,6 v% Z) c" k) C0 e' b3 U1 U
  66.   .clkb(clk), // input clkb, s* Y' o/ V% Y$ w: {  g
  67.   .web(dpram_web), // input [0 : 0] web
    ! k) o" w+ O, \1 e! w' L* b6 `
  68.   .addrb(dpram_addrb), // input [14 : 0] addrb
    , v4 v: J6 K9 O9 Z  K
  69.   .dinb(dpram_dinb), // input [15 : 0] dinb0 P" I- l) }! T- A% P, |* K+ k$ L7 U
  70.   .doutb(dpram_doutb));// output [15 : 0] doutb)
    : o1 O  `( j3 E( p' J& X5 ?; |
  71. # o$ E5 u* }/ {- T, i( I. Q
  72. always@(emif_clk)begin7 h: I9 A+ W' t5 u2 G" |. c
  73.                 dpram_wea             <= 0;
    7 A; G+ k+ g: \! V2 T0 a0 D2 w: g
  74.                 dpram_addra           <= {emifa_addr_reg[13:0],emifa_ba1_reg};
    6 X6 \/ J6 F8 U3 o9 F
  75.                 dpram_dina            <= emifa_data_reg;
    ( }9 _/ D  R) s& y0 K, Q; G9 ^1 n
  76. end1 ?* b0 |, ^) W( I& e- D6 X
  77. assign dpram_web = 1'b1;1 y2 x: C4 A& S3 Y. y' v

  78. 0 s6 s- J, o9 I  d, y
  79. always@( clk )5 A  a' v' O/ B' g) y1 }
  80. begin
    1 j% R; I; D$ O! b. {$ P+ P! C
  81.         dpram_addrb  <= 100;
    1 i7 [# A, I5 M9 T
  82.         dpram_dinb   <= 16'd2048;
      O- s2 R2 s; D8 ]6 f( t5 W6 F9 ?
  83. end
    $ |9 M: T' }  y8 H/ }

  84. 6 _* D. n9 l: z' N, H/ A& K: J. ?
  85. endmodule% @: m" _2 x  J2 b0 T" @+ V/ `

  86. / y& ^6 P7 Q) W4 j! v. F
复制代码
嗯,谢谢,这个懂了,但是读出来的数还是不正确,fpga端具体代码如上。6 r# F( I' e6 [
这段代码相当于RAM的A口只用来读,并且dpram_wea一直置零,RAM的B口用来写入一个数据。7 @) L( R" i& s
代码下载进FPGA后,DSP端先注释掉向fpga写入数据的部分,直接读取,读取的结果都为0,包括  dpram_addrb  <= 100;这个地址下应该的2048.
- c/ \! W* A- l然后把注释去掉,DSP端可以正常的写入数据并且正确的读出数据,但是我的FPGA端已经将  dpram_wea             <= 0;这里置零,是没法写入的,所以对于DSP端还能照常写入读出产生疑问。
0 g! G( D. x: D  y0 b
1 T: g% v& U9 ~$ G3 H; N
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
7#
 楼主| 发表于 2015-4-20 17:31:45 | 只看该作者
Lewis 发表于 2015-4-17 10:109 `# h$ t( l% U( N3 A: [
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址7 _5 g- X  o. ^& m( a  Q, H0 L# d, p' k
...
, a# R0 n6 W. @5 z6 N
我的硬件平台是:TL138F-EasyEVM(浮点DSP C6748+ARM9 +Xilinx Spartn-6 FPGA核)
' [* P3 n, a  O- {& f  ~, D6 n- s; N( I调试例程为:DSP端:EMIF_FPGA----EMIF总线FPGA读写测试- s# A/ q6 F: X  g6 }
                    FPGA端:emif_test
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
8#
 楼主| 发表于 2015-4-21 19:19:07 | 只看该作者
Lewis 发表于 2015-4-17 10:10
/ Z* z% e( Z# [; s: _EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
& \/ K) Q2 k" r4 x6 S* O- ]9 t ...

! Z5 F( n# e6 Q# Y还望版主指导,卡了好多天了,原理都弄明白了,就是不知道问什么读出的数据不对。若是在您那里可以正确读取数据,还望发一份程序给我。谢谢了。
回复 支持 反对

使用道具 举报

20

主题

65

帖子

341

积分

中级会员

Rank: 3Rank: 3

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-18 10:57 , Processed in 0.046035 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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