dsp原理课练习题参考答案-应电

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《DSP原理与应用》练习题参考答案
32学时版本
用于应用电子方向
注意:红色字体文字为解题注解与说明,万万不
可作为答题内容
1.Q.15表示是16位数据中第15位为符号位,第14~0位为小数位。

试写出下面问题的答案:
⑴分别写出十进制正数0.68和十进制负数-0.245的Q.15表示。

0.68*32768=570AH
-0.245*32768=-1F5CH=E0A4H
⑵分别写出Q.15表示的A200H和5A00H的十进制数值。

A200H/32768=-5E00H/32768=- 0.734375
5A00H/32768=0.703125
上面两小题使用教材P7两条公式,公式中Q为数据中的小数位数,digits<->data。

取补码的正规方法是按位取反得到的反码加上1。

16进制下快速算法是找出互补的数,即加上该互补数得10000H。

例如求1F5CH补码,1F5CH+E0A4H=10000H。

故E0A4H为所求。

⑶已知两个Q.15数相乘的乘积存放于累加器A中。

FRCT=0时A为16进制0xFFEA000000,该乘积的十进制数是多少?FRCT=1时A为16进制0x007D000000,该乘积的十进制数又是多少?
FRCT=0时累加器A低30位为小数位
解法一,取乘积Q.15形式,乘积Q.15形式为D400H=-2C00H/32768=-11264/32768=- 0.34375
解法二,运用教材P7公式,EA000000/230=-16000000//230=-11/25=-0.34375
解法三,写出小数点后二进制位数值,乘积为-16000000H,小数点后的二进制为01011B,得2-2+2-4+2-5=-11/25=-0.34375
FRCT=1时累加器A低31位为小数位
解法一,取乘积Q.15形式,乘积Q.15形式为7D00H=32000/32768=0.9765625
解法二,运用教材P7公式,7D000000H/231=125/27= 0.9765625
解法三,写出小数点后二进制位数值,乘积7D000000H小数点后的二进制为1111101B,得2-1+2-2+2-3+2-4+2-5+2-7=125/27= 0.9765625
2.在C54x DSP的C语言开发环境中,数据类型与通常的C语言开发环境的数据类型不同,主要数据类型如下表所示:
数据类型位长
char, unsigned char 16
short, unsigned short, signed short 16
int, unsigned int, signed int 16
long, unsigned long, signed long 32
float 32
double 32
和CCS2.2上的C语言程序如下:
const double coef[15] = { 0.00482584, 0.00804504,-0.00885584,-0.04291741,
-0.02903702, 0.09725365, 0.28342322, 0.37452503,
0.28342322, 0.09725365,-0.02903702,-0.04291741, -0.00885584, 0.00804504, 0.00482584};
void fir(int *x, int *y) { int i, j; for (i = 0; i < 1024; i++) { double accumulator = 0.0; for (j = 0; j < 15; j++) { accumulator += x[i - j] * coef[j]; } y[i] = (int)accumulator; } }
以上表达式中,x , y 分别是低通滤波输入、输出的16位整型数组变量。

现在要求把以上过程优化为在C54x 平台上运行的精度最高、执行效率最高的16位定点运算形式。

试写出在C54x DSP 和CCS2.2环境下完成16位相乘和32位累加的定点运算的C 程序。

第一步:把全部滤波器系数转化为Q.15定点数
第二步:把乘累加转化为整数乘法,Q.15乘以整数的小数点位置在第14位和第15位之间,累加结果为32位整数,其中最高两位为符号位,接着15位为整数,低15位为小数 第三步:舍去低15位小数,取一位符号位和15位整数位作为滤波输出结果 在下面有符号数乘法中小数点位置:
15位数字
S
15位数字
S =
S S 高15位数字低15位数字
const int coef[15]={158, 264, -290, -1406, -951, 3187, 9287, 12272, 9287, 3187, -951, -1406, -290, 264 158};
void fir(int *x, int *y) { int i, j; for (i = 0; i < 1024; i++) { long accumulator = 0; for (j = 0; j < 15; j++) { accumulator += x[i - j] * coef[j]; } y[i] = (int)(accumulator>>15); } }
3. 解决图像编码中常见的8x8离散余弦变换在VC5402 DSP 上定点运算问题。

