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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

  K' Q: c# U6 G3 N6 V8 a4 T邮箱:604285180@qq.com$ B; D+ P6 S2 h9 O- S; `3 n/ [

本帖子中包含更多资源

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

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

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

积分
1137
沙发
发表于 2015-4-16 09:51:44 | 只看该作者
只需要把(下图中)向FPGA写数据的部分注释掉就行,其他地方都不需要修改。
  ~- V9 P4 ?3 c! S9 a
7 N5 X1 E4 y# \

本帖子中包含更多资源

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

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:553 S. U% ^/ o2 N
还要注意数据在FPGA存储的地址,跟dsp读的地址要对应

  J4 v3 @* Z6 V; z- hFPGA端RAM的地址是从0开始的,DSP端地址是0x6000 0000的地址去读,请问如何映射地址?
回复 支持 反对

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

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

! y" s2 W2 W4 N( L' TEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址2 p1 E3 Y: b* ]( T

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
6#
 楼主| 发表于 2015-4-20 17:17:38 | 只看该作者
本帖最后由 水瓶 于 2015-4-20 17:24 编辑
, W/ X+ T0 Y) z
Lewis 发表于 2015-4-17 10:10
, `, l3 S, [% U6 a" ]8 _- }/ h* F) U2 {EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址* T+ v, L+ w) z/ f, s5 F
...
  1. `timescale 1ns / 1ps
    6 z" x! o) ~! \
  2. module emif_test
    3 R$ `( R5 F( F% c
  3. (     1 [1 `! C% u$ R6 G& Z
  4.    input clk,
    $ \1 R2 z9 {/ L( t
  5.         input    emifa_clk,    // 时钟                        
    0 ]3 X) }6 _0 f% t- y9 H) x
  6.         input    emifa_cs2,    //  低电平有效异步器件使能引脚  (与异步器件片选信号相连,只在访问异步存储器时有效)      ' S, e4 g6 w1 g
  7.         input    emifa_oe_n,    //  低电平有效异步器件使能引脚          ( `* ^1 w, X' T6 n1 t: n
  8.         input    emifa_we_n,     // 低电平有效写使能引脚       ' n/ p4 Z  m  F0 @# `: I
  9.         inout    emifa_wait0,    //等待输入引脚      
    " j- r+ a5 D  g8 ~: F  N
  10.         inout    emifa_wait1,             3 g/ N8 h) p& b" }- a0 b5 e  u
  11.         input    emifa_ba1,         // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。            
    3 Z+ C9 [( l* a. [% Y5 c
  12.         input    [13:0]emifa_addr,  // EMIF 地址总线            ; H9 O$ _3 x0 N; O2 a, L( E- j: ?
  13.         output    [15:0]emifa_data   // EMIF 数据总线
    ) H8 w' h& O; V6 q0 f# o
  14. );( {$ p3 i+ W. X7 p, Z8 i" y
  15.         / K$ a( ^  c+ L9 L$ f7 O7 _
  16. /****************EMIF Interface****************/        ) f0 u) O$ g( j' ?( f! o$ `4 V4 T
  17. //信号声明
    . v* y& a8 |1 Q6 V+ Z9 {
  18. wire emif_clk;7 t% W2 |9 z' Y( v+ ?& c
  19. reg emifa_cs2_reg;      
    / y: N; k  E. z
  20. reg emifa_rnw_reg;     0 Y/ R# D4 e; ]: g7 f5 `6 c$ s
  21. reg emifa_oe_n_reg;   
    & E/ t7 j6 t% ]3 C; W
  22. reg emifa_we_n_reg;    % N& @$ n! K1 ]" s7 s
  23. reg emifa_wait0_reg;   
    & C& G: s" ]# G5 C4 ?0 Y. M- d
  24. reg emifa_wait1_reg;  
    $ H6 T& L2 ~, F! u
  25. reg emifa_ba1_reg;     / v* w" O4 I/ m2 v5 k
  26. reg [13:0] emifa_addr_reg;      8 H6 H  a/ ]1 p6 H! T
  27. reg [15:0] emifa_data_reg;
    ' O4 c, U9 R+ b' H. L
  28. ' c, d1 Z# y1 ~" P
  29. //元件例化8 |6 G' Q8 x, v* }* L5 q
  30. BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));
    " w- ?3 D3 N- M& G; z
  31. //寄存器赋值
    ; j7 E5 @* X" \; E. u7 {
  32. always@(posedge emif_clk)begin
    # s5 K0 j9 ^, y8 B
  33.                 emifa_cs2_reg       <= emifa_cs2;! t" h( ]# z6 ^) ^5 p0 W1 b
  34.                 emifa_oe_n_reg      <= emifa_oe_n;( @+ P  c% C' @3 \6 U  X9 I# W$ `7 m
  35.                 emifa_we_n_reg      <= emifa_we_n;4 `: k0 j4 d" H( E8 W, u
  36.                 emifa_wait0_reg     <= emifa_wait0;  ~6 G) C4 o- r- Z
  37.                 emifa_wait1_reg     <= emifa_wait1;" ^% ~+ v7 V1 ]7 Q. R3 _1 @) e. v
  38.                 emifa_ba1_reg       <= emifa_ba1;8 Z( p/ \. U# P' A7 v, m& g7 w
  39.                 emifa_addr_reg      <= emifa_addr;0 N2 z! g( L) {* z/ I: Z, v# R
  40.                 emifa_data_reg      <= emifa_data;
    / D0 @% Y- y- ~# l! [
  41. end7 b- o  x3 C* q, ^) |2 |6 [# F. i
  42. 2 g) H' J8 n8 m, P" u& P) y
  43. //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;
    2 R, T- f/ r  G6 e9 V  x8 H- a
  44. assign emifa_data = dpram_douta;' B7 x! X. B, K0 U# k

  45. 1 ]* C* N( W! o5 v
  46. /****************Dual Port RAM****************/
    ( u& E& m/ H1 m6 d- `, S4 L8 v
  47. //PORTA
    ; v/ D" Y: u  X$ p" R9 n
  48. reg  [14:0]dpram_addra;       5 k  G3 C! m3 j: `0 f# f
  49. reg  dpram_wea;         . w) P+ E8 S( {. }: M
  50. reg  [15:0]dpram_dina;       1 |4 O2 v9 D- Z
  51. wire [15:0]dpram_douta;           : a8 R) `  z. A: @! _2 {9 O7 t% z8 N
  52. //PORTB
    " B5 R" @& U' Z+ X# W
  53. reg  [14:0]dpram_addrb;      
    1 U+ M8 @  Y4 a; u
  54. wire  dpram_web;
    9 `& N$ x' C% W% j; a6 L
  55. reg  [15:0]dpram_dinb;9 R6 T" X! n0 a
  56. wire [15:0]dpram_doutb;
    ! G5 D1 [7 z# e' k- o: `4 |
  57.    
    0 s/ ^, R* b: Y
  58. //元件例化
    5 C, N& [' P/ }! }; \
  59. dpram dpram_unit(
    9 a* O# Z1 A5 U& D7 A4 A; }
  60.   .clka(emif_clk), // input clka* v5 V; M3 B( W8 H8 A
  61.   .wea(dpram_wea), // input [0 : 0] wea
    / V- V, O9 L, ~: @! C
  62.   .addra(dpram_addra), // input [14 : 0] addra
    & q0 [5 _) a" G* f
  63.   .dina(dpram_dina), // input [15 : 0] dina8 n* W' u2 W0 B& T4 G2 a
  64.   .douta(dpram_douta), // output [15 : 0] douta6 D& D8 J# f) H1 x* V, _
  65.         //clkb                  => sys_clk,3 L! x# H- O* m8 I6 I8 Q& E
  66.   .clkb(clk), // input clkb
    + u1 {4 K7 u- M* [/ |$ m% O0 l
  67.   .web(dpram_web), // input [0 : 0] web# w7 g+ F- _0 ^( i: u% |# }
  68.   .addrb(dpram_addrb), // input [14 : 0] addrb
    ; P" r2 h. L8 a0 f
  69.   .dinb(dpram_dinb), // input [15 : 0] dinb
    " {+ |( Z- d2 v' }3 a; H; r
  70.   .doutb(dpram_doutb));// output [15 : 0] doutb)& S. u+ g0 ^9 F, |: e9 i
  71. % [9 L' p# i, j
  72. always@(emif_clk)begin1 @& q* F" S- H' _
  73.                 dpram_wea             <= 0;
    6 q6 q* l, x* Q2 N
  74.                 dpram_addra           <= {emifa_addr_reg[13:0],emifa_ba1_reg};
    # p  K1 b( I  P0 T
  75.                 dpram_dina            <= emifa_data_reg;
    $ H$ _/ M. `) {4 X0 D  ?
  76. end
    7 ]/ F7 J# d' `' r9 x* R/ T
  77. assign dpram_web = 1'b1;
    5 T3 ?% G0 G' x/ [

  78. & P( W- S6 m: ^6 z* {
  79. always@( clk )
    - y( y! m/ W  ]3 ~. ]% @
  80. begin
    - J# N8 T/ v* e
  81.         dpram_addrb  <= 100;
    + F0 N* U$ r* G4 K6 ?6 d2 ^3 F
  82.         dpram_dinb   <= 16'd2048;5 ?: t( g+ p9 N) ]: P; c
  83. end2 b" @+ w; p- q7 [) \4 c% a. W

  84. 2 Y+ Y) z7 J, @! t( m1 x
  85. endmodule
    0 j4 C: V& e4 `# ]2 L' N  J

  86. , {- o' R* r* ~3 |' ~4 r
复制代码
嗯,谢谢,这个懂了,但是读出来的数还是不正确,fpga端具体代码如上。
  {( L% _7 M+ v3 f这段代码相当于RAM的A口只用来读,并且dpram_wea一直置零,RAM的B口用来写入一个数据。
- `+ O9 h8 H, x( @2 \代码下载进FPGA后,DSP端先注释掉向fpga写入数据的部分,直接读取,读取的结果都为0,包括  dpram_addrb  <= 100;这个地址下应该的2048.
0 y- G$ X6 z* ?2 u. ^6 W" }( n1 S* u然后把注释去掉,DSP端可以正常的写入数据并且正确的读出数据,但是我的FPGA端已经将  dpram_wea             <= 0;这里置零,是没法写入的,所以对于DSP端还能照常写入读出产生疑问。
+ `9 i# X& v7 h3 N! ]0 E6 ?6 i7 Q% |% C: [% P/ D
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
7#
 楼主| 发表于 2015-4-20 17:31:45 | 只看该作者
Lewis 发表于 2015-4-17 10:10
' I" c' {  _% _' ?- e5 rEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址5 F6 E" z( A% m  {8 }" w7 {
...
7 ^' F8 e1 c& I+ t5 w& i
我的硬件平台是:TL138F-EasyEVM(浮点DSP C6748+ARM9 +Xilinx Spartn-6 FPGA核)
9 N+ _8 K# G' u( m4 R调试例程为:DSP端:EMIF_FPGA----EMIF总线FPGA读写测试+ w4 U* J+ j2 j  R( A% d3 ^
                    FPGA端:emif_test
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
8#
 楼主| 发表于 2015-4-21 19:19:07 | 只看该作者
Lewis 发表于 2015-4-17 10:10; i. _$ q, ^5 I  n
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址' ?' \9 f5 g  V" X$ `8 U
...

& ?) D4 }7 C9 b; J: y% J还望版主指导,卡了好多天了,原理都弄明白了,就是不知道问什么读出的数据不对。若是在您那里可以正确读取数据,还望发一份程序给我。谢谢了。
回复 支持 反对

使用道具 举报

20

主题

65

帖子

341

积分

中级会员

Rank: 3Rank: 3

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-8 12:56 , Processed in 0.041885 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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