当前位置:首页 > dsp原理及应用试卷答案
通信系《DSP原理及应用》期末考试题(答案)
姓名: 学号: 班级: 分数:
考试时间:15:40~17:30 考试方式:开卷; 注意:所有答案必须写在答题纸上,试卷上的答案无效!
一、 填空题(每空2分,共20分)
1、在C语言和C55x汇编语言的混合程序设计中,C函数的参数和返回值传递到C55x的寄存
器中。在函数“long func(int *p1, int i2, int i3, int i4)”中,*p1传递到 AR0 寄存器,i2传递到 T0 寄存器,i4传递到 AR1 寄存器,返回值由 AC0 寄存器传递。
2、汇编语言“mov *AR0,AC0”使用的寻址方式是 间接寻址模式 ,“mov #0x3,DPH”使
用的寻址方式是 直接寻址模式 ,“mov *(#0x011234),T2”使用的寻址方式是 绝对寻址模式 。
3、“AND #0x7f, AC0”,执行之后,AC0的值是 0000000078 。
4、C55x 的链接器命令文件中,SECTIONS命令的主要作用是 告诉链接器如何将输入段组合成输出
段,以及在存储器何处存放输出 。MEMORY命令的主要作用是 定义目标系统的存储器配置图,包括对存储器各部分的命名,以及规定它们的起始地址和长度 。
二、简述题(共40分)
1、根据你的理解,试列举 DSP 芯片的特点?(5分)
答:哈佛结构;多总线结构;指令系统的流水线操作;专用的硬件乘法器;特殊的DSP指令;快速的指令
周期;丰富的外设
2、TMS320C55x 芯片的总线结构有何特点,主要包括哪些总线?它们的功能是什么?(6分) 答:TMS320C55x DSP采用先进的哈佛结构并具有十二组总线,其独立的程序总线和数据总线允许同时读取
指令和操作数,实现高度的并行操作。
采用各自分开的数据总线分别用于读数据和写数据,允许CPU在同一个机器周期内进行两次读操作数和一次写操作数。独立的程序总线和数据总线允许CPU同时访问程序指令和数据。
包括12条总线,分别是:PAB和PB、BAB和BB、CAB和CB、DAB和DB、EAB和EB、FAB和FB。 功能:
3、DSP 为了降低功耗采取了哪些措施?(6分)
答:双电压供电;多种工作模式
4、TMS320C55x 的总存储空间为多少?可分为哪 3 类,它们的大小是多少?存储器空间的各
自作用是什么?(6分)
答:程序空间16M Byte;I/O空间64K Words;数据空间8M Words 5、TMS320C55x有哪些寻址方式,它们是如何寻址的?试为每种寻址方式列举一条指令(6分)
答:直接寻址模式,mov #K16,DP;
间接寻址模式,mov *AR0,AC0; 绝对寻址模式,mov *(#0x011234),T2; MMR寻址模式,mov *abs16(#AR2), T2; 寄存器位寻址模式,btstp @30, AC1; 圆形寻址模式。
6、将C源程序转换成可执行文件需要经过哪些步骤?(6分)
答:创建C源文件;创建工程文件;创建连接器命令文件;编译整个工程文件;链接;生成可执行文件 7、常用的TMS320C55x汇编命令有哪些,它们的作用是什么?(5分)
三、程序设计题(共40分)
1、用C55x汇编语言实现计算 y??aixi 的程序。(10分)
i?14答:mpym *AR0+, *AR1+, AC0
mpym *AR0+, *AR1+, AC1 add AC1, AC0
mpym *AR0+, *AR1+, AC1 add AC1, AC0
mpym *AR0+, *AR1+, AC1 add AC1, AC0 或者:
mpym *AR0+, *AR1+, AC0 ||rpt #2
macm *AR0+, *AR1+, AC0
2、用C55x汇编语言实现计算 y1?x1*a1?x2*a2的程序。(10分) 答:mpym *AR0+, *AR1+, AC3
masm *AR0+, *AR1+, AC3
3、以8点的FFT为例,用C55x的汇编语言实现FFT的算法,并且解释该算法的实现方法。
(20分)
答: .sect \
_fft:
aadd #(ARGS-Size+1),SP ; Adjust stack for local vars mov mmap(ST1_55),AR2 ; Save ST1,ST3 mov mmap(ST3_55),AR3 mov AR2,fft.d_ST1 mov AR3,fft.d_ST3
btst @#0,T1,TC1 ; Check SCALE flag set mov #0x1f22,mmap(ST3_55) ; Set: HINT,SATA,SMUL xcc do_scale,TC1
mov #0x6300,mmap(ST1_55) ; Set CPL,XF,SATD,SXAM (SCALE=2) do_scale
mov T2,fft.d_T2 ; Save T2 || mov #1,AC0
mov AC0,fft.d_L ; Initialize L=1 || sfts AC0,T0 ; T0=EXP mov AC0,fft.d_N ; N=1< mov XAR1,XCDP ; CDP = pointer to U[] mov XSP,XAR4 add #fft.d_temp,AR4 ; AR4 = pointer to temp mov XAR0,XAR1 ; AR1 points to sample buffer mov T0,T1 mov XAR0,XAR5 ; Copy externd bits to XAR5 outer_loop ; for (L=1; L<=EXP; L++) mov fft.d_L,T0 ; note: Since the buffer is mov #0x6340,mmap(ST1_55) ; Set CPL,XF,SATD,SXAM,FRCT (SCALE=1) || mov #2,AC0 ; arranged in re,im pairs sfts AC0,T0 ; the index to the buffer neg T0 ; is doubled || mov fft.d_N,AC1 ; But the repeat coutners sftl AC1,T0 ; are not doubled mov AC0,T0 ; LE=2< mov AC0,AR0 ; LE1=LE>>1 || sfts AC0,#-1 sub #1,AC0 ; Init mid_loop counter mov mmap(AC0L),BRC0 ; BRC0=LE1-1 sub #1,AC1 ; Init inner loop counter mov mmap(AC1L),BRC1 ; BRC1=(N>>L)-1 add AR1,AR0 mov #0,T2 ; j=0 || rptblocal mid_loop-1 ; for (j=0; j add AR0,AR5 ; AR5 = pointer to X[id].re add #1,AR5,AR2 ; AR2 = pointer to X[id].im add AR1,AR3 ; AR3 = pointer to X[i].re || rptblocal inner_loop-1 ; for(i=j; i :: 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 mov pair(hi(AC0)),dbl(*AR4); AC0H=temp.re AC1H=temp.im || mov dbl(*AR3),AC2 xcc scale,TC1 || mov AC2>>#1,dual(*AR3) ; Scale X[i] by 1/SCALE mov dbl(*AR3),AC2 scale add T0,AR2 || sub dual(*AR4),AC2,AC1 ; X[id].re=X[i].re/SCALE-temp.re mov AC1,dbl(*(AR5+T0)) ; X[id].im=X[i].im/SCALE-temp.im || add dual(*AR4),AC2 ; X[i].re=X[i].re/SCALE+temp.re mov AC2,dbl(*(AR3+T0)) ; X[i].im=X[i].im/SCALE+temp.im inner_loop ; End of inner loop amar *CDP+ amar *CDP+ ; Update k for pointer to U[k] || add #2,T2 ; Update j mid_loop ; End of mid-loop sub #1,T1 add #1,fft.d_L ; Update L bcc outer_loop,T1>0 ; End of outer-loop mov fft.d_ST1,AR2 ; Restore ST1,ST3,T2 mov fft.d_ST3,AR3 mov AR2,mmap(ST1_55) mov AR3,mmap(ST3_55) mov fft.d_T2,T2 aadd #(Size-ARGS-1),SP ; Reset SP ret .end
共分享92篇相关文档