第10讲-第7章应用程序设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
z = x+y ↓ zq*2-Qz = xq*2-Qx + yq*2-Qy ↓ zq = (xq*2-Qx + yq*2-Qy) * 2Qz ↓ zq = ( xq + yq*2Qx-Qy) * 2Qz-Qx
17
zq = ( xq + yq*2Qx-Qy) * 2Qz-Qx
定点加法:
int x,y,z;
0.25
-8192 -0.5 -0.25
13
溢出
• 溢出 – 算术运算结果超出寄存器所能表示的最大数
• C55x的溢出处理机制
– 保护位 • C55x的每个累加器都有8个保护位(39~32位) – 溢出标志位 – 饱和方式位
• SATD控制D单元的操作、SATA控制A单元的操作
• 溢出的处理方法 – 饱和、输入定标、固定定标和动态定标
.sect ".text" .align 4 .global start .sym start,start,36,2,0 start: MOV #0100h,AR1 MOV #0104h,AR2 MOV #0108h,AR3 MOV40 dbl(*AR1(#2)),AC0 SUB dbl(*AR2(#2)),AC0 MOV AC0,dbl(*AR3(#2)) ;AC0=X1X0 ;AC0=X1X0-Y1Y0 ;保存W1W0.
14
补充:定点运算实现的基本原理
• B.1 加法/减法的C语言定点模拟 • B.2 乘法的C语言定点模拟 • B.3 除法的C语言定点模拟
15
B.1 加法/减法的C语言定点模拟
• 浮点 • 定点 – x的Q值为Qx,标定值为xq float x,y,z; z=x+y;
• x= xq*2-Qx, xq=(int)(x*2Qx)
16bit 二 进 制 数 Qi : 215i 215 1 x i 2
2n 1 1 x 2i
11
nbit 二进制数 Qi : 2n 1i
• 定点数 – 小数点固定的数
• 浮点数 – 小数点不固定的数
• 123.45
• 12.345x101
• 1.2345 x102 • 0.12345 x103
– 64位的高32位加法要考虑低32位加法产生的进位
• ADD [ uns(]Smem[)], CARRY, ACx
加法指令见课本P98
28
例7-1,64位加法运算
.sect ".text"
.align 4 .global start .sym start,start, 36, 2, 0
start:
39
7.2.2 乘法运算
• 例7-3,32位整数乘法运算
AC0
AC0
+
+ +
Q14格式小数位权值 MSB(最高位) b15 -2 b14 1 b13 1/2 b12 1/4 … … b1 2-13 LSB(最低位) b0 2-14
Q0格式各位权值 MSB(最高位) b15 -215 b14 214 b13 213 b12 212 … … b1 21 LSB(最低位) b0 20
21666 *2-5 = 677.0625
23
B.3 除法的C语言定点模拟
• 浮点 • 定点 float x,y,z; z=x/y; x = xq*2-Qx, y = yq*2-Qy, xq = (int)(x*2Qx) yq = (int)(y*2Qy)
z = zq*2-Qz,
zq = (int)(z*2Qz)
• 比较 – 精度较低,数值范围较大
– 实现简单,效率较高
– 硬件支持定点数运算
– 精度较高,数值范围较小 (定标后) – 实现复杂,效率较低 – 硬件不一定支持浮点运算
12
转换方法
• 浮点数(x)→定点数(xq) – xq=(int)(x*2Q) = x << Q • 定点数(xq) →浮点数转换(x) – x=(float)(xq*2-Q) = xq >> Q
z = x/y ↓ zq*2-Qz = (xq*2-Qx) / (yq*2-Qy) ↓ zq = xq*2(Qz-Qx+Qy) / yq
24
zq = xq*2(Qz-Qx+Qy) / yq
定点除法:
int x,y,z;
long temp;
//定标后的整数值
temp = (long)x;
z = ( temp << (Qz-Qx+Qy) ) / y ;
long temp;
//定标后的整数值
temp = y<<(Qx-Qy);
temp = x + temp;
z = (int) (temp) << (Qz-Qx);
18
zq = ( xq + yq*2Qx-Qy) * 2Qz-Qx
• 例:设 x=0.5, y=3.1,计算z = x + y – 浮点运算为 z = x + y = 0.5 + 3.1 = 3.6 – 若 Qx=15, Qy=13, Qz=13,则定点运算为 x = 16384, y = 25395; // 定标后的整数 temp = 25393<<2 = 101580; temp = x + temp = 16384+101580 = 117964; z = (int) (temp) >> 2 = 29491;
MOV #0100h,AR1 MOV #0104h,AR2 MOV #0108h,AR3
MOV40 dbl(*AR1(#2)), AC0 ADD dbl(*AR2(#2)), AC0 MOV AC0,dbl(*AR3(#2)) MOV40 dbl(*AR1), AC0 ADD uns(*AR2(#1)),CARRY,AC0 ADD *AR2<<#16, AC0 MOV AC0, dbl(*AR3) B L1 ; AC0 = X1 X0 ; AC0 = X1 X0 + Y1 Y0 ; 保存W1 W0. ; AC0 = X3 X2 ; AC0 = X3 X2 + 00 Y2 + CARRY ; AC0 = X3 X2 + Y3 Y2 + CARRY ; 保存 W3 W2.
21
zq = (xq*yq)*2Qz-(Qx+Qy)
定点乘法:
int x,y,z;
long temp;
//定标后的整数值
temp = (long)x;
z = (temp*y) << (Qz-Qx-Qy);
22
zq = (xq*yq)*2Qz-(Qx+Qy)
• 例:设 x=18.4, y=36.8,计算z = x * y – 浮点运算为 z = x * y = 18.4*36.8 = 677.12 – 若 Qx=10, Qy=9, Qz=5,则定点运算为 x = 18841.6 ≈18841, y = 18841.6 ≈ 18841;// 定标后的整数 temp = (long)18841; z = (18841L*18841) << (5-9-10) = 21666;
二进制数
0010 0000 0000 0000b 0010 0000 0000 0000b
Q格式
Q0 Q14
十六进制数
2000H 2000H
十进制数
8192 0.5
Q15
Q0 Q14 Q15
2000H
E000H E000H E000H
0010 0000 0000 0000b
1110 0000 0000 0000b 1110 0000 0000 0000b 1110 0000 0000 0000b
L1:
MOV40 dbl(*AR1),AC0 SUB uns(*AR2(#1)),BORROW,AC0 SUB *AR2<<#16,AC0 MOV AC0,dbl(*AR3) B L1
;AC0=X3X2 ;AC0=X3X2-00Y2-BORROW ;AC0=X3X2-Y3Y2-BORROW ;保存 W3W2.
29
L1:
• 减法指令 – 单周期内完成32位减法运算: • MOV40 dbl(Lmem),ACx • SUB dbl(Lmem),ACx
– 64位的高32位减法要考虑低32位减法产生的借位
• SUB [uns(]Smem[)],BORROW,ACx
减法指令见课本P100
38
例7-2,64位减法运算
29491 *2-13 = 3.5999755859375 ≈ 3.6
19
B.2 乘法的C语言定点模拟
• 浮点 • 定点 float x,y,z; z=x*y;
x = xq*2-Qx, y = yq*2-Qy, z = zq*2-Qz,
xq = (int)(x*2Qx) yq = (int)(y*2Qy) zq = (int)(z*2Qz)
16384 *2-15 = 0.5
26
7.2 基础算术运算
• 7.2.1 加减运算 • 7.2.2 ห้องสมุดไป่ตู้法运算 • 7.2.3 除法运算 • 7.2.4 小数乘法
27
7.2.1 加减运算
• 加法指令 – 单周期内完成32位加法运算 • MOV40 dbl(Lmem),ACx • ADD dbl(Lmem),ACx
10
Q14格式小数位权值 MSB(最高位) b15 -2 b14 1 b13 1/2 b12 1/4 … … b1 2-13 LSB(最低位) b0 2-14
表 7-1 Q 表示及数值范围 Q 表示 Q15 Q14 Q13 Q12 Q11 Q10 Q9 Q8 Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0 十进制数 X 表示范围 -1≤X≤0.9999695 -2≤X≤1.9999390 -4≤X≤3.9998779 -8≤X≤7.9997559 -16≤X≤15.9995117 -32≤X≤31.9990234 -64≤X≤63.9980469 -128≤X≤127.9960938 -256≤X≤255.9921875 -512≤X≤511.9804375 -1024≤X≤1023.96875 -2048≤X≤2047.9375 -4096≤X≤4095.875 -8192≤X≤8191.75 -16384≤X≤16383.5 -32768≤X≤32767
20
x = xq*2-Qx, y = yq*2-Qy, z = zq*2-Qz,
xq = (int)(x*2Qx) yq = (int)(y*2Qy) zq = (int)(z*2Qz)
z = x*y ↓ zq*2-Qz = xq*2-Qx * yq*2-Qy ↓ zq*2-Qz = xq*yq*2-(Qx+Qy) ↓ zq = (xq*yq)*2Qz-(Qx+Qy)
25
zq = xq*2(Qz-Qx+Qy) / yq
• 例:设 x=18.4, y=36.8,计算z = x / y – 浮点运算为 z = x * y = 18.4 / 36.8 = 0.5 – 若 Qx=10, Qy=9, Qz=15,则定点运算为 x = 18841.6 ≈18841, y = 18841.6 ≈ 18841;// 定标后的整数 temp = 18841L; z = (18841L << (15-10+9) / 18841= 16384;
第7章 应用程序设计
(第10讲)
•7.1 定标与溢出处理
•补充:定点运算实现的基本原理 •7.2 基础算术运算
•7.3 FIR滤波器
•7.4 IIR滤波器 •7.5 快速傅立叶变换FFT
1
2
浮点数的计算机存储格式
3
4
5
6
7.1 定标与溢出处理
• C55x子系列 – 16位定点DSP • 参与运算的数是16位的整型数
• 如何处理小数? – 数的定标
• 由程序员确定一个数的小数点的位置
浮点 → 定点
小数点不固定
小数点固定
7
8
9
C55x中的定标方法
• 参与运算的数:16位整型数 – 数定标的Q表示法:每个采用Qi定标的16位数 • 1 个符号位、 i 个小数位、 15-i 个整数位
Q15格式小数位权值 MSB(最高位) b15 -1 b14 1/2 b13 1/4 b12 1/8 … … b1 2-14 LSB(最低位) b0 2-15
– y的Q值为Qy,标定值为yq • y= yq*2-Qy, yq=(int)(y*2Qy) – z的Q值为Qz,标定值为zq • z= zq*2-Qz, zq=(int)(z*2Qz)
16
x = xq*2-Qx, y = yq*2-Qy, z = zq*2-Qz,
xq = (int)(x*2Qx) yq = (int)(y*2Qy) zq = (int)(z*2Qz)