DSP学习中指令测试

来源:本站
导读:目前正在解读《DSP学习中指令测试》的相关信息,《DSP学习中指令测试》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《DSP学习中指令测试》的详细说明。
简介:本文主要介绍了DSP的控制指命令。

1.NOP 空操作,在建立流水线和执行延时的情况下有用。

2.CLRC control bit 清控制位

3.SETC control bit 置控制位

control bit可以是:C、CNF、INTM、OVM、SXM、TC、XF。

4.IDLE 等机

受INTM位的影响

PC+1 -> PC

进入空闲模式,片内内设保持激活状态

未被屏蔽中断激活(这里的屏蔽是指中断控制寄存器里的屏蔽位(0004H))

INTM=0,程序转移到它所影响的中断服务程序

INTM=1,程序返回IDLE的下一条指令继续执行。如时是不可蔽屏中断MNI或RESET,进中断服务程序。

5.BIT 位测试

BIT dma, bit code (不是# bit code)

BIT ind, bit code[, ARn]

影响TC, 数据被指定的位复制到TC,测试的位号=15 – bit code,所以要测试第6位的,那么bit code = 9。

我们可以在头文件中定义:BIT0 .set 15

BIT1 .set 14 ……

则在写BIT指令时就符合我们的习惯用法,如:BIT *, BIT0

6.BITT 按TREG进行位测试

BIT dma

BIT ind[, ARn]

参考BIT指令,相当于的TREG低四位赋值给bit code后执行。

7.LDP 装载页面指针

LDP dma

LDP ind[, ARn]

LDP #k (k如果超过9位,编译时会发出警告并丢弃高7位)

影响DP位,LST #0也可以修改DP。

8.LST 装载状态寄存器

LST #m, dma m=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 设定乘积输出方式

SPM constant(0~3) (不是# constant)

constant->PM 参考PM说明

当constant超出范围时编译时不是警告后取低两位,而是错误提示。

11.RPT 重复下一条指令

RPT dma

RPT ind[, 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 弹出堆栈至数据存储器

POPD dma

POPD ind[, ARn]

15.PSHD 数据入栈

PSHD dma

PSHD ind[, ARn]

堆栈操作和POP、PUSH一样。

分支跳转指令

1.B pma[, ind[, ARn]] 分支跳转

Pma -> PC

2.BACC 按ACC跳转

ACCL -> PC

3.BANZ pma[, ind[, ARn]] AR非零跳转

当前AR = 0, PC+2 -> PC

当前AR != 0, pma -> PC

注意:当前AR默认修改为减1;如BANZ PGM 等同于 BANZ PGM, *-。

故可以用一个AR做循环计数,

如:PGM: NOP (循环次数为当前AR值+1)

BANZ PGM

4.BCND 条件跳转

BCND pma,cond1[, cond2][, …] 如果指定条件都满足,则跳转

Cond 条件

EQ ACC=0 并不是所有的条件的组合都有意义

NEQ ACC!=0 多条件跳转时要注意冲突

LT ACC<0

LEQ ACC<=0 冲突会错误提示,如:

GT ACC>0 LT和GT

GEQ ACC>=0 UNC和所有的条件

NC C=0 EQ和NEQ 和LEQ和GEQ任意两个

C C=1 C和NC、OV和NOV、NTC和TC和BIO任意两个

NOV OV=0 (除N外,其它有字母相同的条件就冲突)

OV OV=1

BIO BIO引脚为低电平

NTC TC=0

TC TC=1

UNC 无条件

5.CC pma, cond1[, cond2][, …] 条件调用

它同BCND的区别只在于BCND不保存断点

6.CALA 根据ACC的程序调用

PC+1 -> TOS

ACCL -> PC

它同BACC的区别只在于BACC不保存断点

7.CALL pma[, ind[, ARn]] 无条件跳转

它同B的区别只在于B不保存断点

8.RET 返回

TOS -> PC

子程序和中断服务程序以RET指令结束

9.RETC 条件返回

RETC cond1[,cond2][, …]

指定条件都满足,就执行一个标准返回。

条件同BCND说明。

10.INTR 软中断

INTR k 0~31 ( 非 #k )

不受INTM和中断屏蔽位影响。

PC+1 -> TOS

K*2 -> PC

INTM=1

11.NMI 不可屏蔽中断指令

等于 INTR 18

12.TRAP 软件陷阱中断

相当于INTR 17;但不受INTM影响,也不影响INTM(唯一不置INTM的中断)。~控制指命令

1.NOP 空操作,在建立流水线和执行延时的情况下有用。

2.CLRC control bit 清控制位

3.SETC control bit 置控制位

control bit可以是:C、CNF、INTM、OVM、SXM、TC、XF。

4.IDLE 等机

受INTM位的影响

PC+1 -> PC

进入空闲模式,片内内设保持激活状态

未被屏蔽中断激活(这里的屏蔽是指中断控制寄存器里的屏蔽位(0004H))

INTM=0,程序转移到它所影响的中断服务程序

INTM=1,程序返回IDLE的下一条指令继续执行。如时是不可蔽屏中断MNI或RESET,进中断服务程序。

5.BIT 位测试

BIT dma, bit code (不是# bit code)

BIT ind, bit code[, ARn]

影响TC, 数据被指定的位复制到TC,测试的位号=15 – bit code,所以要测试第6位的,那么bit code = 9。

我们可以在头文件中定义:BIT0 .set 15

BIT1 .set 14 ……

则在写BIT指令时就符合我们的习惯用法,如:BIT *, BIT0

6.BITT 按TREG进行位测试

BIT dma

BIT ind[, ARn]

参考BIT指令,相当于的TREG低四位赋值给bit code后执行。

7.LDP 装载页面指针

LDP dma

LDP ind[, ARn]

LDP #k (k如果超过9位,编译时会发出警告并丢弃高7位)

影响DP位,LST #0也可以修改DP。

8.LST 装载状态寄存器

LST #m, dma m=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 设定乘积输出方式

SPM constant(0~3) (不是# constant)

constant->PM 参考PM说明

当constant超出范围时编译时不是警告后取低两位,而是错误提示。

11.RPT 重复下一条指令

RPT dma

RPT ind[, 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 弹出堆栈至数据存储器

POPD dma

POPD ind[, ARn]

15.PSHD 数据入栈

PSHD dma

PSHD ind[, ARn]

堆栈操作和POP、PUSH一样。

分支跳转指令

1.B pma[, ind[, ARn]] 分支跳转

Pma -> PC

2.BACC 按ACC跳转

ACCL -> PC

3.BANZ pma[, ind[, ARn]] AR非零跳转

当前AR = 0, PC+2 -> PC

当前AR != 0, pma -> PC

注意:当前AR默认修改为减1;如BANZ PGM 等同于 BANZ PGM, *-。

故可以用一个AR做循环计数,

如:PGM: NOP (循环次数为当前AR值+1)

BANZ PGM

4.BCND 条件跳转

BCND pma,cond1[, cond2][, …] 如果指定条件都满足,则跳转

Cond 条件

EQ ACC=0 并不是所有的条件的组合都有意义

NEQ ACC!=0 多条件跳转时要注意冲突

LT ACC<0

LEQ ACC<=0 冲突会错误提示,如:

GT ACC>0 LT和GT

GEQ ACC>=0 UNC和所有的条件

NC C=0 EQ和NEQ 和LEQ和GEQ任意两个

C C=1 C和NC、OV和NOV、NTC和TC和BIO任意两个

NOV OV=0 (除N外,其它有字母相同的条件就冲突)

OV OV=1

BIO BIO引脚为低电平

NTC TC=0

TC TC=1

UNC 无条件

5.CC pma, cond1[, cond2][, …] 条件调用

它同BCND的区别只在于BCND不保存断点

6.CALA 根据ACC的程序调用

PC+1 -> TOS

ACCL -> PC

它同BACC的区别只在于BACC不保存断点

7.CALL pma[, ind[, ARn]] 无条件跳转

它同B的区别只在于B不保存断点

8.RET 返回

TOS -> PC

子程序和中断服务程序以RET指令结束

9.RETC 条件返回

RETC cond1[,cond2][, …]

指定条件都满足,就执行一个标准返回。

条件同BCND说明。

10.INTR 软中断

INTR k 0~31 ( 非 #k )

不受INTM和中断屏蔽位影响。

PC+1 -> TOS

K*2 -> PC

INTM=1

11.NMI 不可屏蔽中断指令

等于 INTR 18

12.TRAP 软件陷阱中断

相当于INTR 17;但不受INTM影响,也不影响INTM(唯一不置INTM的中断)。

提醒:《DSP学习中指令测试》最后刷新时间 2024-03-14 01:10:35,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《DSP学习中指令测试》该内容的真实性请自行鉴别。