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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 12190|回复: 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/ h8 z, j2 B$ ]9 _9 A邮箱:604285180@qq.com
' Z1 O5 K( \% r6 z3 G

本帖子中包含更多资源

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

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

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

积分
1137
沙发
发表于 2015-4-16 09:51:44 | 只看该作者
只需要把(下图中)向FPGA写数据的部分注释掉就行,其他地方都不需要修改。# Y3 y% H  j7 E5 J' Z5 X
* j1 N9 B' B0 E7 i

本帖子中包含更多资源

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

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:550 Y3 I% s7 N% n* P
还要注意数据在FPGA存储的地址,跟dsp读的地址要对应
1 \& u' J$ d* d
FPGA端RAM的地址是从0开始的,DSP端地址是0x6000 0000的地址去读,请问如何映射地址?
回复 支持 反对

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

积分
1137
5#
发表于 2015-4-17 10:10:29 | 只看该作者
' A; m" O& h1 a& `& V( {) r3 x) H
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
8 A% S! u+ R! n6 `0 [! B

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
6#
 楼主| 发表于 2015-4-20 17:17:38 | 只看该作者
本帖最后由 水瓶 于 2015-4-20 17:24 编辑 8 E& X* c% E, t3 Q% o% T2 P# y
Lewis 发表于 2015-4-17 10:10
0 j0 ~" B1 A8 {3 eEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址# q% @& T0 ?: K5 v6 Z" q, s
...
  1. `timescale 1ns / 1ps8 |* d3 u8 R5 Q2 Q* y
  2. module emif_test# U" Z; L: ]  M* f+ h& P& g
  3. (     # _# j, Q0 B  F7 {
  4.    input clk,
    * x/ W/ l2 d( ?. v8 l
  5.         input    emifa_clk,    // 时钟                        
    8 H5 B( g: w, ^. x7 \
  6.         input    emifa_cs2,    //  低电平有效异步器件使能引脚  (与异步器件片选信号相连,只在访问异步存储器时有效)      # g, \4 [7 A* R9 N+ Y0 ?, u; m
  7.         input    emifa_oe_n,    //  低电平有效异步器件使能引脚         
    ( z* a# b2 c. e/ @' s7 K
  8.         input    emifa_we_n,     // 低电平有效写使能引脚       7 m$ h( d3 t/ ], h6 Z7 @; U9 m/ G
  9.         inout    emifa_wait0,    //等待输入引脚      % a$ ^1 x0 g5 X& b. ]& y, l- D
  10.         inout    emifa_wait1,            
    % e5 ^3 G: [, s( c' w* @$ x1 H; `
  11.         input    emifa_ba1,         // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。            
    0 Y# s& n" H$ V& T. J1 `* U7 d  \+ i6 o
  12.         input    [13:0]emifa_addr,  // EMIF 地址总线            2 {$ Q0 o0 i8 x. W0 L  _/ o3 g
  13.         output    [15:0]emifa_data   // EMIF 数据总线, Y: p: Q! B6 a
  14. );
    # |4 @+ `, Y9 C3 N/ a) u
  15.         ) }% J- F2 ]8 B! h7 {* i0 F
  16. /****************EMIF Interface****************/        $ G- H8 E" e) z5 k2 o* m$ D
  17. //信号声明7 J' |5 W, A6 @7 s0 |
  18. wire emif_clk;
    * o, j8 r0 c1 u" c; n) L" m" d* u
  19. reg emifa_cs2_reg;      
    ) H% W. k! R, V" S  M# |! _: U$ k
  20. reg emifa_rnw_reg;       q# c' |& e. a; c* [& o
  21. reg emifa_oe_n_reg;   
    # f7 Y$ Z" S% w
  22. reg emifa_we_n_reg;    ' p- D0 B+ _. _( D6 u3 R" ]. l
  23. reg emifa_wait0_reg;   ! m2 A, {' X4 l8 C: |3 D& V
  24. reg emifa_wait1_reg;  2 F; [: O- K6 E  y9 N, a: i2 t5 p) Q
  25. reg emifa_ba1_reg;     
    0 [4 E$ _- K0 e. ]
  26. reg [13:0] emifa_addr_reg;      
    7 E' }  N. j. ]: l
  27. reg [15:0] emifa_data_reg;
    " M* a2 {* f' J/ ?

  28. 1 D; ?* \3 w* K+ e+ C
  29. //元件例化! e% G) F5 O& T* v: e6 U
  30. BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));1 f; j  x: n' s
  31. //寄存器赋值) v1 \; T% G' ]4 R5 ]8 s. ?
  32. always@(posedge emif_clk)begin8 n' _: `5 v; D. ?2 p# [
  33.                 emifa_cs2_reg       <= emifa_cs2;8 s, @2 ?1 J2 _1 R/ |1 H+ n
  34.                 emifa_oe_n_reg      <= emifa_oe_n;" f1 ~  g9 n3 Q. X6 d, L3 x
  35.                 emifa_we_n_reg      <= emifa_we_n;1 ]3 O" k- u' z* v' I& ~
  36.                 emifa_wait0_reg     <= emifa_wait0;
    & ~' t5 j* s! X: ]% C/ `4 f
  37.                 emifa_wait1_reg     <= emifa_wait1;3 v8 y% ^% z& V, [8 v
  38.                 emifa_ba1_reg       <= emifa_ba1;
    & _; C& @9 \. u
  39.                 emifa_addr_reg      <= emifa_addr;
    1 p3 L7 ^- c3 X# D3 P. V! K* Z% m5 X
  40.                 emifa_data_reg      <= emifa_data;: L0 F! ?+ Z3 s/ Y! p6 U# ~$ H
  41. end8 I4 h* m7 K- [
  42. ; ^+ i+ w) G" J9 t$ ?1 `* @
  43. //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;+ {3 V( N( `" l* }( |7 t0 O( Z% w0 _
  44. assign emifa_data = dpram_douta;0 r- X/ n4 {: w) u

  45. 5 O! e$ C# [+ `: ~
  46. /****************Dual Port RAM****************/
    . R" O/ n$ h1 u
  47. //PORTA; d: b$ p& K* H3 S3 u
  48. reg  [14:0]dpram_addra;      
    1 P8 G; T1 v9 p7 S! G, s
  49. reg  dpram_wea;         7 ~; s' S, L" l
  50. reg  [15:0]dpram_dina;       ! i0 e# k0 o) e; t/ }6 n7 @3 \5 ~
  51. wire [15:0]dpram_douta;           
    " p7 Y$ K3 H  n  e* b8 A0 {8 B& C2 [
  52. //PORTB
    ! \' X. e) x! t5 b2 \) v) t+ T
  53. reg  [14:0]dpram_addrb;       + f# c$ c' O* t, y
  54. wire  dpram_web;
    8 g1 F) X+ Z' E, J. Y! G2 o
  55. reg  [15:0]dpram_dinb;5 a, [6 s. P8 P" X
  56. wire [15:0]dpram_doutb;
    9 E! f3 V% G1 Q: E
  57.    
    ' U+ K  S" ]) o
  58. //元件例化
    7 }  G5 L" b" R- g9 ]
  59. dpram dpram_unit(
    ) Z" Z5 b- u/ w# p
  60.   .clka(emif_clk), // input clka. h) j% _; W! A( B6 s) k# k( h) a
  61.   .wea(dpram_wea), // input [0 : 0] wea
    6 D' g/ ~/ {# D) F& w5 }
  62.   .addra(dpram_addra), // input [14 : 0] addra
    ! }# P) B' ^. o2 {4 w
  63.   .dina(dpram_dina), // input [15 : 0] dina
    9 n8 ?: v% b  r" e' L$ G- p7 N
  64.   .douta(dpram_douta), // output [15 : 0] douta
    ( R3 Q4 h! q& A) w; U- ~/ S
  65.         //clkb                  => sys_clk,
    " l. l! i' r1 R8 t) h) P* T
  66.   .clkb(clk), // input clkb5 T- a/ j8 J  D- p6 d& j( u. F; o9 @  ?
  67.   .web(dpram_web), // input [0 : 0] web
    ' f$ R: Y& I- a! p7 N/ S
  68.   .addrb(dpram_addrb), // input [14 : 0] addrb1 x0 v/ V) i, W5 p- }/ w. O( W7 U
  69.   .dinb(dpram_dinb), // input [15 : 0] dinb; A/ E6 A: x8 P3 a
  70.   .doutb(dpram_doutb));// output [15 : 0] doutb)
    3 N4 p) Q1 Y' S$ J, T. X& Y, @
  71. " M' g" J8 V0 n6 c
  72. always@(emif_clk)begin
    2 p4 g- r9 T+ w- A/ C7 m- I
  73.                 dpram_wea             <= 0;! e$ m3 I" n1 }* k
  74.                 dpram_addra           <= {emifa_addr_reg[13:0],emifa_ba1_reg};, ]( Q( b& n8 ~" H- D7 A. U
  75.                 dpram_dina            <= emifa_data_reg;4 n7 E% e0 A" J8 g1 m, C
  76. end
    . p0 ~3 T0 M% b# A
  77. assign dpram_web = 1'b1;$ s# D8 R5 A+ J1 U: m; V; t
  78. , I5 A3 w4 L% H& ?
  79. always@( clk )
    5 Q7 O5 Y. d) \5 J, R; r
  80. begin
    0 w, j- ?+ k$ A) ~2 H
  81.         dpram_addrb  <= 100;
    8 M: _: }6 c9 }$ @1 [! ^7 V
  82.         dpram_dinb   <= 16'd2048;$ [4 {5 k) R  A! b9 [
  83. end
    ' E, W5 b  d% \

  84. $ r2 c% D, B4 c" r; I
  85. endmodule
    : n8 f& v: p  t+ n2 a* q

  86. 9 g8 @- k% ^6 d
复制代码
嗯,谢谢,这个懂了,但是读出来的数还是不正确,fpga端具体代码如上。" b0 Z% n  z. R' h0 i4 ^
这段代码相当于RAM的A口只用来读,并且dpram_wea一直置零,RAM的B口用来写入一个数据。6 J0 Y3 E  j% X( Q3 \- ~4 u: l% d
代码下载进FPGA后,DSP端先注释掉向fpga写入数据的部分,直接读取,读取的结果都为0,包括  dpram_addrb  <= 100;这个地址下应该的2048.& P9 X0 P( g- v! r! E1 L: d8 N' J
然后把注释去掉,DSP端可以正常的写入数据并且正确的读出数据,但是我的FPGA端已经将  dpram_wea             <= 0;这里置零,是没法写入的,所以对于DSP端还能照常写入读出产生疑问。
; t& m% O; a1 H# X/ C9 D" S. F; ]; O- ]9 `) B: s1 T. \# H% V
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
7#
 楼主| 发表于 2015-4-20 17:31:45 | 只看该作者
Lewis 发表于 2015-4-17 10:10
3 S3 B0 y* u0 C1 OEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址1 ]  g7 n) n% z
...
: }7 f. x8 @. c, {2 J6 d$ }
我的硬件平台是:TL138F-EasyEVM(浮点DSP C6748+ARM9 +Xilinx Spartn-6 FPGA核)
* D$ d- Z. H/ y# I8 e9 I调试例程为:DSP端:EMIF_FPGA----EMIF总线FPGA读写测试
( i9 H5 e0 [) A- \3 _" u5 l                    FPGA端:emif_test
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
8#
 楼主| 发表于 2015-4-21 19:19:07 | 只看该作者
Lewis 发表于 2015-4-17 10:10
6 S) s% I( Q% b* [7 m( KEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址, |2 z# j$ r& {5 a) M0 v. q
...

* h8 J, w1 R% Q- m还望版主指导,卡了好多天了,原理都弄明白了,就是不知道问什么读出的数据不对。若是在您那里可以正确读取数据,还望发一份程序给我。谢谢了。
回复 支持 反对

使用道具 举报

20

主题

65

帖子

341

积分

中级会员

Rank: 3Rank: 3

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-31 20:50 , Processed in 0.044813 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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