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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 11544|回复: 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中初始化的数据。请问问题出在哪里了?还望版主大侠指导。
9 F. C( K. E( t5 t( J2 J
邮箱:604285180@qq.com* |! b2 }; L  C$ r- C3 q* P: p6 b

本帖子中包含更多资源

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

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

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

积分
1137
沙发
发表于 2015-4-16 09:51:44 | 只看该作者
只需要把(下图中)向FPGA写数据的部分注释掉就行,其他地方都不需要修改。0 l& e+ a1 W, }7 s' w2 T
8 }8 z3 v% y: W4 J; D) ~0 ^% 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$ X4 J: C: g& U
还要注意数据在FPGA存储的地址,跟dsp读的地址要对应
  I0 m6 o7 u+ H% O
FPGA端RAM的地址是从0开始的,DSP端地址是0x6000 0000的地址去读,请问如何映射地址?
回复 支持 反对

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

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

' c' Y$ j# r8 w, VEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
+ C) X5 ~1 z) b+ f+ g) p" j! x, D

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
6#
 楼主| 发表于 2015-4-20 17:17:38 | 只看该作者
本帖最后由 水瓶 于 2015-4-20 17:24 编辑
2 a7 j# U% U( Y! Q
Lewis 发表于 2015-4-17 10:10
9 j+ n1 ]( t1 d; iEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址; d; d7 K% |+ o3 ~  f2 v
...
  1. `timescale 1ns / 1ps
    4 s. ^- J. v5 l/ v) j
  2. module emif_test
    + I& V& [: O8 W
  3. (     6 O5 r  J7 ]" l) X# ?
  4.    input clk,
    " ^8 ]! h) @: @  i+ s# ^* p" T
  5.         input    emifa_clk,    // 时钟                        
    / t1 k' [( g! @5 z$ v4 V
  6.         input    emifa_cs2,    //  低电平有效异步器件使能引脚  (与异步器件片选信号相连,只在访问异步存储器时有效)      
    8 ?( I( E7 g! T4 f. n  V
  7.         input    emifa_oe_n,    //  低电平有效异步器件使能引脚          1 @4 R$ m1 K0 `+ f( V
  8.         input    emifa_we_n,     // 低电平有效写使能引脚       2 |; w; @; b2 C1 t% |$ ^
  9.         inout    emifa_wait0,    //等待输入引脚      
    4 Z- ?# y, L" e5 U% u
  10.         inout    emifa_wait1,             * Y5 c) v. Q, }4 A7 o6 _( i6 H5 W
  11.         input    emifa_ba1,         // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。            
    7 u4 e* w  A$ B; ?$ Z+ v
  12.         input    [13:0]emifa_addr,  // EMIF 地址总线            0 U8 g+ k8 u" e% T
  13.         output    [15:0]emifa_data   // EMIF 数据总线+ I6 g# l( |7 |5 t  J
  14. );0 P# R' a$ M2 D1 A
  15.         
    4 y$ E. \1 I$ J, E
  16. /****************EMIF Interface****************/        
    8 r2 }- q- e3 e7 |7 _6 `
  17. //信号声明
    $ I9 X4 l& v5 a2 `/ S9 M
  18. wire emif_clk;3 H9 y5 E; ~( j- B
  19. reg emifa_cs2_reg;      7 }! }8 o$ \3 X  l" N
  20. reg emifa_rnw_reg;     
    9 Y* \# ^8 I! q$ K/ s
  21. reg emifa_oe_n_reg;    2 F0 l! H$ Y2 W8 u. A1 \5 C. i8 I
  22. reg emifa_we_n_reg;    + n% X1 O8 n" D
  23. reg emifa_wait0_reg;   
    7 j. }6 A6 ^0 a: o( c- P& U
  24. reg emifa_wait1_reg;  
    . n# d4 Q9 T( v+ F
  25. reg emifa_ba1_reg;     3 ^6 [8 H3 @; _% g, z
  26. reg [13:0] emifa_addr_reg;      
    * M# G7 t( @$ i: O1 q7 t9 g6 o# N2 O
  27. reg [15:0] emifa_data_reg; / u: z: l, X; G2 l3 m$ ^

  28. / ?5 m6 E! E* L6 y
  29. //元件例化) a5 f5 H3 v( w8 u* t  ^3 [" c
  30. BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));2 ~: y4 n: P" l# `
  31. //寄存器赋值+ \/ s( H7 G% y) h' w2 _: j
  32. always@(posedge emif_clk)begin
    $ d* V0 e8 T$ y/ _  Z8 E% _
  33.                 emifa_cs2_reg       <= emifa_cs2;7 U8 p7 h% [8 v% y
  34.                 emifa_oe_n_reg      <= emifa_oe_n;
    9 k7 W1 N% S: p' P
  35.                 emifa_we_n_reg      <= emifa_we_n;
    / w% ~$ V% N  J
  36.                 emifa_wait0_reg     <= emifa_wait0;* P) Q9 v9 R% S! Y
  37.                 emifa_wait1_reg     <= emifa_wait1;
    ; z4 Z, U4 u# Z: ?' p. a- J
  38.                 emifa_ba1_reg       <= emifa_ba1;
    " O( W  U' B8 ?6 S- d8 X2 v3 ]" w
  39.                 emifa_addr_reg      <= emifa_addr;6 G8 |! ]* L# E" a2 D3 `
  40.                 emifa_data_reg      <= emifa_data;' I, K  D% L* N/ y
  41. end" P* I- ]/ }' c) R1 `
  42. 9 m1 B) h. j9 _8 z2 [8 W' M; F
  43. //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;* e; C2 Y' o" N/ w7 ~8 ?
  44. assign emifa_data = dpram_douta;
    ( q0 W3 E) Y- U/ V1 H

  45. ' X0 ?: a# k" `2 |, R
  46. /****************Dual Port RAM****************// ^" L8 t& p5 K8 R
  47. //PORTA; x! c4 F$ a( J5 S' K
  48. reg  [14:0]dpram_addra;       & g+ k4 d( j$ [( n% Y- E$ R
  49. reg  dpram_wea;         
    / P+ }& r7 k; x5 f5 P$ q
  50. reg  [15:0]dpram_dina;       / [5 N5 t! `( |
  51. wire [15:0]dpram_douta;           8 w7 Z& {, h3 C9 X' X4 F3 E: F
  52. //PORTB: G) z* C: P* g  k  Q
  53. reg  [14:0]dpram_addrb;       ) Z1 D* E+ b3 S( `; \' }5 D
  54. wire  dpram_web;2 B7 p+ d8 o5 H
  55. reg  [15:0]dpram_dinb;
      w7 Y; \7 h, J1 z
  56. wire [15:0]dpram_doutb;
    ! y, \3 S/ }- C# a9 Z7 [, D
  57.    
    & v9 F8 Z9 g7 N: z% X) [
  58. //元件例化
    4 n: c( L; q7 T) [. b) X- V
  59. dpram dpram_unit(1 b: U* L  l3 \* V
  60.   .clka(emif_clk), // input clka0 ^& l" ]8 y& B( t8 G- R
  61.   .wea(dpram_wea), // input [0 : 0] wea; u# d* x3 J% j
  62.   .addra(dpram_addra), // input [14 : 0] addra
    ! b. w; c9 v9 L, r8 G) p
  63.   .dina(dpram_dina), // input [15 : 0] dina
    * H% ~2 ^) f& v4 N
  64.   .douta(dpram_douta), // output [15 : 0] douta0 P5 |- Z- n) f" q8 U% K% H
  65.         //clkb                  => sys_clk,
    & V3 j; _  m( l& A2 A
  66.   .clkb(clk), // input clkb2 ^' S- H. [1 x
  67.   .web(dpram_web), // input [0 : 0] web
    & w9 s3 x( e. V4 _0 Y8 M
  68.   .addrb(dpram_addrb), // input [14 : 0] addrb
    / A0 D/ A2 z/ h9 F5 t2 z
  69.   .dinb(dpram_dinb), // input [15 : 0] dinb
    : r( k: K" L- X$ C! \+ G5 y
  70.   .doutb(dpram_doutb));// output [15 : 0] doutb)1 s6 K# q3 u$ i9 H) V
  71. % d- g3 F0 _) M# Z! t$ X* O
  72. always@(emif_clk)begin& W9 T: ]2 Y) `
  73.                 dpram_wea             <= 0;
    - O* g, O2 L9 T
  74.                 dpram_addra           <= {emifa_addr_reg[13:0],emifa_ba1_reg};* G4 u6 o2 E. h8 }' P+ k5 K
  75.                 dpram_dina            <= emifa_data_reg;/ B4 N, [4 z/ _6 c' V. ]# P
  76. end
    3 n/ j( n' h" z  n# y* f
  77. assign dpram_web = 1'b1;
    8 _) E9 U' b/ l. A9 m% ^1 x# U
  78. ; e4 E/ w$ J$ W! X# ?1 Q. e) U
  79. always@( clk )
    , i7 S7 D7 {' I6 E" o# F+ Q
  80. begin
    9 c+ W2 |8 p; f7 [# }# K  v
  81.         dpram_addrb  <= 100;
    2 I! c7 d' X  ~) W/ |2 `
  82.         dpram_dinb   <= 16'd2048;' p  I/ D  h9 S) `2 _
  83. end5 j0 f. I2 X! A) f1 n  h5 Z4 b

  84. + W. X- p1 D' |: s8 O! @
  85. endmodule
    ; y# Q3 t1 @0 {6 d8 g# a9 l+ \- N# D

  86. , v9 w) G0 c1 y" z* Q  \6 X( D
复制代码
嗯,谢谢,这个懂了,但是读出来的数还是不正确,fpga端具体代码如上。  N) E( ?" {4 H8 H1 \$ l+ ^8 b
这段代码相当于RAM的A口只用来读,并且dpram_wea一直置零,RAM的B口用来写入一个数据。
3 P' o0 ]0 {- G/ K( a+ U代码下载进FPGA后,DSP端先注释掉向fpga写入数据的部分,直接读取,读取的结果都为0,包括  dpram_addrb  <= 100;这个地址下应该的2048.
, S( ?% s+ E9 `& S# X3 P. O% _# t然后把注释去掉,DSP端可以正常的写入数据并且正确的读出数据,但是我的FPGA端已经将  dpram_wea             <= 0;这里置零,是没法写入的,所以对于DSP端还能照常写入读出产生疑问。
/ a# n- h: B# u2 D7 ~: |$ ]( r1 [
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
7#
 楼主| 发表于 2015-4-20 17:31:45 | 只看该作者
Lewis 发表于 2015-4-17 10:102 m2 `. G$ y; ?# ]
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
5 Y' \% U5 ^# B/ K* c ...

+ I) V2 \: b0 r& L+ c我的硬件平台是:TL138F-EasyEVM(浮点DSP C6748+ARM9 +Xilinx Spartn-6 FPGA核)
7 A  R, d+ f% _, O2 x调试例程为:DSP端:EMIF_FPGA----EMIF总线FPGA读写测试; K2 r. _" X9 u. d" X
                    FPGA端:emif_test
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
8#
 楼主| 发表于 2015-4-21 19:19:07 | 只看该作者
Lewis 发表于 2015-4-17 10:10- o! [- N5 v  t+ q' ~
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
. _7 v) @* a9 K ...

" x) M8 Y4 [8 C" l" ^/ _8 Z/ [$ s还望版主指导,卡了好多天了,原理都弄明白了,就是不知道问什么读出的数据不对。若是在您那里可以正确读取数据,还望发一份程序给我。谢谢了。
回复 支持 反对

使用道具 举报

20

主题

65

帖子

341

积分

中级会员

Rank: 3Rank: 3

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-12 10:12 , Processed in 0.045061 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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