⑴ 用C 语言写出定点运算实现8
cos
2214
cos 153π
π
⨯+⨯的程序,并且把最后结果存放到16位整型变
量r 中。

数据类型见前面题3的表格。

4
cos
π的Q15定点数是23170 8
cos
π的Q15定点数是30274
const int x[2]={153,221};
const int y[2]={23170,30274}; long a; int r;
a=x[0]*y[0]+x[1]*y[1]; r=(int)(a>>15);
或者C 程序也可写成: long a; int r;
a=153*23170+221*30274; r=(int)(a>>15);
在下面有符号数乘法中小数点位置:
15位数字
S
15位数字
S =
S S 高15位数字低15位数字
⑵ 用C54x 汇编指令写出定点运算实现8
cos 2214cos 153π
π
⨯+⨯的代码,并且把最后结果转换为16位整数存放到1102H 的地址中。

1000H 存放153,1001H 存放221 1002H 存放23170,1003H 存放30274
SSBX FRCT
STM #1000H,AR2 STM #1002H,AR3 STM #1102H,AR1 RPTZ A,#1
MAC *AR2+,*AR3+,A STH A, *AR1
在下面有符号数乘法中小数点位置:
15位数字
S
15位数字
S =
S 0
高15位数字低15位数字
⑶ 现有一个8位无符号字符数118,对其执行浮点运算8
cos
4
cos 118π
π
⨯⨯,VC5402 汇编指令代码
段如下:
SSBX FRCT
MPY *(1000H),#118,A MPYA *(1001H)
STH B,*(1002H)
运算前数据页1000H 和1001H 的地址存放的数据是多少?运算后数据页1002H 的地址存放的结果是多少?
运算前数据页1000H 的地址存放的数据是327684
cos ⨯π
=23170 运算前数据页1001H 的地址存放的数据是327688
cos
⨯π
=30274
运算后数据页1002H 的地址存放的结果是76,得出过程见于(4) 在下面有符号数乘法中小数点位置:
15位数字
S
15位数字
S *=S 高15位数字低15位数字0
第一次乘法高15位数字S 15位数字S *
=
S 高15位数字低15位数字0
第二次乘法
⑷ 上面⑶的代码段求出8
cos
4
cos
118π
π
⨯⨯的结果是多少?
118*23170,乘积取1位符号和高15位得83,再乘以30274,乘积取1位符号和高15位得76 写出83和76,得3分 写出76,得2分 写出77,得1分
用计算器,分两步,第一步算4πcos
×118取整数得83;第二步算8
π
cos ×83取整数得76 用计算器一步算出77,得1分
连77都算不出,便不如中学生
4. 在VC5402汇编语言程序中需要连续读取散布于数据页地址0A06H ,0A27H ,0A3AH ,0A53H ,0A65H ,0A92H ,0ACAH ,0AE0H 中的8个数据。

要求以最少指令和最快速度读入这8个地址的数据。

写出执行指令。

注意读入8个地址数据的次序不能改变。

如全写成16位地址的直接寻址形式,得一半分
LD *(0A06H), A LD *(0A27H), A LD *(0A3AH), A LD *(0A53H), A LD *(0A65H), A LD *(0A92H), A LD *(0ACAH), A LD *(0AE0H), A
注意,读用LD *(), A ,写用STL A, *() 满分答案:7位地址的直接寻址形式
RSBX CPL 或者CPL=0时 LD #14H,DP LD @06H,A
LD @27H,A
LD @3AH,A
LD @53H,A
LD @65H,A
LD #15H,DP
LD @12H,A
LD @4AH,A
LD @60H,A
5.现在需要对16位整型音频信号数据执行512点FFT,待处理数据放在数据页首地址为0A00H,长度为512的缓冲区内。

在按时间抽取基2 FFT碟形运算中输入数据倒序,输出数据顺序。

⑴写出在一个512次循环中以降序ARx-0B读入数据页0BFFH~0A00H的512个输入数据的汇编指令代码。

STM #0BFFH, AR1
STM #256, AR0
STM #511, AR2
loop:
LD *AR1-0B, A
BANZ loop, *AR2-
或者
STM #0BFFH, AR1
STM #256, AR0
STM #511, BRC
RPTB end_loop – 1
LD *AR1-0B, A
end_loop:
或者
STM #0BFFH, AR1
STM 256, AR0
RPT #511
LD *AR1-0B, A
FFT基2碟形运算,时间抽取时输入乱序、输出顺序;频域抽取时输入顺序、输出乱序
AR0数值设为FFT点数一半。

