;则*AR1=A(31~16),TRN左移1位,TRN(0)=0,TC=0
;否则*AR1=A(15~0),TRN左移1位,TRN(0)=1,TC=1
TRN将自动记录比较结果。
3.1.6指数编码器
指数编码器用于支持单周期EXP(指数运算指令)的一个专用硬件。
在EXP指令中累加器的指数值能以二进制补码的形式存储在T寄存器(低6位,联系桶形移位寄存器)中,范围是-8~31。
指数值定义为前面的冗余位数减8的差值。
如:
000000FFFFH,前面冗余位数为24位,指数值为24-8=16
0FFFFFFFFFFH,前面冗余位数为4位,指数值为4-8=-4
我们看看下面的例子:
EXPA;指数值送入T中
STT,EXPONET;将指数值存入定义的数据存储器中
NORMA;对累加器归一化
3.1.7CPU状态和控制寄存器
TMS320C5X有3个状态和控制寄存器:
(1)状态寄存器ST0
(2)状态寄存器ST1
(3)处理器工作方式状态寄存器PMST
这3个寄存器是整个芯片的控制部分,相当于芯片的神经中枢,控制着整个芯片的运行状态。
这3个寄存器中,ST0和ST1中包含着芯片的各种工作条件和工作状态;PMST中包含了寄存器的设置状态和其他一些控制信息。
1.处理器工作方式状态寄存器PMST
PMST主要设定并控制处理器的工作方式,放映处理器的工作状态。
其结构如下:
15~76543210
IPTP
MP/MC
OVLY
AVIS
DROM
CLKOFF
SMUL
SST
(1)IPTR,中断向量指针。
IPTR共9位,它标志着中断向量驻留的128b字的程序存储区地址。
复位时,这9b全部置1,因此复位向量总是驻留在程序存储空间地址为FF80H处。
(2)MP/MC,微处理器或微计算机工作方式选择位。
通过设置该位来选择芯片工作在哪种工作方式。
若连接引脚为高电平时,工作在微处理器状态,这时不能寻址片内的程序寄存器;若为低电平时,工作在微计算机状态,此时可以选择片内程序存储器。
(3)OVLY,RAM重复占用标志位。
如果此位置位,允许片内双寻址数据RAM映射到程序空间,也就是可以将片上的RAM作为程序空间寻址。
注意:
数据0页(0~7FH)为特殊寄存器空间,不能映射。
(4)AVIS,地址可见位。
此位置位,允许在地址引脚上看见内部程序空间的地址内容。
(5)DROM,数据ROM位。
这一位用来控制片内的ROM是否映射到数据空间。
(同OVLY位联系讲)
(6)CLKOFF,时钟关断位。
该位决定引脚CLKOUT(输出时钟脉冲)是否允许输出。
为1是禁止输出。
(7)SMUL,乘法饱和位。
该位只有在OVM=1,FRCT=1时才有效,对乘法结果进行饱和处理。
(8)SST,存储饱和位。
当SST=1时,对存储前累加器进行饱和处理。
2.状态寄存器ST0
状态寄存器ST0,主要反映寻址要求和计算中间运行状态。
15~1312111098~0
ARP
TC
C
OVA
OVB
DP
各位定义如下:
(1)ARP,辅助寄存器指针。
ARP共3位,用于间接寻址当中辅助寄存器的选择。
(2)TC,测试/控制位。
用于保存ALU的测试位操作结果,也可根据该位状态辅助一些状态转移指令的执行。
(3)C,进位标志位。
(4)OVA,累加器A的溢出标志。
(5)OVB,累加器A的溢出标志。
(6)DP,数据存储器页指针。
DP是一个9b的字段,常常作为高9b和指令中的低7b想结合,直接寻址。
3.状态寄存器ST1
ST1反映了寻址要求、计算的初始设置、I/O及中断控制。
151413121110987654~0
BRAF
CPL
XF
HM
INTM
0
OVM
SXM
C16
FRCT
CMPT
ASM
各位定义如下。
(1)BRAF,块重复操作标志。
如果BRAF=1,表示正在执行块重复操作指令;
(2)CPL,直接寻址编辑方式标志位。
该标志为标志直接寻址方式选用何种指针。
如过CPL=1,表示选用堆栈指针(SP),若CPL=0,表示选用页指针(DP)。
(3)XF,XF引脚状态控制位。
控制XF通用外部I/O引脚输出状态。
(4)HM,CPU保持工作方式标志。
该位是当芯片响应HOLD信号时,CPU保持工作方式标志。
(5)INTM,中断方式控制位。
可开关所有可屏蔽中断。
(6)“0”位。
(7)OVM,溢出方式控制位。
(前面内容中讲过,ALU中)
(8)SXM,符号扩展方式控制位。
该位用于决定符号位是否扩展。
当SXM=1时,数据进入ALU之前进行符号位扩展。
(9)C16,双16b/双精度算术运算方式控制位。
(前面介绍过,CSSU中)
(10)FRCT,小数方式控制位。
(前面介绍过,乘法器中)
(11)CMPT,间接寻址辅助寄存器修正方式控制位。
当CMPT=1时,可通过修改ARP内容改变当前辅助寄存器AR1~AR7的值。
如果CMPT=0,则ARP必须清零,且不能被修正。
(12)ASM,累加器移位方式控制位。
(前面讲过,移位寄存器)
3.2总线结构
我们来看看,DSP芯片内部的数据是怎么传输的呢?
TMS320C54系列的芯片内部总线结构是一样的,均有8条总线,分别是4条地址总线、3条数据总线和一条程序总线,其中每条总线都是16位。
TMS320C54系列芯片之所以有如此优良的性能,正是由于这8条并行的总线结构。
TMS320C54系列芯片可以在一个机器周期内完成4次访问存储器的操作:
取1次指令、读2个操作数、写1个操作数。
1.程序总线PB和程序地址总线PAB
程序地址总线PAB用于传送程序存储器的地址,而程序总线PB则传送来自程序存储器的指令代码和操作数。
程序存储器总选中的内容是根据程序存储器中地址来选择实现的。
2.数据总线DB、CB和数据地址总线DAB、CAB
数据总线DB和CB是与读操作相关的数据总线,由于具有两条这样的总线,所以TMS320C54系列芯片可以实现在单周期内读取两个操作数,而数据地址总线DAB与CAB就是这两条总线对应的地址总线。
3.数据总线EB和数据地址总线EAB
数据总线EB是一个与写操作数相关的数据总线,任何一条写指令都是通过这条总线来传送数据的,EAB就是与之相对应的地址总线。
由于分离的读写总线,所以在一个周期内可以同时执行读写操作。
下面我们以一个表格的形式来展示一下个总总线的功能列表
读写方式
数据总线
程序总线
数据地址总线
CB
DB
EB
PB
PAB
CAB
DAB
EAB
程序写
★
★
程序读
★
★
单数据写
★
★
单数据读
★
★
双数据读
★
★
★
★
长数据(32b)读
★(hw)
★(lw)
★(hw)
★(lw)
数据读/数据写
★
★
★
双数据读/系数读
★
★
★
★
★
外设读
★
★
外设写
★
★
指令系统部分
1.算术指令:
①ABDST:
②ABS:
③ADD:
④ADDC:
⑤ADDM:
⑥ADDS:
⑦EXP:
FIRS:
LTD:
LMS:
MAC[R]
MACA[R]
MACD
MACP:
MACUS:
MAS[R]:
MASA[R]:
MAX:
MIN:
MPY[R]:
MPYA:
MPYU:
第6章
第3部分
在数字信号处理的过程当中,我们会大量的遇到比如相乘,相加,比较等各种各样的算数运算。
那么这样多的运算的对象是什么呢?
当然是各种各样的数据,也就是我们在DSP当中常常说到的”操作数”(运算当中的大部分”操作数”通常放在数据存储器中,而立即数放在程序存储器当中)。
所谓寻址,也就是我们拿到这样一些操作数进行运算。
寻址方法,当然就是我们(拿到)寻找所指定的参与运算的操作数的方法。
(程序的跳转或者重复操作也可称之为寻址,后面课程中会提到的)
在编写程序时,我们可以根据程序不同的要求采用不同的寻址方式,从而缩短程序运行的时间和提高代码执行效率。
今天我们讲授的内容就是TMS320C54X系列DSP芯片的寻址方式。
6.1数据寻址方式
TMS320C54X系列DSP器件具有下列基本的寻址方式:
(1)立即寻址,指令编码本身带有操作数。
(2)绝对寻址,指令编码中含有操作数地址。
(3)累加器寻址,累加器的内容是程序存储器中操作数的地址。
(4)直接寻址,指令编码中含有的7b地址与DP或SP一起合成数据存储器中操作数的实际地址。
(5)间接寻址,同过辅助寄存器寻址。
(6)存储器映像寄存器寻址,这种寻址方式不影响当前数据页面指针DP和当前堆栈指针SP的值。
6.1.1立即寻址
什么是立即寻址呢?
是指指令里包含了立即操作数。
指令当中的立即数编码可以是一个字,也可以是两个字长(根据立即数的长短而定)。
(1)长度为3b或5b、8b、9b的立即数我们称之为短立即数。
(2)长度为16b的长立即数。
我们来看一些立即数不同时,用立即数寻址的例子:
LD#2,ARP;ARP=2,ARP(ST0:
辅助寄存器指针,15~13)
LD#3,ASM;ASM=3,ASM(ST1:
累加器移位寄存器,4~0)
LD#50,DP;DP=50,DP(ST0:
数据存储页面指针,8~0)
ADD#0ffh,A;将0ffh加给AccA
上面这些都是短立即数寻址,我们以最后一个位例,来看看他的编码方式是怎样的?
由上图我们可以很轻松的看出,对于短立即数寻址,译成机器码的时候只占两个字节,操作码一个字节,短立即数一个字节。
我们再来看这样两条指令:
STM#FFFFH,IMR;IMR=FFFFH,开所有中断(当然,需要ST1中的INTM=0)
ADD#1234h,A;将#1234h加给AccA
以上两个立即数都是16b长度的立即数,那么它们就属于场立即数寻址了。
我们以第二个指令来看看它的编码方式,看和短立即数寻址有什么不同?
由上图我们可以看出,它的编码总共占了两个字(4个字节),其中操作码和操作数各占了一个字。
很明显,长立即数寻址占用的存储空间要大。
立即数寻址由此,可分为长立即数寻址和短立即数寻址两种方式。
6.1.2绝对寻址
绝对寻址,就是在指令中包含有所需寻址的存储单元的16位地址。
在绝对寻址指令语法中,存储单元的16位地址,可以用其所在单元的地址标号或者16位符号常数来表示。
所以编码长度总是16b,占两个字以上。
有以下4类:
1.数据存储器地址(dmad)寻址:
MVDKSmem,dmaddata(dmad)=Smem
MVDMdmad,MMR
MVKDdmad,Smem
MVMDMMR,dmad
2.程序存储器地址(pmad)寻址:
FIRSXmem,Ymem,pmad
MACDSmem,pmad,src
MACPSmem,pmad,src
MVPDpmad,Smem
3.端口地址(PA)寻址
PORTRPA,Smem
PORTWSmem,PA
4.*(lk)寻址适用于支持单数据存储器操作数的指令
例:
MVKDSAMPLE,*AR5;将数据存储器SAMPLE地址单元中的数据传送到又AR5寄存器所指向的存储器单元中。
SAMPLE为一符号常数,代表一个数据存储单元的地址。
MVPDTABLE,*AR7-;将程序存储器标号为TABLE地址单元中的数据传送到由AR7寄存器所指向的数据存储器单元中。
TABLE代表一个程序存储单元的地址。
PORTRFIFO,*AR5;从FIFO端口读入一个数据,将其存放到由AR5寄存器所指向的数据存储器单元中。
FIFO是一个I/O端口地址标号。
LD*(BUFFER)A;将BUFFER符号所指的数据存储器单元中的数据传送到累加器A。
BUFFER是一个16位符号常数。
6.1.3累加器寻址
累加器寻址,就是利用累加器的数值作为地址来读写程序存储器。
有两条指令用的是累加器寻址方式:
READASmem;以累加器A中的数位地址,从程序存储器中读入一个数,并传送到由Smem所指定的数据存储器单元之中。
WRITASmem;将Smem所指定的数据存储单元中的一个数,传送到累加器A所指定的程序存储器单元中。
6.1.4直接寻址
在直接寻址中,指令包含了有数据存储器地址(dma)的低7b,这7b作为地址偏移量,结合数据页指针DP或堆栈指针SP形成16b的数据存储器地址。
使用这种寻址,我们可以在不修改DP和SP的情况下,对128个数据寻址。
在直接寻址方式中,指令中包含了数据存储器的低7b地址:
ST1中的编译模式位CPL用于选择DP或SP来产生数据存储器的地址。
(1)当CPL=0时,7b地址与DP中的9b字段形成16b的数据存储器地址。
Ps:
为什么我们将DP叫做页面指针?
应为DP占高9位地址,也就是将存储器逻辑的分为了512页,每页有128个地址单元。
(2)当CPL=1时,7b地址作为一个正数,与SP相加形成16b的数据存储器地址。
直接寻址的语法是利用一个“@”(在变量的前面加上),或者一个数来设定偏移地址的值。
直接寻址是一个单周期执行指令,但要注意数据所在的页面指针。
6.1.5间接寻址
在间接寻址中,64K数据空间任意单元都可通过一个辅助寄存器中的16-bit地址进行访问。
C54x有8个16-bit辅助寄存器(AR0-AR7)。
两个辅助寄存器算术单元(ARAU0和ARAU1),根据辅助寄存器的内容进行操作,完成无符号的16-bit算术运算。
间接寻址很灵活,不仅能从存储器中读或写一个单16-bit数据操作数,而且能在一条指令中访问两个数据存储器单元(即从两个独立的存储器单元读数据,或读一个存储器单元同时写另一个存储器单元,或读写两个连续的存储器单元)。
单操作数间接寻址方框图:
单操作数间接寻址类型:
*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的值作为数据存储器的地址。
编程举例:
间接寻址编程:
.mmregs
.bssx,4,1
a.word1,2,3,4
.sect“program”
STM#a,AR1
STM#x,AR2
LD#0,A
LD*AR1+,T
MAC