x第10讲-第7章应用程序设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
12
溢出
• 溢出 – 算术运算结果超出寄存器所能表示的最大数
• C55x的溢出处理机制
– 保护位 • C55x的每个累加器都有8个保护位(39~32位) – 溢出标志位 – 饱和方式位
• SATD控制D单元的操作、SATA控制A单元的操作
• 溢出的处理方法 – 饱和、输入定标、固定定标和动态定标
13
BSET SXMD BCLR SATD
BCLR FRCT
33
AMAR *AR0+ ||AMAR *AR1+
;AR0指向X0 ;AR1指向Y0
MPYM uns(*AR0-),uns(*AR1),AC0
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
16
zq = ( xq + yq*2Qx-Qy) * 2Qz-Qx
定点加法:
int x,y,z;
• 0.12345 x103
• 比较 – 精度较低,数值范围较大 – 实现简单,效率较高 – 硬件支持定点数运算 – 精度较高,数值范围较小 – 实现复杂,效率较低 – 硬件不一定支持浮点运算
6
7.1 定标与溢出处理
• C55x子系列 – 16位定点DSP • 参与运算的数是16位的整型数
• 如何处理小数? – 数的定标
24
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
8
9
C55x中的定标方法
• 16位整数采用补码形式表示,每个采用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
L1:
MOV40 dbl(*AR1),AC0 ;AC0=X3X2 SUB uns(*AR2(#1)),BORROW,AC0;AC0=X3X2-00Y2-BORROW SUB *AR2<<#16,AC0 ;AC0=X3X2-Y3Y2-BORROW MOV AC0,dbl(*AR3) ;保存 W3W2. B L1
long temp;
//定标后的整数值
temp = y<<(Qx-Qy);
temp = x + temp;
z = (int) (temp) << (Qz-Qx);
17
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;
补充:定点运算实现的基本原理
• B.1 加法/减法的C语言定点模拟 • B.2 乘法的C语言定点模拟 • B.3 除法的C语言定点模拟
14
B.1 加法/减法的C语言定点模拟
• 浮点 • 定点 – x的Q值为Qx,标定值为xq float x,y,z; z=x+y;
• x= xq*2-Qx, xq=(int)(x*2Qx)
29491 *2-13 = 3.5999755859375 ≈ 3.6
18
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
25
7.2 基础算术运算
• 7.2.1 加减运算 • 7.2.2 乘法运算 • 7.2.3 除法运算 • 7.2.4 小数乘法
26
7.2.1 加减运算
• 加法指令 – 单周期内完成32位加法运算 • MOV40 dbl(Lmem),ACx • ADD dbl(Lmem),ACx
28
L1:
• 减法指令 – 单周期内完成32位减法运算: • MOV40 dbl(Lmem),ACx • SUB dbl(Lmem),ACx
– 64位的高32位减法要考虑低32位减法产生的借位
• SUB uns(Smem),BORROW,ACx
29
例7-2,64位减法运算
.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.
30
7.2.2 乘法运算
• 例7-3,32位整数乘法运算
AC0
AC0
+
+ +
31
32
.sect ".text" .align 4
.global start .sym start,start,36,2,0
start:
MOV #0100h,AR0 MOV #0102h,AR1 MOV #0104h,AR2
– 64位的高32位加法要考虑低32位加法产生的进位
• ADD uns(Smem), CARRY, ACx
加法指令见课本P98
27
例7-1,64位加法运算
.sect ".text"
.align 4 .global start .sym start,start, 36, 2, 0
start:
MOV #0100h,AR1 MOV #0104h,AR2 MOV #0108h,AR3
19
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)
10
转换方法
• 浮点数(x)→定点数(xq) – xq=(int)(x*2Q) = x << Q • 定点数(xq) →浮点数转换(x) – x=(float)(xq*2-Q) = x >> Q
Q格式
Q0 Q14
十六进制数
2000H 2000H
二进制数
0010 0000 0000 0000b 0010 0000 0000 0000b
z = x/y ↓ zq*2-Qz = (xq*2-Qx) / (yq*2-Qy) ↓ zq = xq*2-(Qz-Qx+Qy) / yq
23
zq = xq*2-(Qz-Qx+Qy) / yq
定点除法:
int x,y,z;
long temp;
//定标后的整数值
temp = (long)x;
z = ( temp << (Qz-Qx+Qy) ) / y ;
21666 *2-5 = 677.0625
22
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)
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.
第7章 应用程序设计
(第10讲)
•7.1 定标与溢出处理
•补充:定点运算实现的基本原理 •7.2 基础算术运算
•7.3 FIR滤波器
•7.4 IIR滤波器
1
浮点数的计算机存储格式
2
3
4
5
7.1 定标与溢出处理
• 定点数 – 小数点固定的数 • 123.45 • 浮点数 – 小数点不固定的数 • 12.345x101 • 1.2345 x102
十wk.baidu.com制数
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
0.25
-8192 -0.5 -0.25
11
表 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
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
20
zq = xq*yq*2Qz-(Qx+Qy)
定点乘法:
int x,y,z;
long temp;
//定标后的整数值
temp = (long)x;
z = (temp*y) << (Qz-Qx-Qy);
21
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;
– y的Q值为Qy,标定值为yq • y= yq*2-Qy, yq=(int)(y*2Qy) – z的Q值为Qz,标定值为zq • z= zq*2-Qz, zq=(int)(z*2Qz)
15
x = xq*2-Qx, y = yq*2-Qy, z = zq*2-Qz,
xq = (int)(x*2Qx) yq = (int)(y*2Qy) zq = (int)(z*2Qz)
溢出
• 溢出 – 算术运算结果超出寄存器所能表示的最大数
• C55x的溢出处理机制
– 保护位 • C55x的每个累加器都有8个保护位(39~32位) – 溢出标志位 – 饱和方式位
• SATD控制D单元的操作、SATA控制A单元的操作
• 溢出的处理方法 – 饱和、输入定标、固定定标和动态定标
13
BSET SXMD BCLR SATD
BCLR FRCT
33
AMAR *AR0+ ||AMAR *AR1+
;AR0指向X0 ;AR1指向Y0
MPYM uns(*AR0-),uns(*AR1),AC0
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
16
zq = ( xq + yq*2Qx-Qy) * 2Qz-Qx
定点加法:
int x,y,z;
• 0.12345 x103
• 比较 – 精度较低,数值范围较大 – 实现简单,效率较高 – 硬件支持定点数运算 – 精度较高,数值范围较小 – 实现复杂,效率较低 – 硬件不一定支持浮点运算
6
7.1 定标与溢出处理
• C55x子系列 – 16位定点DSP • 参与运算的数是16位的整型数
• 如何处理小数? – 数的定标
24
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
8
9
C55x中的定标方法
• 16位整数采用补码形式表示,每个采用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
L1:
MOV40 dbl(*AR1),AC0 ;AC0=X3X2 SUB uns(*AR2(#1)),BORROW,AC0;AC0=X3X2-00Y2-BORROW SUB *AR2<<#16,AC0 ;AC0=X3X2-Y3Y2-BORROW MOV AC0,dbl(*AR3) ;保存 W3W2. B L1
long temp;
//定标后的整数值
temp = y<<(Qx-Qy);
temp = x + temp;
z = (int) (temp) << (Qz-Qx);
17
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;
补充:定点运算实现的基本原理
• B.1 加法/减法的C语言定点模拟 • B.2 乘法的C语言定点模拟 • B.3 除法的C语言定点模拟
14
B.1 加法/减法的C语言定点模拟
• 浮点 • 定点 – x的Q值为Qx,标定值为xq float x,y,z; z=x+y;
• x= xq*2-Qx, xq=(int)(x*2Qx)
29491 *2-13 = 3.5999755859375 ≈ 3.6
18
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
25
7.2 基础算术运算
• 7.2.1 加减运算 • 7.2.2 乘法运算 • 7.2.3 除法运算 • 7.2.4 小数乘法
26
7.2.1 加减运算
• 加法指令 – 单周期内完成32位加法运算 • MOV40 dbl(Lmem),ACx • ADD dbl(Lmem),ACx
28
L1:
• 减法指令 – 单周期内完成32位减法运算: • MOV40 dbl(Lmem),ACx • SUB dbl(Lmem),ACx
– 64位的高32位减法要考虑低32位减法产生的借位
• SUB uns(Smem),BORROW,ACx
29
例7-2,64位减法运算
.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.
30
7.2.2 乘法运算
• 例7-3,32位整数乘法运算
AC0
AC0
+
+ +
31
32
.sect ".text" .align 4
.global start .sym start,start,36,2,0
start:
MOV #0100h,AR0 MOV #0102h,AR1 MOV #0104h,AR2
– 64位的高32位加法要考虑低32位加法产生的进位
• ADD uns(Smem), CARRY, ACx
加法指令见课本P98
27
例7-1,64位加法运算
.sect ".text"
.align 4 .global start .sym start,start, 36, 2, 0
start:
MOV #0100h,AR1 MOV #0104h,AR2 MOV #0108h,AR3
19
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)
10
转换方法
• 浮点数(x)→定点数(xq) – xq=(int)(x*2Q) = x << Q • 定点数(xq) →浮点数转换(x) – x=(float)(xq*2-Q) = x >> Q
Q格式
Q0 Q14
十六进制数
2000H 2000H
二进制数
0010 0000 0000 0000b 0010 0000 0000 0000b
z = x/y ↓ zq*2-Qz = (xq*2-Qx) / (yq*2-Qy) ↓ zq = xq*2-(Qz-Qx+Qy) / yq
23
zq = xq*2-(Qz-Qx+Qy) / yq
定点除法:
int x,y,z;
long temp;
//定标后的整数值
temp = (long)x;
z = ( temp << (Qz-Qx+Qy) ) / y ;
21666 *2-5 = 677.0625
22
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)
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.
第7章 应用程序设计
(第10讲)
•7.1 定标与溢出处理
•补充:定点运算实现的基本原理 •7.2 基础算术运算
•7.3 FIR滤波器
•7.4 IIR滤波器
1
浮点数的计算机存储格式
2
3
4
5
7.1 定标与溢出处理
• 定点数 – 小数点固定的数 • 123.45 • 浮点数 – 小数点不固定的数 • 12.345x101 • 1.2345 x102
十wk.baidu.com制数
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
0.25
-8192 -0.5 -0.25
11
表 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
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
20
zq = xq*yq*2Qz-(Qx+Qy)
定点乘法:
int x,y,z;
long temp;
//定标后的整数值
temp = (long)x;
z = (temp*y) << (Qz-Qx-Qy);
21
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;
– y的Q值为Qy,标定值为yq • y= yq*2-Qy, yq=(int)(y*2Qy) – z的Q值为Qz,标定值为zq • z= zq*2-Qz, zq=(int)(z*2Qz)
15
x = xq*2-Qx, y = yq*2-Qy, z = zq*2-Qz,
xq = (int)(x*2Qx) yq = (int)(y*2Qy) zq = (int)(z*2Qz)