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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

& L$ [9 p$ C  L" y4 i) X8 x邮箱:604285180@qq.com
7 S* X5 w) \( X. {6 C) {4 Q: o! ?

本帖子中包含更多资源

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

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

使用道具 举报

20

主题

65

帖子

341

积分

中级会员

Rank: 3Rank: 3

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

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
8#
 楼主| 发表于 2015-4-21 19:19:07 | 只看该作者
Lewis 发表于 2015-4-17 10:10* h3 ^/ r8 D1 s8 }
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址7 s  L, n. A. {1 w: Z( f
...

+ n3 H3 G: K, t$ V4 @; i7 I* I还望版主指导,卡了好多天了,原理都弄明白了,就是不知道问什么读出的数据不对。若是在您那里可以正确读取数据,还望发一份程序给我。谢谢了。
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
7#
 楼主| 发表于 2015-4-20 17:31:45 | 只看该作者
Lewis 发表于 2015-4-17 10:104 \5 c+ p9 i* M+ @! b! W+ N
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址( k2 J  O, \. f8 l9 A- S) K
...
2 ?4 H) t* L) O# y# @
我的硬件平台是:TL138F-EasyEVM(浮点DSP C6748+ARM9 +Xilinx Spartn-6 FPGA核)6 Y; ]1 \9 c. U1 |" M3 h. }
调试例程为:DSP端:EMIF_FPGA----EMIF总线FPGA读写测试
! V6 J& j% W7 S: p( J& J) I                    FPGA端:emif_test
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
6#
 楼主| 发表于 2015-4-20 17:17:38 | 只看该作者
