当前位置:首页 > 教案
第二节 DSP的浮点运算方法
1.浮点数的表示方法 要 点 (1) C54x 本身是定点DSP芯片; (2)用定点DSP芯片进行浮点数运算,必须先将定点数转换为浮点数。 浮点数表示定点数,采用尾数和指数两部分来表示 定点数=尾数×2-(指数) 或 x=m×2e
2.定点数转换成浮点数 注意 由于C54x DSP用16位表示数字,其对浮点数的表
示与IEEE 754-1985标准的32位表示法略有不同。
采用一个单元保存指数和一个单元保存尾数的两个16位表示法。 转换要点 (1)先将定点数放在累加器A或B中,然后用指令:EXP A 或EXP B。 这是一条提取指数的指令,所提取的指数保存在T寄存器中。如果累加器A=0,则0→T;否则,累加器A的冗余符号位数减8→T。累加器A中的内容不变。
例5-16 提取A=FF FFFF FFCB中的指数值。 执行指令: EXP A
执行前 执行后
A=FF FFFF FFCB A=FF FFFF FFCB
T= 0000 T= 0019 (25)
本例中,由于A≠0,需要先求出A的冗余符号位并减去8。 A=F F F F F F F F C B 1111 1111 1111 1111 1111 1111 1111 1111 1100 1011 33位冗余符号位1, 33-8=25=0x0019
例5-17 提取B=07 8543 2105中的指数值。 执行指令: EXP B
执行前 执行后 B=07 8543 2105 B=07 8543 2105
T= 0007 T= FFFC (-4)
本例中,由于B≠0,需要先求出B的冗余符号位并减去8。 A= 0 7 8 5 4 3 2 1 0 5
0000 0111 1000 0101 0100 0011 0010 0001 0000 0101 4位冗余符号位0, 4-8=-4=0xFFFC
-4=-(0x0004)=(1111 1111 1111 1011+1)补=(0xFFFC) 补
(2)使用指令 ST T,EXPONENT 将保存在T寄存器中的指数存放到数据存储转换要点 器的指定单元EXPONENT中。 如 EXP A ST T,@e1 ;将指数存入数据存储器 ; e1所指定的单元中。 (3)使用指令NORM A 。 按T寄存器中的内容对累加器A进行归一化处理。这里的将定点数转换成浮点数所进行的归一化处理,指通过左移或右移,使一个二进制数变为一个小数,且小数点后的第一个数不为零,移动的位数用指数表示。
例如:
0.3=(0.010011)2×2-0=(0.10011)2×2-1, -0.8=-0.8×2-0=-(0.110011) 2×2-0,
-0.24=-(0.001111)×2-0=-(0.1111)2×2-2。 3=(11)2×2-0=(0.11)2×22 -8=-(1000)2×2-0=-(0.1)2×24 -24=-(11000)2×2-0=-(0.11)2×25
上例中,对于小数,当转换成小数点后第一位为1的归一化数时,通过将小数点右移实现,指数为负数。对于整数,则将小数点左移实现,指数搂正数。 例5-18 对累加器A进行归一化处理。 执行指令: NORM A
执行前 执行后
A=FF FFFF F001 A=FF 8008 0000
T= 0013 T= 0013(19)
执行时,按T中的十进制数值,这里为正19,对累加器A中的值左移19位,即将在A=FF FFFF F001中的值左移19位,低位添零,高位溢出丢弃。
A=(1111 1111 1111 1111 1111 1111 1111 0000 0000 0001 )2
←1111 1111 1111 1111 1111 1111 1111 0000 0000 0001 0000 0000 0000 0000 000 左移出去掉的19位 左移进19位添0 ←(1111 1111 1000 0000 0000 1000 0000 0000 0000 0000)2=(FF 8008 0000)16 例5-19 对累加器B中的值进行归一化处理后存入A。 执行指令: NORM B, A
执行前 执行后
A=FF FFFF F001 A=00 4214 1414 B=21 0A0A 0A0A B=21 0A0A 0A0A T= FFF9 T= FFF9(-7) 将B移-7位,即右移7位:
B=(0010 0001 0000 1010 0000 1010 0000 1010 0000 1010)2 → 0000 000 0010 0001 0000 1010 0000 1010 0000 1010 0000 1010
右移进7位添0 去掉移出的7位 →(0000 0000 0100 0010 0001 0100 0001 0100 0001 0100)2 =(00 4214 1414)16
转换要点 3.浮点数转换成定点数 在将浮点数转换成定点数时,按指数值将尾数右移(指数为负时左移)即可。其操作与定点数转换为浮点数相反。这种相反方向的移位是通过对指数取反实现的。 使用指令 NEG A NORM A
如指数在A中,尾数在x中,则将浮点数转换成定点数的指令为: NEG A ;指数反号
STL A,@temp ;将指数暂存在数据存储单元中 LD @temp,T ;将指数装入T寄存器 LD @x,16,A ;将尾数装入A的高16位
NORM A ;将尾数按T移位,由于T中的指数 ;是已经取反了的,所进行的移
;位为反向移位。转换后的定点 ;数在A中。
例5-20 编写浮点乘法程序,完成x1×x2=0.3×(-0.8)运算。程序清单为: .title “float.asm” ;程序名 .def start ;定义标号
STACK: .usect “STACK”,100 ;设置堆栈
.bss x1,1 ;为被乘数x1预留1个单元的空间 .bss x2,1 ;为乘数x2预留1个单元的空间
.bss e1,1 ;为被乘数的指数e1预留1个单元空间 .bss m1,1 ;为被乘数的尾数m1预留1个单元空间 .bss e2,1 ;为乘数的指数e2预留1个单元的空间
.bss m2,1 ;为乘数的尾数m2预留1个单元的空间 .bss ep,1 ;为乘积的指数ep预留1个单元的空间
.bss mp,1 ;为乘积的尾数mp预留1个单元的空间 .bss product,1 ;为乘积留空间 .bss temp,1 ;为暂存留空间
.data ;定义数据段 table: .word 3*32768/10 ;设初值 0.3
.word -8*32768/10 ;设初值-0.8
.text ;定义代码段 start: STM #STACK+100,SP ;设置堆栈指针初值 MVPD table,@x1 ;送0.3、-0.8 MVPD table+1,@x2 ;至数据存储器
LD @x1,16,A ;将x1送到A
EXP A ;取A中指数
ST T,@e1 ;存指数到e1
NORM A ;对A归一化 STH A,@m1 ;存尾数到m1 LD @x2,16,A ;将x2送到A
EXP A ;提取A中指数,放入T ST T,@e2 ;保存x2的指数到e2 NORM A ;对累加器A归一化 STH A,@m2 ;保存x2的尾数到m2 CALL MULT ;调用浮点乘法子程序 end: B end ;循环等待 MULT: SSBX FRCT ;设置小数乘法运算
SSBX SXM ;数据进入ALU之前进行符号位扩展
共分享92篇相关文档