DSP的特点与应用.docx

上传人:b****1 文档编号:3161342 上传时间:2023-05-05 格式:DOCX 页数:16 大小:22.44KB
下载 相关 举报
DSP的特点与应用.docx_第1页
第1页 / 共16页
DSP的特点与应用.docx_第2页
第2页 / 共16页
DSP的特点与应用.docx_第3页
第3页 / 共16页
DSP的特点与应用.docx_第4页
第4页 / 共16页
DSP的特点与应用.docx_第5页
第5页 / 共16页
DSP的特点与应用.docx_第6页
第6页 / 共16页
DSP的特点与应用.docx_第7页
第7页 / 共16页
DSP的特点与应用.docx_第8页
第8页 / 共16页
DSP的特点与应用.docx_第9页
第9页 / 共16页
DSP的特点与应用.docx_第10页
第10页 / 共16页
DSP的特点与应用.docx_第11页
第11页 / 共16页
DSP的特点与应用.docx_第12页
第12页 / 共16页
DSP的特点与应用.docx_第13页
第13页 / 共16页
DSP的特点与应用.docx_第14页
第14页 / 共16页
DSP的特点与应用.docx_第15页
第15页 / 共16页
DSP的特点与应用.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

DSP的特点与应用.docx

《DSP的特点与应用.docx》由会员分享,可在线阅读,更多相关《DSP的特点与应用.docx(16页珍藏版)》请在冰点文库上搜索。

DSP的特点与应用.docx

DSP的特点与应用

第1次作业DSP的特点与应用

●通用处理器(GPP)

1采用冯.诺依曼结构,程序和数据的存储空间合二而一

28086/286/386/486/Pentium/PentiumII/PentiumIIIPentiumⅣ

3PowerPc64-bitCPU(SUNSparc,DECAlpha,HP)

4CISC复杂指令计算机,RISC精简指令计算机

5采取各种方法提高计算速度,提高时钟频率,高速总线,多级Cashe,协处理器等

●SingleChipComputer/MicroControllerUnit(MCU)

1除通用CPU所具有的ALU和CU,还有存储器(RAM/ROM)寄存器,时钟,计数器,定时器,串/并口,有的还有A/D,D/A

2INTELMCS/48/51/96(98)

3MOTOROLAHCS05/011

●DSP

1采用哈佛结构,程序和数据分开存储

2采用一系列措施保证数字信号的处理速度,如对FFT的专门优化

DSP技术特点

1存储器结构

微处理器的存储器结构分为两大类:

冯·诺伊曼结构和哈佛结构。

由于成本的原因,GPP广泛使用冯·诺伊曼存储器结构。

典型冯·诺伊曼结构的特点是只有一个存储器空间、一套地址总线和一套数据总线;指令、数据都存放在这个存储器空间中,统一分配地址,所以处理器必须分时访问程序和数据空间。

通常,做一次乘法会发生4次存储器访问,用掉至少4个指令周期。

为了提高指令执行速度,DSP采用了程序存储器空间和数据存储器空间分开的哈佛结构和多套地址、数据总线。

哈佛结构是并行体系结构,程序和数据存于不同的存储器空间,每个存储器空间独立编址、独立访问。

因此,DSP可以同时取指令(来自程序存储器)和取操作数(来自数据存储器);而且,还允许在程序空间和数据空间之间相互传送数据。

哈佛读/写结构使DSP很容易实现单周期乘法运算。

2流水线

流水线结构将指令的执行分解为取指、译码、取操作数和执行等几个阶段。

在程序运行过程中,不同指令的不同阶段在时间上是重叠的,流水线结构提高了指令执行的整体速度,有助于保证数字信号处理的实时性。

因此,所有DSP均采用一定级数的流水线,如TMS320C54xDSP采用6级流水线,而TMS320C6xxxDSP采用8级流水线。

TMS320C55xDSP的流水线则被分为指令流水线和执行流水线两部分,指令流水线完成访问地址产生、等待存储器回应、取指令包、预解码等工作;执行流水线完成译码、读取/修改寄存器、读操作数和输出结果等工作。