循环计数器初值设为循环次数-1也就是FFT点数-1。

升序时,AR1数值设为缓冲区首地址,乱序读LD *AR1+0B, A,乱序写STL A, *AR1+0B
降序时,AR1数值设为缓冲区尾地址,乱序读LD *AR1-0B, A,乱序写STL A, *AR1-0B
⑵在⑴中已经读取0A65H地址的数据后,随后连续8次读取的输入数据的地址是多少?要求写出详细计算过程,光写对答案不能得满分。

第1次:0000,1010,0110,0101-1,0000,0000B=0000,1011,1010,0101=0BA5H
第2次:0000,1011,1010,0101-1,0000,0000B=0000,1010,1010,0101=0AA5H
第3次:0000,1010,1010,0101-1,0000,0000B=0000,1011,0010,0101=0B25H
第4次:0000,1011,0010,0101-1,0000,0000B=0000,1010,0010,0101=0A25H
第5次:0000,1010,0010,0101-1,0000,0000B=0000,1011,1100,0101=0BC5H
第6次:0000,1011,1100,0101-1,0000,0000B=0000,1010,1100,0101=0AC5H
第7次:0000,1010,1100,0101-1,0000,0000B=0000,1011,0100,0101=0B45H
第8次:0000,1011,0100,0101-1,0000,0000B=0000,1010,0100,0101=0A45H
位倒序加减法必须展开成二进制运算。

正常加法,从最右开始,向左进位;正常减法,从最右开始,从左借位。

位倒序加法,从最左开始,向右进位;位倒序减法,从最左开始,从右借位。

6.使用VC5402 DSP芯片对一无限长的16位整型音频信号序列执行103阶FIR带通滤波。

需要分配滤波数据缓冲区FIR_DATA和滤波系数缓冲区FIR_COEF。

现有的在C54x DSP和CCS2.2环境下的C 语言程序fir.c和相应的链接命令文件fir.cmd如下:
fir.c文件:
int fir_data[103];
int fir_coef[103];
main()
{
fir(fir_data, fir_coef, signal_len, fp_in, fp_out); //执行FIR滤波的汇编函数
}
fir.cmd文件:
MEMORY
{
PAGE 0: /* program space */
VECS: origin = 0x0080, length = 0x0080 /* vector table space */
PROG: origin = 0x0100, length = 0x2B00 /* program memory space */
PAGE 1: /* data space */
DA T1: origin = 0x2C00, length = 0x1400 /* application data */
DA T2: origin = 0x4000, length = 0x4000 /* application data */
}
SECTIONS
{
.vectors : {} > VECS PAGE 0 /* interrupt vector table */
.text : {} > PROG PAGE 0 /* program code */
.data : {} > PROG PAGE 0 /* initialized data */
.coeffs : {} > PROG PAGE 0 /* initialized parameters */
.stack : {} > DAT1 PAGE 1 /* software stack section */
.variable : {} > DAT2 PAGE 1 /* uninitialized vars for DSP&AIC10 */
.bss : {} > DAT2 PAGE 1 /* uninitialized vars for applications */
}
于是滤波数据缓冲区FIR_DA TA和滤波系数缓冲区FIR_COEF 都在片外SRAM中。

现在为了提高执行效率尤其在汇编函数中使用双操作数寻址,需要令滤波数据缓冲区FIR_DA TA和滤波系数缓冲区FIR_COEF 在片内DARAM中。

在上面的C语言程序fir.c和相应的链接命令文件fir.cmd中需要做出哪些改动?写出所有改动的地方。

fir.cmd文件:
SECTIONS
{
.internal: {} > DAT1 PAGE 1
}
fir.c文件:
#pragma DATA_SECTION(fir_data , ".internal");
#pragma DATA_SECTION(fir_coef , ".internal");
7.使用VC5402芯片对一无限长的16位整型音频信号序列执行43阶Hamming低通滤波。

每生成一个输出值,线性缓冲区法需要执行43次移动,而循环缓冲区法不需要这样的43次移动,省略43次数据搬移操作,执行效率更高。

