
求DSP学习建议
有些资料可供你参考:DSP的特点 对于没有使用过DSP的初学者来说,第一个困惑就是DSP其他的嵌入式处理器究竟有什么不同,它和单片机,ARM有什么区别.事实上,DSP也是一种嵌入式处理器,它完全可以完成单片机的功能. 唯一的重要的区别在于DSP支持单时钟周期的乘-加运算.这几乎是所有厂家的DSP芯片的一个共有特征.几乎所有的DSP处理器的指令集中都会有一条MAC指令,这条指令可以把两个操作数从RAM中取出相乘,然后加到一个累加器中,所有这些操作都在一个时钟周期内完成.拥有这样一条指令的处理器就具备了 DSP功能. 具有这条指令就称之为数字信号处理器的原因在于,所有的数字信号处理算法中最为常见的算术操作就是乘-加.这是因为数字信号处理中大量使用了内积,或称点积的运算.无论是FIR滤波,FFT,信号相关,数字混频,下变频.所有这些数字信号处理的运算经常是将输入信号与一个系数表或者与一个本地参考信号相乘然后积分(累加),这就表现为将两个向量(或称序列)进行点积,在编程上就变成将输入的采样放在一个循环buffer里,本地的系数表或参考信号也放在一个buffer里,然后使用两个指针指向这两个buffer.这样就可以在一个loop里面使用一个MAC指令将二者进行点积运算.这样的点积运算对与处理器来说是最快的,因为仅需一个始终周期就可以完成一次乘加. 了解DSP的这一特点后,当我们设计一个嵌入式系统时,首先要考虑处理器所实现的算法中是否有点积运算 ,即是否要经常进行两个数组的乘加,(记住数字滤波,相关等都表现为两个数组的点积)如果有的话,每秒要做多少次,这样就能够决定是否采用DSP,采用多高性能的DSP了. 浮点与定点 浮点与定点也是经常是初学者困惑的问题,在选择DSP器件的时候,是采用浮点还是采用定点,如果用定点是16位还是32位?其实这个问题和你的算法所要求的信号的动态范围有关. 定点的计算不过是把一个数据当作整数来处理,通常AD采样来的都是整数,这个数相对于真实的模拟信号有一个刻度因子,大家都知道用一个16位的AD去采样一个0到5V的信号,那么AD输出的整数除以2^16再乘以5V就是对应的电压.在定点DSP中是直接对这个16位的采样进行处理,并不将它转换成以小数表示的电压,因为定点DSP无法以足够的精度表示一个小数,它只能对整数进行计算. 而浮点DSP的优势在于它可以把这个采样得到的整数转换成小数表示的电压,并不损失精度(这个小数用科学记数法来表示),原因在于科学记数法可以表示很大的动态范围的一个信号,以IEEE754浮点数为例, 单精度浮点格式: [31] 1位符号 [30-23]8位指数 [22-00]23位小数 这样的能表示的最小的数是+-2^-149,最大的数是+-(2-2^23)*2^127.动态范围为20*log(最大的数\\\/最小的数)=1667.6dB 这样大的动态范围使得我们在编程的时候几乎不必考虑乘法和累加的溢出,而如果使用定点处理器编程,对计算结果进行舍入和移位则是家常便饭,这在一定程度上会损失是精度.原因在于定点处理处理的信号的动态范围有限,比如16位定点DSP,可以表示整数范围为1-65536,其动态范围为20*log(65536\\\/1)=96dB.对于32定点DSP,动态范围为20*log(2^32\\\/1)=192dB,远小于32位ieee浮点数的1667.6dB,但是,实际上192dB对绝大多数应用所处理的信号已经足够了. 由于AD转换器的位数限制,一般输入信号的动态范围都比较小,但在DSP的信号处理中,由于点积运算会使中间节点信号的动态范围增加,所以主要考虑信号处理流程中中间结果的动态范围,以及算法对中间结果的精度要求,来选择相应的DSP.另外就是浮点的DSP更易于编程,定点DSP编程中程序员要不断调整中间结果的P,Q值,实际就是不断对中间结果进行移位调整和舍入. DSP与RTOS TI的CCS提供BIOS,ADI的VDSP提供VDK,都是基于各自DSP的嵌入式多任务内核.DSP编程可以用单用C,也可以用汇编,或者二者结合,一般软件编译工具都提供了很好的支持.我不想在这里多说BIOS,VDK怎么用这在相应的文档里说的很详细.我想给初学者说说DSP的RTOS原理.用短短几段话说这个复杂的东西也是挑战!^_^ 其实DSP的RTOS和基于其他处理器的通用RTOS没什么大的区别,现在几乎人人皆知的uCOSii也很容易移植到DSP上来,只要把寄存器保存与恢复部分和堆栈部分改改就可以.一般在用BIOS和VDK之前,先看看操作系统原理的书比较好.uCOS那本书也不错. BIOS和VDK其实是一个RTOS内核函数集,DSP的应用程序会和这些函数连接成一个可执行文件.其实实现一个简单的多任务内核并不复杂,首先定义好内核的各种数据结构,然后写一个scheduler函数,功能是从所有就绪任务中(通过查找就绪任务队列或就绪任务表)找出优先级最高的任务,并恢复其执行.然后在此基础上写几个用于任务间通信的函数就可以了,比如event,message box,等等. RTOS一般采用抢先式的任务调度方式,举例说当任务A等待的资源available的时候,DSP会执行一个任务调度函数scheduler,这个函数会检查当前任务是否比任务A优先级低,如果是的话,就会把它当前挂起,然后把任务A保存在堆栈里寄存器值全部pop到DSP处理器中(这就是所谓的任务现场恢复).接着scheduler还会把从堆栈中取出任务A挂起时的程序执行的地址,pop到PC,使任务A继续执行.这样当前任务就被任务A抢先了. 使用RTOS之后,每个任务都会有一个主函数,这个函数的起始地址就是该任务的入口.一般每个任务的主函数里有一个死循环,这个循环使该任务周期地执行,完成一部分算法模块的功能,其实这个函数跟普通函数没任何区别,类似于C语言中的main函数.一个任务创建的时候,RTOS会把这个函数入口地址压入任务的堆栈中,好象这个函数(任务)刚发生过一次中断一样.一旦这个新创建任务的优先级在就绪队列中是最高的,RTOS就会从其堆栈中弹出其入口地址开始执行. 有一个疑问是,不使用RTOS,而是简单使用一个主循环在程序中调用各个函数模块,一样可以实现软件的调度执行.那么,这种常用的方法与使用RTOS相比有什么区别呢?其实,使用主循环的方法不过是一种没有优先级的顺序执行的调度策略而已.这种方法的缺点在于,主循环中调用的各个函数是顺序执行的,那么,即使是一个无关紧要的函数(比如闪烁一个LED),只要他不主动返回,也会一直执行直到结束,这时,如果发生一个重要的事件(比如DMA buffer full 中断),就会得不到及时的响应和处理,只能等到那个闪烁LED的函数执行完毕.这样就使整个DSP处理的优先次序十分不合理.而在使用了RTOS之后,当一个重要的事件发生时,中断处理会进入RTOS,并调用scheduler,这时scheduler 会让处理这一事件的任务抢占DSP处理器(因为它的优先级高).而哪个闪烁LED任务即使晚执行几毫秒都没任何影响.这样整个DSP的调度策略就十分合理.RTOS要说的内容太多,我只能讲一下自己的一点体会吧 DSP与正(余)弦波 在DSP的应用中,我们经常要用到三角函数,或者合成一个正(余)弦波.这是因为我们喜欢把信号通过傅立叶变换映射到三角函数空间来理解信号的频率特性.信号处理的一些计算技巧都需要在DSP软件中进行三角函数计算.然而三角函数计算是非线性的计算,DSP并没有专门的指令来求一个数的正弦或余弦.于是我们需要用线性方法来近似求解. 一个直接的想法是用多项式拟合,这也正是大多数DSP C编译器提供正余弦库函数所采用的方法.其原理是把三角函数向函数空间{1,x,x^2,x^3....}上投影,从而获得一系列的系数,用这些系数就可以拟合出三角函数.比如,我们在[0,pi\\\/2]区间上拟合sin,只需在matlab中输入以下命令: x=0:0.05:pi\\\/2; p=polyfit(x,sin(x),5) 就得到5阶的多项式系数: p = 0.00581052047605 0.00580963216172 -0.17193865685360 0.00209002716293 0.99969270087312 0.00000809543448 于是在[0,pi\\\/2]区间上: sin(x)= 0.00000809543448+0.99969270087312*x+ 0.00209002716293*x^2-0.17193865685360*x^3+ 0.00580963216172*x^4+0.00581052047605*x^5 于是在DSP程序中,我们可以通过用乘加(MAC)指令计算这个多项式来近似求得sin(x) 当然如果用定点DSP还要把P这个多项式系数表用一定的Q值来改写成定点数. 这样的三角函数计算一般都需要几十个cycle 的开销.这对于某些场合是不能容忍的 另一种更快的方法是借助于查表,比如,我们将[0,pi\\\/2]分成32个区间,每个区间长度就为pi\\\/64,在每个区间上我们使用直线段拟合sin曲线,每个区间线段起点的正弦值和线段斜率事先算好,存在RAM里,这样就需要在在RAM里存储64个 常数: 32个起点的精确的正弦值(事先算好): s[32]={0,sin(pi\\\/64),sin(pi\\\/32),sin(pi\\\/16)....} 32个线段的斜率: f[32]={0.049,.....} 对于输入的每一个x,先根据其大小找到所在区间i,通常x用定点表示,一般取其高几位就是系数i了,然 后通过下式即可求出sin(x): sin(x)= s*f 这样一般只需几个CYCLE就可以算出正弦值,如果需要更高的精度,可以将区间分得更细,当然,也就需 要更多的RAM去存储常数表. 事实上,不仅三角函数,其他的各种非线性函数都是这样近似计算的. 1. 接触DSP 在参加过一次社会上多的尽乎到了泛滥地步的DSPxxx培训班之后,我自信已经具备DSP工师资格,便欣喜若狂跑道书店买了一本名为DSP xxx应用的书,作者叫xxx,并且是这个领域的牛人,这本书确实是很出色的书籍.但是当时,对于我这个对DSP一窍不通、刚刚入门的人来说却建立了一个错误的概念——DSP是个很容易的领域,只要培训一下,再稍微看看书,就可以成为专家.所以,现在看来,这些都是误导,我认为学习DSP技术应该分为两个阶段,第一阶段学习DSP技术基础概念;第二阶段学习DSP技术的行业应用.那本DSP xxx应用的书,它更适合书名应叫做DSP中的数学或物理运用...什么的. 2. 购买DSP学习套件 有了兴趣,就要去学习,于是我撺掇领导批准购买了DSP学习入门套件(DSK),许多公司均有销售,如TI等,大概是需要3000-4000人民币.买后不久,我就发现,这种套件对于我来说一点用处都没有.因为我的基础知识实在是太差了.这些套件对于我来说,只是另一种涵义的PC机及一些外围设备,想要懂的这些东西,我就需要去读更多的相关书籍,这时,很难没有想要放弃的念头,我开始有点畏惧DSP这种技术,门槛太高了.可是,我不能放弃,我已经投入了许多的金钱和时间,我不想丢掉这4000元钱,也不能对领导没有交待.事实上,我没有想到,我将付出更多的钱和时间去学习. 3. 再次参加培训班,再次购买DSP书籍 在我就感到了无助,困惑之际.我又想到了放弃.虽然我的数学还算不错,但其中遇到的一些问题在我思考后,还是无法解决,我越来越畏惧DSP了.于是,我开始在google上搜索DSP培训相关的信息,终于发现闻亭公司DSP培训中心的教程和内容正是我一直寻找的东西.也许是DSP技术对我的有着巨大的诱惑力,也许是我的之直着,我又一次勇敢的报名参加了培训.32个课时之后,解决了我半年多来积累的很多粗浅的问题.再翻开培训教材刚刚复读了第一章时,我想如果这本教材是我读到的第一本书,并且我没有花4000元买那个可*的学习套件,我会毫不犹豫的投降,放弃学习DSP,但.......那个可*的xxx作者,他的书怎么可以用作教学呀.他的书虽然让我对DSP产生了浓厚的兴趣,却把我引到了一条艰难的路上,而且花了那么多的冤枉钱....既然事已如此,我只有慢慢的去读这些书籍,在我读到教材的后面章节以后,我开始明白前面章节的内容,所以当你读书遇到不明白的时候,千万不要气馁.有时,一个内容,可能需要读上几遍,才能明白,这比一开始的感觉要好的多了. 4. 实验——至关重要的一步 现在,从你的架子上取下那套DSK,去尝试做一些小实验,我的第一个实验是正弦发生器,这个实验比较简单,但是它也花费了我几周的时间去读大量的关于串口、编码、寄存器等的书并且进行大量的实验.这个执行半小时的正弦发生器,让我查阅了恨不得够组建一个图书馆的书籍,而且这个东西没有任何用途.我是用汇编语言在54x中执行,这个实验让我很好的理解了什么是DSP,什么是McBSP, DMA, 等.当然问题也同步产生了,我就又不得不做了许多的实验去验证.我建议,在系统未定型之前,使用mathlab\\\/simulink进行仿真,并且可以多实验几种芯片,这样可以让你明白更多的内容.我觉得我就要成为一个真正的DSP工程师了,我度过了最困难的时期.我觉得自己是个英雄,嘿嘿. 5. 去寻找一份与DSP相关的工作,去当个DSP工程师 我希望困难已经过去,但这种愿望为时过早了.在DSP的研究中,我还遇到了很多的困难,由于篇幅有限,我就不在进行描述了.反正,如果想成为真正的DSP专家,就不要期望事情会变得容易.有些DSP开发人员并不知道什么是真正的0和1,他们只会查阅各种参考书籍和参数表,我们并不提倡这种做法.因为这些人选择了一种简单的做法,但是他们并不是真正的DSP开发人员.他们只是编写一些他们不理解的代码,他们似乎在担当着一台编码器的角色. 6. 总结 这篇文章只是我的一点感慨,可能并不是很适用现在的DSP开发工程师,因为,市面上已经有了供你学习的DSP教学套件,搭配了多种实验供你参考,轻松入门,如:闻亭公司的大学实验箱什么的.这个实验箱提供了一个很好的实验环境,并且为初学的你设计了多种实验、教材,让你由浅入深的学习.不会向我似的,绕一大圈才走到正确的路上.另外,你也可以向他们的工程师咨询.
有单片机基础在学习DSP有多难,DSP很难么
我本科毕业\\\/
1. 接触DSP 在参加过一次社会上多的尽乎到了泛滥地步的DSPxxx培训班之后,我自信已经具备资格,便欣喜若狂跑道书店买了一本名为DSP xxx应用的书,作者叫xxx,并且是这个领域的牛人,这本书确实是很出色的书籍。
但是当时,对于我这个对DSP一窍不通、刚刚入门的人来说却建立了一个错误的概念——DSP是个很容易的领域,只要培训一下,再稍微看看书,就可以成为专家。
所以,现在看来,这些都是误导,我认为学习DSP技术应该分为两个阶段,第一阶段学习DSP技术基础概念;第二阶段学习DSP技术的行业应用。
那本DSP xxx应用的书,它更适合书名应叫做“DSP中的数学或物理运用”...什么的。
2. 购买DSP学习套件 有了兴趣,就要去学习,于是我撺掇领导批准购买了DSP学习入门套件(DSK),许多公司均有销售,如TI等,大概是需要3000-4000人民币。
买后不久,我就发现,这种套件对于我来说一点用处都没有。
因为我的基础知识实在是太差了。
这些套件对于我来说,只是另一种涵义的PC机及一些,想要懂的这些东西,我就需要去读更多的相关书籍,这时,很难没有想要放弃的念头,我开始有点畏惧DSP这种技术,门槛太高了。
可是,我不能放弃,我已经投入了许多的金钱和时间,我不想丢掉这4000元钱,也不能对领导没有交待。
事实上,我没有想到,我将付出更多的钱和时间去学习3. 再次参加培训班,再次购买DSP书籍 在我就感到了无助,困惑之际。
我又想到了放弃。
虽然我的数学还算不错,但其中遇到的一些问题在我思考后,还是无法解决,我越来越畏惧DSP了。
于是,我开始在“google上搜索DSP培训相关的信息,终于发现闻亭公司“DSP培训中心”的教程和内容正是我一直寻找的东西。
也许是DSP技术对我的有着巨大的诱惑力,也许是我的执着,我又一次勇敢的报名参加了培训。
32个课时之后,解决了我半年多来积累的很多粗浅的问题。
再翻开培训教材刚刚复读了第一章时,我想如果这本教材是我读到的第一本书,并且我没有花4000元买那个可*的学习套件,我会毫不犹豫的投降,放弃学习DSP,但……。
那个可*的xxx作者,他的书怎么可以用作教学呀。
他的书虽然让我对DSP产生了浓厚的兴趣,却把我引到了一条艰难的路上,而且花了那么多的冤枉钱...。
既然事已如此,我只有慢慢的去读这些书籍,在我读到教材的后面章节以后,我开始明白前面章节的内容,所以当你读书遇到不明白的时候,千万不要气馁。
有时,一个内容,可能需要读上几遍,才能明白,这比一开始的感觉要好的多了。
4. 实验——至关重要的一步 现在,从你的架子上取下那套DSK,去尝试做一些小实验,我的第一个实验是“正弦发生器”,这个实验比较简单,但是它也花费了我几周的时间去读大量的关于串口、编码、寄存器等的书并且进行大量的实验。
这个执行半小时的“正弦发生器”,让我查阅了恨不得够组建一个图书馆的书籍,而且这个东西没有任何用途。
我是用在54x中执行,这个实验让我很好的理解了什么是DSP,什么是McBSP, DMA, 等。
当然问题也同步产生了,我就又不得不做了许多的实验去验证。
我建议,在系统未定型之前,使用mathlab\\\/simulink进行仿真,并且可以多实验几种芯片,这样可以让你明白更多的内容。
我觉得我就要成为一个真正的了,我度过了最困难的时期。
我觉得自己是个英雄,嘿嘿。
5. 去寻找一份与DSP相关的工作,去当个 我希望困难已经过去,但这种愿望为时过早了。
在DSP的研究中,我还遇到了很多的困难,由于篇幅有限,我就不在进行描述了。
反正,如果想成为真正的DSP专家,就不要期望事情会变得容易。
有些DSP开发人员并不知道什么是真正的0和1,他们只会查阅各种参考书籍和参数表,我们并不提倡这种做法。
因为这些人选择了一种简单的做法,但是他们并不是真正的DSP开发人员.他们只是编写一些他们不理解的代码,他们似乎在担当着一台“编码器”的角色.6. 总结 这篇文章只是我的一点感慨,可能并不是很适用现在的DSP开发工程师,因为,市面上已经有了供你学习的DSP教学套件,搭配了多种实验供你参考,轻松入门,如:闻亭公司的“大学实验箱”什么的。
这个实验箱提供了一个很好的实验环境,并且为初学的你设计了多种实验、教材,让你由浅入深的学习。
不会向我似的,绕一大圈才走到正确的路上。
另外,你也可以向他们的工程师咨询。
祝所有DSP的研究者早日成功
DSP嵌入式无线通信系统开发实例精讲的目录
我也不懂,以下是我搜集的,希望有帮助DSP芯片,也称信号处理器,是一种特别适合于进行数字信理运算的微处理器具,其主机应用是实时快速地实现各种数字信号处理算法。
根据数字信号处理的要求,DSP芯片一般具有如下主要特点: (1)在一个指令周期内可完成一次乘法和一次加法; (2)程序和数据空间分开,可以同时访问指令和数据; (3)片内具有快速RAM,通常可通过独立的数据总线在两块中同时访问; (4)具有低开销或无开销循环及跳转的硬件支持; (5)快速的中断处理和硬件I\\\/O支持; (6)具有在单周期内操作的多个硬件地址产生器; (7)可以并行执行多个操作; (8)支持流水线操作,使取指、译码和执行等操作可以重叠执行。
当然,与通用微处理器相比,DSP芯片的其他通用功能相对较弱些。
单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。
概括的讲:一块芯片就成了一台计算机。
它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。
单片机的应用领域 : 1. 单片机在智能仪器仪表中的应用; 2. 单片机在工业测控中的应用; 3. 单片机在计算机网络和通讯技术中的应用; 4. 单片机在日常生活及家电中的应用; 5. 单片机在办公自动化方面。
DSP比单片机贵你说的是其中的一部分知识,是DSP处理的信息的原理。
要向学习DSP的硬件开发,还要学习微机原理,由单片机系统的设计经验最好。
还有就是DSP的开发环境,也就是CCS,要掌握常用的编程语言,有汇编语言和C语言的编程经验最好. 首先要了解DSP的特点。
数字信号处理相对于模拟信号处理有很大的优越性,表现在精度高、灵活性大、可靠性好、易于大规模集成等方面。
随着人们对实时信号处理要求的不断提高和大规模集成电路技术的迅速发展,数字信号处理技术也发生着日新月异的变革。
实时数字信号处理技术的核心和标志是数字信号处理器。
自第一个微处理器问世以来,微处理器技术水平得到了十分迅速的提高,而快速傅立叶交换等实用算法的提出促进了专门实现数字信号处理的一类微处理器的分化和发展。
数字信号处理有别于普通的科学计算与分析,它强调运算处理的实时性,因此DSP除了具备普通微处理器所强调的高速运算和控制功能外,针对实时数字信号处理,在处理器结构、指令系统、指令流程上具有许多新的特征,其特点如下: (1) 算术单元 具有硬件乘法器和多功能运算单元,硬件乘法器可以在单个指令周期内完成乘法操作,这是DSP区别于通用的微处理器的一个重要标志。
多功能运算单元可以完成加减、逻辑、移位、数据传送等操作。
新一代的DSP内部甚至还包含多个并行的运算单元。
以提高其处理能力。
针对滤波、相关、矩阵运算等需要大量乘和累加运算的特点,DSP的算术单元的乘法器和加法器,可以在一个时钟周期内完成相乘、累加两个运算。
近年出现的某些DSP如ADSP2106X、DSP96000系列DSP可以同时进行乘、加、减运算,大大加快了FFT的蝶形运算速度。
(2) 总线结构 传统的通用处理器采用统一的程序和数据空间、共享的程序和数据总线结构,即所谓的冯•诺依曼结构。
DSP普遍采用了数据总线和程序总线分离的哈佛结构或者改进的哈佛结构,极大的提高了指令执行速度。
片内的多套总线可以同时进行取指令和多个数据存取操作,许多DSP片内嵌有DMA控制器,配合片内多总线结构,使数据块传送速度大大提高。
如TI公司的C6000系列的DSP采用改进的哈佛结构,内部有一套256位宽度的程序总线、两套32位的数据总线和一套32位的DMA总线。
ADI公司的SHARC系列DSP采用超级哈佛结构(Super Harvared Architecture Computer),内部集成了三套总线,即程序存储器总线、数据存储器总线和输入输出总线。
(3) 专用寻址单元 DSP面向数据密集型应用,伴随着频繁的数据访问,数据地址的计算也需要大量时间。
DSP内部配置了专用的寻址单元,用于地址的修改和更新,它们可以在寻址访问前或访问后自动修改内容,以指向下一个要访问的地址。
地址的修改和更新与算术单元并行工作,不需要额外的时间。
DSP的地址产生器支持直接寻址、间接寻址操作,大部分DSP还支持位反转寻址(用于FFT算法)和循环寻址(用于数字滤波算法)。
(4) 片内存储器 针对数字信号处理的数据密集运算的需要,DSP对程序和数据访问的时间要求很高,为了减小指令和数据的传送时间,许多DSP内部集成了高速程序存储器和数据存储器,以提高程序和数据的访问存储器的速度。
如TI公司的C6000系列的DSP内部集成有1M~7M位的程序和数据RAM;ADI公司的SHARC系列DSP内部集成有0.5M~2M位的程序和数据RAM,Tiger SHARC系列DSP内部集成有6M位的程序和数据RAM。
(5) 流水处理技术 DSP大多采用流水技术,即将一条指令的执行过程分解成取指、译码、取数、执行等若干个阶段,每个阶段称为一级流水。
每条指令都由片内多个功能单元分别完成取指、译码、取数、执行等操作,从而在不提高时钟频率的条件下减少了每条指令的执行时间。
(6) DSP与其它处理器的差别 数字信号处理器(DSP)、通用微处理器(MPU)、微控制器(MCU)三者的区别在于:DSP面向高性能、 重复性、数值运算密集型的实时处理;MPU大量应用于计算机;MCU则适用于以控制为主的处理过程。
DSP的运算速度比其它处理器要高得多,以FFT、相关为例,高性能DSP不仅处理速度是MPU的 4~10倍,而且可以连续不断地完成数据的实时输入/输出。
DSP结构相对单一,普遍采用汇编语言编程,其任务完成时间的可预测性相对于结构和指令复杂(超标量指令)、严重依赖于编译系统的MPU强得多。
以一个FIR滤波器实现为例,每输入一个数据,对应每阶滤波器系数需要一次乘、一次加、一次取指、二次取数,还需要专门的数据移动操作,DSP可以单周期完成乘加并行操作以及3~4次数据存取操作,而普通MPU完成同样的操作至少需要4个指令周期。
因此,在相同的指令周期和片内指令缓存条件下,DSP的运算送到可以超过MPU运算速度的4倍以上。
正是基于 DSP的这些优势,在新推出的高性能通用微处理器(如Pentium、Power PC 604e等)片内已经融入了 DSP的功能,而以这种通用微处理器构成的计算机在网络通信、语音图像处理、实时数据分析等方面的效率大大提高。
谈一点学dsp的心得 因为课题需要,所以跟dsp打上了交道。
大概从今年的8月份开始了解dsp。
那个时候中文书籍好像不是很多,就从网上下载ti的一些基本手册和几本大 黄皮书。
因为以前基本没接触过,所以没搞dsp之前觉得dsp好深奥好难,看 了一段时间书以后,开始使用ccs仿真一些程序。
现在回头看看ccs的软仿真 一般只能仿真算法的对错,对于算法的效率和其他一些性能的仿真基本没有 什么意义。
可惜刚上手的时候我对这个不太清楚,就一直在ccs的软仿真上 浪费了太多时间,总想通过ccs下的profiler观测值来提高程序效率,结果 和后来在实际板子上跑出来的效果大相径庭。
大概到了国庆假期结束,开始 画电路板,11月初拿到电路板开始漫长的调试过程。
早听人说过调硬件是一 件很苦恼又很无奈的事,因为好多问题没有道理可讲。
第一块板子是一块小 的实验板,制版焊接到调试一次通过,我就感觉调试硬件没什么特别难的。
结果后来的事实让我体验到了调试硬件的艰苦。
第二块板子也很快做完了, 结果上电后总进不去ccs。
折腾了两天,挨个管脚测,后来又和第一次做得 板子进行比较,发现一些中断引脚没有拉高,估计可能是这方面的原因。
把 这些中断管脚拉高以后,ccs顺利进去了。
后来又遇到了很多问题,每次都要 花上两三天时间才能把问题找出来。
到现在电路基本能跑起来,但还有些不太 稳定,原因还需要慢慢琢磨。
在调试过程中,能多找一些身边的高手问就尽量找,这样有两个好处,一 能节省你的时间,二可以从高手那里得到一些经验。
其次如果电路在调试过程 中老出问题,先检查程序,确认程序没有问题以后,在查硬件电路,这样一个 顺序效率比较高。
再就是多留意一下bbs上的信息,有的信息可能现在对你 没多少用处,但是可能在以后会用到。
还有一些具体经验,以后有时间在总结了 *^_^* 学习DSP可能需要时间很长,不是短期可以解决的。
我的建议: 1。
看网上资料; 2。
用DSK来练手; 3。
如果你连硬件经验都没有,那就得先练焊板子,哈哈 4。
找人请教 我的唯一感受,如果你想学深些的话: 1.多看TI的pdf,多多宜善,权威而且全面 2.硬件上,多做项目,包括单片机的、一般电路的都行 3.软件上,一般的编程不说了,编译原理之类的对混合编程很有帮助的 4.其它东西,就是那些随着DSP的出现才流行的东西,如DSP\\\/BIOS,CPLD技术等 其实也没什么诀窍,我现在还是照着上面学,离目标还差得远
基于DSP TMS320VC5402的音频信号分析仪毕业论文?
学习protel软件的体会 摘 要:介绍了Protel 99 SE的系统结构、主要特色以及在电路设计中的应用,指出了设计中出现的问题,并给出了具体的解决方法。
关键词:Protel 99 SE;电路原理图;印刷电路板;电路设计 2007年8月,在江苏省教育厅统一组织的“四新培训”活动中,我参加了由东南大学举办的“电子线路CAD——protel软件应用”培训。
作为初学者,我通过为期8天的学习,比较全面地了解和掌握了绘制、编辑电路原理图和印制电路图的方法和技巧,并能处理一些常见问题。
在对protel软件的学习中,我有不少心得体会,下面我就谈一下我的学习体会。
一、简要介绍Protel软件。
Protel是protel公司在80年代末推出的一款功能强大的电路CAD软件,其所设计的电子电路产品范围,涵盖了从小型的电子产品,一直到复杂的电子计算机,是目前国内电子行业使用最广泛的电子电路设计软件。
我所学习的Protel 99 SE 是Protel公司推出的最新版本,应用于电路原理图设计、电路板设计等,他基于Windows环境,功能强大,人机界面友好,能让人们在具有最完整的功能环境下,提升设计上的品质和效率。
二、Protel99SE软件的组成。
Protel99SE由五大系统构成。
1.原理图设计系统---原理图设计系统是用于原理图设计的Advanced Schematic 系统。
这部分包括用于设计原理图的原理图编辑器Sch以及用于修改、生成零件的零件库编辑器SCHLib。
2.印刷电路板设计系统---印刷电路板设计系统是用于电路板设计的 Advanced PCB。
这部分包括用于设计电路板的电路板编辑器PCB以及用于修改、生成零件封装的零件封装编辑器PCBLib。
3.信号模拟仿真系统---信号模拟仿真系统是用于原理图上进行信号模拟仿真的SPICE 3f5系统。
4. 可编程逻辑设计系统---可编程逻辑设计系统是基于CUPL的集成于原理图设计系统的PLD设计系统。
5.Protel99SE内置编辑器---这部分包括用于显示、编辑文本的文本编辑器Text和用于显示、编辑电子表格的电子表格编辑器Spread。
三、Protel99SE的主要特色。
1.Protel99SE系统针对Windows NT4\\\/9X作了纯32位代码优化,使得Protel99SE设计系统运行稳定而且高效。
2. SmartTool(智能工具)技术将所有的设计工具集成在单一的设计环境中;SmartDoc(智能文档)技术将所有的设计数据文件储存在单一的设计数据库中,用设计管理器来统一管理;SmartTeam(智能工作组)技术能让多个设计者通过网络安全地对同一设计进行单独设计,再通过工作组管理功能将各个部分集成到设计管理器中。
3. 对印刷电路板设计时的自动布局采用两种不同的布局方式,即组群式和基于统计方式;新增加了自动布局规则设计功能;增强的交互式布局和布线模式。
4.电路板信号完整性规则设计和检查功能可以检测出潜在的阻抗匹配、信号传播延时和信号过载等问题; 广泛的集成向导功能引导设计人员完成复杂的工作。
5.原理图到印刷电路板的更新功能加强了Sch和PCB之间的联系; 可以用标准或者用户自定义模板来生成新的原理图文件;集成的原理图设计系统收集了超过60000个元器件。
6.通过完整的SPICE 3f5仿真系统可以在原理图中直接进行信号仿真;可以选择超过60种工业标准计算机电路板布线模板或者用户可以自己生成一个电路板模板。
四、用Protel99SE进行电路设计的基本步骤。
1.设计电路原理图 电路原理图的设计是整个电路设计的基础,因此电路原理图要设计好,以免影响后面 的设计工作。
电路原理图的设计一般有如下步骤: (1)设置原理图设计环境;(2)放置元件;(3)原理图布线;(4)编辑和调整;(5)检查原理图;(6)生成网络表。
2.设计印刷电路板 印刷电路板设计是从电路原理图变成一个具体产品的必经之路,因此,印刷电路板设计是电路设计中最重要、最关键的一步。
通常,印刷电路板设计的具体步骤如下: (1)规划电路板;(2)设置参数;(3)装入网络表;(4)元器件布局;(5)自动布线;(6)手工调整。
五、实例 下面以两级放大电路的设计来说明Protel 99 SE在电路设计中的应用。
设计要求:(1)使用单层电路板;(2)电源、地线铜膜线的宽度为1.27 mm;(3)一般布线的宽度为0.635 mm 。
1. 设计电路原理图 原理图设计最基本的要求是正确性,其次是布局合理,最后是在正确性和布局合理的前 提下力求美观。
根据以上所述的电路原理图设计步骤,两级放大器电路原理图设计过程如下: (1) 启动原理图设计服务器 进入Protel 99 SE,创建一个数据库,执行菜单File\\\/New命令,从框中选择原理图服务器(Schematic Document)图标,双击该图标,建立原理图设计文档。
双击文档图标,进入原理图设计服务器界面。
(2) 设置原理图设计环境 执行菜单Design\\\/Options和Tool\\\/Preferences,设置图纸大小、捕捉栅格、电气栅格等。
(3) 装入所需的元件库 在设计管理器中选择Browse SCH页面,在Browse区域中的下拉框中选择Library,然后单击ADD\\\/Remove按钮,在弹出的窗口中寻找Protel 99 SE子目录,在该目录中选择Library\SCH路径,在元件库列表中选择所需的元件库,比如Miscellaneous devices
怎么学习DSP或者FPGA的开发。
求高人指点
FPGA我也开始学习已经一年多了,没有基础没有其他人帮助的情况下,要在半年实现FPGA的OFDM调制是不太可能的。
先熟悉环境,多用Verilog写代码。
先了解通信原理知道什么是OFDM,在MATLAB上面进行算法研究,通过了以后才能在FPGA上面实现的。
使用FPGA进行数字信号处理还是蛮好的,最近我也才写了一些相关的代码。
个人感觉首先需要对DSP要有所了解,然后做几种常用的滤波器,然后是FFT必须要的。
当然各种调制方式FSK,ASK,QAM也可以尝试的。
先只需要把原理设计出来以后进行仿真就能看到效果的。
当然如果不想写testbench,一般可以用signaltap直接调试也更为直观。
这是我的理解了。
数电课程设计 骨灰级进在线等
摘要:设计交通灯控制程序、用ICETEK-CTR上的发光二极管的亮灭模拟交通信号,并用其显示阵列模拟显示;使用TMS320VC5509DSP片上定时器定时产生时钟计数;利用ICETEK-CTR上键盘产生外中断,从而模拟实际生活中十字路口交通灯控制。
关键词:交通灯控制、ICETEK-CTR发光二极管、定时器、键盘 目录: 1.系统设计要求 2.总体方案设计 3.程序编写 4.实验步骤及调试 5.设计总结 (一) 系统设计要求 利用ICETEK-EDU实验箱提供的设备,设计模拟实际生活中十字路口交通灯控制,具体要求如下: 交通灯分红黄绿三色,东、南、西、北各一组,用灯光信号实现对交通的控制:绿灯信号表示通行,黄灯表示警告,红灯禁止通行,灯光闪烁表示信号即将改变。
计时显示:8*8点阵显示两位计数,为倒计时,每秒改变计数显示。
正常交通灯信号自动变换: (1) 南北方向绿灯,东西红灯( 20秒) (2) 南北方向绿灯闪烁 (3) 南北方向黄灯 (4) 南北方向红灯,东西方向黄灯 (5) 东西方向绿灯( 20秒) (6) 东西方向绿灯闪烁 (7) 东西方向黄灯 (8) 返回( 1)循环控制 紧急情况; 利用ICETEK-CTR上键盘产生外中断,中断正常信号顺序,模拟突发情况。
(二 ) 总体方案设计 (1) 交通灯模拟: 利用ICETEK-CTR上的一组发光二极管(共12只,分为东西南北四组、红黄绿三色)的亮灭实现交通信号的模拟。
(2) 计时显示: 利用ICETEK-CTR上的发光二极管显示阵列模拟显示。
Welcome visit us at: 对于计数显示,当处于状态1、5、*中时需要进行倒计时,需要计算在此状态中的计数值增量,根据增量判断是否更新计数显示。
(3) 计时: 使用TMS320VC5509DSP片上定时器,定时产生时钟计数,再利用此计数对应具体时间。
Welcome visit us at: statusNSRedEWYellow 4 南北红灯,东西黄灯 4秒(16,200,215) 20 状态编号 信号灯状态 状态定义 保持时间(计数值,起始时间,结束时间) 计数显示 1 南北绿灯,东西红灯 statusNSGreenEWRed 20秒(160,0,159) 20-0 2 南北绿灯闪烁,东西红灯 statusNSFlashEWRed 6秒(24,160,183) 0 3 南北黄灯,东西红灯 statusNSYellowEWRed 4秒(16,184,199) 20 5 南北红灯,东西绿灯 statusNSRedEWGreen 20秒(160,216,375) 20-1 6 南北红灯,东西绿灯闪烁 statusNSRedEWFlash 6秒(24,376,399) 0 7 南北红灯,东西黄灯 statusNSRedEWYellow 4秒(16,400,415) 20 8 南北黄灯,东西红灯 statusNSYellowEWRed 4秒(16,416,431) 20 * 南北红灯,东西红灯 StatusHold 20秒(160,0,159) 20-1 其中,正常顺序每112秒(计数值日448)为一个循环,状态“*”为非顺序状态。
这样,只要根据计数值就可确定当前状态,根据状态再分情况处理。
(4) 紧急情况: 紧急情况处理;模拟紧急情况(重要车队通过、急救车通过等)发生时,交通警察手动控制 1. 当任意方向通行剩余时间多于是秒,将时间改成10秒。
2. 正常变换到四面红灯(20秒) 3. 直接返回正常顺序的下一个通行信号(跳过闪烁绿灯、黄灯状态)。
(三)总程序流程图 Welcome visit us at: 定时器中断服务程序入口 计数工作变量值在原基础上加1 退出定时器中断服务程序 开始 初始化:EMIF、CPU、频率、ICETEK-CTR、定时器、中断控制寄存器、工作变量 根据定时器计数确定当前状态 根据当前状态设置批示灯状态 根据当前状态设置发光二极管显示阵列状态 读取键盘输入 结束
结束 Welcome visit us at: (四) 程序编写 根据设计要求,由于控制是由不同的各种状态按顺序发生的,我们可以采用状态机制控制方法来解决此问题。
具体方法是:首先列举所有可能发生的状态;然后将这些状态编号,按顺序产生这些状态;状态延续的时间用程序控制。
对于突发情况,可采用在正常顺序的控制中插入特殊控制序列的方式完成。
注:程序附在后面几页里 (五)实验步骤及调试 1.连接实验箱附带的键盘的PS2插头到ICETEK-CTRR的键盘接口P8 2.将ICETEK-CTR板的供电电源开关拨动到“开”的位置。
3.设置Code Composer Studio2.21在硬件仿真方式下运行。
4.启动Code Composer Studio2.21: 选择菜单Debug->Reset CPU。
5.编译并下载已编好的程序。
6.运行程序观察结果。
7.突发事件控制。
在ICETEK-CTR附带的小键盘上按下除“Enter“键外的按键,观察信号是否满足要求。
8.结束程序运行退出。
在ICETEK-CTR附带的小键盘上按下“Enter“键。
9.退出CCS (六)设计总结 通过此次课程设计,对交通灯的控制有了进一步的认识;同时 也掌握了TMS320VC5509DST定时器、外中断的使用和编程。
设计控制系统在把握好整体设计理念的同时,要考虑到特殊情况的存在。
本次控制程序的编写,考虑交通出现紧急情况是比较困难的一个方面,交通灯要如何高速。
(七)参考文献 胡庆名 李小刚 吴钰淳 EMS320C55X DSP原理、应用和设计 北京机械出版社,2005 同组者: (八)程序: 键盘中断服务程序入口 设置突发事件标志 退出键盘中断服务程序 Welcome visit us at: #include c5509.h #include ICETEK-VC5509-EDU.h #include scancode.h #define nStatusNSGreenEWRed 160 #define nStatusNSFlashEWRed 184 #define nStatusNSYellowEWRed 200 #define nStatusNSRedEWYellow 216 #define nStatusNSRedEWGreen 376 #define nStatusNSRedEWFlash 400 #define nStatusNSRedEWYellow1 416 #define nStatusNSYellowEWRed1 432 #define nTotalTime 448 #define nStatusHold 160 #define statusNSGreenEWRed 0 #define statusNSFlashEWRed 1 #define statusNSYellowEWRed 2 #define statusNSRedEWYellow 3 #define statusNSRedEWGreen 4 #define statusNSRedEWFlash 5 #define statusHold 6 void InitDSP(); void InitTimer(); void InitICETEKCTR(); void INTR_init(); void interrupt time(void); void interrupt xint2(void);\\\/\\\/ XINT2中断服务程序 void SetLEDArray1(int nNumber); \\\/\\\/ 修改显示内容 void RefreshLEDArray1(); \\\/\\\/ 刷新显示 void EndICETEKCTR(); unsigned int uWork,nTimeCount,nTimeMS; unsigned int uLightStatusEW,uLightStatusSN; unsigned int bHold; unsigned char ledbuf[8],ledx[8]; unsigned char led[40]= { 0x7E,0x81,0x81,0x7E,0x00,0x02,0xFF,0x00, 0xE2,0x91,0x91,0x8E,0x42,0x89,0x89,0x76, 0x38,0x24,0x22,0xFF,0x4F,0x89,0x89,0x71, 0x7E,0x89,0x89,0x72,0x01,0xF1,0x09,0x07, Welcome visit us at: 0x76,0x89,0x89,0x76,0x4E,0x91,0x91,0x7E }; int www=0; main() { int nWork1,nWork2,nWork3,nWork4; int nNowStatus,nOldStatus,nOldTimeCount,nSaveTimeCount,nSaveStatus; unsigned int nScanCode; nTimeCount=nTimeMS=0; bHold=0; uLightStatusEW=uLightStatusSN=0; nNowStatus=0; nOldStatus=1; nOldTimeCount=0; InitDSP(); \\\/\\\/ 初始化DSP,设置运行速度 InitICETEKCTR(); \\\/\\\/ 初始化显示\\\/控制模块 InitTimer(); \\\/\\\/ 设置定时器中断 \\\/\\\/ 根据计时器计数切换状态 \\\/\\\/ 根据状态设置计数和交通灯状态 while ( 1 ) { if ( bHold && nNowStatus==statusHold ) { if ( nTimeCount>=nStatusHold ) { nNowStatus=nSaveStatus; nTimeCount=nSaveTimeCount; bHold=0; } } else if ( nTimeCount



