第7章 DSP 复习资料
1.美国德州仪器(TI)公司生产的TMS320系列芯片主推C2000系列,C5000系列,C6000系列,试分析这三种系列芯片的典型应用领域。
答:C2000系列面向工业产品控制,低价位;
C5000系列面向通信类应用,性能好,低功耗,有利于便携式通信产品及其他仪器的推出;
C6000系列面向高档次应用,如多媒体,图像处理及其他超高速处理场合。
2.数字信号处理的硬件实现可分为单片机实现和DSP实现,试对比分析两者各自主要的优点,缺点。
答:单片机:
优点:接口性能好;
缺点:总线结构是冯·诺依曼结构,系统复杂,特别是乘法运算速度慢;
DSP:
优点:哈佛总线结构,内部具有硬件乘法器等可以实现某些特定功能,具有很高的并行特性,专门的指令系统;
缺点:灵活性差。
3.试分析冯·诺依曼结构与哈佛总线结构各自的特点。
答:冯·诺依曼结构:
程序存储和数据存储共用一个存储空间。编址依靠指令计数器提供的地址来区分是指向数据还是地址,只能串行执行,速度慢,数据吞吐量小;
哈佛总线结构:
程序与数据存储空间分开,各有独立的地址总线和数据总线,取指和读数可以同时进行,从而提高速度,允许直接在程序和数据之间进行信号传递,具有高速运算能力。
4.DSP区别于通用微处理器的重要标志?
答:硬件乘法器。
5.简述定点DSP和浮点DSP的区别。
答:在定点DSP中,小数点的位置在一个数据字中是固定的。而在浮点格式中,一个数据字被分成两部分,分别表示指数和底数,因此它所表示的数据的小数点随着指数的变化而浮动。浮点格式所能表示的数据范围要比定点格式大得多,在大多数应用中都不需要特别考虑运算的溢出问题。
6. DSP中的地址产生单元-ARAU。
7.名词翻译:
ARAU:辅助寄存器算术单元 Auxiliary Registers:辅助寄存器
CALU:中央算术逻辑单元 Barrel shifter:桶型移位器
Multiplier:硬件乘法器 Accumulator:累加器
CSSU:比较、选择和存储单元
8.TMS320C2000系列的内部总线结构?
答:6条:其中是3条地址线,PAB程序地址总线,DRAB数据读地址总线,DWAB数据写地址总线;其他3条为PRDB程序读总线,DRDB数据读总线,DWEB数据写总线。
9.TMS320C3x系列(32bit的浮点DSP)的内部总线结构?
答:7条,其他和TMS320C2000系列一样,多了一条DRAB数据读地址总线。
10.TMS320C6000系列的CPU具有8个独立功能单元:
L1,L2:作算术比较运算;
S1,S2:作程序控制,逻辑运算;
D1,D2:存储;
M1,M2:乘法。
11.TMS320C54x系列(16位定点DSP)特点:
8条总线:
其中:
4条地址总线(PAB,CAB,DAB和EAB),3条数据存储器总线(CB,DB和EB),1条程序存储器总线(PB)。
4条数据地址总线(PAB,CAB,DAB和EAB)传送执行指令所需要的地址。
CB和DB总线传送从数据存储器读出的操作数。EB总线传送写入到存储器中的数据。
程序总线(PB)传送从程序存储器来的指令代码和立即数。
12.TMS320C54x系列硬件结构:
多总线结构,三组16-bit数据总线和一组程序总线
40-bit算术逻辑单元(ALU),一个40-bit的桶形移位器
两个独立的40-bit累加器(A和B最大的差别:A的高位段AH(31-16)可以做为乘法器的输入)
17x17-bit并行乘法器,连接一个40-bit的专用加法器。可用来进行非流水单周期乘/加(MAC)运算
比较、选择和存储单元(CSSU)用于Viterbi运算器的加/比较选择
指数编码器在一个周期里计算一个40-bit累加器值的指数值
两个地址发生器中有八个辅助寄存器和两个辅助寄存器算术单元(ARAU0,ARAU1)
TMS320C54x系列软件结构:
寻址方式:
立即数寻址:指令中嵌有一个固定的数
绝对地址寻址:指令中有一个固定的地址
累加器寻址:按累加器内的地址去访问程序存储器中的一个单元
直接寻址:指令中的7bits是一个数据页内的偏移地址,而所在的数据页由数据页指针DP 或SP决定。该偏移加上DP和SP的值决定了在数据存储器中的实际地址。
间接寻址:按照辅助寄存器中的地址访问存储器。
存储器映射寄存器寻址:修改存储器映射寄存器中的值,而不影响当前DP或SP的值。
堆栈寻址:把数据压入和弹出系统堆栈。
LD #1234,A……………立即数寻址
MVPD pmad, *AR7………绝对地址寻址或间接寻址
FIRS *AR2+, *AR3+, pmad………绝对地址寻址或间接寻址
READA *AR2+…………累加器寻址或间接寻址
WRIT A *AR2+…………累加器寻址或间接寻址
LD #4,DP…………直接寻址
STM #12,AR4…………MM R寻址或间接寻址
间接寻址:*Arx:ARx包含了数据存储器地址。
*ARx-/ *ARx+ :访问后,ARx中的地址减1/加1。
*+ARx:在寻址之前,ARx中的地址加1。
*ARx-0B/ *ARx+0B :访问后,从ARx中以位倒序进位的方式减去/加上AR0。*ARx-0/ *ARx+0 :访问后,从ARx中减去/加上AR0。
*ARx-%/ *ARx+% :访问后,ARx中的地址以循环寻址的方式减1/加1。
*ARx-0%/ *ARx+0% :访问后,从ARx中以循环寻址的方式减去/加上AR0。*ARx(lk):ARx和16-bit的长偏移(lk) 的和用来作为数据存储器地址。ARx本身不被修改。
*+ARx(lk):在寻址之前,把一个带符号的16-bit的长偏移(lk)加到ARx中,然后用新的ARx的值作为数据存储器的地址。
*+ARx(lk)%:在寻址之前,把一个带符号的16-bit的长偏移以循环寻址的方式加到ARx中,然后再用新的ARx的值作为数据存储器的地址。
用定点DSP中数据表示方法表示出0.5和-0.5 ,以及57和-57。0.5:4000H 0100 0000 0000 0000 H
-0.5:1100 0000 0000 0000 H
-0.5的反码:1011 1111 1111 1111 H
-0.5的补码:1100 0000 0000 0000 H ,即C000H
57:0000 0000 0011 1001 ,即0039H
-57:
原码:1000 0000 0011 1001反码:1111 1111 1100 0110 补码:1111 1111 1100 0111 即FFC7H
用浮点DSP中数据表示方法表示出-29.625.
可以用二进制表示为-11101.101B,
用科学计数法表示为:
-1.1101101*24,其指数为127+4=131,
化为二进制表示为:1000 0011 B,
故此数的浮点格式表示为 :
1100 0001 1110 11010000 0000 0000 0000,
转换成16进制表示为:0xC1ED0000 H。
用浮点DSP中数据表示方法表示出12.0 。
二进制表示为:1100 B ,
科学计数:1.100×23 ,
指数:127+3=130 ,二进制为1000 0010 B ,
则浮点格式:0100 0001 01000000 0000 0000 0000 0000十六进制表示为:0x41400000 H
用浮点DSP中数据表示方法表示出37.25。
二进制表示为:100101.01 B ,
科学计数:1.0010101×25 ,
指数:127+5=132 ,二进制为1000 0100 B ,
则浮点格式:0100 0010 0001 0101 0000 0000 0000 0000十六进制表示为:0x42150000 H
TMS320C54x的指令集
Eg:
ADD *AR3+ , A
Before instruction After instruction A 0F00 A1400
AR3 0100 AR3 0101
DATA MEMORY:
0100H 0500 0100H 0500
计算A的值:
A :0000 1111 0000 0000
+0000 0101 0000 0000
0001 0100 0000 0000
1 4 0 0
Eg:
ADD A , -8 , B
Before instruction After instruction
A 1200 A 1200
B 1800 B 1812
计算B的值:1812
Eg:
ADD #0123BH , *AR4+
Before instruction After instruction AR4 0100 AR4 0101
DATA MEMORY:
0100H 0004 0100H 0123F
计算AR4中0100H此时指向的值:0123F
Eg:
MPY *AR2-, *AR4+0 , B
Before instruction After instruction AR0 0002 AR0 0002
AR2 01FF AR2 01FE
AR4 0300 AR4 0302
T 011C T 0500 DATA MEMORY:
01FFH 0500 01FFH 0500
0300H 0004 0300H 0004
Eg:
MPYA *AR2
Before instruction After instruction T 1234 T 5678 AR2 0200 AR2 0200 DATA MEMORY:
0200H 5678 0200H 5678 指令后T中的值:5678
Eg:
MAC *AR5+ , *AR6+ , A , B
Before instruction After instruction A 1000 A1000 AR5 0100 AR0 0101
AR6 0200 AR6 0201
T 0008 T 5678 DATA MEMORY:
0100H 5678 0100H 5678 0200H 1234 0200H 1234
Eg:
ABS A , B
Before instruction After instruction
A FFC
B A FFCB
B FC18 B 0035
A的值是—53 ,B等于A的绝对值,指令之后是+53 ,
即00110101 等于0035
Eg:
CMPL A , B
Before instruction After instruction
A FCBA A FCBA
B FC18 B 0345
B等于A取反码,指令之后是0345
Eg:
DELAY *AR3
Before instruction After instruction AR3 0100 AR3 0100 DATA MEMORY:
0100H 6C6C 0100H 6C6C 0101H 1234 0101H 6C6C
EG:
AND *AR3+ , A
Before instruction After instruction A 00FF 1200 A 0000 1000 AR3 0100 AR3 0101
DATA MEMORY:
0100H 1500 0100H 1500
计算A的值:
00FF 1 0010 0 0
AND 0000 1 0101 0 0
0000 1 0000 0 0
EG:
OR *AR3+ , A
Before instruction After instruction A 00FF 1200 A 00FF 1700 AR3 0100 AR3 0101
DATA MEMORY:
0100H 1500 0100H 1500
计算A的值:
00FF 1 0010 0 0
OR 0000 1 0101 0 0
00FF 1 0111 0 0
EG:
XOR *AR3+ , A
Before instruction After instruction A 00FF 1200 A 00FF 0700 AR3 0100 AR3 0101
DATA MEMORY:
0100H 1500 0100H 1500
计算A的值:
00FF 1 0010 0 0
XOR 0000 1 0101 0 0
00FF 0 0111 0 0
EG:
XORM 0404H , *AR4—
Before instruction After instruction AR4 0100 AR4 00FF
DATA MEMORY:
0100H 4444 0100H 4040
计算AR4的值:
0000 0100 0000 0100
XOR 0100 0100 0100 0100
0100 0000 0100 0000 (4040)
EG:
LD #248 , B
Before instruction After instruction
B 0000 B 00F8
十进制―――二进制―――十六进制
248等于(0 0 1111 1000 B),又等于00F8 H
EG:
STH B , -8 , *AR7-
Before instruction After instruction
B FF 8421 1234 B FF8421 1234
AR7 0321 AR7 0320
DATA MEMORY:
0321H ABCD 0321H FF84
加法指令应用举例:
ld temp1,a ;将变量temp1装入寄存器A
add temp2,a ;将变量temp2与寄存器A相加 , 结果放入A 中
stl a,temp3 ;将结果(低16位)存入变量temp3中
ld #0,dp ; 设置数据页指针ld 60h,16,a ; 将60H 的内容装如A的高16位
adds 61h, a ; 将61H的内容加到A的低16位
减法指令使用举例:stm #60h,ar3 ;将变量立即数60h装入ar3
stm #61h,ar2 ;将变量立即数61h装入ar2
sub *ar2, *ar3,b ;将变量temp3左移16位,同时变量temp2也左移16位,然后相减(变量temp2—变量temp3),结果放入寄存器B(高16位)中
sth b, temp4;将相减的结果(高16位)存入变量temp4
利用SUBC实现定点除法
ld temp1,B;将被除数temp1装入B寄存器的低16位
rpt #15;重复SUBC指令16次subc temp2, B;使用SUBC指令完成除法stl B,temp3;将商(B寄存器的低16位)存入变量temp3
sth B,temp4;将余数(B寄存器的高16位)存入变量temp4
注:实际上是完成整数除法
若用Subc temp2, B 完成10除以3 ,请写出指令内部运行步骤。
被除数:源B 0 0 0 0 0 0 0000 0000 0000 1010
除数:temp2 0 0 0 0 0 0 0000 0000 0000 0011
开始:
temp2中的值左移15位:
0 0 0 0 0 0001 1000 0000 0000 0000
源B-temp2< 0 , 则源B开始左移,需要左移14位:(完成第14次运行)
0 0 0 0 0 0010 1000 0000 0000 0000
此时源B-temp2>0 ,则减出值<<1 + 1 :(完成第15次运行)
减出值:0 0 0 0 0 0001 0000 0000 0000 0000
左移一位后加一:0 0 0 0 0 0010 0000 0000 0000 0001
此时源B-temp2>0 ,则减出值<<1 + 1 :(完成第16次运行)
减出值:0 0 0 0 0 0000 1000 0000 0000 0001
左移一位后加一:0 0 0 0 0 0001 0000 0000 0000 0011
结束。
结果:B的低段位放置商3 ,B的高段位放置余数1 。
若用Subc temp2, B 完成13除以2 ,请写出指令内部运行步骤。
被除数:源B 0 0 0 0 0 0 0000 0000 0000 1101
除数:temp2 0 0 0 0 0 0 0000 0000 0000 0010
开始:
temp2中的值左移15位:0 0 0 0 0 0001 0000 0000 0000 0000
源B-temp2< 0 , 则源B开始左移,需要左移13位:(完成第13次运行)
0 0 0 0 0 0001 1010 0000 0000 0000
此时源B-temp2>0 ,则减出值<<1 + 1 :(完成第14次运行)
减出值:0 0 0 0 0 0000 1010 0000 0000 0000
左移一位后加一:0 0 0 0 0 0001 0100 0000 0000 0001
此时源B-temp2>0 ,则减出值<<1 + 1 :(完成第15次运行)
减出值:0 0 0 0 0 0000 0100 0000 0000 0001
左移一位后加一:0 0 0 0 0 0000 1000 0000 0000 0011
此时源B-temp2<0 ,则此时的值<<1 :(完成第16次运行)
左移一位:0 0 0 0 0 0001 0000 0000 0000 0110
结束。
结果:B的低段位放置商6 ,B的高段位放置余数1 。
行步骤。
被除数:源B 0 0 0 0 0 0 0000 0000 0000 1111
除数:temp2 0 0 0 0 0 0 0000 0000 0000 0011
开始:
temp2中的值左移15位:0 0 0 0 0 0001 1000 0000 0000 0000
源B-temp2< 0 , 则源B开始左移,需要左移13位:(完成第13次运行)
0 0 0 0 0 0001 1110 0000 0000 0000
此时源B-temp2>0 ,则减出值<<1 + 1 :(完成第14次运行)
减出值:0 0 0 0 0 0000 0110 0000 0000 0000
左移一位后加一:0 0 0 0 0 0000 1100 0000 0000 0001
此时源B-temp2<0 ,则此时的值<<1:(完成第15次运行)
左移一位:0 0 0 0 0 0001 1000 0000 0000 0010
此时源B-temp2>0 ,则减出值<<1 + 1:(完成第16次运行)
减出值:0 0 0 0 0 0000 0000 0000 0000 0010
左移一位后加一:0 0 0 0 0 0000 0000 0000 0000 0101
结束。
结果:B的低段位放置商5 ,B的高段位放置余数0 。
部运行步骤。
被除数:源B 0 0 0 0 0 0 0010 0000 0000 0000
除数:temp2 0 0 0 0 0 0 0100 0000 0000 0000
开始:
源B 中的值左移16位: 0 0 0010 0000 0000 00000 0 0 0 temp2中的值左移15位:0 0 0010 0000 0000 00000 0 0 0
源B-temp2= 0 , 则减出值<<1 + 1 :(完成第1次运行)
0 0 0 0 0 0000 0000 0000 0000 0001
此时源B-temp2<0 ,则此时的值<<1:(要左移15次, 完成第16次运行)移出值:0 0 0 0 0 0000 1000 0000 0000 0000
有指令: stl B, -1, quot_f
此时源B右移一位:0 0 0 0 0 0000 0100 0000 0000 0000
结束。
结果:B的低段位放置商0.5 ,B的高段位放置余数0 。
定点整数乘法举例:rsbx FRCT;清FRCT标志,准备整数乘ld temp1,T;将变量temp1装入T寄存器
mpy temp2,a ;完成temp2*temp1,结果放入A寄存器(32位)sth a , temp3 ;a的高16位装入变量temp3 temp4 ;a的低16位装入变量temp4
定点小数乘法举例ssbx FRCT ;FRCT=1,准备小数乘法
ld temp1,16,a ;将变量temp1装入寄存器A的高16位mpya temp2 ;完成temp2乘寄存器A的高16位,结果在B中,同时将temp2装入T寄存器
sth b,temp3 ;将乘积结果的高16位存入变量temp3
定点小数除法举例
ld temp1,T ;被除数装入T寄存器
mpy temp2,A ;除数与被除数相乘,存A
ld temp2,B ;除数temp2装入B低16位
abs B ;求绝对值
stl B,temp2 ;B低16位存回temp2
ld temp1,16,B ;被除数装入B高16位
abs B ;求绝对值
rpt #15 ;重复SUBC指令16次
subc temp2,b ;完成除法运算and #0ffffh,B ;B高16位清0,仅保
留商
bcd div_end,agt ;延时跳转,先执行下面两条指令,然后判断A,若A>0,则跳转到标号div_end,结束除法运算
stl B,-1,temp3 ;商右移一位存temp3
xor B ;若商为负,将B清0
sub temp3,B ;将商反号
stl B,temp3 ;存回变量temp3中
div_end:
计算16阶的FIR滤波器输出256个点
.sect “fir-pro g”
STM #255, BRC ; Repeat 256 times
RPTBD fir_filter_loop
STM #16, BK ; FIR circular buffer size
LD *AR7+, A ; load the input value
STL A, *AR4+% ; replace oldest sample with
; newest sample
RPTZ A, #15
MAC *AR4+0%, *AR3+0%, A ; filtering
STH A, *AR5+ ; replace the oldest buffer value
fir_filter_loop
Link的cmd文件的作用是什么?
Link的cmd文件用于DSP数字信号处理代码的定位。由于DSP的编译器的编译结果是未定位的,DSP没有操作系统来定位执行代码,每个客户设计的DSP系统的配置也不尽相同,因此需要用户自己定义代码的安装位置。以C5000为例,基本格式为:
-o sample.out
-m sample.map
-stack 100
sample.obj meminit.obj
-l rts.lib
MEMORY {
PAGE 0: VECT: origin = 0xff80, length 0x80
PAGE 0: PROG: origin = 0x2000, length 0x400
PAGE 1: DA TA: origin = 0x800, length 0x400
}
SECTIONS {
.vectors : {} >PROG PAGE 0
.text : {} >PROG PAGE 0
.data : {} >PROG PAGE 0