嵌入式开发者社区
标题: 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]! I& i$ I+ l+ k
邮箱:604285180@qq.com
5 {- |& w. K: m4 v [2 p; x9 K
作者: Lewis 时间: 2015-4-16 09:51
只需要把(下图中)向FPGA写数据的部分注释掉就行,其他地方都不需要修改。6 B% E" j* g) Y. C6 v' u
[attach]223[/attach]
( p- d* T2 N s
作者: Lewis 时间: 2015-4-16 09:55
还要注意数据在FPGA存储的地址,跟dsp读的地址要对应
作者: 水瓶 时间: 2015-4-16 22:14
! y" r1 C: }* ?8 Z- J9 d0 R
FPGA端RAM的地址是从0开始的,DSP端地址是0x6000 0000的地址去读,请问如何映射地址?
作者: Lewis 时间: 2015-4-17 10:10
[attach]225[/attach]
9 [' L6 K& z0 E+ `: S( }- uEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF 其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址5 o! v& }% x" U+ k
作者: 水瓶 时间: 2015-4-20 17:17
本帖最后由 水瓶 于 2015-4-20 17:24 编辑
* k" ~- w; k: r! NLewis 发表于 2015-4-17 10:10. }5 v4 }- A* J
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF 其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
" q- D2 I8 ?; h H ...
- `timescale 1ns / 1ps% w6 v' B9 B2 h8 S, B4 |
- module emif_test
0 F! m, _# |! v! a. m6 p8 U% K) l" r - ( , W5 Z6 @( y/ d1 E3 C
- input clk,6 {# w6 R/ g# N5 h* i6 X
- input emifa_clk, // 时钟 8 }1 e2 l @" c! f4 k6 H) P
- input emifa_cs2, // 低电平有效异步器件使能引脚 (与异步器件片选信号相连,只在访问异步存储器时有效) 1 e! o; a7 D0 L
- input emifa_oe_n, // 低电平有效异步器件使能引脚
& l( j b& B' x! v - input emifa_we_n, // 低电平有效写使能引脚
) l: X( o9 P! z$ P# \" O - inout emifa_wait0, //等待输入引脚
" h; V( ~3 g. s! L! J* r- ] - inout emifa_wait1, , ]% ^$ W) `% Y: ^- ?4 m
- input emifa_ba1, // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。 % }8 d* D- g i3 Q f& E
- input [13:0]emifa_addr, // EMIF 地址总线 # @" i: i3 E& ~3 B! A F3 r; \
- output [15:0]emifa_data // EMIF 数据总线4 D$ c* O C5 f/ c" v5 t
- );, }/ F/ O4 R" `2 i* U
- # D t2 U0 R- {' Q! p
- /****************EMIF Interface****************/
0 E( ?2 q8 S! l8 F4 Z - //信号声明
2 _* N" g# u/ E9 m - wire emif_clk;
7 e, b( w5 O5 { t+ _- T - reg emifa_cs2_reg; 6 r3 j8 u8 a1 \
- reg emifa_rnw_reg; ; V* ^) b# h1 q& [: I$ P
- reg emifa_oe_n_reg;
$ D; H7 N. ?% ~1 l0 E - reg emifa_we_n_reg;
- L5 x) L5 B9 ~5 X" B - reg emifa_wait0_reg;
- B$ I# ?. C4 q3 \' I" F - reg emifa_wait1_reg;
& h F$ ^( K ~ - reg emifa_ba1_reg; 8 |# L- j3 |7 k. W5 n! X- @
- reg [13:0] emifa_addr_reg;
4 _; c) ]& Y# ^0 x3 \; X - reg [15:0] emifa_data_reg; 0 s0 h3 v% a$ p/ e* ^
) l" j; _& t6 O( M8 {- //元件例化! \: R# m6 b$ k# y6 e
- BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));6 J( `) E. \# F2 M
- //寄存器赋值 i3 g9 O6 z1 a
- always@(posedge emif_clk)begin
1 {' r) [# G+ O4 R1 S/ J& [ - emifa_cs2_reg <= emifa_cs2;
* v/ h9 d% D) n( Y1 l& @8 S2 i - emifa_oe_n_reg <= emifa_oe_n;
! A8 N6 \% n# K6 A - emifa_we_n_reg <= emifa_we_n; k g* `# _+ ]2 f: X% c7 w
- emifa_wait0_reg <= emifa_wait0;3 R% J9 x F0 m
- emifa_wait1_reg <= emifa_wait1;+ [2 U5 o) c' x
- emifa_ba1_reg <= emifa_ba1;0 M* `! i4 k9 V3 A
- emifa_addr_reg <= emifa_addr;1 [- h, a, G4 ~; Q: D9 d, m
- emifa_data_reg <= emifa_data;5 O: n* I0 M( I& J; S K
- end
" j X s! C2 H; A% | Y7 S/ e - ) b6 p' O* U& h5 M
- //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;( b. O% T: L9 r: M& c& g/ t- B
- assign emifa_data = dpram_douta;
9 x! N# F3 V3 @( H! _: v ]- W - . I1 r) f9 V I! u
- /****************Dual Port RAM****************/: Y8 v9 |- q/ M! [/ Z
- //PORTA( Y# N9 A( `% a, K& }8 o/ {
- reg [14:0]dpram_addra; ( G) Q8 k @; p. r- ]1 O# q5 T+ @
- reg dpram_wea; , i9 {3 S; i4 a$ l
- reg [15:0]dpram_dina;
# o( ~1 z0 \5 F1 @- A - wire [15:0]dpram_douta;
9 ]9 J) F( w; }' n4 b$ _ - //PORTB
1 g, [) H3 c" p4 n% y9 J- }/ T" ?- J - reg [14:0]dpram_addrb;
8 d6 l4 p, _+ [; w2 F" n" K8 \ - wire dpram_web;% b$ I5 M9 K! W$ q! R
- reg [15:0]dpram_dinb;8 |. @( G+ a; l O3 o% m7 }
- wire [15:0]dpram_doutb; . r4 C- Y) S6 F4 c
- 5 F1 Q; @' z9 T
- //元件例化8 @) \% y" K, p0 D/ q3 Y1 a h
- dpram dpram_unit(+ }6 t. k1 ~* W- l7 v) p
- .clka(emif_clk), // input clka
0 [+ X" \3 A& P m - .wea(dpram_wea), // input [0 : 0] wea
- B5 V( B: v; C4 `, n - .addra(dpram_addra), // input [14 : 0] addra
) l" A) n8 P& i4 K - .dina(dpram_dina), // input [15 : 0] dina; c: e7 l% d7 J" y, g
- .douta(dpram_douta), // output [15 : 0] douta2 z+ d; Q! y8 T& P2 x2 \2 }
- //clkb => sys_clk,
+ p0 D, B5 h [# k0 L3 E+ E( F - .clkb(clk), // input clkb
/ X3 i5 m( d2 v$ ?1 I/ d9 G - .web(dpram_web), // input [0 : 0] web- V' i1 G1 E# l8 p
- .addrb(dpram_addrb), // input [14 : 0] addrb
* |7 v) j# h8 e) H9 {8 l+ w - .dinb(dpram_dinb), // input [15 : 0] dinb6 q; O$ w5 Z6 L: f
- .doutb(dpram_doutb));// output [15 : 0] doutb)
% k6 Q5 u+ g2 @) ?* Q+ {5 e0 R! K - ) g' v2 ?5 Q$ ~7 t/ g# E
- always@(emif_clk)begin
$ S4 n6 c# Z" L2 d, ~8 m1 z; [ - dpram_wea <= 0;, G ]! b; m1 T- m
- dpram_addra <= {emifa_addr_reg[13:0],emifa_ba1_reg};
1 f8 q& u& D5 ~, e* T( Z) i& g - dpram_dina <= emifa_data_reg;
& X5 W" @! N) P! G - end
& G5 I% \) P5 `/ ]5 a - assign dpram_web = 1'b1;
" t0 F) Y# o' Y - 7 P! z; n1 ~ r
- always@( clk )8 P, l1 |% m8 x. R! ~
- begin
- C* c3 u- A2 D9 c; T - dpram_addrb <= 100;
9 c: Z% ~, r! K# G( B9 ^" { - dpram_dinb <= 16'd2048;5 I: y* k5 J8 E/ H" g0 M( S3 c9 C: u
- end
2 v3 X3 c( M% |# n1 a: f5 ?
. z- T9 x6 z: D- }' E3 i- endmodule
" d( |1 b! M$ q9 }9 v7 q - 0 M# @: o8 V! r* ^+ v+ f% m1 d/ B9 S* v
复制代码 嗯,谢谢,这个懂了,但是读出来的数还是不正确,fpga端具体代码如上。
! B2 @/ G/ N l9 f( \这段代码相当于RAM的A口只用来读,并且dpram_wea一直置零,RAM的B口用来写入一个数据。
) k! X1 ^' b$ h代码下载进FPGA后,DSP端先注释掉向fpga写入数据的部分,直接读取,读取的结果都为0,包括 dpram_addrb <= 100;这个地址下应该的2048.; t" {9 E+ K' L+ G. t% R. e
然后把注释去掉,DSP端可以正常的写入数据并且正确的读出数据,但是我的FPGA端已经将 dpram_wea <= 0;这里置零,是没法写入的,所以对于DSP端还能照常写入读出产生疑问。0 k6 W7 L; z" u
# e0 e& y; {- R4 Z+ Y
作者: 水瓶 时间: 2015-4-20 17:31
Lewis 发表于 2015-4-17 10:10
2 [, w n; N- n5 `' MEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF 其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
6 K5 a9 l9 w* P6 c4 a B ...
, j3 z3 A% M- S* r- m2 ~) c; w# w, g我的硬件平台是:TL138F-EasyEVM(浮点DSP C6748+ARM9 +Xilinx Spartn-6 FPGA核)/ S9 N$ u" P8 Y! c- n
调试例程为:DSP端:EMIF_FPGA----EMIF总线FPGA读写测试3 q( G) O M9 d& T$ Z
FPGA端:emif_test
作者: 水瓶 时间: 2015-4-21 19:19
Lewis 发表于 2015-4-17 10:10
! i1 R- s6 R& ~6 S' ]& ^EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF 其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
' n6 `4 @* u* Y5 f" }+ X& E ...
0 S2 @) }5 ]+ V }$ b" l还望版主指导,卡了好多天了,原理都弄明白了,就是不知道问什么读出的数据不对。若是在您那里可以正确读取数据,还望发一份程序给我。谢谢了。
作者: jj909305 时间: 2017-8-12 10:01
楼主你好,这里你弄出来了吗?
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |