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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

. T0 C; s) r# j2 d邮箱:604285180@qq.com
4 u% J8 W+ B1 D0 K$ I9 q

本帖子中包含更多资源

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

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

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

积分
1137
沙发
发表于 2015-4-16 09:51:44 | 只看该作者
只需要把(下图中)向FPGA写数据的部分注释掉就行,其他地方都不需要修改。  a# Z* h0 l( k9 `% P( L/ Z' D
6 q/ q4 a3 i- R* }* e5 H, W7 G

本帖子中包含更多资源

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

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
7 G; b4 Q2 Z( w3 M5 ^2 {% s+ E还要注意数据在FPGA存储的地址,跟dsp读的地址要对应
1 ]0 Z: t4 ~1 X4 g2 F" S
FPGA端RAM的地址是从0开始的,DSP端地址是0x6000 0000的地址去读,请问如何映射地址?
回复 支持 反对

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

积分
1137
5#
发表于 2015-4-17 10:10:29 | 只看该作者
4 m8 B* D7 q. _6 y$ x7 S
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址  {$ ^( ^' J6 k, _# J

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
6#
 楼主| 发表于 2015-4-20 17:17:38 | 只看该作者
本帖最后由 水瓶 于 2015-4-20 17:24 编辑
* U) V3 f4 Q( v5 E! S7 }0 p9 P/ P
Lewis 发表于 2015-4-17 10:10
8 G/ }5 D* m; Z- w1 q5 bEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址$ V- S9 ~* F6 o+ u& I2 \
...
  1. `timescale 1ns / 1ps4 J: t+ f9 x) Q' w! @8 @+ d
  2. module emif_test/ S& B: n# q. [2 E4 \
  3. (     ' d9 |" B* W: }( ^
  4.    input clk,- I: e5 ]" u+ n! M6 |" N# z' e
  5.         input    emifa_clk,    // 时钟                         . ?3 k' u; i/ B! F$ S/ Z
  6.         input    emifa_cs2,    //  低电平有效异步器件使能引脚  (与异步器件片选信号相连,只在访问异步存储器时有效)      
    / q2 D  Z4 ~3 [5 p3 F: e" p2 W
  7.         input    emifa_oe_n,    //  低电平有效异步器件使能引脚          / b9 L# e, C. e, Q. h
  8.         input    emifa_we_n,     // 低电平有效写使能引脚       $ `  }7 Q4 W/ B) P( d
  9.         inout    emifa_wait0,    //等待输入引脚      ' A( L: x' }+ t8 w- `4 q3 ^
  10.         inout    emifa_wait1,            
    + J& ^1 G. u* L2 ?, U3 n
  11.         input    emifa_ba1,         // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。            7 \! _  {0 \. j4 g& Q
  12.         input    [13:0]emifa_addr,  // EMIF 地址总线            
    ) G" m4 B) |9 ?
  13.         output    [15:0]emifa_data   // EMIF 数据总线0 E9 a; w- ]0 K- |5 k2 G) b
  14. );
    , s: L  c! C; {$ ^8 P3 a0 r
  15.         
    $ t% _6 v9 m" b  Q. d$ N  v
  16. /****************EMIF Interface****************/        
    - B6 p5 d; F. l5 H& }2 `) E
  17. //信号声明* P9 h4 k% W+ W9 Z$ z- @$ }" j
  18. wire emif_clk;7 g8 t$ C" S+ N
  19. reg emifa_cs2_reg;      9 o: K# ~/ }( }9 {
  20. reg emifa_rnw_reg;     
    5 B! E8 j9 G* m9 y6 b
  21. reg emifa_oe_n_reg;   
    / C; B8 X6 e3 ]& M
  22. reg emifa_we_n_reg;   
      R3 Z. ]: k) e! {) K) V9 y$ @
  23. reg emifa_wait0_reg;   
    " C4 B) `0 H% Q* z; C
  24. reg emifa_wait1_reg;  
    + u& v' j$ z9 m( o9 p
  25. reg emifa_ba1_reg;     # b9 R0 R& g' b0 t! s) ^
  26. reg [13:0] emifa_addr_reg;      2 g# T+ T3 [* Q6 b
  27. reg [15:0] emifa_data_reg; - q" X3 P3 C0 z" L2 A

  28. ( T; z# D6 M* U0 a
  29. //元件例化
    2 u  Z: J, }8 o* L" y5 w, ?% ]
  30. BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));
    ' n8 n4 y6 N: _2 E$ [; B
  31. //寄存器赋值) x. t( k' V, T9 k7 \2 Q
  32. always@(posedge emif_clk)begin
    ! j% B5 v0 I! c, ~
  33.                 emifa_cs2_reg       <= emifa_cs2;2 D3 G) J9 f& k
  34.                 emifa_oe_n_reg      <= emifa_oe_n;
    9 C9 r1 Y1 w2 P& Z$ O, {! u
  35.                 emifa_we_n_reg      <= emifa_we_n;/ [1 P% M5 Q6 V5 V! I0 S
  36.                 emifa_wait0_reg     <= emifa_wait0;
    1 K) C, A. L8 I5 Y
  37.                 emifa_wait1_reg     <= emifa_wait1;
    * c, Q* D) o; Q6 c
  38.                 emifa_ba1_reg       <= emifa_ba1;
    / \# z- k. D8 [
  39.                 emifa_addr_reg      <= emifa_addr;
    $ S& [0 C. h7 ~0 M7 b$ q; [" L
  40.                 emifa_data_reg      <= emifa_data;4 ]' a. D8 ~* |) g, i6 S( w
  41. end
    8 h$ q1 k" g% m) F; {  ]; g
  42. ! F0 c9 M. j; M( O; K" x0 e1 o
  43. //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;% Y3 H2 Q' @5 @# P2 Q
  44. assign emifa_data = dpram_douta;* V/ b% G1 S- g" s6 \. k5 A

  45. 6 C5 Q3 {; I2 ]7 u
  46. /****************Dual Port RAM****************/
    4 w0 R' I4 t" [2 D, }
  47. //PORTA
    $ m. }  h4 z# t4 `# q' b- C4 T$ o2 [
  48. reg  [14:0]dpram_addra;       ( C( z8 D  ]4 w6 ^
  49. reg  dpram_wea;         
    . Z+ m, P: w' \1 S# Q
  50. reg  [15:0]dpram_dina;      
    ( T9 }- h! m$ F  @) G' W8 a
  51. wire [15:0]dpram_douta;           . T! [; S2 B* v. _$ ?/ L! @
  52. //PORTB3 X) H, S4 w+ v" h4 q3 R
  53. reg  [14:0]dpram_addrb;      
    ) m2 f0 c! a0 q  `) l* x
  54. wire  dpram_web;
    8 ^! \% ~6 T5 }
  55. reg  [15:0]dpram_dinb;
    + x$ ^4 S! {! b2 D& T+ A
  56. wire [15:0]dpram_doutb;
    7 T8 t; x/ Z! N5 s. N  E
  57.    ! O6 [- @, Y/ A- i7 j2 q. ^
  58. //元件例化
    ; B/ T4 o+ B4 l& c* _* V' `
  59. dpram dpram_unit(' @  Y1 e/ g5 ?! C' d
  60.   .clka(emif_clk), // input clka! e5 q$ ~& n/ O% l4 j/ b! d( ?- I
  61.   .wea(dpram_wea), // input [0 : 0] wea4 r: W0 N" {$ y+ c4 N1 H9 H
  62.   .addra(dpram_addra), // input [14 : 0] addra; J2 O7 V$ G+ x( n; ]
  63.   .dina(dpram_dina), // input [15 : 0] dina
    & d5 m, X* w/ f( m' K* C7 f
  64.   .douta(dpram_douta), // output [15 : 0] douta
    , }: g: o, g( \( y
  65.         //clkb                  => sys_clk,
    : A5 F* ^8 o- T
  66.   .clkb(clk), // input clkb+ [! c, ^, @- P. d/ K
  67.   .web(dpram_web), // input [0 : 0] web
    7 H  R+ t5 C( K
  68.   .addrb(dpram_addrb), // input [14 : 0] addrb
    0 d, j1 m2 j6 c( o1 L
  69.   .dinb(dpram_dinb), // input [15 : 0] dinb/ {1 [$ ~( m1 R" L* V
  70.   .doutb(dpram_doutb));// output [15 : 0] doutb)
    ! Y' _$ x- u& _& r- X; R, f8 n
  71. , o' T; |7 `* T+ ?- ~7 A0 `1 l7 l
  72. always@(emif_clk)begin$ _/ [4 }$ Q: l; U0 v
  73.                 dpram_wea             <= 0;
    - O) o4 Z% L8 n4 N) H/ E. a2 F
  74.                 dpram_addra           <= {emifa_addr_reg[13:0],emifa_ba1_reg};
    " \  @0 F# h" I' E  d8 {
  75.                 dpram_dina            <= emifa_data_reg;
    4 ~' l$ @2 m; g% }! c* Z
  76. end
    : S# e2 a( ~. b3 F6 ~
  77. assign dpram_web = 1'b1;5 Q7 A- O1 Z% [

  78. ' Y: ^4 n& O$ Q2 y1 }7 L  [
  79. always@( clk )" ?* Y0 r) x( J$ [+ [% ]! B3 d
  80. begin
    " O1 p) H/ I% S/ |
  81.         dpram_addrb  <= 100;
    / F+ x# s' b* ~8 u, h
  82.         dpram_dinb   <= 16'd2048;* ^# r, x5 i3 ^* g# F' N0 A
  83. end
    * H, B: A5 N0 Y, ^( L& y

  84. # b( \& S# j  |$ N. P5 S
  85. endmodule7 C1 |& e; k$ Y# `

  86. 8 U0 f  N$ u0 \0 F5 ^4 m
复制代码
嗯,谢谢,这个懂了,但是读出来的数还是不正确,fpga端具体代码如上。
0 D5 i6 o0 y7 P! X* ~这段代码相当于RAM的A口只用来读,并且dpram_wea一直置零,RAM的B口用来写入一个数据。
6 [( `! G* W+ j, F1 S2 S代码下载进FPGA后,DSP端先注释掉向fpga写入数据的部分,直接读取,读取的结果都为0,包括  dpram_addrb  <= 100;这个地址下应该的2048., n; l- N7 P4 o3 R1 S) z* }
然后把注释去掉,DSP端可以正常的写入数据并且正确的读出数据,但是我的FPGA端已经将  dpram_wea             <= 0;这里置零,是没法写入的,所以对于DSP端还能照常写入读出产生疑问。1 _0 }, Z) C3 ]" n  {
; F- V+ F4 [4 j5 z( r
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
7#
 楼主| 发表于 2015-4-20 17:31:45 | 只看该作者
Lewis 发表于 2015-4-17 10:10
( Q$ p% f  V) j. R8 aEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
1 ~9 }/ j" C" B$ F: a8 H1 F" w4 N ...
2 |3 g9 ^$ s0 P
我的硬件平台是:TL138F-EasyEVM(浮点DSP C6748+ARM9 +Xilinx Spartn-6 FPGA核)
  X6 W# n1 x! z- I3 H调试例程为:DSP端:EMIF_FPGA----EMIF总线FPGA读写测试
9 k! N# P+ o; [- c                    FPGA端:emif_test
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
8#
 楼主| 发表于 2015-4-21 19:19:07 | 只看该作者
Lewis 发表于 2015-4-17 10:105 |7 b: J  E( `! [. I
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
1 @* q; D( n4 U/ _( L* { ...
- h( `3 w( A% T. e$ c
还望版主指导,卡了好多天了,原理都弄明白了,就是不知道问什么读出的数据不对。若是在您那里可以正确读取数据,还望发一份程序给我。谢谢了。
回复 支持 反对

使用道具 举报

20

主题

65

帖子

341

积分

中级会员

Rank: 3Rank: 3

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-3 17:03 , Processed in 0.044893 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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