版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章寻址方式与流水线4.1数据寻址方式4.2程序寻址方式4.3指令流水线4.4汇编程序流程控制
4.1数据寻址方式
C54x提供了7种基本数据寻址方式。
(1)立即数寻址:指令中包含了一个固定的数,主要用于初始化。
(2)绝对寻址:利用固定的16位地址寻址存储单元。
(3)累加器寻址:把累加器的内容作为地址去访问程序存储器单元。
(4)直接寻址:利用数据页指针(DP)或堆栈指针(SP)寻址,数据存储器地址由基地址和指令中的7位偏移地址决定。(5)间接寻址:将辅助寄存器的内容作为地址访问数据存储器。
(6)存储器映射寄存器寻址:用于快速寻址映射寄存器。(7)堆栈寻址:将数据压入或弹出系统堆栈。4.1.1立即数寻址
立即数有两种类型:短立即数(k)和长立即数(lk)。短立即数长度为3、5、8或9位,可以放在一个字长的指令中;而长立即数为16位,放在两个字长的指令中。下面以RPT指令来说明一个立即数是如何放置在指令代码中的。若立即数为8位,则RPT为单字长指令,此时编译后的机器操作码放在指令的高8位(15~8位),立即数放在指令的低8位(7~0位),如图4.1(a)所示。若立即数为16位,则RPT为双字长指令,此时操作码放在低位字中,立即数放在高位字中,如图4.1(b)所示。图4.1带立即数的RPT指令机器执行码注意:立即数需在数值或符号前面加一个“#”号,否则会认为是一个地址。例如要将数值80H装入累加器A中,指令应该表示为
LD#80HA
但若表示为
LD80H,A
则指令变成了将数据存储器偏移地址为80H单元的数据装入累加器A中,具体访问哪个单元需要根据ST1的编译模式位CPL而定。4.1.2绝对寻址
C54x绝对地址寻址有以下4种类型。
(1)数据存储器地址(dmad)寻址,主要指令有:
MVDKSmem,dmad;(Smem)→dmad
MVKDdmad,Smem;(dmad)→Smem
MVDMdmad,MMR;(dmad)→MMR
MVMDMMR,dmad;(MMR)→dmad
dmad寻址的共同特点是指令中的dmad是用常数或符号表示的数据空间绝对地址。例如,要将AR3指向的数据存储器单元的内容复制到数据空间地址为SAMPLE的单元中去,可以使用下面的语句:
MVDK*AR3,SAMPLE
其中,SAMPLE是数据存储器的绝对地址。若SAMPLE表示的数据地址为1000H,则上面的语句还可以表示为
MVDK*AR3,1000H
(2)程序存储器地址(pmad)寻址,主要指令有:
pmad,Smem;Smem=pmad
MVDPSmem,pmad;pmad=Smem
MACPSmem,pmad,src;src=src+Smem*pmad,T=Smem
MACD[DW]Smem,pmad,src;src=src+Smem*pmad,T=Smem,(Smem+1)=Smem
FIRSXmem,Ymem,pmad;B=B+A*pmad,A=(Xmem+Ymem)<<16
pmad寻址的共同特点是指令中的pmad是用常数或符号表示的程序空间绝对地址。例如,要将AR7指向的数据存储器单元的内容复制到程序空间地址为TABLE的单元中去,可以使用下面的语句:
MVDP*AR7,TABLE
其中,TABLE表示程序存储器地址。
(3)端口地址(PA)寻址,主要指令有:
PORTRPA,Smem;Smem=PA
PORTWSmem,PA;PA=Smem
PA寻址时,指令中的PA是用常数或符号来表示的端口地址。例如,要将数据存储器200H单元的内容复制到端口地址为FIFO的I/O口,可以表示为
PORTW200H,FIFO
其中,FIFO表示端口地址,同样FIFO也可以用常数表示的端口地址替代。
(4)*(lk)绝对寻址。
它是用常数或符号lk来表示的数据空间地址。例如,要将累加器A的低16位放入数据存储器地址为BUFFER的单元中,可以表示为
STLA,*(BUFFER)*(lk)寻址无须改变DP或初始化ARx就能够访问数据空间的任何单元,但这种寻址方式会使指令的长度增加1个字,使一个原来单字长指令扩展为双字长指令或使一个双字长指令扩展成三字长指令。注意:*(lk)绝对寻址的指令不能与单重复指令RPT和RPTZ一起使用。4.1.3累加器寻址
累加器寻址是将累加器的内容作为一个程序存储器地址来访问的。有两条指令采用的是累加器寻址方式,它们分
别是:
READA
Smem
WRITA
Smem
READA是将累加器A所指定的程序存储器单元的内容传送到Smem指向的数据存储器单元中。
WRITA是将Smem指向的数据存储器单元的内容传送到累加器A所指定的程序存储器单元中。
需要注意的是,大多数C54x芯片的程序存储器单元地址由累加器的低16位确定,但是某些DSP芯片(如C548、C549、C5410和VC5416有23根地址线)的累加器在寻址时,程序存储
器单元地址由累加器的低23位确定。4.1.4直接寻址
在直接寻址中,有一个指示数据存储器的低7位偏移地址的操作数,它与基地址结合,形成16位的数据存储器地址。基地址存放在数据页指针寄存器(DP)或者堆栈指针寄存器(SP)中。采用直接寻址无须改变DP或SP的值就可以任意访问当前基地址中连续的128个单元,这种方式的显著特点是指令代码只有一个字,访问速度块。图4.2给出了使用直接寻址指令的机器执行码格式,其中15~8位为指令操作码,第7位I为寻址方式,若I=0,表示指令使用直接寻址方式,6~0位包含了指令的数据存储器的偏移地址。图4.2直接寻址指令的机器执行码格式根据ST1中的编译模式位CPL可确定基地址。当CPL=0时,基地址为DP,实际访问的地址如图4.3所示,高9位为DP的值(称为数据页),低7位为指令中的偏移地址。图4.3以DP为基地址的直接地址形成过程由于DP的范围为0~511(29-1),因此以DP为基地址的直接寻址将存储器分为512页。偏移地址的范围为0~127(27-1),因此每页有128个可以访问的单元。也就是说,DP指向了512页中的某一页,而偏移地址则指向该页的某一个单元。在以DP为基地址的直接寻址中,必须注意先初始化DP,否则程序运行结果将不正常。当CPL=1时,基地址为SP,实际访问的地址如图4.4所示,等于SP+指令中的7位偏移地址。这种寻址方式可以访问以SP为基地址的连续的128个单元。由于SP为16位的地址,因此不像DP那样有页面边界限制。图4.4以SP为基地址的直接地址形成过程4.1.5间接寻址
在间接寻址中,数据空间的任意单元都可以通过一个辅助寄存器中的内容所代表的16位地址进行访问。C54x有8个16位的辅助寄存器AR0~AR7。借助两个辅助寄存器算术单元ARAU0和ARAU1的运算,辅助寄存器的地址还可以有选择地进行增量、减量、偏移或变址的修改,其中AR0除了可以像其他辅助寄存器一样使用外,还能够用于循环寻址和位反转寻址中。间接寻址方式相当灵活,不但可以用一条指令从数据存储器读或写一个16位的数据操作数(单操作数间接寻址),还能在一条指令中访问两个数据存储器单元(双操作数间接寻址),包括从两个不同的数据存储器单元读数据和写两个连续的存储器单元,或者读一个存储器单元同时写另一个存储器单元。
1.单操作数间接寻址
这种方式可以通过修改辅助寄存器的值来自动改变寻址单元,具体修改方式有:地址加1或减1、加16位偏移量或用AR0值作为偏移量等。这些地址修改可以在地址访问之前或者之后进行,共形成16种具体的寻址方式。表4.1列出了单操作数间接寻址的语法以及每一种语法的功能。表4.1中涉及到循环寻址和位反转寻址两种特殊的寻址过程,下面作详细介绍。
(1)循环寻址。在卷积、相关和FIR滤波等许多算法中,都需要在存储器中设置循环缓冲区。循环缓冲区是一个滑动窗口(如图4.5所示),它包含了最近的数据。如果有新的数据到来,它将覆盖最早的不再使用的数据。实现循环缓冲区的关键是循环寻址,循环寻址用%表示。图4.5循环缓冲区及循环寻址若BK定义的循环缓冲区的大小为R,则要求缓冲区的首地址始于最低N位为0的地址,且N是满足2N>R的最小整数。例如,R=31写成二进制为011111B,即N=5。一个长度为
31个字的循环缓冲区必须开始于最低5位为0的地址(即xxxxxxxxxxx00000B),且赋值BK=31。又如,一个长度为32个字的循环缓冲区必须开始于最低6位为0的地址(即xxxxxxxx
xx000000B),且赋值BK=32。设循环缓冲区的索引index是当前ARx的低N位值,步长step是一次加到ARx中或从ARx中减去的值。循环寻址的算法(index+step)%BK的具体代码如下:
if0≤index+step<BK:
index=index+step.
elseifindex+step≥BK:
index=index+step-BK.
elseifindex+step<0:
index=index+step+BK.例如,下面一段代码可实现a到b的抽取(8抽1)运算。
STM#a,AR1
STM#b,AR2
STM#8,AR0
STM#10H,BRC
RPTB#EXT_END-1
LD*AR1+0%,A
STLA,*AR2+%设AR1=1000H,BK=20H,则N=6。根据指令AR0=8,可得step=8,则“LD*AR1+0%,A”循环寻址的单元分别是0x1000,0x1008,0x1010,0x1018,0x1000,0x1008,…。
使用循环寻址时,必须遵循以下三个原则:
①循环缓冲区的长度R小于2N,且地址从一个低N位为0的地址开始;
②步长小于或等于循环缓冲区的长度R;
③所使用的辅助寄存器必须指向缓冲区单元。
(2)位反转寻址。位反转寻址主要用于FFT算法中,这种寻址方式可以大大提高程序的执行速度和存储器的利用效率。使用时,AR0存放的整数值为FFT点数的一半,另一个辅助寄存器ARx指向存放数据的单元。位反转寻址将AR0加到辅
助寄存器中,地址以位反转方式产生。也就是说,两者相
加时,进位是从左向右反向传播的,而不是通常加法中的
从右向左传播。例如,1010B与1100B的位反转相加结果为0001B,如图4.6所示。图4.6位反转进位示意图设辅助寄存器为8位,AR2的值为01100000B,AR0的值为00001000B,则位反转寻址中AR2中的值修改的顺序和修改后AR2的值如下:*AR2+0B,AR2=01100000B(第0值)
*AR2+0B,AR2=01101000B(第1值)
*AR2+0B,AR2=01100100B(第2值)
*AR2+0B,AR2=01101100B(第3值)
*AR2+0B,AR2=01100010B(第4值)
*AR2+0B,AR2=01101010B(第5值)
*AR2+0B,AR2=01100110B(第6值)
*AR2+0B,AR2=01101110B(第7值)表4.2给出了AR0为00001000B时,位模式和位反转模式与AR2低4位的关系。
2.双操作数间接寻址
双操作数间接寻址用于完成2个读操作数或者1个读和1个存储(写)并行的操作。采用这种方式的指令代码都为一个字长且只能以间接寻址方式工作。由于指令代码中只有两位用来表示辅助寄存器,因此只有4个辅助寄存器AR2~AR5可以使用,与2个ARAU一起,在一个周期内访问2个操作数。表4.3列出了双操作数间接寻址的类型。4.1.6存储器映射寄存器寻址
这种寻址方式用来修改存储器映射寄存器的内容,但不会影响当前的DP或SP值。由于不需要对DP或SP进行操作,因此这种寻址方式的开销是最小的。存储器映射寄存器寻址既可以在直接寻址中使用,又可以在间接寻址中使用,具体的地址产生方法如下所述。
(1)直接寻址方式中,数据存储器低7位的地址来自指令字,高9位都被强制清0,而不管当前DP值或SP值为多少。
(2)在间接寻址方式中,数据存储器低7位的地址来自当前辅助寄存器的低7位,高9位都被强制清0。当操作完成后,辅助寄存器的高9位被强制清0。存储器映射寄存器的寻址范围为0x00~0x7F,包括数据第0页中的便笺式RAM(地址在0x0060~0x007F内的RAM)的任意单元。在汇编指令中,只有以下8条指令能使用存储器映射寄存器的寻址方式。
LDMMMR,dst
STM#lk,MMR
STLMsrc,MMR
MVDMdmad,MMR
MVMDMMR,dmad
MVMMMMRx,MMRy
POPMMMR
PSHMMMR
需要注意的是,在存储器映射寄存器寻址方式下,不能采用下列间接寻址的句法:
*ARx(lk),*+ARx(lk),*+ARx(lk)%和*+(lk)4.1.7堆栈寻址
系统堆栈是用户定义的一段数据存储单元,用于中断或子程序调用时自动保存程序计数器PC中的值,当前程序的运行环境以及函数调用时的数据传递等。堆栈存放数据是从高端地址向低端地址进行的,其最高地址单元称为栈底。DSP用一个16位的堆栈指针SP来实现栈寻址,SP总是指向堆栈中最后存入的数据单元。
PSHD;将数据存储器中的一个数压入堆栈
PSHM;将一个MMR中的值压入堆栈
POPD;从堆栈中弹出一个数据到数据存储单元
POPM;从堆栈中弹出一个数据到一个MMR图4.7给出了将一个数据X2压入堆栈(PSHDX2)的操作过程,从图4.7中可以清楚地看出堆栈和指针SP在操作前后的变化情况。对于TMS320C5000DSP来说,数据压入堆栈前要对SP进行减量运算,而在数据弹出堆栈操作之后,要对指针进行增量运算。图4.7数据压入堆栈操作过程示意图注意:堆栈没有超出容量的自动保护功能。如果压入堆栈的数据个数超出堆栈的容量,则存储在比堆栈最低地址更低的地址单元上的数据有可能覆盖其他的数据,因此在考虑堆栈容量时,一定要有余地。一种简单测试堆栈是否超出范围的方法是,在初始化主程序时,将堆栈全部初始化为一个不用的常数,如0xFFFF等,然后当程序执行到一定阶段的时候观察堆栈里是否至少还有一个这样的常数,若没有,则程序使用堆栈超出了堆栈的容量。在中断和调用子程序过程中,堆栈用来存放和恢复PC的值。当一个中断产生或者调用一个子程序时,返回地址会自动压入堆栈顶部。返回地址从堆栈中弹出,存放到PC中。此外,FRAME指令也能影响堆栈,它将一个短立即数偏移量与SP指针相加,从而修改SP的值。在直接寻址中,也可以用堆栈指针SP作为基地址来寻址。
4.2程序寻址方式
4.2.1程序存储器地址生成器
程序存储器有指令代码、参数表和立即数。C54x程序地址总线(PAB)为16位总线,可寻址空间为64K字。5416等还有额外的7根地址总线可寻址外部128个64K字的页。
5416共有5个寄存器单元组成程序地址产生逻辑(PAGEN),为指令代码、参数表、长立即数或其他存入程序存储器的信息产生地址,并把该地址放在PAB上。这5个寄存器分别是PC(程序计数器)、RC(重复计数器)、BRC(块重复计数器)、RSA(块重复起始地址寄存器)和REA(块重复结束地址寄存器),如图4.8所示。图4.8程序地址生成器(PAGEN)组成示意图当顺序执行时,PC的值(程序地址)放在PAB总线上,进而在程序存储器相应的地址取指。然后PC值自动加1,指向下一个指令地址。如果程序地址不是连续的,如跳转、返回、中断或循环,则需要根据具体指令给PC加载合适的地址。重复执行类似于执行C语言的for循环语句,DSP的重复执行是为了提高执行效率而作的特殊改进,它不需要CPU计算重复执行的次数。如果重复执行某行代码(单重复执行),程序先将重复次数减1的值载入到RC,然后重复执行;如果重复执行某一段代码(块重复执行),程序先将重复次数减1的值载入到BRC,同时初始化BSA和BEA,然后重复执行。两者都是每重复执行一次,RC或BRC的值就自动减1,当减到0后,再执行一次,然后就停止执行。4.2.2程序计数器(PC)和扩展程序计数器(XPC)
程序计数器(PC)是一个16位寄存器,控制着程序的运行过程。在通常情况下,程序指令按前后顺序逐条执行时,PC值依次递增。但是,当程序指令出现转移、子程序调用、子程序返回、条件操作、单指令重复、指令块重复、硬件复位或者中断操作时,PC值会出现不连续的情况,此时PC值的变化情况见表4.4。扩展程序计数器(XPC)是一个7位寄存器。在C548、C549、C5410、C5416和C5420等DSP芯片中,使用XPC可以对程序存储器扩展空间进行寻址。在程序计数器PC被载入时,XPC的值也随情况不同发生变化。表4.5给出了各种情况下XPC值的变化。4.2.3延时转移下的PC操作
由于C54xDSP在执行指令时采用了流水线结构,执行一条指令被分成了预取指、取指、译码、操作数寻址、读操作数和执行(回写)6个部分。也就是说,当一条指令运行到执行部分时,后续的一条双字长指令或者两条单字长指令也已经进入流水线。C54xDSP中的汇编指令在执行转移操作时都分为延时转移和不延时转移两种方式,在转移指令上加上后缀D表示延时转移。延时转移指令能够使紧跟转移指令之后的一条双字长指令或两条单字长指令执行完毕后,再跳转到指令指定的地址执行;而不延时转移指令,它直接跳转到指令指定的地址执行,此时紧跟在转移指令之后的一条双字长指令或两条单字长指令将不被执行,直接在流水线上被冲洗掉。由于冲洗流水线需要附加周期,降低了程序运行效率,因此正确应用延时转移指令和不延时转移指令可以提高程序运行速度和效率。
4.3指令流水线
DSP的指令流水线为指令的并行执行提供了硬件支持,大大提高了DSP的指令执行速度。C54x的流水线由6级深度组成,彼此相互独立,并行工作。也就是说,要完整地执行一条指令,需要6个时钟周期,如果后面的指令能建立流水线结构,则每条指令只需占用一个时钟周期,大大提高了运行速度。这6个指令阶段分别是程序预取指、程序取指、指令译码、寻址操作数、读操作数和执行,如图4.9所示。图4.9流水线操作示意图
(1)程序预取指(Prefetch):将PC的地址放在程序地址总线(PAB)上。
(2)程序取指(Fetch):从程序总线(PB)取指令,载入指令寄存器(IR)。
(3)指令译码(Decode):对指令的内容进行译码,确定所要操作的存储器类型、数据地址单元及相关控制信号。
(4)寻址操作数(Address):又称“访问”,就是得到“读”操作数的地址,它将第一操作数地址放在DAB上,将第二操作数地址放在CAB上,并对辅助寄存器和堆栈指针进行修正。(5)读操作数(Read):将第一操作数放在DB上,将第二操作数放在CB上,如果是并行指令,将第三操作数的写地址放在EAB上。
(6)执行(Execute):将执行后的数据(在EB总线上)按EAB地址写到存储单元。不同的指令,具体执行内容有所不同,如有的指令没有读操作数,有的指令没有写操作数,则相应的操作数为空。对于不能建立流水线的指令,流水线需要作特殊处理,以免出现流水线冲突,这些指令主要是程序控制指令,如分支指令、条件执行指令等。避免流水线冲突的主要方法是加NOP空操作指令延时以及合理设计代码等。可能产生流水线冲突的硬件资源有:
(1)辅助寄存器(AR0~AR7);
(2)循环缓冲区大小寄存器(BK);
(3)块重复计数器(BRC);
(4)堆栈指针(SP);
(5)暂存器(T);
(6)微处理器方式寄存器(PMST);
(7)状态寄存器(ST0和ST1);
(8)存储器映射寄存器中的累加器(AG、AH、AL、BG、BH、BL)。
它们都是映射寄存器,如果在流水线中同时对它们进行寻址,则有可能产生不能防范的冲突(一般出现在先写后读的情况下),而算术运算不会出现此类冲突问题。
4.4汇编程序流程控制
4.4.1条件操作
C54x的一些指令,只有当满足一个或多个条件时才能执行,表4.6列出了一些指令的执行条件及其操作符。当使用多个条件时,只有满足所有条件时,指令才可以执行。多个条件指令的条件组合不能任意选择,必须满足表4.7的分类。4.4.2分支转移指令
C54x的分支转移指令分无条件分支转移指令(相当于C语言的goto语句)、条件分支转移指令(相当于C语言的if…end语句)和远分支转移指令(在扩展程序存储器上的分支转移)三大类。
1.无条件分支转移指令
无条件分支转移指令共有2条指令,B[D]和BACC[D]如表4.8所示。由于DSP的指令执行采用流水线结构,当执行到将pmad或累加器的低16位的值加载到PC上时,指令后面2个周期的指令(可以是2个单字或一个双字的指令)已加载到流水线上。指令B表示指令后面的2个周期的指令不执行,直接抛弃。指令BD表示指令后面的2个周期的指令先继续执行,然后分支转移,称为延迟(Delay)操作。指令BACC和BACCD的区别也同此。例4.1
B指令执行示例。
2.条件分支转移指令
条件分支转移指令共有2条指令,BANZ[D]和BC[D],如表4.9所示。例4.2
BANZ指令执行示例。例4.3
BC指令执行示例单条指令的条件为“与”关系,需要同时满足;若为“或”的关系,可以分成多行书写即可。如:
BCnext,AGT
BCnext,AOV;如果A>0或A溢出,就跳到next处执行其他条件执行的指令与此相同。
如果要有条件地跳过1~2字的指令,可用XC条件转移指令快速执行,格式为
XCn,cond[,cond[,cond]];n=1~2
如果后面的条件全部满足,就执行后面的n字指令,否则就执行n条NOP(空操作)。当n=1时为一个单字指令,当n=2时为两个单字或一个双字指令。
3.远分支转移指令
远分支转移指令共有2条指令,FB[D]和FBACC[D],如表4.10所示。例4.4
FB指令执行示例。例4.5
FBACC指令执行示例。4.4.3重复操作指令
1.单指令重复操作指令
单指令重复操作指令有两条指令RPT和RPTZ,可重复其后的一条指令,如表4.11所示。
重复次数由RPT或RPTZ指令放在RC寄存器里,值的范围为0~65535,实际执行次数比指令操作数多1次。RC寄存器不能对外访
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024房屋买卖合同反诉状
- 2024煤矿安全监控系统建设与维护合同
- 10 我们爱和平 第一课时 说课稿-2023-2024学年道德与法治六年级下册统编版
- 5G时代2024年电信工程合同管理策略
- 2024年雨污分流工程承包细则标准协议
- 2025年度草原畜牧业生产与市场拓展合作合同3篇
- 专业净水设备定期更新滤芯协议(2024)版B版
- 福建省南平市武夷山第三中学2020-2021学年高一数学理月考试题含解析
- 福建省南平市松溪县职业中学2021-2022学年高一数学文模拟试卷含解析
- 生活学习收获成长
- 2024-2025学年成都高新区七上数学期末考试试卷【含答案】
- 定额〔2025〕1号文-关于发布2018版电力建设工程概预算定额2024年度价格水平调整的通知
- 2025年浙江杭州市西湖区专职社区招聘85人历年高频重点提升(共500题)附带答案详解
- 《数学广角-优化》说课稿-2024-2025学年四年级上册数学人教版
- “懂你”(原题+解题+范文+话题+技巧+阅读类素材)-2025年中考语文一轮复习之写作
- 2025年景观照明项目可行性分析报告
- 一种基于STM32的智能门锁系统的设计-毕业论文
- 华为经营管理-华为经营管理华为的IPD(6版)
- 北京课改版六年级英语下册全册知识点清单汇总
- 城市供水问题与对策研究毕业论文
- 如何写好一篇中文论文
评论
0/150
提交评论