嵌入式开发者社区
标题: 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]7 _% [1 v4 d8 z
邮箱:604285180@qq.com
}: I' O& J" `& v; |: ~
作者: Lewis 时间: 2015-4-16 09:51
只需要把(下图中)向FPGA写数据的部分注释掉就行,其他地方都不需要修改。& B" A9 ?5 K* a& R8 {
[attach]223[/attach] S) V- ^$ o+ e7 [2 d4 r- L2 R5 H
作者: Lewis 时间: 2015-4-16 09:55
还要注意数据在FPGA存储的地址,跟dsp读的地址要对应
作者: 水瓶 时间: 2015-4-16 22:14
) C) a- {' d" r; uFPGA端RAM的地址是从0开始的,DSP端地址是0x6000 0000的地址去读,请问如何映射地址?
作者: Lewis 时间: 2015-4-17 10:10
[attach]225[/attach]4 i/ V. ?+ Q2 _
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF 其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
% N( m. ]8 i% }9 @5 }* L
作者: 水瓶 时间: 2015-4-20 17:17
本帖最后由 水瓶 于 2015-4-20 17:24 编辑
6 H4 f' J9 O0 S. ^8 \$ wLewis 发表于 2015-4-17 10:10# v3 h7 ]1 R% G; o0 j
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF 其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
4 {5 ]) D, F9 M ...
- `timescale 1ns / 1ps! z3 C9 G+ K+ H' k: I- M
- module emif_test
* B; K3 K# y& b: H* v; C - ( + \/ ~' S S3 F$ Y& h
- input clk,
2 c7 w2 G2 e' @( w* N9 ] - input emifa_clk, // 时钟
}: v: J6 x0 n& c& b8 X/ P - input emifa_cs2, // 低电平有效异步器件使能引脚 (与异步器件片选信号相连,只在访问异步存储器时有效)
+ n1 F/ Y3 P# l: N' {3 X - input emifa_oe_n, // 低电平有效异步器件使能引脚
* `: Q( m( a$ @; p+ p2 z2 B( p1 A - input emifa_we_n, // 低电平有效写使能引脚 7 P+ X' G7 n/ n. j$ N5 z) q( p9 J
- inout emifa_wait0, //等待输入引脚 , y6 x/ A/ m$ k( Y9 q% ]
- inout emifa_wait1,
0 Z! i! B$ |! z! p/ Q9 T - input emifa_ba1, // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。 7 R$ @. y+ h3 g4 I
- input [13:0]emifa_addr, // EMIF 地址总线
3 N7 ?/ A% t+ x/ l2 ~( D l- H - output [15:0]emifa_data // EMIF 数据总线
2 Z: M6 y k7 p - );# B0 s' ^4 ^3 h w/ \
-
# B. a" S6 B' Z) E$ z1 ^ - /****************EMIF Interface****************/ * q3 v3 t$ \3 I9 v* b
- //信号声明7 T, e. m6 v4 P. V
- wire emif_clk;
% Y; f# A0 K3 p - reg emifa_cs2_reg; 7 P& A$ h' ^& @- h1 @
- reg emifa_rnw_reg;
4 {. e, {. B! a. H - reg emifa_oe_n_reg; . R0 v; h" H) q) u, b# j7 J
- reg emifa_we_n_reg;
3 f0 ^ i1 P, @/ F/ b+ ~ - reg emifa_wait0_reg;
4 Q$ s6 w; \% W' N% ^ - reg emifa_wait1_reg;
- u8 ~- z, [# f) E6 M5 z - reg emifa_ba1_reg;
% ^% e# e. j" V; \2 k - reg [13:0] emifa_addr_reg;
9 G8 {* k8 I4 ~+ ]% B1 H# n+ x. X/ | - reg [15:0] emifa_data_reg;
% m5 V5 Z; z: L p5 Z- j) V1 d& ~& p6 n
; Z1 q; q, o4 q9 y5 q4 Q# Y- //元件例化
& U. [6 k8 S5 D. C; e+ o+ o3 J8 R - BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));
$ {- D* q* x9 K( @7 ]( @: ? - //寄存器赋值
( O( G( |7 [* L& `# f6 n% _: X - always@(posedge emif_clk)begin3 c2 L8 A0 p2 C# e$ i- F
- emifa_cs2_reg <= emifa_cs2;; Y( \ H' f) E1 V) ^
- emifa_oe_n_reg <= emifa_oe_n;% m" r' N: X# S
- emifa_we_n_reg <= emifa_we_n;
. x3 B% G- q7 {+ X9 B - emifa_wait0_reg <= emifa_wait0;
" L: B2 f! |) g% p: g" P- x - emifa_wait1_reg <= emifa_wait1;3 l' A2 s9 @2 L$ }3 C
- emifa_ba1_reg <= emifa_ba1;
/ l' W, j ?! V; P( L+ c' _ - emifa_addr_reg <= emifa_addr;' U6 K! P, m7 K, c
- emifa_data_reg <= emifa_data;- y. W% X5 q7 N/ W
- end+ i; e" e ]5 a9 |3 F7 A H
- 4 l3 H$ x* W& j+ v/ T; z. d
- //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;
3 J1 ?- M$ R+ ^. [ - assign emifa_data = dpram_douta;
( k- w# t, z8 \ A/ U- H0 ]
+ O, q N7 r/ W% J2 @- /****************Dual Port RAM****************/
* x$ h" k# j: G% N! a; V - //PORTA
* h6 C5 Y2 y9 F* B% L$ f# N - reg [14:0]dpram_addra; $ L8 c4 `( v2 i
- reg dpram_wea;
2 A4 `+ s. n e+ \ - reg [15:0]dpram_dina; / J5 h9 X" X2 c* o z7 @
- wire [15:0]dpram_douta; - \: o! ]" {3 V: y: M/ N7 b4 p
- //PORTB2 { k5 q! `7 v7 F
- reg [14:0]dpram_addrb; / K, P! {( L, N9 A) Q. G5 K9 l6 ]7 @
- wire dpram_web;+ p/ M, o) ? Y3 ~2 {3 [
- reg [15:0]dpram_dinb;$ i+ `5 Q; k" q( g' p
- wire [15:0]dpram_doutb; ' Y. Y( j1 f& B5 A! t: c- P3 u1 l5 K
- ) Q: ~" R/ H, ^8 R8 b$ ]5 |
- //元件例化
) d; h# |2 f W1 W5 | - dpram dpram_unit(
; I7 V: n# g) n5 P; O: X2 b5 j - .clka(emif_clk), // input clka( w1 Y% O0 F3 B/ r" P6 c
- .wea(dpram_wea), // input [0 : 0] wea
- u6 i$ {8 @# a" G+ ~! b. l - .addra(dpram_addra), // input [14 : 0] addra
1 v: y6 K7 B# _3 O' J - .dina(dpram_dina), // input [15 : 0] dina. g0 R3 S: k1 o# X3 }( g
- .douta(dpram_douta), // output [15 : 0] douta7 r1 H5 ^5 A5 d5 |! u4 G8 p( y
- //clkb => sys_clk,. V4 U" \- E3 Q L( V
- .clkb(clk), // input clkb; z, s- {4 F) W# d$ O1 n3 d1 M6 v
- .web(dpram_web), // input [0 : 0] web C- d6 `: @; ^: t
- .addrb(dpram_addrb), // input [14 : 0] addrb
; i: }" d) I& ^8 J9 _ - .dinb(dpram_dinb), // input [15 : 0] dinb7 C9 v" m+ z( _; X* n- R! @
- .doutb(dpram_doutb));// output [15 : 0] doutb)9 M% u+ A& I Z: o
& |6 L$ f$ A& a: v; {0 V- always@(emif_clk)begin0 e$ j. ?: k7 {
- dpram_wea <= 0;
4 P5 B& O0 O. Y& }- [. x - dpram_addra <= {emifa_addr_reg[13:0],emifa_ba1_reg};
7 G. \& t" y* @' Z - dpram_dina <= emifa_data_reg;
) Q d# }* e7 i. J1 F1 m - end
, F" R/ J( Z* X" K - assign dpram_web = 1'b1;6 b1 P4 y; T2 j( [9 D) a; G% s
. C; `* u$ e7 C0 P0 O! m$ w+ s& j- always@( clk )
) A1 T- M' _) t - begin; p' A' t- V, R4 H K4 b1 N7 t6 q
- dpram_addrb <= 100;* r/ ^0 t V# H# [ `7 {$ g
- dpram_dinb <= 16'd2048;, x R! p/ Z" `0 C
- end3 ]$ B' m- w" q. Y2 G2 y& ?. {/ a2 {$ @
7 E+ _: Z' S1 F: C; B4 @' S' [- endmodule d* N5 ^2 ^/ _: B
- $ t* a4 E- @, A0 r9 @
复制代码 嗯,谢谢,这个懂了,但是读出来的数还是不正确,fpga端具体代码如上。
! F" p( B; }$ S0 X1 R9 v这段代码相当于RAM的A口只用来读,并且dpram_wea一直置零,RAM的B口用来写入一个数据。( d' g8 u: K6 S; W) z
代码下载进FPGA后,DSP端先注释掉向fpga写入数据的部分,直接读取,读取的结果都为0,包括 dpram_addrb <= 100;这个地址下应该的2048.
# i. b7 R% j3 b* r9 g然后把注释去掉,DSP端可以正常的写入数据并且正确的读出数据,但是我的FPGA端已经将 dpram_wea <= 0;这里置零,是没法写入的,所以对于DSP端还能照常写入读出产生疑问。
& v. R& D. `# J) j+ t% ?+ \9 b, F% H B z, n
作者: 水瓶 时间: 2015-4-20 17:31
Lewis 发表于 2015-4-17 10:10
0 c6 y& l8 G5 Q' y$ fEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF 其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
* x' |1 X% I* H' B8 ^9 f ...
- j9 P& ?8 u8 ^8 [$ ^6 K$ C我的硬件平台是:TL138F-EasyEVM(浮点DSP C6748+ARM9 +Xilinx Spartn-6 FPGA核)* z$ C' ?/ K" z( z
调试例程为:DSP端:EMIF_FPGA----EMIF总线FPGA读写测试, n8 v. x K Z% T. j& b; u2 F
FPGA端:emif_test
作者: 水瓶 时间: 2015-4-21 19:19
Lewis 发表于 2015-4-17 10:10
+ X* O# n' g, C" k( b! MEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF 其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址" X- i }# [( ?
...
' H+ ]* S: p1 o9 R8 f
还望版主指导,卡了好多天了,原理都弄明白了,就是不知道问什么读出的数据不对。若是在您那里可以正确读取数据,还望发一份程序给我。谢谢了。
作者: jj909305 时间: 2017-8-12 10:01
楼主你好,这里你弄出来了吗?
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |