Skip to content

Commit 2402d7a

Browse files
committed
A-DSP访问FPGA的EMIF速率问题
1 parent 65af45a commit 2402d7a

File tree

8 files changed

+219
-12
lines changed

8 files changed

+219
-12
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
[<font size=4>←返回主目录<font>](./README.md)
2+
</br></br></br>
3+
4+
5+
## 测试
6+
7+
下面是我在一个DSP+FPGA的系统(平台:TMS320C6713+EP2C8Q208CN)上测试。
8+
9+
测试方法为:FPGA将采集的同一路信号存放在FIFO1与FIFO2中,然后DSP通过EMIF分别读取FIFO1和FIFO两个通道的数据,两通道数据显示结果如图。
10+
11+
12+
- EMIF时钟频率 100MHz
13+
14+
15+
![][imag1]
16+
17+
__图1__
18+
19+
![][imag2]
20+
21+
__图2__
22+
23+
从图1中可以看出:读取通道2的数据时在某个时刻发生了丢点的现象。
24+
25+
从图2中可以看出:从FPGA中送出的应该是三角波,而出现某些值被采集到多次(2次)到的情况。
26+
27+
28+
- EMIF时钟频率 50MHz
29+
30+
31+
![][imag3]
32+
33+
__图3__
34+
35+
图3为降低EMIF的时钟频率后访问FPGA,读回的两通道数据完全一致,没有出现任何的数据丢失或重复。
36+
37+
## 分析
38+
多次检查FPGA程序,没有发现有任何问题,而且降速后DSP读取正确,说明FPGA的程序不存在问题。因此,暂时将问题定位到:在PCB布线难以满足防信号干扰的前提下,DSP通过EMIF访问FPGA将可能导致读取数据出错。
39+
40+
因此,针对出现的问题,暂降低EMIF速率到50MHz,而代价就是访问SDRAM的速率也降低了,这对大量数据存储在外部SDRAM的情况,性能将下降一半。
41+
42+
若内部RAM满足存储要求的前提下,推荐将运算数据存储在内部RAM中,通过测试:计算1024个点的实数FFT,在内部RAM中的运算时间将比在外部SDRAM中快差不多5倍(系统倍频时钟为200MHz)。
43+
44+
45+
[imag1]:../images/FPGA与DSP通信中的EMIF速率问题/imag1.png
46+
[imag2]:../images/FPGA与DSP通信中的EMIF速率问题/imag2.png
47+
[imag3]:../images/FPGA与DSP通信中的EMIF速率问题/imag3.png
+148
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
2+
3+
作为一个从本科电子信息工程转入计算机研究生的同学,一直研究嵌入式、信号处理相关方向,一直被我奉为最经典的语言就是C和Matlab。
4+
5+
有了它们,我几乎可以干任何我想干的事情。
6+
7+
用多了Matlab做仿真,有时就会遇到:Matlab如何实现的定时器的功能的呢?比如:
8+
9+
1. 网络拓扑结构每隔10s更新一次
10+
2. 让这个程序在5s后就结束吧
11+
12+
在Matlab中提供了一个多线程的方法——Timer。
13+
14+
15+
每当使用一个新的Matlab函数,最好资料就是帮助文档:
16+
17+
18+
```
19+
>> help timer
20+
>> doc timer
21+
```
22+
23+
使用Timer的步骤如下:
24+
25+
## 1 创建Timer对象
26+
27+
timer对象的创建直接通过timer函数完成的,
28+
29+
```
30+
iter = 400;
31+
interval = 0.5; % s
32+
t = timer('TimerFcn', @caputure, ... % 回调函数caputure,必选参数
33+
'Period', interval, ... % 每隔interval (s)调用一次caputure函数
34+
'ExecutionMode', 'fixedSpacing', ...
35+
'TasksToExecute', iter); % 调用caputure次数设定为iter
36+
```
37+
38+
Timer对象的格式为:
39+
40+
```
41+
>> t
42+
43+
Timer Object: timer-1
44+
45+
Timer Settings
46+
ExecutionMode: fixedSpacing
47+
Period: 0.5
48+
BusyMode: drop
49+
Running: off
50+
51+
Callbacks
52+
TimerFcn: @main/caputure
53+
ErrorFcn: ''
54+
StartFcn: ''
55+
StopFcn: ''
56+
```
57+
58+
- Timer Settings中比较重要的参数有:
59+
60+
- ExecutionMode 执行的模式
61+
62+
就是确定TimerFcn执行周期计算的始末点
63+
64+
'singleShot' :只能执行一次,故Period属性不起作用,其他模式都可以执行多次
65+
66+
'fixedSpacing' :上一次TimerFcn执行完毕时刻到下一次TimerFcn被加入队列时刻之间的间隔
67+
68+
'fixedDelay' :上一次开始执行到下一次被加入队列之间的间隔
69+
70+
'fixedRate' :前后两次被加入到执行语句队列时刻之间的间隔
71+
72+
- Period 时间间隔(执行周期)
73+
74+
也就是每个Period执行一次TimerFcn,执行周期到底指的是哪两个时刻之间的间隔由ExecutionMode决定
75+
76+
- StartDelay 启动时延
77+
78+
从启动Timer开始到第一次把TimerFcn的加入到Matlab的执行语句队列中去的时延, 默认值为0s
79+
80+
- TasksToExecute 执行次数
81+
82+
TimerFcn被执行的次数,默认为1次,设置多次时需要设置执行周期Period
83+
84+
- Timer对象的另一部分是回调函数(Callbacks)
85+
86+
- TimerFcn Timer函数
87+
88+
是Timer对象的核心,Timer的多线就是通过执行这个TimerFcn来实现的,也是Timer对象的必选参数
89+
90+
- ErrorFcn
91+
92+
- StartFcn 启动Timer时调用的函数,可以用于初始化
93+
94+
- StopFcn 停止Timer时调用的函数
95+
96+
## 2 设定和读取Timer对象的参数
97+
98+
除了可以在创建Timer时设定相关参数外,还有其它的方法可以随时设置:
99+
100+
- 使用set/get函数
101+
102+
```
103+
%创建一个默认的Timer对象
104+
TaskTimer=timer
105+
set(TaskTimer,'Name','Matlabsky','TimerFcn',@caputure)
106+
get(TaskTimer,'Name')
107+
````
108+
109+
- 直接操纵结构体
110+
111+
```
112+
TaskTimer=timer
113+
TaskTimer.Name='Matlabsky'
114+
TaskTimer.TimerFcn=@caputure
115+
```
116+
117+
## 3 创建回调函数
118+
119+
回调函数的格式为:
120+
121+
```
122+
function my_callback_fcn(obj,event,p1,p2)
123+
% by dynamic
124+
% see also http://www.matlabsky.com
125+
% 20092.15
126+
%
127+
% ==== obj和event为必选输入参数
128+
%
129+
% 1. obj就是前面创建的Timer对象,它包含着Timer的所有参数
130+
%
131+
% 2. event是一个结构体,包含Type和Data两个字段
132+
% Type保存的是当前的Timer对象执行的时间,比如StartFcn、StopFcn等
133+
% Data是一个结构体,包含time一个字段,保存的是执行该事件的系统时间
134+
%
135+
% 所以event的使用是event.Type获取Timer到底在执行哪个事件,event.Data.time获取执行该时间的系统时间
136+
%
137+
% ==== p1,p2...等是其它自定义的输入参数,根据需要在自己添加
138+
```
139+
140+
141+
142+
143+
# 参考
144+
145+
1. http://www.matlabsky.com/thread-646-1-1.html
146+
147+
148+

essays/README.md

+17-12
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,26 @@
11
# 目录(Contents)
22

3-
## DSP
3+
## 嵌入式及信号处理
44

5-
- [数字信号处理中各种频率关系](./数字信号处理中各种频率关系.md)
6-
- [滤波器设计指标](./滤波器设计指标.md)
7-
- [模拟信号采样与AD转换](./模拟信号采样与AD转换.md)
8-
- [在DSP671x上使用Timer统计信号处理算法的时间消耗](./在DSP671x上使用Timer统计信号处理算法的时间消耗.md)
9-
- [TMS320C6713烧写Flash的通用方法](./TMS320C6713烧写Flash的通用方法.md)
10-
- [DSP连接不上CCS3.3的问题讨论](./DSP连接不上CCS3.3的问题讨论.md)
11-
- [烧写Flash后的DSP程序运行不正常的情况分析](./烧写Flash后的DSP程序运行不正常的情况分析.md)
5+
- DSP
6+
- [数字信号处理中各种频率关系](./数字信号处理中各种频率关系.md)
7+
- [滤波器设计指标](./滤波器设计指标.md)
8+
- [模拟信号采样与AD转换](./模拟信号采样与AD转换.md)
9+
- [在DSP671x上使用Timer统计信号处理算法的时间消耗](./在DSP671x上使用Timer统计信号处理算法的时间消耗.md)
10+
- [TMS320C6713烧写Flash的通用方法](./TMS320C6713烧写Flash的通用方法.md)
11+
- [DSP连接不上CCS3.3的问题讨论](./DSP连接不上CCS3.3的问题讨论.md)
12+
- [烧写Flash后的DSP程序运行不正常的情况分析](./烧写Flash后的DSP程序运行不正常的情况分析.md)
1213

13-
## FPGA
14+
- FPGA
15+
- [FPGA的复位](./FPGA的复位.md)
16+
- [FPGA的边沿检测](./FPGA的边沿检测.md)
1417

15-
- [FPGA的复位](./FPGA的复位.md)
16-
- [FPGA的边沿检测](./FPGA的边沿检测.md)
18+
- ARM
19+
20+
21+
- 系统综合
22+
- [FPGA与DSP通信中的EMIF速率问题](./FPGA与DSP通信中的EMIF速率问题.md)
1723

18-
## ARM
1924

2025
## 数学物理之美
2126

essays/数理统计知识整理.md

+7
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,11 @@ FֵԽС
184184
5. 预测
185185

186186

187+
## 2 方差分析
188+
189+
190+
191+
187192
## 参考
188193

189194
1. [相关系数显著性检验表]
@@ -224,6 +229,8 @@ FֵԽС
224229
[beta置信区间]:../images/数理统计知识整理/beta置信区间.png
225230
[S-Equal]:../images/数理统计知识整理/S_Equal.png
226231

232+
[方差分析表]:../images/数理统计知识整理/方差分析表.png
233+
227234

228235

229236
[相关系数显著性检验表]:../enclosure/数理统计知识整理/相关系数显着性检验表(完整润色版).xls
Loading
Loading
Loading
Loading

0 commit comments

Comments
 (0)