3硬件乘法累加单元

由于DSP任务包含大量的乘法—累加操作,所以DSP处理器使用专门的硬件来实现单周期乘法,并使用累加器寄存器来处理多个乘积的累加;而且几乎所有DSP指令集都包含有MAC指令。

而GPP通常使用微程序实现乘法。

4零开销循环

DSP算法的特点之一是主要的处理时间用在程序中的循环结构中,因此多数DSP都有专门支持循环结构的硬件。

所谓“零开销”(zerooverhead)是指循环计数、条件转移等循环机制由专门硬件控制,而处理器不用花费任何时间。

通常GPP的循环控制是用软件来实现的。

5特殊的寻址方式

除了立即数寻址、直接寻址、间接寻址等常见寻址方式之外,DSP支持一些特殊的寻址方式。

例如为了降低卷积、自相关算法和FFT算法的地址计算开销,多数DSP支持循环寻址和位倒序寻址。

而GPP一般不支持这些寻址方式。

6高效的特殊指令

DSP指令集设计了一些特殊的DSP指令用于专门的数字信号处理操作。

这些指令充分利用了DSP的结构特点,提高了指令执行的并行度,从而大大加快了完成这些操作的速度。

例如TMS320C55xx中的FIRSADD指令和LMS指令,分别用于对称结构FIR滤波算法和LMS算法。

7丰富的片内外设

根据应用领域的不同,DSP片内集成了众多类型的硬件设备。

例如,定时器、串行口、并行口、主机接口(HPI)、DMA控制器、等待状态产生器、PLL时钟产生器、JTEG标准测试接口、ROM、RAM及Flash等。

这些片内外设提高了处理速度和数据吞吐能力,简化了接口设计,同时降低了系统功耗和节约了电路板空间。

举例DSP应用(FIR、IIR、FFT等)

1有限冲激响应滤波器DSP实现

在利用C55x系列处理器编写程序时,应充分利用处理器所提供的各种条件。

在下面所给出的实例中,可以发现该程序充分发挥了C55x内核双乘法器的作用,并灵活使用辅助寄存器的各种寻址方式。

这样做将提高处理器的工作效率,更好地满足系统实时性的要求。

该滤波器的阶数为4,输入数据长度为11。

程序清单:

N_TAPS.set4

N_DATA.set11

.data

COEFFS.int1,2,3,4

IN_DATA.int1,2,3,4,5,6,7,8,9,10,11

.bssOUT_DATA,N_DATA+N_TAPS1,,1

.text

BCLRARMS

.arms_off

bfir:

MOV#CODFFS,XCDP

AMOV#(IN_DATA+N_TAPS1),XAR0

AMOV#(IN_DATA+N_TAPS),XAR1

AMOV#OUT_DATA,XAR2

MOV#((N_DATAN_TAPS+1)/21),BRC0

MOV#(N_TAPS3),CSR

MOV#(-(N_TAPS1)),T0

MOV#(N_TAPS+1),T1

||RPTBLOCALFIREND1

MPY*AR0,*CDP+,AC0

:

:

MPY*AR1,*CDP+,AC1

RPTCSR

MACM*AR0,*CDP,AC0

:

:

MACM*AR1,*CDP+,AC1

MACM*AR0(T1),*CDP(T0),AC0

:

:

MACM*AR1(T1),*CDP(T0),AC1

MOVdbl(LO(AC0)),dbl(*AR2)

FIREND

计算的最终结果为:

0x0014,0x001E,0x0028,0x0032,

0x003C,0x0046,0x0050,0x005A

在取滤波器系数时,应注意要对生成的系数进行处理。

这是因为生成的系数一般都带有小数部分,而C55x系列处理器是定点处理器,不能处理小数。

因此,要对系数进行适当放大,使所有系数都在32768~+32767之间。

2无限冲激响应滤波器的结构

程序中AR0指向输入数据*x(n),AR1指向滤波器系数*h,AR2指向输出数据y(n),AR3指向中间变量dbuffer,T0存放滤波器中组成单元的数量,T1存放输入数据个数,滤波器的系数存放的顺序如下:

