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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

* C+ g" U# ^5 u8 |邮箱:604285180@qq.com# B1 U: g9 z% {* R3 u

本帖子中包含更多资源

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

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

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

积分
1137
沙发
发表于 2015-4-16 09:51:44 | 只看该作者
只需要把(下图中)向FPGA写数据的部分注释掉就行,其他地方都不需要修改。
5 A9 O4 L) L# M+ [5 w4 U' a4 y* r' B8 r9 Z: I6 E- ^

本帖子中包含更多资源

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

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$ R: ~. q& V$ K- A
还要注意数据在FPGA存储的地址,跟dsp读的地址要对应
* J# ]" d8 P5 q
FPGA端RAM的地址是从0开始的,DSP端地址是0x6000 0000的地址去读,请问如何映射地址?
回复 支持 反对

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

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

2 u5 A  M) v6 B3 _( I; ?EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址: @7 N! D6 ?. g( p

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
6#
 楼主| 发表于 2015-4-20 17:17:38 | 只看该作者
本帖最后由 水瓶 于 2015-4-20 17:24 编辑
" u6 W# _; y: P  I1 `
Lewis 发表于 2015-4-17 10:10- @2 y- |4 z& ~& x; G
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
3 v6 Q; z, ]# o1 B/ Z ...
  1. `timescale 1ns / 1ps4 p  c- d, p5 \. G3 f# X
  2. module emif_test
    2 u6 p% \& G1 f! j3 Y5 S) Z
  3. (     
    2 R3 C& B; m# @  k7 ?1 \: j
  4.    input clk,
    ) a% m7 O' N: |$ g+ c
  5.         input    emifa_clk,    // 时钟                         + Y) S- K1 g9 q2 c( [8 F. G
  6.         input    emifa_cs2,    //  低电平有效异步器件使能引脚  (与异步器件片选信号相连,只在访问异步存储器时有效)      & W0 }8 o) s5 V1 P3 |; w" k) Q
  7.         input    emifa_oe_n,    //  低电平有效异步器件使能引脚         
    $ D# V$ x2 B' r4 M+ F9 t
  8.         input    emifa_we_n,     // 低电平有效写使能引脚      
    . t% L' j% K5 R3 A
  9.         inout    emifa_wait0,    //等待输入引脚      
    ! U5 D5 o8 L# e+ Z2 Q6 Z( e. \( ^) M
  10.         inout    emifa_wait1,             5 ~# P  i! U9 }
  11.         input    emifa_ba1,         // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。            
      K* T# F: m8 m$ l3 I4 l, z
  12.         input    [13:0]emifa_addr,  // EMIF 地址总线            * w" t- ^+ n5 H/ j- X+ @) g+ h3 w
  13.         output    [15:0]emifa_data   // EMIF 数据总线8 L/ W- l; ?# Q5 a
  14. );5 T5 m  G: t9 D4 ?0 K8 ~; d
  15.         $ z+ \: _7 \( Q% M
  16. /****************EMIF Interface****************/        ( Z) Z  o7 a( S  R, d$ q, f
  17. //信号声明2 E! x6 h. t0 n2 Y. K
  18. wire emif_clk;
    * i7 L1 o$ c4 B, w( P, b
  19. reg emifa_cs2_reg;      1 D; y/ |) F- `# v* Q( R
  20. reg emifa_rnw_reg;     
    4 \. z) {% h1 l' }
  21. reg emifa_oe_n_reg;   
    3 c- p: w" f: @  ^
  22. reg emifa_we_n_reg;   
    $ z4 B. V  f; c2 h/ ^
  23. reg emifa_wait0_reg;   5 s1 |( z) O4 c+ V0 a% d' P
  24. reg emifa_wait1_reg;  
    : `1 j& M, K" M, ^$ o
  25. reg emifa_ba1_reg;     
    $ t2 U& i& Z9 W
  26. reg [13:0] emifa_addr_reg;      
    # \: }; S  Y+ S. W8 n2 A
  27. reg [15:0] emifa_data_reg; 9 N7 J/ f% n* U. x$ X3 z+ f
  28. 5 P- A4 B1 P) n: I$ Y8 X8 Y# ]
  29. //元件例化1 z& H) B' v8 ]( s6 O; G6 V& a
  30. BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));
    : k4 y' e4 N8 U( U, Z4 k$ k) C
  31. //寄存器赋值8 G9 ?% V/ P! ^. j
  32. always@(posedge emif_clk)begin
    4 Z+ U% T) h3 x) R/ g
  33.                 emifa_cs2_reg       <= emifa_cs2;
    1 S- P; g( p) F
  34.                 emifa_oe_n_reg      <= emifa_oe_n;
    # F+ Z) T6 {+ }. L1 [4 e" q
  35.                 emifa_we_n_reg      <= emifa_we_n;9 m$ A, M. m- t% z3 b
  36.                 emifa_wait0_reg     <= emifa_wait0;
    8 o9 e, k; b# v) ?% E: G3 ^
  37.                 emifa_wait1_reg     <= emifa_wait1;! G9 z- u+ t  x  V- @
  38.                 emifa_ba1_reg       <= emifa_ba1;+ a; D  [; v6 H3 g: N+ C
  39.                 emifa_addr_reg      <= emifa_addr;9 {0 ]4 m* A/ j5 F* W( j
  40.                 emifa_data_reg      <= emifa_data;
    ; c6 b# X- V; {8 p' k
  41. end
    & `. G- |/ Y- q6 U" w
  42. 4 ~! b( h% w! d6 h4 E
  43. //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;
    : a  f" V) n, r4 W
  44. assign emifa_data = dpram_douta;8 p: m6 ]9 o# u$ C7 X$ B! j

  45. 9 H9 ?  w: q* J* }, r( ], I/ O
  46. /****************Dual Port RAM****************/: |0 O3 n% D) U% T2 h0 R$ Z
  47. //PORTA' k6 v! P7 |* k. Z
  48. reg  [14:0]dpram_addra;       8 Z4 s4 j/ R( n- C
  49. reg  dpram_wea;         
    : Z  R  x, ~  b" E6 [7 ]8 X1 m
  50. reg  [15:0]dpram_dina;       : `* m* s+ B1 }" |0 }% J" K
  51. wire [15:0]dpram_douta;           
    * F7 s) l/ ^0 X  U+ ^9 [
  52. //PORTB
    + o/ F2 e# W* A) }0 b% _3 f
  53. reg  [14:0]dpram_addrb;       / M5 U* q! `/ O6 h  f" g5 e* V5 p
  54. wire  dpram_web;
    * i: X% s$ L' U/ Y5 [
  55. reg  [15:0]dpram_dinb;
    $ J8 L5 U) {8 B4 \6 M' p
  56. wire [15:0]dpram_doutb;   X! i, b, o! q5 M9 M* m# s( ~: r" }3 o
  57.    
    , @7 n1 d9 K0 i4 y
  58. //元件例化
    6 m' u8 l1 q! u, b5 v( [1 P* \
  59. dpram dpram_unit(
    1 C, _+ I- {  y, [3 I3 C
  60.   .clka(emif_clk), // input clka
    0 s( `1 }5 t5 E' b% j6 V
  61.   .wea(dpram_wea), // input [0 : 0] wea
    , n5 s7 M) E) x# L1 d
  62.   .addra(dpram_addra), // input [14 : 0] addra$ Z# G8 U2 v5 D
  63.   .dina(dpram_dina), // input [15 : 0] dina4 @5 U/ }* ]4 P( [0 L
  64.   .douta(dpram_douta), // output [15 : 0] douta
    . Y# ?+ X+ u  J/ M
  65.         //clkb                  => sys_clk,4 a* m4 d8 K4 D0 _. k" Y
  66.   .clkb(clk), // input clkb0 N: o0 Q) [- s% Q
  67.   .web(dpram_web), // input [0 : 0] web) z! n6 N! I* U1 i, S
  68.   .addrb(dpram_addrb), // input [14 : 0] addrb
    ! E8 _; q0 c* D" H" `
  69.   .dinb(dpram_dinb), // input [15 : 0] dinb
    ; {: ~. H- X: S% f9 B
  70.   .doutb(dpram_doutb));// output [15 : 0] doutb)
    9 v6 d8 }$ a6 m
  71. " U3 J' L( K8 V1 i( P. ~4 c* P
  72. always@(emif_clk)begin* l/ D; ]! Y8 I( s4 ^- [5 Y
  73.                 dpram_wea             <= 0;& }& s' ?* c) G/ }" i
  74.                 dpram_addra           <= {emifa_addr_reg[13:0],emifa_ba1_reg};
    - O/ g' Y! e: R8 w
  75.                 dpram_dina            <= emifa_data_reg;
    ( C/ d! X; _$ ?9 }) t2 N1 Y
  76. end2 t% r% I; b8 W) Y+ e& V. [4 k
  77. assign dpram_web = 1'b1;3 H; B" _- h4 X& [& L

  78. . ~! ^2 @' k+ y& k1 }
  79. always@( clk )/ `  [7 w9 N! G" ]/ [+ T, Z
  80. begin1 w. t& [) f% |3 I* |8 U2 [0 Y% V
  81.         dpram_addrb  <= 100;; m% |2 l( y; b& Y7 o% O4 J; _
  82.         dpram_dinb   <= 16'd2048;& S' T  d7 z- l/ C& b
  83. end7 n6 }! P* f& s) }2 |. P7 S

  84. + i9 n$ n, G& w9 n
  85. endmodule% }( j( S% x, L" Q5 t$ K. m

  86. 2 r6 w: `: B1 P+ |) u$ \
复制代码
嗯,谢谢,这个懂了,但是读出来的数还是不正确,fpga端具体代码如上。
# O# I7 G% z4 X  g( [+ N/ x这段代码相当于RAM的A口只用来读,并且dpram_wea一直置零,RAM的B口用来写入一个数据。
/ ]7 G8 x6 p/ f  J5 G; _5 e# z代码下载进FPGA后,DSP端先注释掉向fpga写入数据的部分,直接读取,读取的结果都为0,包括  dpram_addrb  <= 100;这个地址下应该的2048.* J5 O3 q% I8 G" D6 X
然后把注释去掉,DSP端可以正常的写入数据并且正确的读出数据,但是我的FPGA端已经将  dpram_wea             <= 0;这里置零,是没法写入的,所以对于DSP端还能照常写入读出产生疑问。
8 Y, T: K+ `5 u# i. D. H
1 X/ {; T; L, D
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
7#
 楼主| 发表于 2015-4-20 17:31:45 | 只看该作者
Lewis 发表于 2015-4-17 10:10
  f6 p* C3 e' C2 z' aEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址9 `; A. R6 F) s9 b- s
...

1 f6 \# j9 |; ~我的硬件平台是:TL138F-EasyEVM(浮点DSP C6748+ARM9 +Xilinx Spartn-6 FPGA核)
" v6 Q  a5 [0 Q1 Z1 l调试例程为:DSP端:EMIF_FPGA----EMIF总线FPGA读写测试
5 L7 V0 h. S( }! D) q( Z                    FPGA端:emif_test
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
8#
 楼主| 发表于 2015-4-21 19:19:07 | 只看该作者
Lewis 发表于 2015-4-17 10:10+ g6 \, N/ j; s8 `$ V
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址5 ]  e: i6 M; A0 i& ~: L
...

1 z8 p. a3 m5 k' o6 V9 @还望版主指导,卡了好多天了,原理都弄明白了,就是不知道问什么读出的数据不对。若是在您那里可以正确读取数据,还望发一份程序给我。谢谢了。
回复 支持 反对

使用道具 举报

20

主题

65

帖子

341

积分

中级会员

Rank: 3Rank: 3

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-9 20:02 , Processed in 0.048472 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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