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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 10296|回复: 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中初始化的数据。请问问题出在哪里了?还望版主大侠指导。
& R0 I, b2 h$ `" }3 @
邮箱:604285180@qq.com3 h$ q7 k: a& D5 d& c+ L

本帖子中包含更多资源

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

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

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
沙发
 楼主| 发表于 2015-4-16 22:14:25 | 显示全部楼层
Lewis 发表于 2015-4-16 09:55% Z& F  x$ e+ j
还要注意数据在FPGA存储的地址,跟dsp读的地址要对应
8 @1 Y) r( b# q) X( J
FPGA端RAM的地址是从0开始的,DSP端地址是0x6000 0000的地址去读,请问如何映射地址?
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
板凳
 楼主| 发表于 2015-4-20 17:17:38 | 显示全部楼层
本帖最后由 水瓶 于 2015-4-20 17:24 编辑
, E) k8 T9 H6 P4 {; B  b8 F3 b
Lewis 发表于 2015-4-17 10:10
! Z4 M& W! J6 V/ eEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
% m, S* h8 C) a+ e9 z! N% t ...
  1. `timescale 1ns / 1ps( F% P9 [* A9 p5 ^- V: `$ T
  2. module emif_test1 R6 w# A, z3 _; F3 `4 g
  3. (     0 x4 \% M$ u" a8 ]. @0 m
  4.    input clk,- |% w6 d) N  F+ ^# H! C2 a  O
  5.         input    emifa_clk,    // 时钟                        
    6 v1 ?8 W5 Z5 E4 u# b! K
  6.         input    emifa_cs2,    //  低电平有效异步器件使能引脚  (与异步器件片选信号相连,只在访问异步存储器时有效)      : Y) _# w8 |  ]% I6 y+ j
  7.         input    emifa_oe_n,    //  低电平有效异步器件使能引脚          " f3 ^' m+ n9 _* B
  8.         input    emifa_we_n,     // 低电平有效写使能引脚      
    $ o# n  R9 U- S- N
  9.         inout    emifa_wait0,    //等待输入引脚      8 e. n2 ]/ L/ b2 j* h( g
  10.         inout    emifa_wait1,               o8 a( M; N9 c. f  P9 X/ y( I
  11.         input    emifa_ba1,         // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。            : z9 i# {" q# e/ \6 I
  12.         input    [13:0]emifa_addr,  // EMIF 地址总线            
    7 f4 f; B5 X2 O- s
  13.         output    [15:0]emifa_data   // EMIF 数据总线
    $ H8 c8 J8 {/ p
  14. );
    $ D1 |( V- H# X# n0 A1 b
  15.         8 }- F* M. c4 e; H2 z; P
  16. /****************EMIF Interface****************/        3 m) c6 t" H" S' N( `! v. e
  17. //信号声明5 m! j# U+ y; I0 D. k
  18. wire emif_clk;! Y+ |2 Z8 f" h- S) |* ~, {
  19. reg emifa_cs2_reg;      + ?0 m: s- x+ `; l  V' w
  20. reg emifa_rnw_reg;     7 e2 M/ R* L% A
  21. reg emifa_oe_n_reg;      Z4 ~( p% D, `' s( d7 Y- s
  22. reg emifa_we_n_reg;    0 C9 Y9 S2 w$ w& ^" A) ^. i
  23. reg emifa_wait0_reg;   
    ' O9 I% `( B2 |7 o( W& ]
  24. reg emifa_wait1_reg;  " @9 R: R- e$ y7 |
  25. reg emifa_ba1_reg;     
    9 s# G1 j) F8 b. ^8 T( d
  26. reg [13:0] emifa_addr_reg;      ; P$ l3 B* p' N: o: q' g% M
  27. reg [15:0] emifa_data_reg; / k6 u+ l1 \9 ]6 E* f: F% I

  28. ) v3 w3 w! |! c+ M. w; K; z
  29. //元件例化
    - B. @' N8 {: I. U" a: e
  30. BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));
    " f0 y1 B$ j" h1 w
  31. //寄存器赋值1 m. s$ i4 @1 E( ~( D
  32. always@(posedge emif_clk)begin
    5 m- [1 K" W( p) k# B
  33.                 emifa_cs2_reg       <= emifa_cs2;. L( \, ~# L4 o  r% U
  34.                 emifa_oe_n_reg      <= emifa_oe_n;
    # E4 e* {' a# H+ e  E: K
  35.                 emifa_we_n_reg      <= emifa_we_n;' B8 H* }3 m9 ^5 Y9 R% o
  36.                 emifa_wait0_reg     <= emifa_wait0;0 x1 T( k4 w) W/ j
  37.                 emifa_wait1_reg     <= emifa_wait1;1 A# Y+ H4 i; d' [$ N
  38.                 emifa_ba1_reg       <= emifa_ba1;  W) _2 m8 F$ M& [+ X8 e7 g
  39.                 emifa_addr_reg      <= emifa_addr;
    ( y* i8 o- l# b9 k
  40.                 emifa_data_reg      <= emifa_data;
    & s5 K0 w( X; {
  41. end
    ( o4 O) J- G3 W- \

  42. 2 c/ h# I. Z8 }  d/ |8 ~
  43. //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;4 a  q% h/ {  k
  44. assign emifa_data = dpram_douta;
    , m9 {* X5 z* `: R- r9 F1 D- L

  45. & d- D$ X* d* ~! ~5 a- e, r
  46. /****************Dual Port RAM****************/3 j% @& @6 j0 [
  47. //PORTA
    . G% B; }( n# m
  48. reg  [14:0]dpram_addra;      
    + A5 u: L3 G* R9 k; L
  49. reg  dpram_wea;         " H/ N( v6 W7 c1 H! F2 D
  50. reg  [15:0]dpram_dina;       " K9 ]$ _1 h6 G" c
  51. wire [15:0]dpram_douta;           4 ^8 \3 W* m$ |+ j" i
  52. //PORTB
    : y  G  S+ P! m. ?
  53. reg  [14:0]dpram_addrb;       . u0 S) g8 ^4 Z& G8 d) ~. W0 X5 K
  54. wire  dpram_web;
    9 w4 t) O! G* f6 k6 y4 D
  55. reg  [15:0]dpram_dinb;% k9 v3 l* x9 M$ ^9 }/ Q0 _7 N
  56. wire [15:0]dpram_doutb;
    0 H3 m9 f3 b) ^, B3 R3 K% C# e
  57.    & V( A3 |% m$ U$ I5 i7 S5 y
  58. //元件例化5 H4 o/ P( ~, q
  59. dpram dpram_unit(
    7 O3 u$ B. ~$ c6 f4 @" ^4 ?& n/ D
  60.   .clka(emif_clk), // input clka4 X: g0 O# H$ r: ]1 w1 b
  61.   .wea(dpram_wea), // input [0 : 0] wea
    . c& @. q' T6 c# Y3 C, J; i8 @
  62.   .addra(dpram_addra), // input [14 : 0] addra
    # G2 r0 R) v4 O5 o5 g; E* Z
  63.   .dina(dpram_dina), // input [15 : 0] dina
    & W8 e5 w; w' }. T! w4 J
  64.   .douta(dpram_douta), // output [15 : 0] douta1 K5 [' X) j) {, s* {
  65.         //clkb                  => sys_clk,
    ; k) O7 Z8 N$ Z
  66.   .clkb(clk), // input clkb
    , J' C& Q- O( [; A9 r
  67.   .web(dpram_web), // input [0 : 0] web5 @/ o8 g: m. H; O2 ]5 ~
  68.   .addrb(dpram_addrb), // input [14 : 0] addrb
    ' i) K* R9 f4 l
  69.   .dinb(dpram_dinb), // input [15 : 0] dinb
    7 _6 ?$ D; i, H) f% x) _. [
  70.   .doutb(dpram_doutb));// output [15 : 0] doutb)
    0 O9 k% g) G7 p& O
  71. / P* Z! U( y0 K$ S! p/ [
  72. always@(emif_clk)begin
    ( T; M+ ?+ n0 Z
  73.                 dpram_wea             <= 0;" }3 [1 V" x/ R) e0 c* ]! U/ _
  74.                 dpram_addra           <= {emifa_addr_reg[13:0],emifa_ba1_reg};  _, V8 W& G% `! j# I4 P5 f
  75.                 dpram_dina            <= emifa_data_reg;
    & [  b, `. h, C+ i% V5 x
  76. end: w# U& s; p" P* V# `: d  W
  77. assign dpram_web = 1'b1;/ a2 z+ I9 P* w% A
  78. 3 _) c) N( `0 [. t6 M/ V
  79. always@( clk )- q" ^( r# s1 w( x* p& U
  80. begin
    ' z+ l7 x; W$ r: g5 Q+ N
  81.         dpram_addrb  <= 100;
      M6 `5 |; d! s, U& Q# c. S$ S
  82.         dpram_dinb   <= 16'd2048;
    1 i; @' U- m; r+ h( @
  83. end/ \2 a! d9 A8 R+ t! X
  84. $ Z* i0 p+ F/ t
  85. endmodule
    # p9 r! N1 t6 u& f  q4 `' x
  86. " Y( g  ?' L: Q$ X5 n& I4 s
复制代码
嗯,谢谢,这个懂了,但是读出来的数还是不正确,fpga端具体代码如上。
8 u: y# \. W" m) \. h5 ]( ]这段代码相当于RAM的A口只用来读,并且dpram_wea一直置零,RAM的B口用来写入一个数据。4 B9 k" Y+ y3 ^/ n$ @3 K4 _4 O: s
代码下载进FPGA后,DSP端先注释掉向fpga写入数据的部分,直接读取,读取的结果都为0,包括  dpram_addrb  <= 100;这个地址下应该的2048.
: J) a' C" `/ J; |: o然后把注释去掉,DSP端可以正常的写入数据并且正确的读出数据,但是我的FPGA端已经将  dpram_wea             <= 0;这里置零,是没法写入的,所以对于DSP端还能照常写入读出产生疑问。
  p/ H( a% _$ \& p, T3 D2 k$ r' J. G5 I8 l- c( B9 S, G# _
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
地板
 楼主| 发表于 2015-4-20 17:31:45 | 显示全部楼层
Lewis 发表于 2015-4-17 10:105 ?3 o( h# }% j$ u
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
0 V& [2 M9 r" M) J- c; P: v ...
3 e% v* |6 p. ^1 k( H7 v' [; X4 Q
我的硬件平台是:TL138F-EasyEVM(浮点DSP C6748+ARM9 +Xilinx Spartn-6 FPGA核): `% K. R3 |$ L! [
调试例程为:DSP端:EMIF_FPGA----EMIF总线FPGA读写测试" v# \% I% L! U- W3 [  {; o
                    FPGA端:emif_test
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
5#
 楼主| 发表于 2015-4-21 19:19:07 | 显示全部楼层
Lewis 发表于 2015-4-17 10:10
. {5 ?( X- D$ `$ ~; }EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址) b; g- e  o# Y, e
...

" O$ w+ R6 Y  W6 N还望版主指导,卡了好多天了,原理都弄明白了,就是不知道问什么读出的数据不对。若是在您那里可以正确读取数据,还望发一份程序给我。谢谢了。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-10 02:30 , Processed in 0.043501 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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