作为数位信号处理器最重要的就是数值计算与处理的功能...

实验 :Numerical Issues(2) & Block FIR Filter
作为数位信号处理器最重要的就是数值计算与处理的功能, 面将延续实验 继续
来介绍C54x在数值处理的方式.
Accumulative Overflow:
旦数值计算过后超出32 bits时,C54x提供8 bits
的Guard bits,故在 连串的计算过程 可暂不考
虑overflow的问题,计算完成后再来处理overflow的部份.请注意,Guard bits并不直
接参与运算,其功能主要用作缓冲之用,故C54x的运算能力仍为32 bits.(注1)
Overflow Mode:
Accumulator计算数值超过32 bits时,会自动发生Saturation.也就是将数值限制在
FF 8000 0000h与00 7FFF FFFFh之间.与Saturation mode最大的不同在於,Saturation
mode仅在Accumulator之值要存到记忆体时才会发生.而Overflow mode是在每 次的
Accumulator计算后就会发生.(注2)
OVM = 0 关闭Overflow mode
OVM = 1 启动Overflow mode
Rounding:
C54x之运算结果通常会以S.Q15模式放在Accumulator A或B之31~16 bits的位
置,这个时候在15~0 bits的位置加 8000h则可得到 舍五入的效果.
左 图所示只要在指令后加 R,则运算结果将
会自动做 舍五入.指令RND则是强制Accumulator
做 舍五入.(注3)
通常都会在最后 次的运算使用Rounding的功
能.
Bit compare and Test:
BIT为 个位元提取指令,指令格式为BIT
mem, Bit_code其 须注意的是
Bit#=(15-Bit_code).例如当Bit_code=4时,则
是将(15-4)=11位元的值复制到TC.
Boolean Operations:
C54x主要的布林运算指令有6个,AND,OR,XOR,ANDM,ORM及XORM其使用
方法与 般微处理器的布林运算指令类似.
Shift and Rotate Operations:
C54x之位移及旋转指令使用方法与 般微处理器类似,但是C54x多了Guard Bits
以及Sign-extension mode故有些 方必须注意.
SFTA src, SHIFT,[dst]
(right)-16≤SHIFT≤15(left )
SFTL src, SHIFT,[dst]
(right)-16≤SHIFT≤15(left )
SFTA是算术位移,
Guard bits也会 起参与位
移.右移时39 bit会补
Sign big.而SFTL是逻辑位
移,仅位移32 bits,位移后
ROLTC src
ROL src
ROR src
空缺的bit皆会补 0.
除了ROLTC多了TC bit以外,旋转指
令皆以32 bits及C bit做旋转位移.
其他数学运算指令:
LDU Load Unsigned ABS Absolute Value
MPYU Multiply (Unsigned * Unsigned) NEG 2's complement
MACSU MAC (Signed * Unsigned) CMPL 1's complement
C54x Division
般在做除法的演算都是以十进位来做处理,但所做的除法必须要换算为 进制才
能让电脑读取及运算,而C54X又是如何去做除法的演算呢 面以 个4bit的除数
去除以 个8bit的被除数来做例子:(注4)
被除数:00101000(decimal 40)
除数 :0011(decimal 3)
0010 1000
-0011
1111 1000
将被除数之7 ~ 4 bits与除数3 ~ 0 bits对齐后,
被除数无法去减除数,但是发现并不够减,也
就是结果为负,所以被除数必须向左移 位(借
位),并将被除数最右边的位元设为零,成为如
右的形式0101000 0,然后再做相减,如 图
所示
0101 000 0 商
-0011
0010 000 01 商-----(1)
然后再将(1)向左移 位并在商补1,可得
010000 01,然后再做相减,如 图所示
0100 00 01 商
-0011
0001 00 011 商-----(2)
然后再将(2)向左移 位并在商补1,可得
00100 011,然后再做相减,如 图所示
00100 011 商
-0011
被除数无法去减除数,所以被除数必须向左移
位(借位),并将商补零,成为如右的形式0100
0110,然后再做相减,如 图所示
0100 0110 商
-0011
0001 1101 商
余数
最后所得的 商---1101,余数---0001
完整的C54x Division程式
LD @den,16,A ;将den内16bit的资料放到A(31~16)
MPYA @num ;将den和num相乘存到B accumulator
ABS A ;将den取绝对值
STH A,@den ;取绝对值后的den存回记忆体
LD @num,A ;将num之值载入A(15~0)
ABS A ;num取绝对值
RPT #15 ;重复16次以求出最后的余数和商
SUBC @den,A ;被除数 个bit后移位并视结果补 0或1
XC 1,BLT ;判断B accumulator 是否小於零
NEG A ;若B accumulator 小於零则A accumulator变号
STL A,@quot ;将A accumulator的低16位元值存到quotient
numerator与denominator相乘所得结果的正负号可用於判断最后相除时的符号.
C54x提供了 个1 bit 的除法指令SUBC,但是此 指令仅能处理两个正数相除,故在
正式做除法演算前,必须将numerator与denominator取绝对值.而SUBC 的指令动作
便是将num ( accumulator A ) 与den相减,若结果为正,则A向左位移1 bit并且在bit
0补 1.若相减结果为负,则A向左位移1 bit并且在bit 0补 0.如此重复16次便
完成 个16 bits除以16 bits的除法运算.
最后利用XC 1, BLT指令来判断商数的正负号,因为numerator与denominator相
乘所得结果存於accumulator B,故使用BLT选项来判断B是否小於零,若小於零则NEG
A 将存於A内的商数转成负数.若B不小於零,则跳过NEG A指令直接将商数存至
quot.在XC指令 的1是定义若判断式为真,则执行 个1 word的指令,否则跳过
个1 word的指令.如果XC指令 填入2,则判断式为真,则执行 两个1 word的
指令,或是执行 个2 words指令,否则跳过2 words去执行.
Block FIR Filter
在实验 已经学习到如何去制作 个FIR filter,不过仅止於 个输入与 个输
出.现在来讨论当 连串的输入讯号时要如何得到输出讯号.(注5)
假设有6个输入讯号,今有 个3阶(4个系数)的FIR filter,则会产生3个输出.
x0 x1 x2 x3 x4 x5 a0 a1 a2 a3
AR3 AR2
y0 = a0x0 + a1x1 + a2x2 + a3x3 y0 y1 y2
AR1
x0 x1 x2 x3 x4 x5 a0 a1 a2 a3
AR3 AR2
y1 = a0x1 + a1x2 + a2x3 + a3x4 y0 y1 y2
AR1
x0 x1 x2 x3 x4 x5 a0 a1 a2 a3
AR3 AR2
y2 = a0x2 + a1x3 + a2x4 + a3x5 y0 y1 y2
AR1
fir: STM #a,AR2 ;将a的起始位置载入AR2
RPT #3 ;4个系数由ROM复制到a
MVPD #init_a,*AR2+
STM #2,BRC ;设定BRC = 2(重复3次)
STM #4,BK ;设定BK = 4
STM #1,AR0 ;设定AR0(index)= 1
STM #y,AR1 ;将y的起始位置载入AR1
STM #a,AR2 ;将a的起始位置载入AR2
STM #x,AR3 ;将x的起始位置载入AR3
RPTB done-1 ;由LD开始至STH重复执行3次
LD #0,A ;将A载入0
RPT #3 ;重复MAC指令4次
math: MAC *AR2+0%,*AR3+,A ;A = A + an*xn
MAR *+AR3(#-3) ;AR3减去3使得AR3指向新区段的第 个位置
STH A,*AR1+ ;将A(31~16)存至yn,AR1加1
done: RET ;副程式结束,返回
RPTB pmad指令可以做整个程式区段的重复执行,RPTB指令的 行开始
(RSA),至pmad所指定位置之间的程式区段(REA)重复执行.而执行的次数由
Block-repeat counter register (BRC)来决定,重复执行的次数为BRC+1.(注6)
C54x Circular Addressing:
在C54x 有 项对於运算
效能影响甚巨的功能就是
Circular addressing.假设现有
12 words(circular buffer size
register, BK=12)的记忆体空间
位於1230h ~ 123Bh,令AR2 =
1239h若使用circular addressing
时,当AR2 = AR2 + 3则AR2 =
1230h.若继续执行AR2 =
AR2 - 1则AR2 = 123Bh.
如此 来对AR2而言,
内容不论增加或减少,都不会超出预设的范围内,如同在绕圈 般.此项功能的好处是
可利用有限的记忆体空间,处理无限多的资料序列,并可提升指令运算的效率.
但是使用Circular addressing时有些规则必须注意,若使用R words的记忆体空间
作为circular addressing记忆体区段,则必须使此段记忆体空间的起始位置位於由LSB
开始算起N bits为0的记忆体位置,且2N > R.例如使用12 words,24 > 12故须由记忆
体位置LSB算起4 bits的值皆为0 ( bit3 ~ bit0 ).start addressing xxxx xxxx xxxx 0000
以十六进位表示为XXX0h,x或X表示任意数,如1230h或其他bit3 ~ bit0为0
的记忆体位址皆可作为起始位置.而在cmd档 亦须做适度的修正,例如fir的程式
所使用的a使用4 words ( BK=4 )的记忆体空间,则23 > 4故N = 3.若其所在的section
为coeff且记忆体位於DARAM,则在cmd档须做如 之宣告:
coeff :> DARAM align(8) PAGE 1
须做对齐的有3 bits,故写法为align(23) = align(8),如此CCS在组译时会自动空出
适当的位置给a.若无此宣告,则circular addressing 样可动作,但实际位置会出错.
Circular *ARn+% post increment by 1 - circular BK
*ARn-% post decrement by 1 - circular
*ARn+0% post increment by AR0 - circular BK, AR0
*ARn-0% post decrement by AR0 - circular
fir程式 的MAC *AR2+0%,*AR3+,A的AR2指向ax,由a0开始经过4次执行后因
为circular addressing的关系,AR2并非指向a5,而是指向a0.同时使用Xmem及Ymem
的指令,只有 列的定址法可以使用.(注7)
*ARx addr=ARx *ARx+ addr=ARx, ARx=ARx+1
*ARx- addr=ARx, ARx=ARx-1 *ARx+0% addr=ARx, ARx=cir(ARx+AR0)
MAR *+AR3(#-3)指令适用来调整ARx之值,以此左列指令为例,AR3 = AR3 +
(-3).因为REA的位置为STH A,*AR1+故STH执行完毕后BRC = BRC - 1并且会回
LD(RSA)指令执行,直到BRC小於零为止.
列是 个可以on-line执行的3阶FIR filter程式片段:
fir: STM #4,BK ;设定BK=4
STM #1,AR0 ;设定AR0(index)=1
STM #y,AR1 ;将y的起始位置载入AR1
STM #a,AR2 ;将a的起始位置载入AR2
STM #x,AR3 ;将x的起始位置载入AR3
loop: MPY *AR2+0%,*AR3+0%,A ;A = a0*x0
MAC *AR2+0%,*AR3+0%,A ;A = A + a1*x1
MAC *AR2+0%,*AR3+0%,A ;A = A + a2*x2
MAC *AR2+0%,*AR3,A ;A = A + a3*x3
STH A,*AR3 ;x3 = A
PORTW *AR3,0000h ;port(0000h) = x3
PORTR 0000h, *AR3 ;x3 = port(0000h)
B loop ;跳回loop
执行完第 个MAC指令后 执行完PORTR 0000h, *AR3指令后
Last X0{x(n)} 3nd X0{x(n-1)}
3nd X1{x(n-1)} 2rd X1{x(n-2)}
2rd X2{x(n-2)} First X2{x(n-3)}
First X3{x(n-3)} ← *AR3 Last X3{x(n)} ← *AR3
由 表可清楚的看出,当程式首次由loop处开始执行时,AR3由x0依序指向x3 ( x(n)
~ x(n-3) ),意即由最新 次的资料处理至最旧的 次.因为AR3在执行至PORTR 0000h,
*AR3指令前 直指向x3的位置,故由外部读取进来的最新资料便存放在x3,此时资料
的新旧顺序将推进ㄧ格.由於Circular addressing的影响,处理的顺序为x3,x0,x1,
x2 ( x(n) ~ x(n-3) ),意即由最新 次的资料处理至最旧的 次.如此 来只需有限的记
忆体空间,就可以不断的处理外部输入的资料.(注5)
注1 TMS320C54x DSP Reference Set, Volume 1: CPU and Peripherals (SPRU131) 4.3节
注2 TMS320C54x DSP Reference Set, Volume 1: CPU and Peripherals (SPRU131) 4.2.2节
注3 Code Composer Studio C5000 无RND指令,但TI手册尚有,使用时请注意.
注4 TMS320C54x DSP Reference Set, Volume 4: Applications Guide (SPRU173) 6.1节
注5 TMS320C54x DSP Reference Set, Volume 4: Applications Guide (SPRU173) 4.1节
注6 TMS320C54x DSP Reference Set, Volume 1: CPU and Peripherals (SPRU131) 6.8节
注7 TMS320C54x DSP Reference Set, Volume 1: CPU and Peripherals (SPRU131) 5.5.3.4节
TMS320C54x DSP Reference Set, Volume 4: Applications Guide (SPRU173) 3.7节
作业
1. (1)当accumulator A = 01 2345 6789时请写出执行SFTA A, 4, A或SFTL A,
4, A后accumulator A之结果.
(2)当accumulator A = FE DCBA 9876时请写出执行SFTA A, -4, A或SFTL A,
-4, A后accumulator A之结果.
2. 请参考 述之C54x Division程式来撰写 个-1234除以5的程式,并求出商及余
数.
3. 请利用"实验 Data.txt"档案 的5阶FIR filter(6个系数,fc = 2kHz),与input
讯号(40点资料,fs = 8kHz)做FIR滤波运算,并将运算结果output与input以
Code composer studio的Graph功能绘制出来.
4. 述之on-line FIR程式若使用99阶滤波器(100个系数)将如何改写.

引用地址:http://www.wenhei.com/document/1198875/

文件信息 »

发布时间:2008-05-03   文件大小:532008   类型:pdf 文档
下载文档 作为数位信号处理器最重要的就是数值计算与处理的功能...