嵌入式开发者社区

标题: 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]3 r' S$ ?8 h: e0 q' Z
邮箱:604285180@qq.com. ~* H, [; M" Y9 T7 d8 x4 E- X, S

作者: Lewis    时间: 2015-4-16 09:51
只需要把(下图中)向FPGA写数据的部分注释掉就行,其他地方都不需要修改。: e& V# S  Q7 c) L: r
[attach]223[/attach]
4 L, j1 D( n3 z# o% ?
作者: Lewis    时间: 2015-4-16 09:55
还要注意数据在FPGA存储的地址,跟dsp读的地址要对应
作者: 水瓶    时间: 2015-4-16 22:14
Lewis 发表于 2015-4-16 09:55* s- A; `3 M  ^" a) B
还要注意数据在FPGA存储的地址,跟dsp读的地址要对应
. i: J- H' a- l) {0 b
FPGA端RAM的地址是从0开始的,DSP端地址是0x6000 0000的地址去读,请问如何映射地址?
作者: Lewis    时间: 2015-4-17 10:10
[attach]225[/attach]5 \  e. J& U  m5 u% ]5 X
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
2 {& N$ Z4 A. W0 I% e# o
作者: 水瓶    时间: 2015-4-20 17:17
本帖最后由 水瓶 于 2015-4-20 17:24 编辑
7 @  f) x5 W& S# E# U- w7 C
Lewis 发表于 2015-4-17 10:10
$ i+ t$ G, H3 w. {$ O& EEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
# A) a% h* c' o7 o+ ~0 ^ ...
  1. `timescale 1ns / 1ps
    ! a5 y9 t" m: `! e
  2. module emif_test# T: R: Z+ y) C6 n
  3. (       z' k% M! t3 s; m2 L- O" d
  4.    input clk,
    ( x6 x( ]1 D9 N( D& _. J
  5.         input    emifa_clk,    // 时钟                        
    6 Y+ y8 F5 b. w! ]0 Z
  6.         input    emifa_cs2,    //  低电平有效异步器件使能引脚  (与异步器件片选信号相连,只在访问异步存储器时有效)      
    ; u9 [$ E- i4 B: k# n( d
  7.         input    emifa_oe_n,    //  低电平有效异步器件使能引脚          2 Q6 i, a: I' s- m5 D& V4 Q/ u
  8.         input    emifa_we_n,     // 低电平有效写使能引脚      
    ; `- _/ h' z6 x' X0 _2 _
  9.         inout    emifa_wait0,    //等待输入引脚      
    1 M; E( V0 }  m6 ?9 Z' |$ N
  10.         inout    emifa_wait1,            
    . G% z' g" c3 q5 y7 y4 U( y5 [; z" a
  11.         input    emifa_ba1,         // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。            
    0 P/ |- e- F6 Z9 \5 v9 _
  12.         input    [13:0]emifa_addr,  // EMIF 地址总线            
    , U# {- W8 H) O; B% ~
  13.         output    [15:0]emifa_data   // EMIF 数据总线
    ( F4 x$ A9 ?; Q1 j7 O9 m+ m& X. H
  14. );
    5 K" l1 @) `1 i" O' ]
  15.           L/ g. q6 |1 H4 W& c0 Y" W
  16. /****************EMIF Interface****************/        ! o7 P5 C% e) P0 N  F
  17. //信号声明
    8 [. a& U" S# L* b9 b5 p
  18. wire emif_clk;9 @, C! A1 C0 Y; x) C/ z' L2 q
  19. reg emifa_cs2_reg;      
    ) @9 v  T* f$ j: t! T
  20. reg emifa_rnw_reg;     
    / o) p) N3 G0 C! S$ Q; ^
  21. reg emifa_oe_n_reg;   
    * h" ^2 N. D+ E% e! @& @
  22. reg emifa_we_n_reg;    5 H8 r, `* E' J( e* n. O) x: D, V" `
  23. reg emifa_wait0_reg;   # V6 X! e' I2 h! u8 Q
  24. reg emifa_wait1_reg;  % l  M/ E* }, w: k9 T
  25. reg emifa_ba1_reg;     1 D1 y6 M$ Q- U
  26. reg [13:0] emifa_addr_reg;      4 D, ?% ]1 |, O1 }  w5 Z7 @8 G
  27. reg [15:0] emifa_data_reg;
    1 v: w" ^; u: w9 i& |( H" g

  28. : m+ k, c! V' S' \8 w
  29. //元件例化: y. E. N3 ]" V+ V  H5 x
  30. BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));9 s, V5 w* I2 Q$ l. z( l
  31. //寄存器赋值  I% p5 B/ h2 J
  32. always@(posedge emif_clk)begin1 d" o9 }) b4 c
  33.                 emifa_cs2_reg       <= emifa_cs2;
    9 B% N: g% T' O( `7 @: N! {& U& i
  34.                 emifa_oe_n_reg      <= emifa_oe_n;
    4 o6 O$ _4 K) L1 Q( V; }
  35.                 emifa_we_n_reg      <= emifa_we_n;
    2 z# z- O2 e# F% h  R8 ?
  36.                 emifa_wait0_reg     <= emifa_wait0;0 l2 x7 ^! D3 c5 q0 o
  37.                 emifa_wait1_reg     <= emifa_wait1;1 |& M) r. o- V) v; b6 w- f
  38.                 emifa_ba1_reg       <= emifa_ba1;
    9 U& n2 W; `" E2 g2 }2 J% G
  39.                 emifa_addr_reg      <= emifa_addr;1 i# w: z& D/ k2 f  k! ?% D2 B2 a
  40.                 emifa_data_reg      <= emifa_data;
    * m& \2 T" g5 d* s, W+ N
  41. end7 V+ _% ~1 ]! {4 @2 k8 C- x
  42. $ W0 b! J7 T; o# Y& R3 y
  43. //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;8 V8 S* ^8 d2 `. ~
  44. assign emifa_data = dpram_douta;2 P! ~- E5 R+ A7 W

  45. * \( b2 {$ o; q' z
  46. /****************Dual Port RAM****************/
    2 T7 i6 I, m5 \" b! ?/ |
  47. //PORTA
    3 @4 K  b% n# [8 K& _' z/ f
  48. reg  [14:0]dpram_addra;       ( R: z6 @: t* H( ?4 K9 ~9 I
  49. reg  dpram_wea;         
    ) z% Y7 A( H+ P
  50. reg  [15:0]dpram_dina;       ! \7 G1 m7 f% ~" [  Z
  51. wire [15:0]dpram_douta;           ; w6 c3 N5 r& q  H- g* A
  52. //PORTB
    3 _1 [, U! N3 z9 [
  53. reg  [14:0]dpram_addrb;      
    ; H1 e* p* e! U& F$ |
  54. wire  dpram_web;1 P* N! X2 i9 ?! o% F9 q, Z
  55. reg  [15:0]dpram_dinb;
    " b( s* `. W% c/ D( x1 U
  56. wire [15:0]dpram_doutb;
    9 Q' r0 ^$ y- z7 F3 G* v( I
  57.    
    / w) u# J4 h; P8 M" g
  58. //元件例化$ I( ^8 W9 a( h8 y; B
  59. dpram dpram_unit(, x+ o! N! C: B
  60.   .clka(emif_clk), // input clka  I6 e" x+ r0 W9 z& Q( [8 ?
  61.   .wea(dpram_wea), // input [0 : 0] wea
    4 s4 e- W3 W8 N+ P9 K4 W: V5 L
  62.   .addra(dpram_addra), // input [14 : 0] addra( j  o6 q6 z' x
  63.   .dina(dpram_dina), // input [15 : 0] dina7 i+ k. ~( |! k4 Y: p+ J7 B2 w6 ^! z
  64.   .douta(dpram_douta), // output [15 : 0] douta
    : C2 J) F# a( x$ K! i/ T8 P5 ~  a: {
  65.         //clkb                  => sys_clk,/ I- E+ t) B/ E1 d8 \5 e3 K9 N
  66.   .clkb(clk), // input clkb( V/ D" L+ b) K6 c1 O/ x4 ^* D, D
  67.   .web(dpram_web), // input [0 : 0] web, O: E: H; C/ P5 [
  68.   .addrb(dpram_addrb), // input [14 : 0] addrb2 a/ ~  K0 V- I+ L
  69.   .dinb(dpram_dinb), // input [15 : 0] dinb
    * U1 I4 L* Q3 c% I8 K; m0 i2 u
  70.   .doutb(dpram_doutb));// output [15 : 0] doutb)
    " b+ V; L& \# M+ i( z8 h( W
  71. ) M8 u2 u& q3 d8 n
  72. always@(emif_clk)begin5 [6 k8 L+ \2 g8 [7 N& v, z
  73.                 dpram_wea             <= 0;
      T5 B9 b9 P  c* j( Y5 t
  74.                 dpram_addra           <= {emifa_addr_reg[13:0],emifa_ba1_reg};( R! I; _6 W; d$ `
  75.                 dpram_dina            <= emifa_data_reg;1 k+ T6 B% ^( Q7 r; w- {% [
  76. end
    # z# y- X0 U% S6 o
  77. assign dpram_web = 1'b1;9 d: N5 J, X5 x( r$ X) q1 S5 ^

  78. & e1 `6 e. g/ m
  79. always@( clk )
    + V# [) ?# l+ {& Y; T6 ?8 E
  80. begin
    * A3 D8 S% ]- Y
  81.         dpram_addrb  <= 100;7 M5 _0 m9 r# x! Q; P
  82.         dpram_dinb   <= 16'd2048;+ W  t9 q4 a$ f$ n1 n- @  g" {
  83. end$ _3 b  c' }; W5 s6 H' L

  84. * o* q4 v& z( F4 T+ n8 w1 T: ^; x
  85. endmodule0 `# B: b# r; A( Y: F

  86. * D1 o: K' }. I* o/ h0 a
复制代码
嗯,谢谢,这个懂了,但是读出来的数还是不正确,fpga端具体代码如上。
; L# j. `9 A, J! \7 q这段代码相当于RAM的A口只用来读,并且dpram_wea一直置零,RAM的B口用来写入一个数据。
, T# ], e, n9 \' T4 U代码下载进FPGA后,DSP端先注释掉向fpga写入数据的部分,直接读取,读取的结果都为0,包括  dpram_addrb  <= 100;这个地址下应该的2048.$ q/ G7 ~/ N/ S) @
然后把注释去掉,DSP端可以正常的写入数据并且正确的读出数据,但是我的FPGA端已经将  dpram_wea             <= 0;这里置零,是没法写入的,所以对于DSP端还能照常写入读出产生疑问。
: e: C4 k6 z) }# _3 U8 Z. e8 u" S+ \, c& `1 g8 t7 p) Y8 h

作者: 水瓶    时间: 2015-4-20 17:31
Lewis 发表于 2015-4-17 10:10! R, x7 F" H5 o1 `, D8 z) f( ?+ T
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
- w, b1 h2 |) i ...

- [; \& a9 X$ h6 ]! I1 {+ ^我的硬件平台是:TL138F-EasyEVM(浮点DSP C6748+ARM9 +Xilinx Spartn-6 FPGA核)
% s+ P/ m+ ^2 |调试例程为:DSP端:EMIF_FPGA----EMIF总线FPGA读写测试
* e/ u6 e0 S: G! R6 J                    FPGA端:emif_test
作者: 水瓶    时间: 2015-4-21 19:19
Lewis 发表于 2015-4-17 10:10
$ s9 f- I; @3 {" p4 o. yEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF  其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址! v8 N) K: l% ]
...

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




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