嵌入式开发者社区

标题: FPGA与DSP通信问题。 [打印本页]

作者: 水瓶    时间: 2015-4-15 15:06
标题: FPGA与DSP通信问题。
1、  我现在要实现的基本功能是:一组数据给FPGA端的双口RAM,然后DSP通过EMIF读出。不需要DSP再FPGA写入数据,如何更改贵公司的例程?我的更改是:DSP端注释掉写入FPGA部分,直接读取。FPGA部分是直接在双口RAM中初始化一组数据。然后读出的数据全是0,不是直接在双口RAM中初始化的数据。请问问题出在哪里了?还望版主大侠指导。
[attach]218[/attach]4 ]$ J8 l' f6 r! `4 F) l5 g
邮箱:604285180@qq.com, X. j+ ^" ]% g2 L0 e3 l! `2 Z, G

作者: Lewis    时间: 2015-4-16 09:51
只需要把(下图中)向FPGA写数据的部分注释掉就行,其他地方都不需要修改。
" [1 g( d9 E' i6 j1 Q0 D2 f- M[attach]223[/attach]
* W, j; X( h# w! \8 c8 \
作者: Lewis    时间: 2015-4-16 09:55
还要注意数据在FPGA存储的地址,跟dsp读的地址要对应
作者: 水瓶    时间: 2015-4-16 22:14
Lewis 发表于 2015-4-16 09:55
0 r6 @: Q  b# X$ f) [还要注意数据在FPGA存储的地址,跟dsp读的地址要对应

/ ?9 o' y0 H) b/ _% ^) C4 H( K  R/ pFPGA端RAM的地址是从0开始的,DSP端地址是0x6000 0000的地址去读,请问如何映射地址?
作者: Lewis    时间: 2015-4-17 10:10
[attach]225[/attach]; Y" h5 N- \( M' }. K: N9 }. n& p$ t
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
$ B% H$ |3 O. E9 y: A
作者: 水瓶    时间: 2015-4-20 17:17
本帖最后由 水瓶 于 2015-4-20 17:24 编辑 , n, X$ E, T' L6 ~
Lewis 发表于 2015-4-17 10:10- [# r. b) O3 B! G9 h; c+ q* Z
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址% G' e2 b* h8 E0 Q9 d, Y
...
  1. `timescale 1ns / 1ps
    / F. O  D, j* t" K  R' [
  2. module emif_test
    : R, R% m3 b% I' ]
  3. (     
    3 Z% h; i  f" ]& u* a# ~
  4.    input clk,8 q( e3 e/ K) L! D5 a8 m
  5.         input    emifa_clk,    // 时钟                         ) T7 w& }3 e2 t, g, {$ _
  6.         input    emifa_cs2,    //  低电平有效异步器件使能引脚  (与异步器件片选信号相连,只在访问异步存储器时有效)      7 F+ ?8 N& \, [4 i
  7.         input    emifa_oe_n,    //  低电平有效异步器件使能引脚         
    ( H1 {) u3 }* J; F  L
  8.         input    emifa_we_n,     // 低电平有效写使能引脚       1 ^2 P- a! y; H# {
  9.         inout    emifa_wait0,    //等待输入引脚      $ O. }! I  K+ R/ f
  10.         inout    emifa_wait1,             % J! A& |& j2 q9 ]+ [* j$ j
  11.         input    emifa_ba1,         // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。            
    ! M: \/ r! P  F* y  {
  12.         input    [13:0]emifa_addr,  // EMIF 地址总线            $ H9 C0 L- J7 q" @% }$ G" p7 N5 A0 D* E
  13.         output    [15:0]emifa_data   // EMIF 数据总线
    7 a/ a  U+ i& w  ]$ ^! I
  14. );8 D0 b' H! v& X& ~0 m2 ]
  15.         
    $ F* F0 h* p8 I5 A  S8 a
  16. /****************EMIF Interface****************/        
    4 m1 D9 g' r( r: ^6 R* K) m
  17. //信号声明
    , b5 ~8 j! F# O* g( R2 Y
  18. wire emif_clk;- h8 J! K& ?1 F: }
  19. reg emifa_cs2_reg;      
    * x* E" B# Z% I6 A1 x
  20. reg emifa_rnw_reg;     * c7 l' P% f0 m0 o2 j# N
  21. reg emifa_oe_n_reg;   
    + h- ?+ J: {, z. @" @
  22. reg emifa_we_n_reg;   
    / G. r6 f# w5 @8 [" R
  23. reg emifa_wait0_reg;   3 ~5 }6 [4 p. r1 f+ @
  24. reg emifa_wait1_reg;  
    8 }$ _$ N1 @2 F
  25. reg emifa_ba1_reg;     
    9 r% }* ^' K3 L. o9 C- \+ @/ ^  s  e
  26. reg [13:0] emifa_addr_reg;      1 q9 R9 s; ^; r1 R4 t4 |
  27. reg [15:0] emifa_data_reg;
    & K* q3 z, ?8 t) j7 ^# R

  28. ; G' T0 Q5 j3 C+ {- M9 p
  29. //元件例化6 F4 i2 Q3 w  X6 L* }; g
  30. BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));
    5 d. S2 P6 l# M$ @( T! |  D
  31. //寄存器赋值  H9 U) r- J% T2 f3 q
  32. always@(posedge emif_clk)begin
    9 h; G6 _+ i1 x" N$ A( e
  33.                 emifa_cs2_reg       <= emifa_cs2;
    " K' A! O6 h. u
  34.                 emifa_oe_n_reg      <= emifa_oe_n;2 h% O7 f+ |  k2 C
  35.                 emifa_we_n_reg      <= emifa_we_n;
    * ]9 k5 ?% ~! ?. [0 ]
  36.                 emifa_wait0_reg     <= emifa_wait0;% t6 ]% K$ J8 m$ r& r/ r
  37.                 emifa_wait1_reg     <= emifa_wait1;
    . N9 a3 ?( |% T( g0 x
  38.                 emifa_ba1_reg       <= emifa_ba1;/ O+ U2 B1 z# u, {9 ]
  39.                 emifa_addr_reg      <= emifa_addr;
    8 k2 E  H( H8 T% l$ T, A9 a
  40.                 emifa_data_reg      <= emifa_data;# X. p- d4 ~/ I2 v/ J) D5 _( G# f8 ^
  41. end2 E+ {7 \. E* F3 x. U
  42. 4 \9 J: k2 Y7 X9 N/ W/ ~4 v
  43. //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;3 u2 D# |( m* h" {( E4 P, Q
  44. assign emifa_data = dpram_douta;* |0 \$ M3 Y0 o5 r: m
  45. , Q" g3 V3 w, c" |/ _$ H
  46. /****************Dual Port RAM****************/
    7 ^; j- f/ {$ M" P* {7 n
  47. //PORTA
    4 s2 z2 L! g8 h7 O
  48. reg  [14:0]dpram_addra;       2 H* Y2 i7 K  G* t  F5 i
  49. reg  dpram_wea;         
    6 u+ n* f( `' Z& O2 e' ~: `0 E! x
  50. reg  [15:0]dpram_dina;       1 i: Q; M2 R% y& v+ a
  51. wire [15:0]dpram_douta;           
    + }' d4 _0 |; _0 b2 E% B$ f# J
  52. //PORTB
    4 ]# k1 V" d: _
  53. reg  [14:0]dpram_addrb;       7 z0 `* [! {! A. j  H
  54. wire  dpram_web;; J0 v5 L5 I; A
  55. reg  [15:0]dpram_dinb;% N' f$ X2 j' ?
  56. wire [15:0]dpram_doutb; & e/ |0 R) K1 ]/ z
  57.    , }: O; t9 o, v+ f
  58. //元件例化: m$ n# C$ w% K" \- ^; O/ w; j0 V
  59. dpram dpram_unit(+ b8 m5 y2 t( k$ n- {
  60.   .clka(emif_clk), // input clka( u# ?$ Z7 [& z5 c4 @- ]8 o
  61.   .wea(dpram_wea), // input [0 : 0] wea
    & Y8 Z  I. ^+ g6 G( R* O6 @+ N4 P
  62.   .addra(dpram_addra), // input [14 : 0] addra! M, a6 u6 f5 Y+ a+ C, O
  63.   .dina(dpram_dina), // input [15 : 0] dina
    # u4 u/ T* \& b' O1 w! |# W% A
  64.   .douta(dpram_douta), // output [15 : 0] douta& X! [: H4 Z! c8 n
  65.         //clkb                  => sys_clk,; e" g* L+ L6 c" v8 v7 E
  66.   .clkb(clk), // input clkb# t/ e6 B# Q7 x; T! b# p
  67.   .web(dpram_web), // input [0 : 0] web3 t1 q- Q  V# g$ z( r& ~1 W
  68.   .addrb(dpram_addrb), // input [14 : 0] addrb
    ' i; e/ ?, j2 p" U; ^" c. r
  69.   .dinb(dpram_dinb), // input [15 : 0] dinb" [3 g5 [9 n0 w2 Q3 z8 `* a
  70.   .doutb(dpram_doutb));// output [15 : 0] doutb)
    ( T! o* ]8 k' v" [7 v. Q  m1 V

  71. 2 L* u( W) }) s
  72. always@(emif_clk)begin1 R- y7 h! {: [) u( F2 E. X/ X
  73.                 dpram_wea             <= 0;
    - P* x/ l1 W! _2 x; M
  74.                 dpram_addra           <= {emifa_addr_reg[13:0],emifa_ba1_reg};1 H* O* w4 e% g5 j0 p: J
  75.                 dpram_dina            <= emifa_data_reg;
    9 \, q" N5 y4 x; S+ s7 q
  76. end3 W. u  `6 A/ c# S4 c
  77. assign dpram_web = 1'b1;
    " i" r4 x  P% i+ t. Q
  78. % c$ h: ]) E5 |; y, b- ?3 s
  79. always@( clk )
    : _( W% ?' C4 ]9 D
  80. begin; v( P( }* p7 i: `' Z
  81.         dpram_addrb  <= 100;
    : b' \' o( f5 E# ^4 [/ K
  82.         dpram_dinb   <= 16'd2048;  V; k7 Q0 v3 o' Q7 O$ ]
  83. end2 N) V/ X/ M1 _1 H/ T) L
  84. " E, \1 C$ b( S' F9 d1 R3 U5 j
  85. endmodule
    * z7 z. e& f4 h, {5 I
  86. & i0 C% }& I: u7 e% R+ _
复制代码
嗯,谢谢,这个懂了,但是读出来的数还是不正确,fpga端具体代码如上。
8 p) f$ J% w! P5 y' r3 \+ W2 F这段代码相当于RAM的A口只用来读,并且dpram_wea一直置零,RAM的B口用来写入一个数据。
- o0 I5 Q/ Q" b4 P+ z- ]$ F代码下载进FPGA后,DSP端先注释掉向fpga写入数据的部分,直接读取,读取的结果都为0,包括  dpram_addrb  <= 100;这个地址下应该的2048.
5 U  V/ G! i# A8 m然后把注释去掉,DSP端可以正常的写入数据并且正确的读出数据,但是我的FPGA端已经将  dpram_wea             <= 0;这里置零,是没法写入的,所以对于DSP端还能照常写入读出产生疑问。2 e: `1 }9 L# f& d+ X
8 f# r' }. H6 u

作者: 水瓶    时间: 2015-4-20 17:31
Lewis 发表于 2015-4-17 10:10
9 b, w+ i+ X8 e* G, j$ ?( VEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
$ l. D: }  D$ {" N/ ^: O ...

" k- v  K: p( A* F: N) T* Z我的硬件平台是:TL138F-EasyEVM(浮点DSP C6748+ARM9 +Xilinx Spartn-6 FPGA核)
4 w  ^0 D/ X3 r: j0 H调试例程为:DSP端:EMIF_FPGA----EMIF总线FPGA读写测试$ v  T6 T  L/ c6 y1 O
                    FPGA端:emif_test
作者: 水瓶    时间: 2015-4-21 19:19
Lewis 发表于 2015-4-17 10:10
; k; h' l% ^4 {4 i, n' ^EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址% t' j# X& t( A) o, _
...
1 L9 ~" U- T! i' D* A& d
还望版主指导,卡了好多天了,原理都弄明白了,就是不知道问什么读出的数据不对。若是在您那里可以正确读取数据,还望发一份程序给我。谢谢了。
作者: jj909305    时间: 2017-8-12 10:01
楼主你好,这里你弄出来了吗?




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4