428335 DSP指令测试总结.docx
《428335 DSP指令测试总结.docx》由会员分享,可在线阅读,更多相关《428335 DSP指令测试总结.docx(27页珍藏版)》请在冰豆网上搜索。
428335DSP指令测试总结
符号说明
dma数据存储器地址的低七位(7LSB)
shift左移位数(0~15)位
shift2左移位数(0~7)位
n(x)指定下一次辅助寄存器的(0~7)位的数值
k8位短立即数
lk16位短立即数
m选择如下数据之一
0表示对ST0操作
1表示对ST1操作
PA16位的IO端口或IO映射的寄存器
pma16位的程序地地址空间
ind是一个间接寻址变量,可以把它担供如下7种符号之一:
**+*-*0+*0-*BR0+*BR0-
不变 增1 减1 加/减变址量反向进位加/减变址量
加/减变址量其实就是基址变址寻址方式,可以很方便的实现常数数组的查找。
(反向进位方式是指加或减是从最高位开始运算,并将进位或借位送给低位,此种方法特别适合于FFT运算。
后面的四种操作符都是与AR0中的内容进行加减)
ST0
ARPST0<13-15>辅助寄存器指针,加载ARP,则原ARP值送ARB.只有当执行LST#1
时,ARB与ARP加载相同的值,执行LST#0时只改变ARP,不改变ARB。
OVST0<12>溢出标志位,当OV=1时,复位,溢出条件转移指令,无溢出条件转
指令,LST指令发生时才可以被清0。
OVMST0<11>溢出方式位,OVM=0时,累加器结果正常溢出;OVM=1时,正溢出,ACC=7FFFFFFFH,负溢出,ACC=80000000H。
INTMST0<9>中断屏蔽位,INTM=0,允许响应所有的可屏蔽中断;INTM=1时则禁止。
对不可屏蔽中断 RS、NMI没有影响。
INTM不受LST指令影响。
复位时该位为1,响应可屏蔽中断时,该位被自动置1。
退出中断时是否要手动开中断?
RS中断、SETCINTM、CLRCINTM可对INTM进行设置。
DPST0<0-8>数据存储器页指针,9位的DP与一个指令的低七位一起形成一个16位的直接寻址地址。
LST、LDP可以对其修改。
ST1
ARBST1<13-15>辅助寄存器指针缓冲器,说明同ARP。
CNFST1<12>片内DARAM配置位,CNF=0,可配置的双口RAM单元区被映射到数据存储空间,CNF=1,则映射到程序存储空间。
SETCCNF、CLRCCNF、LST可对其进行修改,复位时CNF=0。
TCST1<11>测试/控制标志位,BIT、BITT、CMPR、LST、NORM影响TC位。
SXMST1<10>符号扩展位,SXM=0,抑制符号扩展;SXM=1,数据通过输入定标移位器传送到累加器时将产生符号扩展。
CLRCSXM、SETCSXM、LST#1可对其进行修改,复位时SXM为1。
CST1<9>进位位,加法时进位置1,否则清0;减法时借位清0,否则置1。
但在移16位的ADD或SUB指令时例外,其有进位或借位时结果一样,否则不影响C。
SETCC、CLRCC、LST可对其修改。
复位时C被置1。
XFST1<4>XF引脚状态位,该位决定XF引脚的状态。
SETCXF、CLRCXF、LST可对其修改。
复位时被置1。
PMST1<1:
0>乘积移位方式,当把PREG中的内容传送到CALU单元时进行移位操作,但PREG本身内容不变。
SPM、LST指令可以对其修改。
复位时清0。
00 不移
01左移1位,移去二进制补码乘法产生的额外符号位,产生Q31格式的乘积。
低位补0。
10 左移4位,移去16位×13位(常数)二进制补码乘法产生的额外符号位,产生Q31格式的乘积。
低位补0。
11 右移6位,将乘积定标,使最多作128次乘法累加不使累加器溢出,无
论ST1中SXM为何值,右移总是要进行符号扩展。
一.辅助寄存器指令。
1.MAR修改当前辅助寄存器
MARdma相当于NOP
MARind[,ARn]修改当前AR寄存器的值,[ARP->ARB,修改ARP]
影响到:
ARP、ARB任何支持间接寻址的指令都可以实现MAR的操作。
MAR*+,AR3 (ARP=0)
当前AR加1,ARB=0,ARP=3;
2.SBRK#k辅助寄存器减立即数
当前AR-k->当前AR
3.ADRK#k短立即数加至辅助寄存器
当前AR+k->当前AR
4.LAR装载辅助寄存器
LARARx,dma
LARARx,ind[,ARn]
LARARx,#k
LARARx,#lk
数据->ARx
5.SAR存辅助寄存器
SARARx,dma
SARARx,ind[,ARn]
ARx->数据
特殊用法:
与LAR一起使用,可以不通过ACC而实数据存储器间的数据交换
如:
LARAR2,20HLARAR3,30H
SARAR2,30HSARAR3,20H
6.BANZAR非零跳转
BANZpma[,ind[,ARn]](ind默认为当前AR减1)
例如:
MAR*,AR0
LARAR1,#3;循环次数=3+1
PGMADD*+,AR1
BANZPGM,AR0;循环结束后,AR1=0FFFFH
7.CMPR辅助寄存器比较
CMPRCM(不是#CM)影响TC
CM:
=0测试是否 (当前AR)=(AR0)
1<
2>
3!
=
如果条件为真,则TC=1,如果条件为假,则TC=0.
二.控制指命令
1.NOP空操作,在建立流水线和执行延时的情况下有用。
2.CLRCcontrolbit清控制位
3.SETCcontrolbit置控制位
controlbit可以是:
C、CNF、INTM、OVM、SXM、TC、XF。
4.IDLE等机
受INTM位的影响
PC+1->PC
进入空闲模式,片内内设保持激活状态
未被屏蔽中断激活 (这里的屏蔽是指中断控制寄存器里的屏蔽位(0004H))
INTM=0,程序转移到它所影响的中断服务程序
INTM=1,程序返回IDLE的下一条指令继续执行。
如时是不可蔽屏中断MNI或RESET,进中断服务程序。
5.BIT位测试
BITdma,bitcode(不是#bitcode)
BITind,bitcode[,ARn]
影响TC,数据被指定的位复制到TC,测试的位号=15–bitcode,所以要测试第6位的,那么bitcode=9。
我们可以在头文件中定义:
BIT0.set15
BIT1.set14……
则在写BIT指令时就符合我们的习惯用法,如:
BIT*,BIT0
6.BITT按TREG进行位测试
BITTdma
BITTind[,ARn]
参考BIT指令,相当于的TREG低四位赋值给bitcode后执行。
7.LDP装载页面指针
LDPdma
LDPind[,ARn]
LDP#k(k如果超过9位,编译时会发出警告并丢弃高7位)
影响DP位,LST#0也可以修改DP。
8.LST装载状态寄存器
LST#m,dmam=0加载到ST0,m=1加载到ST1
LST#m,ind[,ARn]
影响ST0、ST1中除INTM外所有的标志位
指令可用来中断或程序调用后来恢复状态寄存器
LST#0改变ST0的ARP,ST1的ARB不受影响(原本是ARP改变时,原ARP值存入ARB)
LST#m,ind,ARn对ARP、ARB的影响同上,但乎略了ARn的影响。
原指令等同于LST#m,ind(不写ARn可读性更好),即对ARP、ARB的影响来自间接寻址的数据。
状态寄存器的保留位总是读1,写操作对这些位无影响。
测试时数据一直不对,原来是间接寻址时,误认为是把当前AR的值装入STm,其实当前AR的值只是一个地址,装入的是AR值所指向的地址单元。
修改程序后结果正确。
9.SST保存状态寄存器
SST#m,dma不论DP为何值,直接寻址总是保存在第0页
SST#m,ind[,ARn]
10.SPM设定乘积输出方式
SPMconstant(0~3)(不是#constant)
constant->PM参考PM说明
当constant超出范围时编译时不是警告后取低两位,而是错误提示。
11.RPT重复下一条指令
RPTdma
RPTind[,ARn]
RPT#k
重复执行下条指令N次,N为RPTC(16位重复计数器)的初始值加1。
在上下文转换时不能保存PRTC,PRTC被清0。
器件复位PRTC清0。
重复循环可看作是可中断多期指令。
对于块移动,相乘/累加和规格化等操作,RPT特别有用。
重复指令本身不能被重复。
如:
RPT#1
RPT#3
编译可以通过,但运行时执行第二条RPT后,RPTC!
=3,PRTC=0。
12.POP弹出栈至累加器
TOP(堆栈顶)->ACC(硬件堆栈是FIFO的8个单元)
堆栈中的每个值都复制到地址加1的堆栈单元。
要注意没有检查下溢的方法。
13.PUSH累加器低位入栈
ACC->TOP
堆栈中的每个值者复制到地址减一单元,最后一个数据丢失。
14.POPD弹出堆栈至数据存储器
POPDdma
POPDind[,ARn]
15.PSHD数据入栈
PSHDdma
PSHDind[,ARn]
堆栈操作和POP、PUSH一样。
三.分支跳转指令
1.Bpma[,ind[,ARn]]分支跳转
Pma->PC
2.BACC按ACC跳转
ACCL->PC
3.BANZpma[,ind[,ARn]]AR非零跳转
当前AR=0,PC+2->PC
当前AR!
=0,pma->PC
注意:
当前AR默认修改为减1;如BANZPGM等同于BANZPGM,*- 。
故可以用一个AR做循环计数,
如:
PGM:
NOP(循环次数为当前AR值+1)
BANZPGM
4.BCND条件跳转
BCNDpma,cond1[,cond2][,…] 如果指定条件都满足,则跳转
Cond条件
EQACC=0并不是所有的条件的组合都有意义
NEQACC!
=0多条件跳转时要注意冲突
LTACC<0
LEQACC<=0冲突会错误提示,如:
GTACC>0LT和GT
GEQACC>=0UNC和所有的条件
NCC=0EQ和NEQ和LEQ和GEQ任意两个
CC=1C和NC、OV和NOV、NTC和TC和BIO任意两个
NOVOV=0(除N外,其它有字母相同的条件就冲突)
OVOV=1
BIOBIO引脚为低电平
NTCTC=0
TCTC=1
UNC无条件
5.CCpma,cond1[,cond2][,…]条件调用
它同BCND的区别只在于BCND不保存断点
6.CALA根据ACC的程序调用
PC+1->TOS
ACCL->PC
它同BACC的区别只在于BACC不保存断点
7.CALLpma[,ind[,ARn]]无条件跳转
它同B的区别只在于B不保存断点
8.RET返回
TOS->PC
子程序和中断服务程序以RET指令结束
复位中断将不用返回,直接跳转到程序的开始地址里。
9.RETC条件返回
RETCcond1[,cond2][,…]
指定条件都满足,就执行一个标准返回。
条件同BCND说明。
10.INTR软中断
INTRk0~31(非#k)
不受INTM和中断屏蔽位影响。
PC+1->TOS
K*2->PC
INTM=1
11.NMI不可屏蔽中断指令
等于INTR18
程序的非法地址访问也会导致NMI中断。
12.TRAP软件陷阱中断
相当于INTR17;但不受INTM影响,也不影响INTM(唯一不置INTM的中断)。
2008-3-1
四.I/O和存储器命令
1.BLDD数据存储空间的块传送
BLDD#lk(源),dma(目标)(长立即数#lk表示的是源地址或目标地址)
BLDD#lk,ind[,ARn]
BLDDdma,#lk
BLDDind,#lk[,ARn]
一般与RPT指令一起使用。
如果没有加RPT指令,则仅仅是单条数据传送。
一旦RPT流水线被启动,BLDD就变成了单周期指令,即在单步运行时一步就可以实现块传送。
PC+1->MSTACK(微堆栈)
Lk->PC
(源)->目的
[修改当前AR和ARP](循环复制时,对ARP的修改相同,故可以认为是不再修改)
PC+1->PC(即地址自加1)
RPTC!
=0
(源)->目的
RPTC-1->RPTC
PC+1->PC
MSTACK->PC
RPT#15
BLDD*+,#lk,AR1(ARP=0)
指令执行时,AR0中地址对应的数据复制一个到目标地址,其它的数据源数据地址由AR1提供。
2.BLPD程序至数据区的块传送
BLPD#pma,dma
BLPD#pma,ind[,ARn]
除数据源数据地址为程序存储空间地址外,其它操作和BLDD一样。
LDP#12H
RPT#0FH
BLPD#8043H,40H
RPT#0FH
BLPD#start,*+
间接寻址的可以实现块传送,直接寻址的只改变块的第一个值,而且还是错误的,其它值不变,为什么?
RPT#0FH时,960H地址的值为地址(8043H+0FH)的值,
RPT#7时,值为地址(8043H+7)的值
原来是程序到数据的块移动,因为是直接寻址,其地址不变,故只保存最后一次的值。
即块移动直接寻址地址不自加,所以也没有跨段传送的问题。
BLDD也一样。
3.DMOV片内数据传送
DMOVdma
DMOVind[,ARn]
指令将数据存储地址的内容复制到该地址加1的单元,复制后原来的地址内容保持不变。
DMOV指令只能用于片内被配置为数据空间的RAM块,可跨边界移动。
不能用于外部数据存储器。
如果指定外部存储地址,DMOV指令读取指定的存储单元但不进行其他操作。
(2406无外部存储器扩展)
数据移动功能对于实现数字信号处理中的1/Z延时非常有用。
(不懂)
与RPT一起使用可以达到单周期初始化存储器的效果。
如:
RPT#0FFH
DMOV*+
程序存储空间的8000H~87FFH与数据存储空间的800H~FFFH映射的是同一个SARAM,在仿真时,没有设置DON与PON,不管CMD文件把SARAM映射到什么空间,程序LOAD到8000H开始的区域,DMOV也可以在数据空间的SARAM里进行数据传送,改变程序空间的值。
如果DON与PON设置后是否就有没这个问题了?
2008-3-7
没有设置DON、PON,其默认都为1,即SARAM同时被映射到片内程序和数据空间。
当设置好后,如PON=1,DON=0,则在数据空间里就无法改变SARAM中的值了。
其读值全为0。
2008-3-3
4.IN输入
INdma,PA
INind,PA[,ARn]PA:
I/O空间地址
IN指令从I/O单元读入16位的值,将其送到指定的数据存储单元。
IS引脚变成低电平(IS引脚一般做为外部器件的片选线)。
与RPT一起使用,可以从I/O空间读入连续的字并送到数据空间。
PA是否和BLDD、BLPD一样,在RPT循环里执行一次操作可自加1?
否则如何可实现连续读连续写?
5.OUT输入
OUTdma,PA
OUTind,PA[,ARn]
OUT对I/O端口写数据,其它同IN操作。
IN、OUT未测试,有没扩展,不知如何测试?
6.SPLK存长立即数到数据存储区
SPLK#lk,dma
SPLK#lk,ind[,ARn]
指令把16位立即数写到任何数据存储器单元。
与RPT指令一起使用没有作用。
用来设置外设寄存器很方便。
7.TBLR读表
TBLRdma
TBLRind[,ARn]
把程序存储单元中的一个字传送到数据存储单元。
PC+1->MSTACKACC(15:
0)->PC
(pma)->数据存储器地址 间接寻址还按指定修改当前AR与ARP
PC+1->PC
RPTC!
=0
(pma)->数据存储器地址
间接寻址还按指定修改当前AR与ARP
PC+1->PC
MSTACK->PC
如果是重复的直接址,则只有最后一个数据没有被覆盖。
8.TBLW写表
TBLWdma
TBLWind[,ARn]
把数据存储单元的一个字传送到程序存储单元。
其它操作同TBLR。
程序存储单元如果被指定为ROM区会如何?
参考TBLR,除了重复的直接寻址,则是用同数据写入到几个单元。
五.累加器算术、逻辑命令
1.LACC左移后装载累加器
LACCdma[,shift]
LACCdma,16
LACCind[,shift[,ARn]]
LACCind,16[,ARn]
LACC#lk
受SXM影响;当SXM=1时,是先扩展后再移位。
如LACC#8123H,4ACC=0FFF81230H而非00081230H
如LACC#7841H,4ACC=00078410H而非0FFFF8410H
2.LACT按TREG规定的移位装载累加器
LACTdma
LACTind[,ARn]
参考LACC,只是用TREG的低四位来替代LACC中的shift。
3.LACL装载累加器低位并清高位
LACLdma
LACLind[,ARn]
LACL#k8位短立即数
数据->ACC(15:
0)0000H->ACC(31:
16)
指令描述是:
加载的数据被看作无符号数,而不是作为2的补码数。
且指令不受SXM影响。
但实测结果指令受SXM影响。
并且K可以是16位立即数。
LACL#1234HACC=00001234H
LACL#0f1ffhSXM=1ACC=0FFFFF1FFH;SXM=0ACC=0000F1FFH
LACL#0ffhACC=000000FFH
4.ZALR清累加器低位且装载累加器高位
ZALRdma
ZALRind[,ARn]
PC+1->PC数据->ACC(31:
16)
8000H->ACC(15:
0)对数据进行圆整(什么是圆整?
)
5.SACL存累加器高位
SACLdma[,shift2]
SACLind[,shift2[,ARn]]
将整个32位左移shift2位后,再将移位后数值高16位复制到数据存储单元。
移位时低位补0,高位丢失,累加器本身保持不变。
6.SACH存累加器低位
SACHdma[,shift2]
SACHind[,shift2[,ARN]]
参考SACL。
7.ABS取绝对值
受OVM影响影响:
C、OV(C总是为0)
ACC>=0,其内容不变
ACC<0,其内容取绝对值
ACC=80000000HOVM=0执行后ACC=80000000HOV=1
OVM=1执行后ACC=7FFFFFFFHOV=1
8.CMPL累加器取反
9.NEG累加器求负
受影响:
OVM影响到:
C、OV
ACC*(-1)->ACC
ACC=0时,C=1;ACC!
=0时,C=0。
ACC=80000000H参考ABS。
10.AND逻辑与(等同于C中的&,而非&&)
ANDdma
ANDind[,ARn]
AND#lk[,shift]
AND#lk,16
没被移位填满的高位和低位均填0,移位结果和累加器的内容逻辑与。
11.OR逻辑或(等同于C中的|,而非||)
语法同AND
没被移位填满的高位和低位均填0,移位结果和累加器的内容逻辑或。
12.XOR异或
语法同AND
没被移位填满的高位和低位均填0,移位结果和累加器的内容逻辑异或。
13.ROL累加器循环左移
ACC(31)->CACC(30:
0)->ACC(31:
1)C->ACC(0)
所有的移位指令都可以与RPT指令一起使用,实现多位移动。
14.ROR累加器循环右移
ACC(0)->CACC(31:
1)->ACC(30:
0)C->ACC(31)
15.SFL累加器逻辑左移
ACC(31)->CACC(30:
0)->ACC(31:
1)0->ACC(0)
左移指令的逻辑左移与算术左移的结果是一样,不受SXM影响。
16.SFR累加器右移
当SXM=0时,相当于逻辑右移
ACC(0)->CACC(31:
1)->ACC(30:
0)0->ACC(31)
当SXM=1时,相当于算术左移
ACC(0)->CACC(31:
1)->ACC(30:
0)ACC(31)->ACC(31)
17.ADD加至累加器
ADDdma[,shift]
ADDdma,16
ADDind[,shift[,ARn]]
ADDind,16[,ARn]
ADD#k
ADD#lk[,shift]两个立即数的区别就是指令的长度,如果用短立即数又移位的
话,指令长度就两个字。
如ADD#1占一字,ADD#1,1就占两字空间。
除了短立即数寻址只受OVM影响,其它都受SXM、OVM影响。
用8位短立即数,是不可重复的,什么是可重复?
影响C和OV
一般情况下,相加结果产生进位C=1,否则C=0。
当左移16位时,相加结果产生进位C=1,否则C不改变。
1