嵌入式开发者社区

标题: 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]5 [2 |$ O  x+ Y
邮箱:604285180@qq.com
$ ?1 V; S$ i+ c$ x: x8 ^7 n5 {
作者: Lewis    时间: 2015-4-16 09:51
只需要把(下图中)向FPGA写数据的部分注释掉就行,其他地方都不需要修改。4 U9 z5 o% `2 i- i8 q) A; J
[attach]223[/attach]
% T- |+ \+ E, t- ~! e
作者: Lewis    时间: 2015-4-16 09:55
还要注意数据在FPGA存储的地址,跟dsp读的地址要对应
作者: 水瓶    时间: 2015-4-16 22:14
Lewis 发表于 2015-4-16 09:55
7 |+ d; _0 U2 ^还要注意数据在FPGA存储的地址,跟dsp读的地址要对应
. {2 {! c& H  h; A$ u$ @$ a
FPGA端RAM的地址是从0开始的,DSP端地址是0x6000 0000的地址去读,请问如何映射地址?
作者: Lewis    时间: 2015-4-17 10:10
[attach]225[/attach]
/ J' r+ c  Z/ d( u' z7 XEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
; j* t. |' v0 l6 e+ r3 r
作者: 水瓶    时间: 2015-4-20 17:17
本帖最后由 水瓶 于 2015-4-20 17:24 编辑
) _7 o$ t( \9 @, \& I
Lewis 发表于 2015-4-17 10:107 x- j# Q- {* T% O4 R1 [
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
' M: s- C4 T) ~5 ~+ t2 c ...
  1. `timescale 1ns / 1ps4 d/ f* a- z* o) p0 A% s$ J
  2. module emif_test
    - f/ O3 E3 ~6 v; o( H! [
  3. (     2 S4 z3 S/ K. r: W$ y# f
  4.    input clk,
    * b1 i" t& q  R# E  }, A1 o
  5.         input    emifa_clk,    // 时钟                        
    % t- H8 \" n- H8 g
  6.         input    emifa_cs2,    //  低电平有效异步器件使能引脚  (与异步器件片选信号相连,只在访问异步存储器时有效)      
    0 B/ o- c( ^. s/ t
  7.         input    emifa_oe_n,    //  低电平有效异步器件使能引脚          6 A! S# L# x+ Z6 q/ _
  8.         input    emifa_we_n,     // 低电平有效写使能引脚      
    . m# B1 l9 i/ a' y' S9 ]7 {
  9.         inout    emifa_wait0,    //等待输入引脚      . d& L/ N; g. Z1 S* @/ H
  10.         inout    emifa_wait1,             ; Q$ J6 x$ A8 s" h4 C* ~; Z/ x
  11.         input    emifa_ba1,         // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。            + J) H6 D9 r9 X# y7 p6 |
  12.         input    [13:0]emifa_addr,  // EMIF 地址总线            
    * N* k6 J/ _$ s1 Y3 h, P0 N
  13.         output    [15:0]emifa_data   // EMIF 数据总线
    ) y7 M: Z% h' K5 E% o# b6 b+ k
  14. );
    / Z! O4 z2 S. X( d9 G3 V4 I& O
  15.         ) F8 h! ?- c2 S$ `
  16. /****************EMIF Interface****************/        7 P! ?5 Z( w( X
  17. //信号声明
    * W* W6 ^& i- ~& Q
  18. wire emif_clk;
    - z4 V: E: ?# `2 z& {0 S9 O  n
  19. reg emifa_cs2_reg;      
    2 f' o: |/ d6 x2 _8 Q0 o
  20. reg emifa_rnw_reg;     * m# L; X$ S3 v+ h- `8 H" V
  21. reg emifa_oe_n_reg;    2 H2 D% X+ r9 `
  22. reg emifa_we_n_reg;    % g1 h4 M# m" `& a
  23. reg emifa_wait0_reg;   
    ' S6 \. I7 o6 K0 g
  24. reg emifa_wait1_reg;  
    , U* l6 |' g0 o+ ]7 f" H- I. {
  25. reg emifa_ba1_reg;     
    8 B  @7 U6 v0 @6 a) E4 b3 J
  26. reg [13:0] emifa_addr_reg;      
    # d5 L/ \, j, v2 ~+ W% V9 n
  27. reg [15:0] emifa_data_reg;
    % M9 a; v2 U% M# c
  28. & }2 q+ V5 h5 D' g
  29. //元件例化
    ) a/ M7 b* W' b5 h, S8 n- M
  30. BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));( j* r- o/ R, H1 r) Z" e
  31. //寄存器赋值: k% M! ~4 R* `8 r
  32. always@(posedge emif_clk)begin
    ; w3 i& I6 \8 {- Q% R
  33.                 emifa_cs2_reg       <= emifa_cs2;2 C- M; f* v/ U% v
  34.                 emifa_oe_n_reg      <= emifa_oe_n;; Y. F3 y# G4 ^, Z) ^* g
  35.                 emifa_we_n_reg      <= emifa_we_n;
    * q" J8 Y5 S: `2 \) L
  36.                 emifa_wait0_reg     <= emifa_wait0;
    # i& k2 T( X; `
  37.                 emifa_wait1_reg     <= emifa_wait1;2 e3 y$ [6 v& K  K
  38.                 emifa_ba1_reg       <= emifa_ba1;
    ) W' o4 F2 g2 ?$ L
  39.                 emifa_addr_reg      <= emifa_addr;7 X- j) |& T/ p  y# a
  40.                 emifa_data_reg      <= emifa_data;
    6 D1 [5 ?5 I8 f2 d+ p" R
  41. end' c* \3 w; R( @9 w  W

  42.   T# }! [4 ?; d$ ~  Z0 Y# Z6 ~: X
  43. //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;
    5 u* J7 }) G$ }* a1 v8 k, g/ Q
  44. assign emifa_data = dpram_douta;4 S% H+ g. v& X0 c( D
  45. ! }) \- j( X- u0 K# l0 b; }
  46. /****************Dual Port RAM****************/: Q9 _  F6 H9 L  D( Z; b7 W
  47. //PORTA
    ' P$ r" t5 l4 k% Z  W7 ~' c
  48. reg  [14:0]dpram_addra;       + e3 K# g/ F' q! D5 q! R$ `* I6 u' N
  49. reg  dpram_wea;         / \0 @. [% g" K. b  G- @% J( F: ]
  50. reg  [15:0]dpram_dina;       * k8 l* P& |: V  H6 l9 y
  51. wire [15:0]dpram_douta;           
      B* m# I$ [1 m
  52. //PORTB7 L8 M5 f9 a/ `2 N6 ~' C9 `
  53. reg  [14:0]dpram_addrb;       % O5 N. B3 M, e) J- o4 q
  54. wire  dpram_web;: s; D9 U! d$ i( i" B& U% f; h* r1 ?
  55. reg  [15:0]dpram_dinb;
    , W0 \4 ~: U  g4 g# J1 o+ v
  56. wire [15:0]dpram_doutb;
    % E0 P+ s) t8 ?4 x: [
  57.    . r6 v  c! f4 i5 u
  58. //元件例化4 N! S' J5 D! r4 \( T) `
  59. dpram dpram_unit(
    & m% [+ F& x! b/ R8 W# Z
  60.   .clka(emif_clk), // input clka
    , h  D) Y5 T, ]! _8 I( j$ r2 n
  61.   .wea(dpram_wea), // input [0 : 0] wea2 f) D, q# S+ [5 X
  62.   .addra(dpram_addra), // input [14 : 0] addra
    # Q7 `! e  d0 G: H) K7 F9 \6 d" w# @1 U% r
  63.   .dina(dpram_dina), // input [15 : 0] dina& }# |! o: J0 r7 F2 {' I- z3 z
  64.   .douta(dpram_douta), // output [15 : 0] douta
    5 h/ L; }8 W1 r4 M7 F* q  W) N
  65.         //clkb                  => sys_clk,( R9 |9 \" I3 v- W$ p
  66.   .clkb(clk), // input clkb
    9 D/ @  o- c8 H4 U1 ^2 m
  67.   .web(dpram_web), // input [0 : 0] web9 c* R. R6 ]/ z- U" O4 b
  68.   .addrb(dpram_addrb), // input [14 : 0] addrb9 b  Z/ N! C. B+ ?
  69.   .dinb(dpram_dinb), // input [15 : 0] dinb4 B  [( j' d# }6 j. i, B
  70.   .doutb(dpram_doutb));// output [15 : 0] doutb)  v% B- e1 ?' k; [6 K, Z9 @
  71. , f5 b' u- a! C4 n, g
  72. always@(emif_clk)begin/ e% j, `5 F' u0 Y- E, D* {8 ?
  73.                 dpram_wea             <= 0;- ]3 V/ }" B( O: Z
  74.                 dpram_addra           <= {emifa_addr_reg[13:0],emifa_ba1_reg};
    2 z& ]" X- Y/ ^
  75.                 dpram_dina            <= emifa_data_reg;
    5 m4 o: o9 p* g8 |" D
  76. end0 @8 q" F- \) c
  77. assign dpram_web = 1'b1;5 N* l6 G( R9 {

  78. 2 k2 ~- ~* r3 N* G+ N  O
  79. always@( clk )2 q# W9 U5 ?  F
  80. begin
    ; R3 q  k  H) l/ M
  81.         dpram_addrb  <= 100;
    . a4 f8 }3 y) _$ W* h1 p
  82.         dpram_dinb   <= 16'd2048;
    . t% T: p( m7 ^1 i% m& y3 Q
  83. end. y, Y, Y! W1 }1 S9 h* x% m9 m

  84. $ i, }0 C0 q' H% c) C; I  f
  85. endmodule* {. {. j* x3 A9 `
  86. ) `# c' L+ q$ J* d
复制代码
嗯,谢谢,这个懂了,但是读出来的数还是不正确,fpga端具体代码如上。8 G0 u  J' o4 z* O
这段代码相当于RAM的A口只用来读,并且dpram_wea一直置零,RAM的B口用来写入一个数据。$ h$ l, ?- M- F, l5 C
代码下载进FPGA后,DSP端先注释掉向fpga写入数据的部分,直接读取,读取的结果都为0,包括  dpram_addrb  <= 100;这个地址下应该的2048.; {. B& P+ x/ V/ m! r, U" D
然后把注释去掉,DSP端可以正常的写入数据并且正确的读出数据,但是我的FPGA端已经将  dpram_wea             <= 0;这里置零,是没法写入的,所以对于DSP端还能照常写入读出产生疑问。
, y  U! B6 ~- Y# l% R+ z' E  T, E/ s3 s1 F4 P" r( g7 F

作者: 水瓶    时间: 2015-4-20 17:31
Lewis 发表于 2015-4-17 10:10) x  Z  \) x9 `- L9 G
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址" D. X: a$ @8 Y3 F6 i
...

( r6 Q& n' f% W! @  p5 o7 o我的硬件平台是:TL138F-EasyEVM(浮点DSP C6748+ARM9 +Xilinx Spartn-6 FPGA核)5 Y+ C; d& }' a
调试例程为:DSP端:EMIF_FPGA----EMIF总线FPGA读写测试. ?$ \3 N% G( @; ?8 \7 N
                    FPGA端:emif_test
作者: 水瓶    时间: 2015-4-21 19:19
Lewis 发表于 2015-4-17 10:10
* f/ ^, C9 x! qEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
$ ~# I4 G  N9 y9 X6 A, i' d; m ...

; k# Q$ ^9 W. y还望版主指导,卡了好多天了,原理都弄明白了,就是不知道问什么读出的数据不对。若是在您那里可以正确读取数据,还望发一份程序给我。谢谢了。
作者: jj909305    时间: 2017-8-12 10:01
楼主你好,这里你弄出来了吗?




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