现在的位置: 首页 > 综合 > 正文

DSP学习体会

2013年09月15日 ⁄ 综合 ⁄ 共 2798字 ⁄ 字号 评论关闭

这几天,感觉在DSP方面取得了一定的进展,现在把学习的心得体会写在下面,供日后总结。
进展的开头是因为找了一本好书。在这本书中,作者提到,一般人都是在现成的板子上写程序,等程序熟悉到一定的阶段后再开始了解硬件,这种方法是错误的。我 想,我就是按照这种思路来的,难道也错了吗?果然,作者认为,一开始就应该了解硬件,在硬件的基础上开始编写简单的程序。这很对我的胃口,我也不太喜欢一 开始就搞抽象的CPU内核结构之类的东西。

作者给出了一张VC5410系统的电路原理图。我花了两天时间,把这个原理图做成了*.sch形式,一边画图一边分析。果然,我感觉对DSP系统的了解比 较深入了,最起码的是,那些CPU的管脚知道到底是怎么回事了。比如在5系列上集成了3个McBSP口,这三个口都是可编程的(可配置的)。到底怎么配 置?当然是通过寄存器,通过不同的CPU引脚和外设相连。

CPU可以和不同种类的芯片相连,这在DSP芯片方面表现的特别明显。不同种类的芯片,表示写这个芯片的驱动程序就需要用到不同的知识。比如VC5410 和GAL16V8相连,起到片选的作用,那么GAL16V8的逻辑输入输出功能到底如何呢?这就需要我了解,GAL16V8是一个通用逻辑门阵列,可编 程,输入信号是VC5410的控制引脚信号,而输出信号是各个芯片的片选信号。
另外,VC5410扩展了外部存储器芯片:FLASH。那么这种芯片的读写指令到底如何呢?对flash的操作一般有写、擦除、读等等,这需要一系列指令配合。
外界模拟信号经过AD变成数字信号进入到DSP中等待处理,而DSP也把数字信号进行DA转换输出。那么AD和DA就是必备的了。
另外,VC5410和一个支持USB协议的芯片PDUSB12相连,那么,C5410又如何和这个芯片交换数据呢?这就需要我熟悉USB 协议的基本原理,并能编写相应的驱动程序。
还有一点是,VC5410和一个支持串行通信的芯片连接,那么这里面的工作原理又需要我了解。
DEC643板子上,视频编码解码芯片通过IIC总线和DM643交换数据,那么IIC总线协议我也要重点了解,以前这一块只是看了看,搞懂了其中的基本原理,还没怎么用过。
总上所述,DSP系统的复杂性表明了学习DSP硬件,一定要分模块学习,在实际用用到哪一块硬件,就重点了解这一块的内容。
在学习5系列的汇编指令方面,我暗自庆幸我走的路是正确的。否则我还会在黑暗中摸索很长时间。
我先是重点学习了C54的汇编指令,也就是把书本上讲的汇编指令的执行过程看了一边,这花了我一天半的时间。寄存器和存储空间在指令执行前后到底是怎么变 化的,这个指令的过程到底是怎么样进行的,看了以后我心里就清楚了很多。当然也还有一些细节问题没搞清楚,于是我就结合C54系列的内核进一步细化,看了 C54的内部结构框图、寄存器定义、汇编指令格式、片上外设等等,特别是中断系统和位反转操作。
这以后就有点感觉了。我知道了DSP把复位信号也做成了中断服务信号,因此每次复位都要执行一个中断服务程序,这个中断服务程序,显然就应该是系统的初始 化程序了。另外我也知道中断向量表的安排到底是怎么回事了,如果不安排系统响应某个中断源的信号,可以在其中断服务程序中直接安排一个返回指令,这就相当 于”假中断”。
另外我自己也逐步看懂一个比较复杂的DSP程序的结构框架了。比如利用DSP实现FFT、FIR滤波等等。
但是书上也同时提到,C54和C55之间有教大差别,而C55和C6000之连差别不明显。于是我就打算攻克C55难关,当然,过程和上面的过程大致是一致的。先看硬件部分组成,再看一些寄存器、片上外设、寻址方式等等,最后看指令系统等等
C55的硬件部分学习起来没有我想象的那么难,但是要想熟练应用也不是那么简单。关键是C55内部有功能单元A、P、I、D,这每个功能单元内部又有一定 的寄存器,那就是说,CPU不仅仅可以对总线进行读写操作(进而可对存储空间进行读写操作),而且可以对这功能单元进行操作。这就有点烦了。
C55和C6000的中断系统、位反转寻址方式我搞的比较清楚,但是C54、C55的循环寻址方式我不清楚,但循环寻址的方式主要用在什么地方?我搞不清楚。一般来说,一些特殊的寻址方式用于一些特殊的算法中,比如位反转就用于FFT中。

现在我有一个问题:指令的并行执行,以及指令的流水线操作有什么不同?
[续昨天]今天发了帖子,也查了一些资料,感觉这个流水线操作的确很巧妙。它在程序设计中没办法直接体现出来,而在于编程者对CPU内部功能单元的熟悉程 度。也就是说,流水线的关键在于指令对不同功能单元的操作。任何指令都有取址、译码和执行这三个阶段。如果不同的指令在这三个阶段阶段使用了不同的功能单 元(比如A、D、I、P、S等),则可以将这几条指令建立一条流水线。这几条指令最好能循环顺次执行(指令不是在同一个CPU时钟周期里执行的),这样指 令就能被源源不断被取址、译码、执行的操作了。流水线是逻辑意义上的,而不是物理意思上的。
那我似乎能写出在每一个CPU节拍内各个功能单元所进行的操作总和了?
而程序并行执行关键在于,CPU内部有不同的总线,如果指令中的操作数在不同的总线上,则能实现这几条指令的并行操作。并行操作的指令是在一个CPU时钟周期里面进行的.可以用"||"符号表示并行操作的指令。
DSP是RISC,也就是精简指令计算机。它有一个重要的特征是把尽可能的寄存器做在CPU的内部,这样运算的时候在CPU内部进行,以换来高速性能。
举例如下:
LDH||LDH;
MPY;
ADD; 
循环执行5次。 假设每条指令的执行(包含取址、译码和执行)都仅用1个时钟周期。
图1无流水线示意图
Cycle .D1 .D2 .M1 .M2 .L1 .L2 .S1 .S2
1 LDH LDH 
2             MPY 
3                   ADD 
4 LDH LDH 
5             MPY 
6                    ADD 
7 LDH LDH 
8             MPY 
9                    ADD 
前三次循环中指令所占用的功能单元的情况,
3次循环共占用3*3=9Cycle个时钟,
5次循环共占用3*5=15Cycle个时钟.

图2采用流水线后示意图
Cycle .D1 .D2 .M1 .M2 .L1 .L2 .S1 .S2
1 LDH1 LDH1 
2 LDH2 LDH2 MPY1 
3 LDH3 LDH3 MPY2 ADD1 
4 LDH4 LDH4 MPY3 ADD2 
5 LDH5 LDH5 MPY4 ADD3 
6 MPY5 ADD4 
7 ADD5 
指令中的数字表示是第几次循环.
采用流水线后仅使用了7个Cycles.
中间红色地方,表明我们可以做出在一个节拍上所有功能单元进行的操作总和.
其实,Cycles竖栏准确的说不是CPU始终周期,而是指令执行的节拍.
因为我们这里做了假设:假设每一条指令的执行都仅占用1个时钟.

抱歉!评论已关闭.