汇编代码如下:
FIR_FILTERING:
STM #DATA_PTR+FILTER_LEN-1, ①
STM #COEF_PTR, ②
STM #SIGNAL_LEN-1, AR2
STM #TEMPBUFF,AR1
STM #1, AR0
SSBX FRCT
loop2:
STM ③, BK
PORTR PA1, *AR4+%;PA1为输入端口号
LD #0, A
STM ④, AR3
loop1:
MAC ⑤, ⑥, A
BANZ loop1, *AR3-
STH ⑦, *AR1
PORTW *AR1,PA2;PA2为输出端口号
BANZ loop2, *AR2-
其中DATA_PTR指向输入缓冲区,COEF_PTR指向滤波系数缓冲区。

试写出下面问题的答案:
⑴对上面汇编指令代码段中的7个空填入正确答案,使得程序完善并且正确运行。

①AR4, ②AR5, ③#43, ④#42, ⑤*AR4+0%,⑥*AR5+0%,⑦A
⑵为获得正确的滤波结果,对滤波数据缓冲区FIR_DA TA和滤波系数缓冲区FIR_COEF有何要求?
要求滤波数据缓冲区fir_data和滤波系数缓冲区fir_coef的首地址能被64整除,即首地址的低6位为0。

⑶C程序在VC5402片内DARAM中定义了一段连续内存空间。

其它任务分配完后整型指针变量LoopBufHead指向这段内存空间的未分配空间的顶部,具体数值不详。

现使用LoopBufHead分配滤波数据缓冲区FIR_DA TA和滤波系数缓冲区FIR_COEF。

要求在循环缓冲区法的FIR滤波中取得正确滤波结果。

写出设置FIR_DA TA_PTR和FIR_COEF_PTR的C程序代码。

fir_data_ptr=(LoopBufHead+63)&(~63);
fir_coef_ptr=((LoopBufHead+63)&(~63))+64;
对于任意地址Address ,(Address+63)&(~63)求得一个大于等于Address 且满足低6位全零的地址
⑷ 在上面MAC 指令循环执行中读出指向输入缓冲区的辅助寄存器内容为12A3H ,再执行86次MAC 指令后是多少?读出指向滤波系数缓冲区的辅助寄存器内容为12E9H ,再执行4次MAC 指令所访问的4个内存地址是多少?
执行完43次MAC 指令后仍然是12A3H 在模43的环(集合)内,任意数加上43仍然为原数 连续执行4次MAC 指令所访问的4个内存地址分别是12EAH, 12C0H, 12C1H
循环寻址是以BK 寄存器内容(滤波器点数)为模的取模递增运算,环(集合)元素为BK 个顺序地址,首地址低N 位为0,尾地址低N 位为BK-1。

BK >2
N
且2N
最接近于BK 。

在本题BK=43,N= 6,集
合首地址低6位为零,尾地址低6位为42。

12E9H 最低6位全零为首地址12C0H ,尾地址12C0H+42=12EAH
8. 在题7标示为FIR_FILTERING 的使用循环缓冲区法完成FIR 滤波的汇编指令代码段中存在两重循环嵌套。

现有代码采用根据辅助寄存器进行条件跳转的方法实现循环。

C54x DSP 还提供另外一种执行效率更高的实现循环的方法,即重复和块重复。

试写出下面问题的答案:
⑴ 重复指令RPT 和RPTZ 使用C54x DSP 内核什么专门的寄存器或者标志位?把他们全部列举出来。

重复指令RPT 和RPTZ 使用C54x DSP 内核RC 寄存器
⑵ 块重复指令RPTB 使用C54x DSP 内核什么专门的寄存器或者标志位?把他们全部列举出来。

块重复指令RPTB 使用C54x DSP 内核BRC 、RSA 、REA 寄存器和ST1寄存器的BRAF 位
⑶ 对题7标示为FIR_FILTERING 的使用循环缓冲区法完成FIR 滤波的汇编指令代码段进行优化,用重复指令和块重复指令完全消除根据辅助寄存器进行条件跳转的指令。

