嵌入式开发者社区
标题: 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
. {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 @, \& ILewis 发表于 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 ...
- `timescale 1ns / 1ps4 d/ f* a- z* o) p0 A% s$ J
- module emif_test
- f/ O3 E3 ~6 v; o( H! [ - ( 2 S4 z3 S/ K. r: W$ y# f
- input clk,
* b1 i" t& q R# E }, A1 o - input emifa_clk, // 时钟
% t- H8 \" n- H8 g - input emifa_cs2, // 低电平有效异步器件使能引脚 (与异步器件片选信号相连,只在访问异步存储器时有效)
0 B/ o- c( ^. s/ t - input emifa_oe_n, // 低电平有效异步器件使能引脚 6 A! S# L# x+ Z6 q/ _
- input emifa_we_n, // 低电平有效写使能引脚
. m# B1 l9 i/ a' y' S9 ]7 { - inout emifa_wait0, //等待输入引脚 . d& L/ N; g. Z1 S* @/ H
- inout emifa_wait1, ; Q$ J6 x$ A8 s" h4 C* ~; Z/ x
- input emifa_ba1, // EMIF存储区域地址线 ,当与异步器件连接时,这些引脚与EM_A引脚共同形成穷到器件的地址。 + J) H6 D9 r9 X# y7 p6 |
- input [13:0]emifa_addr, // EMIF 地址总线
* N* k6 J/ _$ s1 Y3 h, P0 N - output [15:0]emifa_data // EMIF 数据总线
) y7 M: Z% h' K5 E% o# b6 b+ k - );
/ Z! O4 z2 S. X( d9 G3 V4 I& O - ) F8 h! ?- c2 S$ `
- /****************EMIF Interface****************/ 7 P! ?5 Z( w( X
- //信号声明
* W* W6 ^& i- ~& Q - wire emif_clk;
- z4 V: E: ?# `2 z& {0 S9 O n - reg emifa_cs2_reg;
2 f' o: |/ d6 x2 _8 Q0 o - reg emifa_rnw_reg; * m# L; X$ S3 v+ h- `8 H" V
- reg emifa_oe_n_reg; 2 H2 D% X+ r9 `
- reg emifa_we_n_reg; % g1 h4 M# m" `& a
- reg emifa_wait0_reg;
' S6 \. I7 o6 K0 g - reg emifa_wait1_reg;
, U* l6 |' g0 o+ ]7 f" H- I. { - reg emifa_ba1_reg;
8 B @7 U6 v0 @6 a) E4 b3 J - reg [13:0] emifa_addr_reg;
# d5 L/ \, j, v2 ~+ W% V9 n - reg [15:0] emifa_data_reg;
% M9 a; v2 U% M# c - & }2 q+ V5 h5 D' g
- //元件例化
) a/ M7 b* W' b5 h, S8 n- M - BUFG emif_clk_unit(.I(emifa_clk),.O(emif_clk));( j* r- o/ R, H1 r) Z" e
- //寄存器赋值: k% M! ~4 R* `8 r
- always@(posedge emif_clk)begin
; w3 i& I6 \8 {- Q% R - emifa_cs2_reg <= emifa_cs2;2 C- M; f* v/ U% v
- emifa_oe_n_reg <= emifa_oe_n;; Y. F3 y# G4 ^, Z) ^* g
- emifa_we_n_reg <= emifa_we_n;
* q" J8 Y5 S: `2 \) L - emifa_wait0_reg <= emifa_wait0;
# i& k2 T( X; ` - emifa_wait1_reg <= emifa_wait1;2 e3 y$ [6 v& K K
- emifa_ba1_reg <= emifa_ba1;
) W' o4 F2 g2 ?$ L - emifa_addr_reg <= emifa_addr;7 X- j) |& T/ p y# a
- emifa_data_reg <= emifa_data;
6 D1 [5 ?5 I8 f2 d+ p" R - end' c* \3 w; R( @9 w W
T# }! [4 ?; d$ ~ Z0 Y# Z6 ~: X- //assign emifa_data = (emifa_oe_n ==1'b0)?dpram_douta:16'bZ;
5 u* J7 }) G$ }* a1 v8 k, g/ Q - assign emifa_data = dpram_douta;4 S% H+ g. v& X0 c( D
- ! }) \- j( X- u0 K# l0 b; }
- /****************Dual Port RAM****************/: Q9 _ F6 H9 L D( Z; b7 W
- //PORTA
' P$ r" t5 l4 k% Z W7 ~' c - reg [14:0]dpram_addra; + e3 K# g/ F' q! D5 q! R$ `* I6 u' N
- reg dpram_wea; / \0 @. [% g" K. b G- @% J( F: ]
- reg [15:0]dpram_dina; * k8 l* P& |: V H6 l9 y
- wire [15:0]dpram_douta;
B* m# I$ [1 m - //PORTB7 L8 M5 f9 a/ `2 N6 ~' C9 `
- reg [14:0]dpram_addrb; % O5 N. B3 M, e) J- o4 q
- wire dpram_web;: s; D9 U! d$ i( i" B& U% f; h* r1 ?
- reg [15:0]dpram_dinb;
, W0 \4 ~: U g4 g# J1 o+ v - wire [15:0]dpram_doutb;
% E0 P+ s) t8 ?4 x: [ - . r6 v c! f4 i5 u
- //元件例化4 N! S' J5 D! r4 \( T) `
- dpram dpram_unit(
& m% [+ F& x! b/ R8 W# Z - .clka(emif_clk), // input clka
, h D) Y5 T, ]! _8 I( j$ r2 n - .wea(dpram_wea), // input [0 : 0] wea2 f) D, q# S+ [5 X
- .addra(dpram_addra), // input [14 : 0] addra
# Q7 `! e d0 G: H) K7 F9 \6 d" w# @1 U% r - .dina(dpram_dina), // input [15 : 0] dina& }# |! o: J0 r7 F2 {' I- z3 z
- .douta(dpram_douta), // output [15 : 0] douta
5 h/ L; }8 W1 r4 M7 F* q W) N - //clkb => sys_clk,( R9 |9 \" I3 v- W$ p
- .clkb(clk), // input clkb
9 D/ @ o- c8 H4 U1 ^2 m - .web(dpram_web), // input [0 : 0] web9 c* R. R6 ]/ z- U" O4 b
- .addrb(dpram_addrb), // input [14 : 0] addrb9 b Z/ N! C. B+ ?
- .dinb(dpram_dinb), // input [15 : 0] dinb4 B [( j' d# }6 j. i, B
- .doutb(dpram_doutb));// output [15 : 0] doutb) v% B- e1 ?' k; [6 K, Z9 @
- , f5 b' u- a! C4 n, g
- always@(emif_clk)begin/ e% j, `5 F' u0 Y- E, D* {8 ?
- dpram_wea <= 0;- ]3 V/ }" B( O: Z
- dpram_addra <= {emifa_addr_reg[13:0],emifa_ba1_reg};
2 z& ]" X- Y/ ^ - dpram_dina <= emifa_data_reg;
5 m4 o: o9 p* g8 |" D - end0 @8 q" F- \) c
- assign dpram_web = 1'b1;5 N* l6 G( R9 {
2 k2 ~- ~* r3 N* G+ N O- always@( clk )2 q# W9 U5 ? F
- begin
; R3 q k H) l/ M - dpram_addrb <= 100;
. a4 f8 }3 y) _$ W* h1 p - dpram_dinb <= 16'd2048;
. t% T: p( m7 ^1 i% m& y3 Q - end. y, Y, Y! W1 }1 S9 h* x% m9 m
$ i, }0 C0 q' H% c) C; I f- endmodule* {. {. j* x3 A9 `
- ) `# 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 |