本帖最后由 水瓶 于 2015-4-20 17:24 编辑 / G" |$ \! ?* k, q2 @
Lewis 发表于 2015-4-17 10:102 G& P- P# x, ?6 y- e1 u
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
6 G9 X# E+ Q1 L2 Z$ E0 R, j ...
  1. `timescale 1ns / 1ps
    $ {' c! s+ R6 A+ K* }7 N- C1 U0 v
  2. module emif_test, o9 a9 T; M6 _4 s5 w
  3. (     0 c" e! m" k3 P
  4.    input clk,5 w. J& M+ e4 W; L7 d7 u
  5.         input    emifa_clk,    // 时钟                        
    ) w; w1 J$ ^/ d0 ?8 u
  6.         input    emifa_cs2,    //  低电平有效异步器件使能引脚  (与异步器件片选信号相连,只在访问异步存储器时有效)      
    3 F' r9 m) w: g# i4 p+ I
  7.         input    emifa_oe_n,    //  低电平有效异步器件使能引脚          - h$ B: f- [+ O6 p
  8.         input    emifa_we_n,     // 低电平有效写使能引脚       ) L; ]  C. P0 ]2 Z0 W% i$ O
  9.         inout    emifa_wait0,    //等待输入引脚      ' a0 H) x' T8 J5 P2 N/ M' _, S
  10.         inout    emifa_wait1,            
    ' |, Q. w/ H  ^5 y
  11.         input    emifa_ba1,         // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。            
    # i8 Z1 |6 A2 `5 @& }
  12.         input    [13:0]emifa_addr,  // EMIF 地址总线            
    * i; J* ^: n3 t! ?& k. {
  13.         output    [15:0]emifa_data   // EMIF 数据总线
    * r% M; [8 Q2 g: ?' t* d- Q- _
  14. );( ]8 N9 d& d% K: n
  15.         8 Y8 m0 U* O0 I* V& ^
  16. /****************EMIF Interface****************/        : X% H% L, X3 R/ Q0 O9 [
  17. //信号声明" y  j' B9 R# g- d+ _2 d% f: D9 ?6 [
  18. wire emif_clk;+ G1 |% N1 j  f1 W: {
  19. reg emifa_cs2_reg;      
    ; H  V) h: N+ @5 }+ U1 u; k
  20. reg emifa_rnw_reg;     ; T' J! {3 r  d+ @$ T( o4 B
  21. reg emifa_oe_n_reg;   
      V2 K. X, Y0 \; V$ s* n
  22. reg emifa_we_n_reg;    % z- V/ w0 r! o/ |- P. ~
  23. reg emifa_wait0_reg;   4 x3 ?7 l0 ~; C0 T
  24. reg emifa_wait1_reg;  & j' i7 }) b1 }" z! V7 u6 F$ Q
  25. reg emifa_ba1_reg;     " m, F1 @% r0 Z% p2 x. j
  26. reg [13:0] emifa_addr_reg;      
    5 ^9 F+ R: `* A, z! F0 K5 E3 A
  27. reg [15:0] emifa_data_reg;
    - P% X4 [0 c! U' V0 X3 h2 T, W. A
  28. 5 g) `3 D3 f5 c) V9 N
  29. //元件例化
      C& I: B+ N. i" ]# Y
  30. BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));0 o. g2 F  n  |' u: l$ C
  31. //寄存器赋值* D' i$ o  A. t0 E- H1 L* C  U: \
  32. always@(posedge emif_clk)begin
    0 G3 N7 B; A) O! h5 o& c
  33.                 emifa_cs2_reg       <= emifa_cs2;/ n6 v/ Y# m9 ?/ Q$ p1 }  S
  34.                 emifa_oe_n_reg      <= emifa_oe_n;( h3 j* T# c( @) i
  35.                 emifa_we_n_reg      <= emifa_we_n;  T+ @# W9 `& q# Q
  36.                 emifa_wait0_reg     <= emifa_wait0;9 I; _/ f0 d5 j( `5 d6 g4 L5 I( y
  37.                 emifa_wait1_reg     <= emifa_wait1;
      W4 @. g% J8 w2 ~: w
  38.                 emifa_ba1_reg       <= emifa_ba1;1 X3 p: G( `$ j0 ^1 x" q: A# ~) Q
  39.                 emifa_addr_reg      <= emifa_addr;' A: T) ?( k. R* H2 Y1 V
  40.                 emifa_data_reg      <= emifa_data;
    - y; ]/ T( q% Z  }" ^9 X; f
  41. end$ ~) ^( c, K1 X5 U/ p

  42. ; N) k( J0 Y! }
  43. //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;
    9 ~7 y7 o/ V6 s, y
  44. assign emifa_data = dpram_douta;& J0 a' E% F% S* p" r
  45. 0 o* @; S, |6 F- L/ u( R- s# `3 x
  46. /****************Dual Port RAM****************/6 M  y3 n# j$ ]" o) L
  47. //PORTA' _0 \. M8 \. C3 [7 q  a$ E
  48. reg  [14:0]dpram_addra;      
    $ L) _8 j( S. P1 k2 ~% k9 x; v
  49. reg  dpram_wea;         
    8 X" z6 A7 v6 {4 n$ c& Y8 B4 h
  50. reg  [15:0]dpram_dina;      
    & P6 a7 [* P$ A7 y
  51. wire [15:0]dpram_douta;           
    " q- q; n  V7 b2 g( ^2 E  Q
  52. //PORTB
    ! Q$ A5 J4 J4 d: X4 C
  53. reg  [14:0]dpram_addrb;       9 P; _$ H$ l' m( t) U
  54. wire  dpram_web;
      {7 u& b5 n3 K! Z
  55. reg  [15:0]dpram_dinb;3 E  r! G1 F: W  ^' c' e* k
  56. wire [15:0]dpram_doutb; ( J4 b8 f4 ~8 J1 _4 O$ w+ h8 r
  57.    
      }6 L  p2 g/ T. M$ m
  58. //元件例化
      v' R3 P; v: Q$ A1 }
  59. dpram dpram_unit(
    2 n0 v  ~, G* S. T# p8 g* y$ L
  60.   .clka(emif_clk), // input clka
    : ]; X) k3 ^  E
  61.   .wea(dpram_wea), // input [0 : 0] wea
    % {1 d; A  L( U' }& ?2 S' h: h
  62.   .addra(dpram_addra), // input [14 : 0] addra
    , g# i$ d& g/ Q- i0 h: [
  63.   .dina(dpram_dina), // input [15 : 0] dina' \* F1 x! s) K/ v. S, I0 |
  64.   .douta(dpram_douta), // output [15 : 0] douta9 R. r: T+ f; r) R5 Q& t! R7 u
  65.         //clkb                  => sys_clk,
    % c) c1 c& B; F+ j' A7 B, p
  66.   .clkb(clk), // input clkb
    ( F/ D1 }8 _! m. c2 U) {
  67.   .web(dpram_web), // input [0 : 0] web
    , ?; F7 J6 \' b9 y/ z7 S' n
  68.   .addrb(dpram_addrb), // input [14 : 0] addrb
      ]' Y/ n7 {; t% q; @3 X5 P5 |
  69.   .dinb(dpram_dinb), // input [15 : 0] dinb# x) r5 _2 g2 Z- {4 |. o7 T7 O
  70.   .doutb(dpram_doutb));// output [15 : 0] doutb)
    $ Q) `& P( s' _+ c! E
  71. * I* z$ c2 P# u3 k3 @' ]9 C
  72. always@(emif_clk)begin7 [3 H  u% }  k- ~
  73.                 dpram_wea             <= 0;
    - x& q- {. C8 h! g
  74.                 dpram_addra           <= {emifa_addr_reg[13:0],emifa_ba1_reg};+ q4 I. @: S4 t
  75.                 dpram_dina            <= emifa_data_reg;
    . M1 s. f* U  Q# w
  76. end
    7 }0 Q( o0 P. g9 ~
  77. assign dpram_web = 1'b1;
    + E7 Q9 G( [6 a3 E+ B
  78. ! |; ^' R. Q2 |4 W
  79. always@( clk )
    $ s0 R+ f6 {4 s; I, {# h
  80. begin
    1 o5 X( m% H3 X  _4 c% P4 [
  81.         dpram_addrb  <= 100;) S, @/ G# A+ t8 e! i
  82.         dpram_dinb   <= 16'd2048;
    4 H* f5 ?6 ^+ J% Y7 Y- h
  83. end2 Z- C' Z* T  ^( {* j: ?" B
  84. # b; B3 o1 x4 j
  85. endmodule
    - K: r9 g" X3 ]/ q  E: X3 i
  86. # d6 Q- e0 t$ V
复制代码
嗯,谢谢,这个懂了,但是读出来的数还是不正确,fpga端具体代码如上。
$ z- X" S; N. B6 A( \3 B, g这段代码相当于RAM的A口只用来读,并且dpram_wea一直置零,RAM的B口用来写入一个数据。2 Z! e& }% B& K+ C" T2 l
代码下载进FPGA后,DSP端先注释掉向fpga写入数据的部分,直接读取,读取的结果都为0,包括  dpram_addrb  <= 100;这个地址下应该的2048.
& l% l  o. N" o# W; ?/ A8 {! n1 P6 [然后把注释去掉,DSP端可以正常的写入数据并且正确的读出数据,但是我的FPGA端已经将  dpram_wea             <= 0;这里置零,是没法写入的,所以对于DSP端还能照常写入读出产生疑问。
2 E' r/ l+ d* i$ b- N
" X/ n8 B6 O  P- N2 ^" M
回复 支持 反对

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

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

9 p1 V; \( J" i' HEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址2 G& M" d9 ]( Y- X/ V

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

4

主题

8

帖子

1056

积分

金牌会员

Rank: 6Rank: 6

积分
1056
地板
 楼主| 发表于 2015-4-16 22:14:25 | 只看该作者
Lewis 发表于 2015-4-16 09:558 W# E+ {; }/ W; X# b; I( N4 f
还要注意数据在FPGA存储的地址,跟dsp读的地址要对应

  U+ @4 Z* e$ Y$ [, K1 e! T# eFPGA端RAM的地址是从0开始的,DSP端地址是0x6000 0000的地址去读,请问如何映射地址?
回复 支持 反对

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

积分
1137
板凳
发表于 2015-4-16 09:55:21 | 只看该作者
还要注意数据在FPGA存储的地址,跟dsp读的地址要对应
回复 支持 反对

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

积分
1137
沙发
发表于 2015-4-16 09:51:44 | 只看该作者
只需要把(下图中)向FPGA写数据的部分注释掉就行,其他地方都不需要修改。
, n' d0 I3 P9 ]' I; |! D4 ]2 C0 c! |" j; B  e

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-6 06:26 , Processed in 0.043864 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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