FIR_FILTERING: STM #FIR_DATA_PTR+FILTER_LEN-1, AR4 STM #FIR_COEF_PTR, AR5 STM #SIGNAL_LEN-1, BRC ;循环次数-1 STM #TEMPBUFF,AR1
STM #1,AR0 STM #43,BK RPTB end_loop - 1 PORTR PA1, *AR4+% ;PA1为输入端口号 RPTZ A,#42 ;循环次数-1 MAC *AR4+0%, *AR5+0%, A ;双操作数指令,不能用*AR4+%和*AR5+% STH A, *AR1
PORTW *AR1,PA2;PA2为输出端口号 end_loop
9. 上题7标号为FIR_FILTERING 的滤波代码段必须封装成为如下形式的函数方能被C 语言主程序调用。

void fir(int *fir_ptr, int *coeff_ptr, int len, int *tmpbuff)
其中第一形参为指向输入缓冲区的16位整型指针变量data_ptr ,第二形参为指向滤波系数缓冲区的16位整型指针变量coef_ptr ,第三形参为信号长度,第四形参为指向暂存区的16位整型指针变量tmpbuff 。

从C语言主函数进入汇编子函数时ST1状态寄存器的CPL位为1。

试写出下面问题的答案:
⑴在跳入汇编子程序fir并且执行如下现场保护后,写出把上述fir函数4个形参传递至题7标号为FIR_FILTERING的滤波代码段内相应辅助寄存器的指令。

此处可忽略参数的偏移运算。

PSHM AR0
PSHM AR1
PSHM AR2
PSHM AR3
PSHM AR4
PSHM AR5
PSHM AR6
PSHM AR7
FRAME #-12
C语言调用汇编子程序时C编译器规则:
从C主程序一进入汇编子程序,SP指向返回地址,累加器A存放第一个形参,SP+1指向第二个形参,SP+2指向第三个形参,。

由此类推
在汇编子程序开头,用pshm保护现场,每条pshm指令使SP递减1。

接着使用frame指令为子程序内局部变量分配内存空间。

子程序返回时通过累加器A向主程序输出返回值。

本题中,新SP=旧SP-20,第一形参传递至AR4,第二形参传递至AR5,第三形参传递至AR2或者BRC,第四形参传递至AR1。

STLM A, AR4
LD @21, B
STLM B, AR5
LD @22, B
STLM B, AR2或者STLM B, BRC
LD @23, B
STLM B, AR1
使用辅助寄存器的堆栈指针直接寻址指令,每次读入仅需要用一条指令完成。

辅助寄存器的堆栈指针直接寻址指令MVKD和MVDK与课内的累加器的堆栈指针直接寻址指令LD和STL/STH之间唯一区别在于操作数由累加器A/B变为*(ARx)。

其余完全一致,包括使能标志位CPL。

注意不能写为*ARx。

否则编译器报错。

如MVKD *(AR1), @6指令把AR1内容1234H传递至SP+6地址内存中,使所存数据为1234H。

MVDK @8, *(AR2)指令则把SP+8地址的存放数据5678H传递至AR2,使得AR2内容变为5678H。

STLM A, AR4
MVDK @21, *(AR5)
MVDK @22, *(AR2)或者MVDK @22, *(BRC)
MVDK @23, *(AR1)
⑵写出返回C语言主函数前执行现场恢复的汇编指令代码。

FRAME #12
POPM AR7
POPM AR6
POPM AR5
POPM AR4 POPM AR3 POPM AR2 POPM AR1 POPM AR0 堆栈后进先出。

10. 现在需要对信号缓冲区的256个16位有符号整数的音频信号数据减去其均值(直流分量),成为交流信号。

信号缓冲区在数据页,首地址2C00H 。

均值存放于数据页2D00H 地址中。

去直流分量的汇编指令代码如下: STM #2C00H, AR1 LD *(2D00H), B STM #255, AR0 loop: LD *AR1,A
SUB B,A
STL A,*AR1+ BANZ loop, *AR0-
现在要求对上述代码进行优化以提高执行效率,措施包括双16位读写和减法运算、重复或者块重复等。

其中仅改写为双16位操作便可使循环次数减半。

写出在上述代码基础上经过优化达到最高执行效率的汇编指令代码。