a11a21b21b11....a1ia2ib2ib1i

中间变量的排列顺序如下,i是中间变量所在单元的序号:

d1(n–1),d2(n–1),..di(n–1)d1(n–2),d2(n–2)...di(n–2)

程序清单:

SCALE.set0

.asgCDP,db_ptr;循环指针

.asgAR0,in_ptr;线性指针

.asgAR1,h_ptr;循环指针

.asgAR2,out_ptr;线性指针

.asgAR3,index;

.asgAR4,tap_updt;循环指针

PSHmmap(@ST1_L)

PSHmmap(@ST2_L)

PSHmmap(@ST3_L)

;配置状态寄存器

BCLR#CPL,ST1_55;通过DP进行相对寻址

PSHmmap(@DP_L)

MOV#0,DP;DP=0(访问应设计存器)

PSHT2

PSHT3

PSHBOTHXAR5

;初始化

BSET#CDPLC,ST2_55;CDP=circular(dbuffer)

BSET#AR1LC,ST2_55;AR3=circular(dbuffer)

BSET#AR4LC,ST2_55;AR4=circular(coeff)

BSET#SXMD,ST1_55;符号扩展使能

BCLR#SATD,ST1_55;关闭D单元饱和模式

BSET#FRCT,ST1_55;小数/模式使能

BCLR#SATA,ST3_55;关闭A单元饱和模式

BCLR#C54CM,ST1_55

BCLR#ARMS,ST2_55

;保存dbuffer[0]指针

MOVXAR3,XAR5

;保存当前dbuffer的地址

MOV*ar5,index

;保存循环地址db_ptr(CDP)和tap_updt(AR4)

MOVT0,T3;计算2*nbiq

SFTLT3,#1

ADD#1,T3

MOV@T3_L,BKC;初始化CDP循环缓冲大小(2*nbiq+1)

MOV@T3_L,BK47;初始化AR4循环缓冲大小(2*nbiq+1)

ADD#1,AR5

MOV@AR5_L,BSAC;初始化CDP循环起始地址:

dbuffer

MOV@AR5_L,BSA45

MOVindex,db_ptr

AMAR*db_ptr+

MOVindex,tap_updt

;设置循环地址h_ptr(AR1)

MOVT0,T3;计算4*nbiq

SFTLT3,#1

SFTLT3,#1

MOV@T3_L,BK03;初始化AR0-3循环缓冲大小(4*nbiq)

MOV@AR1_L,BSA01;初始化AR0-1循环起始地址:

coeff

MOV#0,AR1

;保存循环计数

SUB#1,T1,T3;计算nx1

MOVT3,BRC0;初始化外循环数(nx1)

