428335DSP指令测试总结精.docx

上传人:b****7 文档编号:25036294 上传时间:2023-06-04 格式:DOCX 页数:26 大小:27.02KB
下载 相关 举报
428335DSP指令测试总结精.docx_第1页
第1页 / 共26页
428335DSP指令测试总结精.docx_第2页
第2页 / 共26页
428335DSP指令测试总结精.docx_第3页
第3页 / 共26页
428335DSP指令测试总结精.docx_第4页
第4页 / 共26页
428335DSP指令测试总结精.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

428335DSP指令测试总结精.docx

《428335DSP指令测试总结精.docx》由会员分享,可在线阅读,更多相关《428335DSP指令测试总结精.docx(26页珍藏版)》请在冰豆网上搜索。

428335DSP指令测试总结精.docx

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:

00000H->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:

1C->ACC(0

所有的移位指令都可以与RPT指令一起使用,实现多位移动。

14.ROR累加器循环右移

ACC(0->CACC(31:

1->ACC(30:

0C->ACC(31

15.SFL累加器逻辑左移

ACC(31->CACC(30:

0->ACC(31:

10->ACC(0

左移指令的逻辑左移与算术左移的结果是一样,不受SXM影响。

16.SFR累加器右移

当SXM=0时,相当于逻辑右移

ACC(0->CACC(31:

1->ACC(30:

00->ACC(31

当SXM=1时,相当于算术左移

ACC(0->CACC(31:

1->ACC(30:

0ACC(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不改变。

18.SUB从累加器减

参考ADD,有借位时C=0,否则C=1。

当左移16位时,有借位C=0,否则C不改变。

19.ADDC带进位加至累加器

ADDCdma

ADDCind[,ARn]

受OVM影响,影响C和OV,不受SXM影响。

数据+ACC+C->ACC

相加结果产生进位,C=1;否则C=0。

ADDC指令可用来实现多精度运算。

20.SUBB带借位从累加器减

参考ADDC。

ACC–数据-!

C->ACC

21.ADDS抑制符号扩展累加

ADDSdma

ADDSind[,ARn]

同SXM=0,移位数为0的ADD指令,或C=0的ADDC指令的效果。

22.SUBS抑制符号扩展累加

参考ADDS。

23.ADDT按TREG移位加

ADDTdma

ADDTind[,ARn]

受SXM、OVM影响;影响到C、OV。

等效于ADDdma,shift和ADDind[,shift[,ARn]]其中shift=TREG低4位。

24.SUBT按TREG规定的移位进行减法

参考ADDT。

25.SUBC条件减

SUBCdma

SUBCind[

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 幼儿教育 > 家庭教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1