STM #2C00H, AR1 LD *(2D00H), T STM #127, BRC SSBX C16 RPTB L1-1 DSUBT *AR1,A DST A, *AR1+ L1:
单16位运算改为双16位运算,加ADD 改为DADD ,减SUB 可改为DSUB 、DRSUB 和DSUBT 中最适合于具体应用的一种
11. 现在需要在
x a i
i
⨯(72,1,0 =i )共8个乘积中取最小值并且存放到数据页1020H 的内存中去。

a i
和x i
分别存放于首地址为1000H 和1010H 的长度为8的内存区中,十进制数值如下所示:
a i
x i
x a i
i

-4812-576
5715855
32-17-544
-948-752
66332178
77-25-1925
270143780
-4523-1035在下面所出现的C54x DSP汇编指令中,LD *ar2+, T指令, MPY *AR3+, A/B指令, MIN A指令, STL A, *AR1+指令均是单字指令,MIN A指令的操作是比较两个累加器A和B的数值然后取其中最小值送至累加器A。

试写出下面问题的答案:
⑴写出执行完以下汇编指令后,AR1-1(即AR1所指向的上一个地址)的地址是多少?其中十进制
数值是多少?
STM #1000H, AR2
STM #1010H, AR3
STM #1020H, AR1
STM #6, AR0
LD *AR2+, T
MPY *AR3+, A
loop:
LD *AR2+, T
MPY *AR3+, B
MIN A
BANZ loop, *AR0-
STL A, *AR1+
地址是1020H,其中十进制数值是-1925
⑵写出执行完以下汇编指令后,AR1-1(即AR1所指向的上一个地址)的地址是多少?其中十进制
数值是多少?
STM #1000H, AR2
STM #1010H, AR3
STM #1020H, AR1
STM #6, AR0
LD *AR2+, T
MPY *AR3+, A
loop:
LD *AR2+, T
BANZD loop, *AR0-
MPY *AR3+, B
MIN A
STL A, *AR1+
地址是1020H,其中十进制数值是-1925
⑶写出执行完以下汇编指令后,AR1-1(即AR1所指向的上一个地址)的地址是多少?其中十进制
数值是多少?
STM #1000H, AR2
STM #1010H, AR3
STM #1020H, AR1
STM #6, AR0
LD *AR2+, T
MPY *AR3+, A
loop:
LD *AR2+, T
BANZ loop, *AR0-
MPY *AR3+, B
MIN A
STL A, *AR1+
地址是1020H,其中十进制数值是-675
⑷写出执行完以下汇编指令后,AR1-1(即AR1所指向的上一个地址)的地址是多少?其中十进制
数值是多少?
STM #1000H, AR2
STM #1010H, AR3
STM #1020H, AR1
STM #6, AR0
LD *AR2+, T
MPY *AR3+, A
loop:
BANZD loop, *AR0-
LD *AR2+, T
MPY *AR3+, B
MIN A
STL A, *AR1+
地址是1020H,其中十进制数值是-1035
⑸最后,上面哪段代码正确(与本题第一句话的要求一致)?哪段代码的执行效率最高?
第(1)和第(2)段代码正确。

第(2)段代码执行效率最高。

12.下面的汇编代码段实现视频编码的16x16方块运动估计。

用VC5402的ABDST指令计算当前16x16图像块与参考帧带运动补偿的16x16图像块之间的绝对值和差。

其中省略了计算出当前块与参考块指针的部分代码。

每行汇编指令后面都标出了指令周期数。

试用重复、块重复、跳转延迟等优化措施改写这段代码,使得运算结果相同的情况下执行效率最高。

