嵌入式开发者社区
标题: 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]
& }/ k. ~) p4 S# }' s) b邮箱:604285180@qq.com
( b! B4 N. y5 k( \- o7 h z, [
作者: Lewis 时间: 2015-4-16 09:51
只需要把(下图中)向FPGA写数据的部分注释掉就行,其他地方都不需要修改。
3 v* E* t2 K# r+ X/ L$ x[attach]223[/attach]
- b3 [& \ {7 z
作者: Lewis 时间: 2015-4-16 09:55
还要注意数据在FPGA存储的地址,跟dsp读的地址要对应
作者: 水瓶 时间: 2015-4-16 22:14
* H6 W! T* |9 M# L7 ^FPGA端RAM的地址是从0开始的,DSP端地址是0x6000 0000的地址去读,请问如何映射地址?
作者: Lewis 时间: 2015-4-17 10:10
[attach]225[/attach]
- }& N) G# S6 @$ Q$ P6 BEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF 其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
( Q, L! a& L$ W
作者: 水瓶 时间: 2015-4-20 17:17
本帖最后由 水瓶 于 2015-4-20 17:24 编辑
9 w6 c% v+ I: d ILewis 发表于 2015-4-17 10:10' A* U3 Q9 Q S$ t
EMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF 其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址# y' B! o3 `6 C
...
- `timescale 1ns / 1ps3 P8 `, J2 b# R9 u' S
- module emif_test
) |- e; q$ L( _$ s1 l2 k - (
, |) J, T- h6 @ - input clk,1 x5 {# p8 p# _8 g% J3 ]6 F
- input emifa_clk, // 时钟 5 F# y* A% f, g `
- input emifa_cs2, // 低电平有效异步器件使能引脚 (与异步器件片选信号相连,只在访问异步存储器时有效)
; i3 m; b0 W. n5 t3 X - input emifa_oe_n, // 低电平有效异步器件使能引脚
( Q/ F: A1 q. t+ |( y" n - input emifa_we_n, // 低电平有效写使能引脚
% `3 V% r/ y$ N' s | - inout emifa_wait0, //等待输入引脚
$ X/ T- k# R k6 u/ S1 w5 _ - inout emifa_wait1,
1 q5 x; T% ]8 Q; y% x - input emifa_ba1, // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。
$ J+ X0 E3 | }( }& H - input [13:0]emifa_addr, // EMIF 地址总线
/ A! Y$ M$ x/ f - output [15:0]emifa_data // EMIF 数据总线
\* O+ \: _. { }+ j - );
- `! w5 u3 S) k) k/ s - 1 T V# s2 j% P; s2 v, h+ \
- /****************EMIF Interface****************/
$ T, P/ p; i9 D) D3 E/ j - //信号声明
8 [( F3 `! R7 x$ B2 P- n0 c - wire emif_clk;' }3 S5 ^* n- a: {$ |/ T2 W
- reg emifa_cs2_reg; - ?5 s8 S/ ]0 B n/ B) h5 b
- reg emifa_rnw_reg; - s! ~2 q; s! T) f+ A& ^
- reg emifa_oe_n_reg;
; P) _8 @3 R& p# S& R- ? - reg emifa_we_n_reg; ' C+ G1 J1 L# z
- reg emifa_wait0_reg;
, K6 D$ R( {0 r: v- t8 A - reg emifa_wait1_reg;
8 R' R e2 U' y0 a& D$ r; k - reg emifa_ba1_reg; ; ?2 o3 h: d$ m) \
- reg [13:0] emifa_addr_reg;
9 M/ J# s# C) f1 F' z3 v - reg [15:0] emifa_data_reg; : q% E& e% u0 Q% f6 Z. P% k
- , V- B* ?, B- E2 }0 ^
- //元件例化
8 Q2 I" @7 T5 W) k" I r( { - BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));! L2 `# C7 x& m }; u+ }( d
- //寄存器赋值. _/ Y7 }: B" ?8 K1 X7 X1 D
- always@(posedge emif_clk)begin
! y* t) P& P! m# q; { - emifa_cs2_reg <= emifa_cs2;- C1 \9 s' o1 x; p8 e. s
- emifa_oe_n_reg <= emifa_oe_n;: j5 `, ^% F* ?
- emifa_we_n_reg <= emifa_we_n;
$ e0 \8 D. H* b" u - emifa_wait0_reg <= emifa_wait0;! F7 c; B8 g2 I8 z$ o; Q. h0 _
- emifa_wait1_reg <= emifa_wait1;( t' ^( R. f! B, H
- emifa_ba1_reg <= emifa_ba1;: E9 o' {0 Q' r. O
- emifa_addr_reg <= emifa_addr;7 {0 b( `4 w e! F, w1 B
- emifa_data_reg <= emifa_data;
6 r* F$ A/ H' n z. V0 O - end
* a7 C- s3 Z9 V5 C/ ^, J1 I. Z
" X- [! `4 `( B5 b$ X t, j$ G# a- //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;
0 m3 m. O4 ?4 O, c - assign emifa_data = dpram_douta;! _) w6 {( y1 F3 o) j" [/ d5 c
- / P1 X: s }3 U: j6 |0 }
- /****************Dual Port RAM****************/
5 K: F' F6 @; g9 B8 S7 A3 R" \ - //PORTA
- k! o8 U2 u, n1 e2 o - reg [14:0]dpram_addra; - `6 I, B( c. P* ^
- reg dpram_wea; , c! P8 _( x% J; J, n a" `
- reg [15:0]dpram_dina;
' |/ a' s0 V$ E2 q6 k - wire [15:0]dpram_douta; - b/ `6 S) y" F$ N8 c4 N; B
- //PORTB$ l1 I& P" ~% }9 D/ _
- reg [14:0]dpram_addrb; ( p, Q$ V; a2 {3 o- M
- wire dpram_web;: M/ f8 N" t1 |7 r1 a
- reg [15:0]dpram_dinb;
% N7 O! h2 B2 H) `+ [ - wire [15:0]dpram_doutb;
6 g3 H5 y* h7 \# }5 e9 _ -
8 V' v6 ^0 ^; ~ }. v4 j - //元件例化2 y6 o0 n5 e4 D Q8 k
- dpram dpram_unit(
) G. ?( N' K& l8 D+ ^ - .clka(emif_clk), // input clka1 h/ q* t. u6 ~7 ~( \$ o$ l
- .wea(dpram_wea), // input [0 : 0] wea
" ] a/ y- n" }; F4 w2 Q - .addra(dpram_addra), // input [14 : 0] addra. f4 g& {$ c* e: \" P4 ?
- .dina(dpram_dina), // input [15 : 0] dina4 {+ l, `* f7 J/ a( _$ ^* z
- .douta(dpram_douta), // output [15 : 0] douta
4 n- e! }! \6 S* R7 c - //clkb => sys_clk,
& k+ c7 x3 W; x a - .clkb(clk), // input clkb" E k; `7 b9 i, w' g
- .web(dpram_web), // input [0 : 0] web
0 q# C3 Y* u @* e% ?& B2 [ - .addrb(dpram_addrb), // input [14 : 0] addrb9 \0 V% W5 n7 x" ?' G$ G2 Y7 g
- .dinb(dpram_dinb), // input [15 : 0] dinb: ]+ P3 e$ Z3 C2 p' w G
- .doutb(dpram_doutb));// output [15 : 0] doutb)% n: \! U+ E1 m; u% R4 k
- 8 H6 K$ i2 T. N) `8 Y- z& X. f
- always@(emif_clk)begin
5 W0 z! O; S3 }$ k( W - dpram_wea <= 0;
! x) t7 e l- }# n - dpram_addra <= {emifa_addr_reg[13:0],emifa_ba1_reg};
: [4 Q4 F) M% _ - dpram_dina <= emifa_data_reg;
; S3 T% r, M0 H4 @ - end
6 m0 ?. ]3 z2 H' ` k! k - assign dpram_web = 1'b1;6 m8 |5 @4 V2 M4 |# D: O2 c
! u- y$ {! e8 H% r( C* X4 O! \, _3 ~& w- always@( clk )8 o5 C. y2 k1 q
- begin
9 y9 m2 n9 ]7 M1 m$ _6 ^$ ]$ e - dpram_addrb <= 100;2 Y6 c/ E3 x% }, |
- dpram_dinb <= 16'd2048;
, C' i' q N& d& _9 I- h c- ` ]9 J - end4 z* L a5 T, I2 _. P6 M; f
# B0 V% s9 y7 N7 v9 g* a0 G- endmodule
, G0 F w; ~( s - o# s" I1 H9 @
复制代码 嗯,谢谢,这个懂了,但是读出来的数还是不正确,fpga端具体代码如上。
& z& K8 a: W( }6 y6 B- d2 ^1 t这段代码相当于RAM的A口只用来读,并且dpram_wea一直置零,RAM的B口用来写入一个数据。. w U/ ~ V6 f2 K6 p8 @
代码下载进FPGA后,DSP端先注释掉向fpga写入数据的部分,直接读取,读取的结果都为0,包括 dpram_addrb <= 100;这个地址下应该的2048.1 ?1 k' ~- M- o( f8 w
然后把注释去掉,DSP端可以正常的写入数据并且正确的读出数据,但是我的FPGA端已经将 dpram_wea <= 0;这里置零,是没法写入的,所以对于DSP端还能照常写入读出产生疑问。
8 D, P, j$ E3 i: w
3 ?$ c6 o4 q: X; T- H6 q: N8 P
作者: 水瓶 时间: 2015-4-20 17:31
Lewis 发表于 2015-4-17 10:10
3 r5 Q8 N* J) w$ k. rEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF 其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
2 l# b& ~, [9 ]6 }, o6 n1 S ...
- D; X3 v1 G$ u# z% K我的硬件平台是:TL138F-EasyEVM(浮点DSP C6748+ARM9 +Xilinx Spartn-6 FPGA核), t+ Y0 w7 X" P+ T( _6 W b1 @ o
调试例程为:DSP端:EMIF_FPGA----EMIF总线FPGA读写测试
# m8 W8 z, c t. v- q FPGA端:emif_test
作者: 水瓶 时间: 2015-4-21 19:19
Lewis 发表于 2015-4-17 10:10
5 ]7 T" l6 O% vEMIFA_CS2的寻址空间就是0x6000 0000 ~ 0x61FF FFFF 其实EMIFA_CS2读地址0x6000 0000就是读外设的0地址
0 H& p+ O) s" G; L* o ...
9 Y0 S7 C0 Q) V4 q8 Z6 f9 x" R还望版主指导,卡了好多天了,原理都弄明白了,就是不知道问什么读出的数据不对。若是在您那里可以正确读取数据,还望发一份程序给我。谢谢了。
作者: jj909305 时间: 2017-8-12 10:01
楼主你好,这里你弄出来了吗?
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |