1、DSP的特点与应用第1次作业 DSP的特点与应用 通用处理器(GPP)1 采用冯.诺依曼结构,程序和数据的存储空间合二而一 2 8086/286/386/486/Pentium/Pentium II/ Pentium III Pentium 3 PowerPc 64-bit CPU(SUN Sparc,DEC Alpha, HP) 4 CISC 复杂指令计算机, RISC 精简指令计算机 5 采取各种方法提高计算速度,提高时钟频率,高速总线,多级Cashe,协处理器等 Single Chip Computer/ Micro Controller Unit(MCU)1 除通用CPU所具有的ALU
2、和CU,还有存储器(RAM/ROM)寄存器,时钟,计数器,定时器,串/并口,有的还有A/D,D/A 2 INTEL MCS/48/51/96(98) 3 MOTOROLA HCS05/011 DSP1采用哈佛结构,程序和数据分开存储 2采用一系列措施保证数字信号的处理速度,如对FFT的专门优化 DSP技术特点 1存储器结构微处理器的存储器结构分为两大类:冯诺伊曼结构和哈佛结构。由于成本的原因,GPP广泛使用冯诺伊曼存储器结构。典型冯诺伊曼结构的特点是只有一个存储器空间、一套地址总线和一套数据总线;指令、数据都存放在这个存储器空间中,统一分配地址,所以处理器必须分时访问程序和数据空间。通常,做一
3、次乘法会发生4次存储器访问,用掉至少4个指令周期。 为了提高指令执行速度,DSP采用了程序存储器空间和数据存储器空间分开的哈佛结构和多套地址、数据总线。哈佛结构是并行体系结构,程序和数据存于不同的存储器空间,每个存储器空间独立编址、独立访问。因此,DSP可以同时取指令(来自程序存储器)和取操作数(来自数据存储器);而且,还允许在程序空间和数据空间之间相互传送数据。哈佛读/写结构使DSP很容易实现单周期乘法运算。 2流水线 流水线结构将指令的执行分解为取指、译码、取操作数和执行等几个阶段。在程序运行过程中,不同指令的不同阶段在时间上是重叠的,流水线结构提高了指令执行的整体速度,有助于保证数字信号
4、处理的实时性。因此,所有DSP均采用一定级数的流水线,如TMS320C54x DSP 采用6级流水线,而TMS320C6xxx DSP 采用8级流水线。TMS320C55x DSP的流水线则被分为指令流水线和执行流水线两部分,指令流水线完成访问地址产生、等待存储器回应、取指令包、预解码等工作;执行流水线完成译码、读取/修改寄存器、读操作数和输出结果等工作。 3 硬件乘法累加单元由于DSP任务包含大量的乘法累加操作,所以DSP处理器使用专门的硬件来实现单周期乘法,并使用累加器寄存器来处理多个乘积的累加;而且几乎所有DSP指令集都包含有MAC指令。而 GPP通常使用微程序实现乘法。 4 零开销循环
5、DSP算法的特点之一是主要的处理时间用在程序中的循环结构中,因此多数DSP都有专门支持循环结构的硬件。所谓“零开销”(zero overhead)是指循环计数、条件转移等循环机制由专门硬件控制,而处理器不用花费任何时间。通常GPP的循环控制是用软件来实现的。 5 特殊的寻址方式除了立即数寻址、直接寻址、间接寻址等常见寻址方式之外,DSP支持一些特殊的寻址方式。例如为了降低卷积、自相关算法和FFT算法的地址计算开销,多数DSP支持循环寻址和位倒序寻址。而GPP一般不支持这些寻址方式。 6 高效的特殊指令 DSP指令集设计了一些特殊的DSP指令用于专门的数字信号处理操作。这些指令充分利用了DSP的
6、结构特点,提高了指令执行的并行度,从而大大加快了完成这些操作的速度。例如TMS320C55xx中的FIRSADD指令和LMS指令,分别用于对称结构FIR滤波算法和LMS算法。 7 丰富的片内外设 根据应用领域的不同,DSP片内集成了众多类型的硬件设备。例如,定时器、串行口、并行口、主机接口(HPI)、DMA控制器、等待状态产生器、PLL时钟产生器、JTEG标准测试接口、ROM、RAM及Flash等。这些片内外设提高了处理速度和数据吞吐能力,简化了接口设计,同时降低了系统功耗和节约了电路板空间。举例DSP应用(FIR、IIR、FFT等)1有限冲激响应滤波器DSP实现 在利用C55x系列处理器编写
7、程序时,应充分利用处理器所提供的各种条件。在下面所给出的实例中,可以发现该程序充分发挥了C55x内核双乘法器的作用,并灵活使用辅助寄存器的各种寻址方式。这样做将提高处理器的工作效率,更好地满足系统实时性的要求 。 该滤波器的阶数为4,输入数据长度为11。程序清单:N_TAPS .set 4N_DATA .set 11 .dataCOEFFS .int 1,2,3,4 IN_DATA .int 1,2,3,4,5,6,7,8,9,10,11.bss OUT_DATA, N_DATA + N_TAPS 1, ,1.textBCLR ARMS .arms_off bfir:MOV #CODFFS,X
8、CDP AMOV #(IN_DATA + N_TAPS 1),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 | RPTBLOCAL FIREND1 MPY * AR0,*CDP+,AC0 :MPY *AR1,*CDP+,AC1 RPT CSR MACM *AR0,*CDP, AC0 :MACM *AR1,*CDP+,AC1MACM *AR0(
9、T1), * CDP(T0),AC0: MACM *AR1(T1), * CDP(T0),AC1MOV dbl(LO(AC0),dbl(*AR2) FIREND 计算的最终结果为: 0x0014, 0x001E, 0x0028, 0x0032, 0x003C, 0x0046, 0x0050, 0x005A在取滤波器系数时,应注意要对生成的系数进行处理。这是因为生成的系数一般都带有小数部分,而C55x系列处理器是定点处理器,不能处理小数。因此,要对系数进行适当放大,使所有系数都在32768+32767之间。 2无限冲激响应滤波器的结构 程序中AR0指向输入数据*x(n),AR1指向滤波器系数*h
10、,AR2指向输出数据y(n),AR3指向中间变量dbuffer,T0存放滤波器中组成单元的数量,T1存放输入数据个数,滤波器的系数存放的顺序如下: a11 a21 b21 b11 .a1i a2i b2i b1i中间变量的排列顺序如下,i是中间变量所在单元的序号:d1(n1), d2(n1),.di(n1) d1(n2), d2(n2).di(n2)程序清单:SCALE .set 0.asg CDP, db_ptr ;循环指针.asg AR0, in_ptr ;线性指针.asg AR1, h_ptr ;循环指针.asg AR2, out_ptr ;线性指针.asg AR3, index ;.a
11、sg AR4, tap_updt ;循环指针PSH mmap(ST1_L)PSH mmap(ST2_L)PSH mmap(ST3_L); 配置状态寄存器 BCLR #CPL, ST1_55 ;通过DP进行相对寻址 PSH mmap(DP_L) MOV #0, DP ;DP=0 (访问应设计存器) PSH T2 PSH T3 PSHBOTH XAR5;初始化 BSET #CDPLC, ST2_55 ;CDP = circular (dbuffer) BSET #AR1LC, ST2_55 ; AR3 = circular (dbuffer) BSET #AR4LC, ST2_55 ; AR4 =
12、 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;保存dbuffer0指针 MOV XAR3, XAR5 ;保存当前dbuffer的地址 MOV *ar5, index ; 保存循环地址db_ptr (CDP)和 tap_updt (AR4) MOV T0, T3 ;计算 2*nbiq SFTL T3,
13、#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 MOV index, db_ptr AMAR *db_ptr+ MOV index, tap_updt; 设置循环地址h_ptr (AR1) MOV T0,T3 ;计算4*nbiq SFTL T3, #1 SFTL T3, #1 MOV T3_L,BK03 ;初始化 AR0-3
14、循环缓冲大小(4*nbiq) MOV AR1_L, BSA01 ;初始化 AR0-1循环起始地址: coeff MOV #0,AR1 ; 保存循环计数 SUB #1, T1,T3 ;计算nx1 MOV T3,BRC0 ;初始化外循环数 (nx1) MOV T0, T3 ;初始化内循环数 (#bi-quads/21) SFTL T3, #1 SUB #1,T3 MOV T3,BRC1 ; 定义地址偏移 MOV #1,T0 MOV #2,T1 ; 定义比例因子 MOV #SCALE, T2 ;比例因子| SUB AC2, AC2 ; 内核; XAR0: x input; XAR1: h coeff
15、icients; XAR2: r result; XAR3: dbuffer; XAR7: reinit XAR1RPTBLOCAL outer_loop ; 外循环:处理输入向量 MOV *in_ptr+ #16, AC0 ; HI(AC2) = x(n) | RPTBLOCAL inner_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
16、_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) MOV HI(AC0T2),*(tap_updt+T1) ; T1 = #2 , X2 | ADD AC2,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 ; A
17、C3 = 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: MOV HI(AC0log2(FFT_SIZE) ) ; 初始化 MOV *sp(data_ptr), AR0 ; ar0 = #fftdata OR #0x57 , mmap(ST2_55) ; circular ar0, ar1, ar2, ar4 and ar6 ; 蝶形运算起始地址 ADD #2, a
18、r0,ar1 MOV mmap(ar0),bsa23 ; P leg MOV mmap(ar0),bsa45 ; P leg (in-place butterflies)MOV mmap(ar1),bsa01 ; Q leg MOV mmap(ar1),bsa67 ; Q leg (in-place butterflies) ; 蝶形运算数量 MOV *sp(data_sz), T0 MOV T0, T1 ; T1 = #FFT_SIZE SFTS T0, #1 SUB #2, T0 MOV mmap(T0_L), bk03 ; bk03 = (2*FFT_SIZE2), MOV mmap(T
19、0_L), bk47 ; bk47 = (2*FFT_SIZE2), ; 初始化寄存器 MOV *sp(data_sz), T0 SFTS T0, #1 SFTS T0, #1 MOV T0, ar5 ; 2*number of groups for stage 3 MOV #2, ar7 ; 1/2 * number of butterflies per group for stage 3 AMOV #twiddle, xar3 ; not modified during iteration of the stages ADD #2, AR3MOV xar0,xar1 ; data page = data page of indata MOV xar0,xar2 ; data page = data page of indata MOV xar0,xar4 ; data page = data page of indata (in-place butterflies) M
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1