SSBX SXM (1)
LD *(pos_size),A (1)
STLM A,AR3 (1)
L1:
……(省略)
LD *(width),A (1) STLM A,AR0 (1) LD #0,B (1) STM #15,AR2 (1) L2:
MVMM AR6,AR4 (1) MVMM AR7,AR5 (1) LD #0,A (1) STM #16,AR1 (1) L3:
ABDST *AR4+,*AR5+ (1) BANZ L3,*AR1- (4) MAR *AR6+0 (1) MAR *AR7+0 (1) BANZ L2,*AR2- (4) LD *(BL),A (1) SUB *(min_sad),A (1)
BC L4,AGEQ (5) STL B,*(min_sad) (1)
LD *(current_pos),A (1) STL A,*(best_pos) (1) L4:
ADDM #1,*(current_pos) (2) BANZ L1,*AR3- (4) 对此三重循环嵌套改写如下:
SSBX SXM (1) LD *(pos_size),A (1)
STLM A,AR3 (1) L1:
……(省略)
LD *(width),A (1) STLM A,AR0 (1) LD #0,B (1) STM #15,BRC (1) RPTB L2-1
MVMM AR6,AR4 (1) MVMM AR7,AR5 (1) RPTZ A, #16
ABDST *AR4+,*AR5+ (1) MAR *AR6+0 (1) MAR *AR7+0 (1) L2:
LD *(BL),A (1)
SUB *(min_sad),A (1)
BC L4,AGEQ (5)
STL B,*(min_sad) (1)
LD *(current_pos),A (1)
STL A,*(best_pos) (1)
L4:
BANZD L1,*AR3- (4)
ADDM #1,*(current_pos) (2)
13.根据教材P162的C54x DSP片内定时器的定义与设置回答以下问题:
⑴已知工一407实验室的C5402实验板上晶振10MHz,PRD=4E1FH,TCR=0420H,则定时时间是多少?
⑵现在要求用VC5402片内定时器与计数1000次的软件计数器通过中断串接分别产生定时1秒、2秒、4秒、16秒的信号。

如何设置VC5402片内定时器的参数?
14.8086的中断系统与C54x DSP的中断系统有何异同?说明实验五INT中断实验的指导程序是如何设置中断系统的?
15.实验六A/D转换(输入数据)实验和实验七D/A转换(输出数据)实验利用VC5402 DSP的片内外设第1号多通道缓冲串行口McBSP#1分别接收和发送数据。

McBSP的结构方框图如图1所示。

在EL-DSP-EXPⅠ教学实验系统中,VC5402的McBSP#1与位于语音处理单元的TLC320AD50C芯片相连,分别完成一维音频信号的输入、A/D转换、DSP采集和DSP输出、D/A转换、输出。

图1 VC5402芯片的片内外设多通道缓冲串行口McBSP的结构方框图接收数据时,自DR进入的数据最后到达McBSP#1内部16位寄存器DRR1,DDR1在VC5402的数据存储区映像地址是0x0041,同时发生三个动作:①第1号串行口控制寄存器SPCR1的第1bit接收就绪位RRDY(Receive Ready)显1;②RINT线向C5402的CPU发出中断;③REVT线向VC5402的DMA控制器发出事件激励信号。

一旦VC5402的CPU或者DMA控制器把DRR1的16位数据读出,1号串行口控制寄存器SPCR1的第1bit接收设备就绪位(Receiver Ready)显0。

这样VC5402的CPU或者DMA控制器就逐个读出DRR1的16位数据并且转存到数据缓存区中。

实验六的数据缓存区首地址1000H,长度256个16位字。

数据缓存区填满后,便可进行数字信号处理。

发送数据时,一旦上一个数据自McBSP#1内部16位寄存器DXR1(DXR1在C5402的数据存储区映像地址是0x0043)复制到发送部件上去(最后从DX发送出去),相当于DXR1被清空,就同时发
生三个动作::①第2号串行口控制寄存器SPCR2的第1bit发送设备就绪位XRDY(Transmitter Ready)
显1;②XINT线向VC5402的CPU发出中断;③XEVT线向VC5402的DMA控制器发出事件激励信号。

一旦VC5402的CPU或者DMA控制器向DXR1写入16位数据,2号串行口控制寄存器SPCR2的第1bit发送设备就绪位XRDY(Transmitt Ready)显0。

这样VC5402的CPU或者DMA控制器就把数据缓冲区中经过数字信号处理的数据逐个写入到DXR1。

实验七的数据缓存区首地址3000H,长度40个16位字。

实验六和实验七的指导程序都是用CPU查询方式分别完成数据接收和数据发送。

现在要求用效率较高的中断方式完成数据接收与发送的方案。

相关中断系统参数如图2和图3所示。

图2
图3
如图2所示,VC5402的McBSP#1的接收数据中断位是第10bit,发送数据中断位是第11bit。

其中断向量表的偏移量如图3所示,分别是68H和6CH。

试写出把实验六指导程序的查询方式改为中断方式的所有程序代码。

相关文档
最新文档