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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 11874|回复: 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中初始化的数据。请问问题出在哪里了?还望版主大侠指导。
# ?: Y+ S3 c7 ?1 @
邮箱:604285180@qq.com
9 p$ n3 h( b5 Z

本帖子中包含更多资源

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

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

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

积分
1137
沙发
发表于 2015-4-16 09:51:44 | 只看该作者
只需要把(下图中)向FPGA写数据的部分注释掉就行,其他地方都不需要修改。
% Z8 n! ^8 O+ ?0 k+ ^: D; w; x+ g1 k
( S, c9 M; r: Q# M& E- B6 b

本帖子中包含更多资源

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

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! ]& E& c. k2 `* O: ], G0 M
还要注意数据在FPGA存储的地址,跟dsp读的地址要对应

1 p8 ~: m1 `  l; Z" FFPGA端RAM的地址是从0开始的,DSP端地址是0x6000 0000的地址去读,请问如何映射地址?
回复 支持 反对

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

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

9 h5 L2 I3 v4 O& a) Q- ~' ZEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址, O# K& q' h' c, f5 K

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
6#
 楼主| 发表于 2015-4-20 17:17:38 | 只看该作者
本帖最后由 水瓶 于 2015-4-20 17:24 编辑
: X1 s3 G$ x8 T5 D2 ^# m
Lewis 发表于 2015-4-17 10:10$ Z/ Y& I7 Q* Z) `4 V
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
  V! i' h- \5 } ...
  1. `timescale 1ns / 1ps( s1 [8 a9 z# u; H/ m7 H
  2. module emif_test
    / _% I( o& X% s& w/ H1 m3 l5 [
  3. (     
      b* V% l* h9 l4 e
  4.    input clk,
    9 d* O3 e  a: I( P/ V
  5.         input    emifa_clk,    // 时钟                         & }# ~1 o! K- A0 F: R; K
  6.         input    emifa_cs2,    //  低电平有效异步器件使能引脚  (与异步器件片选信号相连,只在访问异步存储器时有效)      
    ) Z: P! ^& h# i" T1 l9 a
  7.         input    emifa_oe_n,    //  低电平有效异步器件使能引脚         
    * z" K# I% Q; z5 l2 W8 A
  8.         input    emifa_we_n,     // 低电平有效写使能引脚       7 q! s! w2 _+ P, N
  9.         inout    emifa_wait0,    //等待输入引脚      
    $ l6 H1 k" }- j; W; C$ Z
  10.         inout    emifa_wait1,             " j8 g! H4 e6 b1 n- a0 o' }5 ]. {/ [
  11.         input    emifa_ba1,         // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。            0 z; O' w( L! F  D
  12.         input    [13:0]emifa_addr,  // EMIF 地址总线            
    6 ^9 X$ M* f# p& g
  13.         output    [15:0]emifa_data   // EMIF 数据总线. z3 _# @" K. y) ~
  14. );6 l' H) o1 u: ~  ~$ g) w
  15.         ' Q- L: i, J3 e; w) P+ }+ I% O2 R
  16. /****************EMIF Interface****************/        
    : t* P( [- c' P1 |; s! [
  17. //信号声明. G' z6 h$ e/ a* w; m: E
  18. wire emif_clk;5 r+ [/ T- B7 f5 C# L& l5 p* x
  19. reg emifa_cs2_reg;      
    + d1 H+ I9 S% r$ U& n
  20. reg emifa_rnw_reg;     
    . A' V% ]0 c* G6 s: x/ e
  21. reg emifa_oe_n_reg;   
    4 }! N3 {! \- S1 |& s7 N' J
  22. reg emifa_we_n_reg;   
    ! |; }; N1 L$ [0 K' @7 b/ f- k) V9 t
  23. reg emifa_wait0_reg;   
    8 F! K! m& [" I, E1 I' l
  24. reg emifa_wait1_reg;  9 G4 b( |% W& m" v2 p% t
  25. reg emifa_ba1_reg;     
    ( h. u. I4 a& X- |" }
  26. reg [13:0] emifa_addr_reg;      & `2 p  p' E* s' f
  27. reg [15:0] emifa_data_reg; 8 |8 D8 m( @3 M3 W

  28. ! ^' p+ E; M3 N5 S0 j/ P- l
  29. //元件例化( s1 x: N6 ~/ }3 H9 Y) R
  30. BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));; J  @! ]* R; ~% C1 U1 o; e) @
  31. //寄存器赋值8 D2 ^" F6 v! W% x; [# {" Z. f
  32. always@(posedge emif_clk)begin
    , o. A! X" B! {) z/ y3 S
  33.                 emifa_cs2_reg       <= emifa_cs2;! V8 [$ b' I* a6 H; R$ i
  34.                 emifa_oe_n_reg      <= emifa_oe_n;" N/ k- [, s/ K3 ?
  35.                 emifa_we_n_reg      <= emifa_we_n;
    * G4 `3 J4 }  c# g% L1 N
  36.                 emifa_wait0_reg     <= emifa_wait0;
    6 y( c+ k& p  B1 `) ?2 Y0 N8 ^% U3 \/ ~
  37.                 emifa_wait1_reg     <= emifa_wait1;* s5 N$ Z; t! g6 p# C
  38.                 emifa_ba1_reg       <= emifa_ba1;
    % I% R5 t# o6 ^+ j5 W8 y8 U
  39.                 emifa_addr_reg      <= emifa_addr;
    . Y; c- R0 j6 H- F5 o) [/ N4 z
  40.                 emifa_data_reg      <= emifa_data;; |; t% u- ]) _5 }/ f
  41. end3 x( U4 ?. ]1 j3 `$ c

  42. 6 f4 K5 ]* ?' k
  43. //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;
    7 q" G# t2 d) R: ?
  44. assign emifa_data = dpram_douta;  y4 U9 a( T2 p* [$ D- d

  45. 4 x; d7 f" n, Y; ]
  46. /****************Dual Port RAM****************/$ Z, @9 `! m9 T  j) C& x& u
  47. //PORTA% v& M! p* {/ r% j5 S
  48. reg  [14:0]dpram_addra;       $ z- ~7 t6 V3 R$ y/ O# ~
  49. reg  dpram_wea;         9 n- l, @  u+ Z; p8 N
  50. reg  [15:0]dpram_dina;       & Q8 w6 ^5 l2 k. U$ k) F( J
  51. wire [15:0]dpram_douta;           
    % _3 f$ b7 D" G( U1 k. X& b
  52. //PORTB5 l8 D1 R2 ^; p" z2 g. G
  53. reg  [14:0]dpram_addrb;       8 C: P/ u! ]8 ~0 K) X
  54. wire  dpram_web;
    6 k! `# \& Y& f: w
  55. reg  [15:0]dpram_dinb;, n4 _* z0 f$ d9 o  q7 w# `) J+ k
  56. wire [15:0]dpram_doutb;
    * d& r! a& F0 s/ Q+ l4 z$ ?9 [2 M
  57.    ) N. @1 r- H" S, l) ]9 k+ Y
  58. //元件例化
    * A! i; B8 |' B0 K0 b
  59. dpram dpram_unit(( e5 n% W% e/ `* p# K2 \- [% ~" m1 Y
  60.   .clka(emif_clk), // input clka
    / E) ^2 W8 l, X
  61.   .wea(dpram_wea), // input [0 : 0] wea3 z0 D8 K9 m7 p4 y" A7 c- o
  62.   .addra(dpram_addra), // input [14 : 0] addra
    $ H" j8 J" b6 x2 D; l
  63.   .dina(dpram_dina), // input [15 : 0] dina
    9 \9 O, O0 ?, E4 K
  64.   .douta(dpram_douta), // output [15 : 0] douta
    # |+ Y( d# O# h' Y
  65.         //clkb                  => sys_clk,7 c' q4 w; l- Z' ?
  66.   .clkb(clk), // input clkb
    5 ^& y6 H6 m2 ], A: T
  67.   .web(dpram_web), // input [0 : 0] web1 W5 B4 x$ j9 d; o3 E4 A
  68.   .addrb(dpram_addrb), // input [14 : 0] addrb# E* i( w8 W8 N& G# j) ]
  69.   .dinb(dpram_dinb), // input [15 : 0] dinb: R2 q# a* ]8 x
  70.   .doutb(dpram_doutb));// output [15 : 0] doutb)
    ( M6 a0 s5 y  X. z8 u

  71. : X9 X3 o; B4 b+ N4 u3 b+ a# L
  72. always@(emif_clk)begin. d( J) b0 B9 w0 u. D7 {2 w# ?
  73.                 dpram_wea             <= 0;
    3 L0 z" |& l0 w( {( E+ E4 s2 a
  74.                 dpram_addra           <= {emifa_addr_reg[13:0],emifa_ba1_reg};
    : G( k& ~: c/ ?/ z" I# b1 `
  75.                 dpram_dina            <= emifa_data_reg;" F' T- t! m+ m1 E
  76. end
    ! d9 t  [! V: p9 `" d
  77. assign dpram_web = 1'b1;, E6 Z* E% f4 F, n

  78. . n$ g9 s3 ^& V& D/ Q$ c7 a
  79. always@( clk )1 ^: \( L4 d; y0 p/ A
  80. begin, u3 A1 t! Z( C( P5 G& k
  81.         dpram_addrb  <= 100;- ~, {7 g. l5 ^  ^9 o
  82.         dpram_dinb   <= 16'd2048;
    & l3 \7 r9 z4 Q9 s9 }
  83. end
    ! c) D, @' V. a* ]4 m
  84. # u2 s3 k0 I  o8 X6 k$ m( |
  85. endmodule. m# `- I$ R" g  Q
  86. 8 t; T* p4 D  `( n; g9 h
复制代码
嗯,谢谢,这个懂了,但是读出来的数还是不正确,fpga端具体代码如上。# H* P: \$ x" h$ v# _4 ^3 b( X
这段代码相当于RAM的A口只用来读,并且dpram_wea一直置零,RAM的B口用来写入一个数据。
! m. @- r1 H6 ]4 w代码下载进FPGA后,DSP端先注释掉向fpga写入数据的部分,直接读取,读取的结果都为0,包括  dpram_addrb  <= 100;这个地址下应该的2048.
" G5 S' \' G  w( ]9 A+ @! _然后把注释去掉,DSP端可以正常的写入数据并且正确的读出数据,但是我的FPGA端已经将  dpram_wea             <= 0;这里置零,是没法写入的,所以对于DSP端还能照常写入读出产生疑问。0 s% v3 i6 L" c: M$ I8 g' r
, x$ D( K6 O* d6 R
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
7#
 楼主| 发表于 2015-4-20 17:31:45 | 只看该作者
Lewis 发表于 2015-4-17 10:10) m& ]* C9 R6 E: G2 \6 i
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
9 K: R; N9 D. j ...
, v0 ~- u5 ]! R6 K& t
我的硬件平台是:TL138F-EasyEVM(浮点DSP C6748+ARM9 +Xilinx Spartn-6 FPGA核)* j$ N0 n9 u+ d
调试例程为:DSP端:EMIF_FPGA----EMIF总线FPGA读写测试
0 G% d# o2 W7 r6 [. w                    FPGA端:emif_test
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
8#
 楼主| 发表于 2015-4-21 19:19:07 | 只看该作者
Lewis 发表于 2015-4-17 10:10! k$ `) z3 [+ g% U! R# B& e
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址( m! U6 i, V* P/ h( \: L, t; O; o
...
- u/ j; K  D- l  O& p& V
还望版主指导,卡了好多天了,原理都弄明白了,就是不知道问什么读出的数据不对。若是在您那里可以正确读取数据,还望发一份程序给我。谢谢了。
回复 支持 反对

使用道具 举报

20

主题

65

帖子

341

积分

中级会员

Rank: 3Rank: 3

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-17 00:08 , Processed in 0.043695 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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