DSP考试资料文档格式.docx
《DSP考试资料文档格式.docx》由会员分享,可在线阅读,更多相关《DSP考试资料文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
![DSP考试资料文档格式.docx](https://file1.bdocx.com/fileroot1/2023-2/4/815cbcb3-8cdd-4290-87cb-b01a694c6473/815cbcb3-8cdd-4290-87cb-b01a694c64731.gif)
AR30101
AR30100
0100h1500
数据存储器
二、简答(共40分)
1.TMS320C54x有多少条16位总线?
这些总线各有什么作用?
(6分)
答:
’C54x共有4组8条16位总线
1条程序总线(PB):
传送取自程序存储器的指令代码和立即操作数。
3条数据总线(CB、DB、EB):
CB和EB传送从数据存储器读出的操作数;
EB传送写到存储器中的数据。
4条地址总线(PAB、CAB、DAB、EAB)传送相应指令所学要的代码。
2.TMS320C54x片内存储器一般包括哪些种类?
如何控制存储器片内或片外的分配?
TMS320C54x的片内存储空间分为3个可选择的存储空间:
64K的程序空间,64K的数据空间和64K的I/O空间,所有TMS320C54x芯片都包括RAM、SARAM、DARAM。
程序空间:
MP/MC=14000H~FFFFH片外
MP/MC=04000H~EFFFH片外FF00H~FFFFH片内
OVLY=10000H~007FH保留0080H~007FH片内
OVLY=00000H~3FFFH片外
数据空间:
DROM=1F000H~FEFFH只读空间FF00H~FFFH保留
DROM=0F000H~FEFFH片外
3.当TMS320C54xCPU接收到可屏蔽的硬件中断时,满足哪些条件中断才能被响应?
(1)出现多个中断时,此中断的优先级最高
(2)INTM=0允许全局中断
(3)IMR中的响应相应位为1,开放此中断。
4.循环寻址中,如何确定循环缓冲的起始地址?
如果循环缓冲大小为17,其起始地址必须从什么地址开始?
BK初始化为多少?
(4分)
5.TMS320C54x硬件复位地址为多少?
如何确定中断向量地址?
计算INT0(IPTR=001H)的中断向量地址。
复位后,复位向量地址为:
0080H
确定地址方式:
IPTR+左移2位后的中断向量序列号
10H左移2位后成为40H,IPTR=001H,则中断向量地址为00C0H
6.若辅助寄存器AR0的值为0x0005H,AR3的值为0x030FH,请分别给出下列寻址方式修改后的辅助寄存器的值。
*AR3+;
AR3=0310H
*AR3+0;
AR3=0314H
*AR3(15);
AR3=0324H
7.分别解释以下指令的功能。
LD#80h,A;
把立即数80H装入累加器A
LD80h,A;
把80H为地址的数据装如累加器A
LD#80h,16,A;
把立即数80H左移16位后装如累加器A
三、程序填空(共22分,每空2分)
1.实现计算z=x+y-w的程序。
.title"
example1.asm"
.mmregs
STACK.usect"
STACK"
10h
.bssx,1
.bss y,1
.bssw,1
.bssz,1
.defstart
.data
table:
.word10,26,23
.text
start:
STM#0,SWWSR
STM#STACK+10h,SP;
初始化堆栈指针SP
STM#x,AR1
RPT#2
MVPDtable,*AR1+;
数据从程序存储器传送到数据存储器
CALLSUMB
end:
Bend
SUMB:
LD@x,A
ADD@y,A
SUB@w,A;
实现减法运算
STLA,@z
RET
.end
2.实现对数组X[5]={1,2,3,4,5}的初始化,然后将数据存储器中的数组X[5]复制到数组Y[5]。
最后实现数组X和数组Y中对应元素相乘并累加,即z=1*1+2*2+3*3+4*4+5*5
.bssx,5
.bssy,5
.bssz,1
.word1,2,3,4,5
.text
STM#x,AR1
RPT4
MVPDtable,*AR1+;
从程序存储器传送到数据存储器数组X[5]
STM#x,AR2
STM#y,AR3
MVDD*AR1,*AR3;
从数据存储器数组X[5]传送到Y[5]
SSBXFRCT;
准备整数乘法
STM#x,AR2
STM#y,AR3
STM#z,AR4
RPTZ4
MAC*AR2+,*AR3+,A
STLA,*AR4
End:
四、分析程序回答问题(共8分)
.def_c_int00
.mmregs
stack:
.usect"
stack"
10h
.bssa,4
.bssx,4
.bssy,1
table:
.word1,2,4,3
.word8,6,4,2
.text
_c_int00:
STM#stack+10h,sp
STM#a,AR1
RPT#7
MVPDtable,*AR1+
CALLsum
end:
Bend
sum:
STM#a,AR3
STM#x,AR4
RPTZA,#3
MAC*AR3+,*AR4+,A
STLA,@y
ret
.end
(1)说明该程序的功能:
a1*x1=a2*x2+a3*x3+a4*x4
(2)说明以下各量的理论值(4分)
A:
2Aa1的地址:
81H内容:
1
AR1:
88HAR3:
84H
第二套
1.TI公司的定点DSP产品主要有TMS320C2000系列、TMS320C5000系列和TMS320C6000系列。
2.’C54xDSP中传送执行指令所需的地址需要用到PAB、CAB、DAB和EAB4条地址总线。
3.DSP的内部存储器类型可分为随机存取存储器(RAM)和只读存储器(ROM)。
其中RAM又可以分为两种类型:
单寻址RAM(SARAM)和双寻址RAM(DARAM)。
4.’C54xDSP的内部总存储空间为192K字,分成3个可选择的存储空间:
64K字的程序存储空间、64K字的数据存储空间和64K字的I/O空间。
5.从功能结构上,’C54XDSP的CPU可以划分成运算部件和控制部件两大部分。
6.’C54xDSP的寻址方式有七种,分别为立即寻址、绝对寻址、累加器寻址、直接寻址、间接寻址、存储器映象寄存器寻址、堆栈寻址。
7.在’C54xDSP寻址和指令系统中,Xmem和Ymem表示16位双寻址操作数,Dmad为16位立即数,表示数据存储器地址,Pmad为16位立即数,表示程序存储器地址。
8.程序计数器的值可以通过复位操作、顺序执行指令、分支转移,累加器转移,块重复,子程序调用,从累加器调用子程序,中断等操作改变。
9.’C54xDSP芯片采用了6级流水线的工作方式,即一条指令分为预取指、取指、译码、寻址、读数和执行6个阶段。
10.解决MMR写操作的流水线冲突时,一般可用采用推荐指令和插入空操作指令的方法。
11.’C54xDSP定时器由3个16位存储器映射寄存器组成:
定时器寄存器(TIM)、定时器周期寄存器(PRD)和定时器控制寄存器(TCR)。
12.主机接口(HPI,HostPortInterface)是TMS320C54x系列定点芯片内部具有的一种接口部件,主要用于DSP与其他总线或CPU进行通信。
13.’C54xDSP的指令系统有助记符指令和代数指令两种形式。
14.COFF目标文件中.text段通常包含可执行代码,.data段通常包含己初始化的数据,.bss段中通常为未初始化的数据保留空间。
15.DSP芯片的开发工具可以分为代码生成工具和代码调试工具两类。
1.BANZ2000h,*AR3-
2.CMPRGT,AR3
3.ADD*AR3+,14,A
4.SUBA,-8,B
5.MPY*AR3+,A
五、程序题(15分)
写出计算
的主要汇编程序,并给程序添加注释,画出程序的流程图。
解:
程序及注释:
.bssx,20;
给变量x分配20个字单元
.bssy,1;
给变量y分配1个字单元
STM#x,AR1;
取x地址
STM#19,AR2;
设置循环次数
LD#0,A;
累加器清零
loop:
ADD*AR1+,A;
累加x分量
BANZloop,*AR2-;
循环是否结束,没有结束则继续累加
STLA,@y;
把结果存入y
流程图:
第三套
1、用C55x汇编语言实现计算
的程序。
(10分)
mpym*AR0+,*AR1+,AC0
mpym*AR0+,*AR1+,AC1
addAC1,AC0
或者:
||rpt#2
macm*AR0+,*AR1+,AC0
2、用C55x汇编语言实现计算
的程序。
mpym*AR0+,*AR1+,AC3
masm*AR0+,*AR1+,AC3
3、以8点的FFT为例,用C55x的汇编语言实现FFT的算法,并且解释该算法的实现方法。
(20分)
.sect"
fft_code"
_fft:
aadd#(ARGS-Size+1),SP;
Adjuststackforlocalvars
movmmap(ST1_55),AR2;
SaveST1,ST3
movmmap(ST3_55),AR3
movAR2,fft.d_ST1
movAR3,fft.d_ST3
btst@#0,T1,TC1;
CheckSCALEflagset
mov#0x6340,mmap(ST1_55);
SetCPL,XF,SATD,SXAM,FRCT(SCALE=1)
mov#0x1f22,mmap(ST3_55);
Set:
HINT,SATA,SMUL
xccdo_scale,TC1
mov#0x6300,mmap(ST1_55);
SetCPL,XF,SATD,SXAM(SCALE=2)
do_scale
movT2,fft.d_T2;
SaveT2
||mov#1,AC0
movAC0,fft.d_L;
InitializeL=1
||sftsAC0,T0;
T0=EXP
movAC0,fft.d_N;
N=1<
<
EXP
movXAR1,XCDP;
CDP=pointertoU[]
movXSP,XAR4
add#fft.d_temp,AR4;
AR4=pointertotemp
movXAR0,XAR1;
AR1pointstosamplebuffer
movT0,T1
movXAR0,XAR5;
CopyexterndbitstoXAR5
outer_loop;
for(L=1;
L<
=EXP;
L++)
movfft.d_L,T0;
note:
Sincethebufferis
||mov#2,AC0;
arrangedinre,impairs
sftsAC0,T0;
theindextothebuffer
negT0;
isdoubled
||movfft.d_N,AC1;
Buttherepeatcoutners
sftlAC1,T0;
arenotdoubled
movAC0,T0;
LE=2<
L
||sftsAC0,#-1
movAC0,AR0;
LE1=LE>
>
sub#1,AC0;
Initmid_loopcounter
movmmap(AC0L),BRC0;
BRC0=LE1-1
sub#1,AC1;
Initinnerloopcounter
movmmap(AC1L),BRC1;
BRC1=(N>
L)-1
addAR1,AR0
mov#0,T2;
j=0
||rptblocalmid_loop-1;
for(j=0;
j<
LE1;
j++)
movT2,AR5;
AR5=id=i+LE1
movT2,AR3
addAR0,AR5;
AR5=pointertoX[id].re
add#1,AR5,AR2;
AR2=pointertoX[id].im
addAR1,AR3;
AR3=pointertoX[i].re
||rptblocalinner_loop-1;
for(i=j;
i<
N;
i+=LE)
mpy*AR5+,*CDP+,AC0;
AC0=(X[id].re*U.re
:
mpy*AR2-,*CDP+,AC1;
-X[id].im*U.im)/SCALE
masr*AR5-,*CDP-,AC0;
AC1=(X[id].im*U.re
macr*AR2+,*CDP-,AC1;
+X[id].re*U.im)/SCALE
movpair(hi(AC0)),dbl(*AR4);
AC0H=temp.reAC1H=temp.im
||movdbl(*AR3),AC2
xccscale,TC1
||movAC2>
#1,dual(*AR3);
ScaleX[i]by1/SCALE
movdbl(*AR3),AC2
scale
addT0,AR2
||subdual(*AR4),AC2,AC1;
X[id].re=X[i].re/SCALE-temp.re
movAC1,dbl(*(AR5+T0));
X[id].im=X[i].im/SCALE-temp.im
||adddual(*AR4),AC2;
X[i].re=X[i].re/SCALE+temp.re
movAC2,dbl(*(AR3+T0));
X[i].im=X[i].im/SCALE+temp.im
inner_loop;
Endofinnerloop
amar*CDP+
amar*CDP+;
UpdatekforpointertoU[k]
||add#2,T2;
Updatej
mid_loop;
Endofmid-loop
sub#1,T1
add#1,fft.d_L;
UpdateL
bccouter_loop,T1>
0;
Endofouter-loop
movfft.d_ST1,AR2;
RestoreST1,ST3,T2
movfft.d_ST3,AR3
movAR2,mmap(ST1_55)
movAR3,mmap(ST3_55)
movfft.d_T2,T2
aadd#(Size-ARGS-1),SP;
ResetSP
ret
.end
第四套