MOVT0,T3;初始化内循环数(#bi-quads/21)

SFTLT3,#1

SUB#1,T3

MOVT3,BRC1

;定义地址偏移

MOV#1,T0

MOV#2,T1

;定义比例因子

MOV#SCALE,T2;比例因子

||SUBAC2,AC2

;内核

;XAR0:

x[]input

;XAR1:

h[]coefficients

;XAR2:

r[]result

;XAR3:

dbuffer[]

;XAR7:

reinitXAR1

RPTBLOCALouter_loop;外循环:

处理输入向量

MOV*in_ptr+<<#16,AC0;HI(AC2)=x(n)

||RPTBLOCALinner_loop;内循环:

处理一个单元

MOV#0,AC3

||MAS*(h_ptr+T1),*db_ptr+,AC0;AC0=x(n)a1*d(n1)

:

:

MAC*h_ptr(T0),*db_ptr+,AC2;AC2=b1*d(n1)

MAS*(h_ptr+T1),*db_ptr+,AC0;AC0=d(n)=x(n)a1*d(n1)a2*d(n2)

:

:

MAC*h_ptr(T0),*db_ptr+,AC2;AC2=b1*d(n1)+b2*d(n2)

MOVHI(AC0<

||ADDAC2,AC0;AC0=d(n)+b1*d(n1)+b2*d(n2)

;开始第二单元

MOV#0,AC2

||

MAS*(h_ptr+T1),*db_ptr+,AC0;AC0=x(n)a1*d(n1)

:

:

MAC*h_ptr(T0),*db_ptr+,AC3;AC3=b1*d(n1)

MAS*(h_ptr+T1),*db_ptr+,AC0;AC0=d(n)=x(n)a1*d(n1)a2*d(n2)

:

:

MAC*h_ptr(T0),*db_ptr+,AC3;AC2=b1*d(n1)+b2*d(n2)

inner_loop:

MOVHI(AC0<

||ADDAC3,AC0

outer_loop:

MOVrnd(HI(AC0)),*out_ptr+;把结果存到输出缓冲

;符号溢出

MOV#0,T0

XCClabel1,overflow(AC0)

label1:

MOV#1,T0

;保存最后一个索引值

MOVAR3,*AR5;保存索引值到dbuffer[0]

;Contextrestore

POPBOTHXAR5

POPT3

POPT2

POPmmap(@DP_L)

POPmmap(@ST3_L)

POPmmap(@ST2_L)

POPmmap(@ST1_L)

3快速傅里叶变换(FFT)的DSP实现

程序中AR0指向输入数据x(n),x(n)是复数,按照实数、虚数顺序放置,并且要求输入的数据进行位翻转。

T0存放FFT变换的点数,点数可以是16,32,64,128,256,512,1024之一。

应用该程序时,应包含TWDDLE.inc文件,该文件存放旋转因子,程序运行之后计算结果将覆盖输入数据。

程序清单:

RET_ADDR_SZ.set1;返回地址

REG_SAVE_SZ.set0;寄存器存储入口

FRAME_SZ.set2;本地变量

ARG_BLK_SZ.set0;参数块

PARAM_OFFSET.setARG_BLK_SZ+FRAME_SZ+REG_SAVE_SZ+RET_ADDR_SZ

.asg0,data_ptr

.asg1,data_sz

.asg2,scale_flag

.bsstempmem,2,,2

.bsstempmem1,2,,2

.asgT3,groups;蝶形运算组数量

.asgT1,index;校正地址

.asgAR7,bflies;蝶形结构数量

.asgAR4,k;外循环计数

.asgAR2,a;蝶形结构顶指针

.asgAR3,b;蝶形结构底指针

.asgAR5,temp;暂存寄存器

.text

;分配帧及变量块

AADD#-(ARG_BLK_SZ+FRAME_SZ+REG_SAVE_SZ),SP

;压栈

PSHT2

PSHT3

PSHBOTHXAR5

PSHBOTHXAR6

PSHBOTHXAR7

;保存入口值

MOVAR0,*sp(data_ptr);

MOVT0,*sp(data_sz);

MOVT1,*sp(scale_flag);

;执行FFT;

;修改状态寄存器

BSET#FRCT,ST1_55

BCLR#ARMS,ST2_55

BCLR#C54CM,ST1_55

;进行基4运算

ADD*sp(data_sz),AR0,AR2;c:

ar2=#(fftdata+2*2*FFT_SIZE/4)

SFTST0,#1;T0=FFT_SIZE/2

movar2,ar3

ADD*sp(data_ptr),T0,AR1;b:

ar1=#(fftdata+1*2*FFT_SIZE/4)

ADDT0,AR3;d:

ar3=#(fftdata+3*2*FFT_SIZE/4)

SFTST0,#1;T0=FFT_SIZE/4

SUB#2,T0

MOV#(tempmem1),AR7

MOV#tempmem,AR6

MOV#2,T1

||MOVdbl(*AR0),AC0;in(ar,ai)

MOVT0,BRC0

||ADDdual(*AR2),AC0,AC2;(ar+cr)/;(ai+ci)

MOVAR2,AR5

||MOV#1,T0

MOVdbl(*AR1),AC1;in(br,bi)

||MOVAC2,dbl(*AR6);temp(ar+cr),(ai+ci)

SUBdual(*AR3),AC1,AC2;(brdr)/(bidi)

SUBdual(*AR2+),AC0;(arcr)/(aici)

||MOVHi(AC2),T3;move(brdr)

ADDdual(*AR3),AC1,AC3;(br+dr)/(bi+di)

||MOVAC2,T2;move(bidi)

ADDdual(*AR6),AC3,AC0;(ar+cr)+(dr+br)=ar'

;(ai+ci)+(di+bi)=ai'

||MOVAC0,dbl(*AR7(T0));(arcr),(aici)unaligned

SUBdual(*AR6),AC3;(ar+cr)(dr+br)=br';(ai+ci)(di+bi)=bi'

||MOVAC0,dbl(*AR0+);out(ar';ai')

SUBADDT2,*AR7(T0),AC0;(arcr)(bidi)=dr';(arcr)+(bidi)=cr‘

ADDSUBT3,*AR7,AC1;(aici)+(brdr)=di'

;(aici)(brdr)=ci'

RPTBLOCALr4_loop

MOVAC3,dbl(*AR1+);out(br',bi')

||MOVdbl(*AR0),AC3;in(ar,ai)

MOVpair(HI(AC0)),dbl(*AR3+);out(dr',di')

||ADDdual(*AR2),AC3,AC2;(ar+cr)

;(ai+ci)

MOVdbl(*AR1),AC1;in(br,bi)

||MOVpair(LO(AC0)),dbl(*AR5+);out(cr',ci')

SUBdual(*AR3),AC1,AC2;(brdr)/(bidi)

||MOVAC2,dbl(*AR6);temp(ar+cr),(ai+ci)

SUBdual(*AR2+),AC3,AC0;(arcr)/(aici)

||MOVHi(AC2),T3;move(brdr)

ADDdual(*AR3),AC1,AC3;(br+dr)/(bi+di)

||MOVAC2,T2;move(bidi)

ADDdual(*AR6),AC3,AC0;(ar+cr)+(dr+br)=ar';(ai+ci)+(di+bi)=ai'

||MOVAC0,dbl(*AR7(T0));(arcr),(aici)unaligned

SUBdual(*AR6),AC3;(ar+cr)(dr+br)=br';(ai+ci)(di+bi)=bi'

||MOVAC0,dbl(*AR0+)

SUBADDT2,*AR7(T0),AC0;(arcr)(bidi)=dr';(arcr)+(bidi)=cr'

r4_loop:

ADDSUBT3,*AR7,AC1;(aici)+(brdr)=di';(aici)(brdr)=ci'

MOVAC3,dbl(*AR1+);out(br',bi')

MOVpair(HI(AC0)),dbl(*AR3+);out(dr',di')

MOVpair(LO(AC0)),dbl(*AR5+);out(cr',ci')

;基2(stages3->log2(FFT_SIZE))

;初始化

MOV*sp(data_ptr),AR0;ar0=#fftdata

OR#0x57,mmap(ST2_55);circularar0,ar1,ar2,ar4andar6

;蝶形运算起始地址

ADD#2,ar0,ar1

MOVmmap(@ar0),bsa23;Pleg

MOVmmap(@ar0),bsa45;P'leg(in-placebutterflies)

MOVmmap(@ar1),bsa01;Qleg

MOVmmap(@ar1),bsa67;Q'leg(in-placebutterflies)

;蝶形运算数量

MOV*sp(data_sz),T0

MOVT0,T1;T1=#FFT_SIZE

SFTST0,#1

SUB#2,T0

MOVmmap(@T0_L),bk03;bk03=(2*FFT_SIZE2),

MOVmmap(@T0_L),bk47;bk47=(2*FFT_SIZE2),

;初始化寄存器

MOV*sp(data_sz),T0

SFTST0,#1

SFTST0,#1

MOVT0,ar5;2*numberofgroupsforstage3

MOV#2,ar7;1/2*numberofbutterfliespergroupforstage3

AMOV#twiddle,xar3;notmodifiedduringiterationofthestages

ADD#2,AR3

MOVxar0,xar1;datapage=datapageofindata

MOVxar0,xar2;datapage=datapageofindata

MOVxar0,xar4;datapage=datapageofindata(in-placebutterflies)

M

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2