? 2011 Microchip Technology Inc.DS70049D_CN 第 2-1页
CPU
2
第2章 CPU
目录
本章包括下列主题:2.1简介 ...............................................................................................................................2-22.2编程模型 ........................................................................................................................2-42.3软件堆栈指针 ................................................................................................................2-82.4CPU 寄存器描述 .........................................................................................................2-112.5算术逻辑单元(ALU ) ................................................................................................2-172.6DSP 引擎 ....................................................................................................................2-182.7除法支持 ......................................................................................................................2-272.8指令流类型 ..................................................................................................................2-272.9循环结构 ......................................................................................................................2-302.10地址寄存器相依性 .......................................................................................................2-352.11寄存器映射 ..................................................................................................................2-382.12相关应用笔记 ..............................................................................................................2-412.13
版本历史 ......................................................................................................................2-42
dsPIC30F系列参考手册
2.1简介
dsPIC30F CPU模块采用16位(数据)改良的哈佛架构,并带有增强型指令集,包含对DSP的
有力支持。 CPU拥有24位指令字,指令字带有长度可变的操作码字段。程序计数器(PC)为
24位宽,可以寻址最大4M × 24位的用户程序存储器空间。单周期指令预取机制用来帮助维持
吞吐量并提供可预测的执行。除了改变程序流的指令、双字传送(MOV.D)指令和表指令以外,
所有指令都在单个周期内执行。使用DO和REPEAT指令支持无开销的程序循环结构,这两个指
令在任何时候都可被中断。
dsPIC30F器件在编程模型中有16个16位工作寄存器。每个工作寄存器都可以充当数据、地址
或地址偏移寄存器。第16个工作寄存器(W15)作为软件堆栈的指针,用于中断和调用。
dsPIC30F指令集有两类指令:MCU类指令和DSP类指令。这两类指令无缝地集成到架构中并
从同一个执行单元执行。指令集包括很多寻址模式,指令的设置可使C编译器的效率达到最优。
数据空间可以作为32K字或64K字节寻址,并被分成两块,称为X和Y数据存储器。每个存储
器块有各自独立的地址发生单元(Address Generation Unit,AGU)。 MCU类指令只通过X存
储器AGU进行操作,可将整个存储器映射空间作为一个线性数据空间访问。某些DSP指令通过
X和Y的AGU进行操作以支持双操作数读操作,这将数据地址空间分成两个部分。X和Y数据
空间的边界视具体器件而定。
可以选择将数据空间存储器映射空间的高32 KB映射到由8位程序空间可视性页(Program Space
Visibility Page,PSVPAG)寄存器定义的任何16K程序字边界内的程序空间内。程序空间到数
据空间的映射功能让任何指令都能像访问数据空间一样访问程序空间。另外,在带有外部总线的
器件上可将RAM连接到程序存储器总线用来扩展内部数据RAM。
X和Y寻址空间都支持无开销循环缓冲区(模寻址)。模寻址省去了DSP算法的软件边界检查
开销。此外,X AGU的循环寻址可以与任何MCU类指令一起使用。 X AGU还支持位反转寻址,
大幅简化了基2(Radix-2) FFT算法对输入或输出数据的重新排序。
CPU支持固有(无操作数)、相对、立即数、存储器直接、寄存器直接和寄存器间接寻址模式。
每条指令根据其功能要求,与一个预定义的寻址模式组相关。每条指令最多支持6种寻址模式。
对于大多数指令,在每个指令周期dsPIC30F能执行一次数据(或程序数据)存储器读操作、一
次工作寄存器(数据)读操作、一次数据存储器写操作和一次程序(指令)存储器读操作。因此
可以支持3个操作数的指令,使A + B = C操作能在单周期内执行。
DSP引擎具备一个高速17位×17位乘法器、一个40位ALU、两个40位饱和累加器和一个40
位双向桶形移位寄存器。该桶形移位寄存器在单个周期内至多可将一个40位的值右移15位或左
移16位。 DSP指令可以无缝地与所有其他指令一起操作,其设计可实现最佳的实时性能。 MAC
指令和其他相关指令可以同时从存储器中取出两个数据操作数并将两个W寄存器相乘。这要求数
据空间对于这些指令拆分为两块,但对所有其他指令保持线性。这是通过为每个地址空间指定某
些工作寄存器,以透明和灵活的方式实现的。
dsPIC30F具有向量异常(Exception)机制,带有多达8个不可屏蔽陷阱源和54个中断源。可
以为每个中断源分配7个优先级之一。
DS70049D_CN第 2-2页? 2011 Microchip Technology Inc.
? 2011 Microchip Technology Inc.DS70049D_CN 第2-3页
第2章 CPU
CPU
2
图2-1中所示为CPU 的框图。
图2-1:
dsPIC30F CPU 内核框图
上电延时定时器振荡器起振定时器POR/BOR 复位
看门狗定时器指令译码和控制
OSC1/CLKI
MCLR
V DD ,V SS 低压检测
UART1, CAN2
时序发生器
CAN1,16
PCH PCL 16
中g 程序计数器
16位ALU
24
24
24
24X 数据总线
I R
I 2C?
DCI
PCU 10位或 定时器
输入 输出
16
16 16 16×16
W 寄存器阵列
除法e
支持
e 引擎
DSP R O M 锁存器
16
Y 数据总线
E A 多路开关
X RAGU X WAGU
Y AGU
AV DD ,AV SS
UART2
SPI2 16
16
16
16
1616
16
16168中断控制器
e PSV 和表e 数据访问g 堆栈
中循环数据锁存器数据锁存器Y 数据g (4 KB )RAM X 数据g (4 KB )RAM 中地址锁存器
中地址锁存器
控制信号输入到不同模块16
SPI1,地址锁存器程序存储器(144 KB )数据锁存器
数据EEPROM (4 KB )I/O 端口
16
16
16
X 地址总线
Y 地址总线
16
立即数数据
12位ADC
f 控制模块
逻辑电路逻辑电路
g 控制控制捕捉模块比较模块
dsPIC30F系列参考手册
2.2编程模型
图2-2中所示为dsPIC30F的编程模型。编程模型中的所有寄存器都是存储器映射的,并且可以
由指令直接控制。表2-1中提供了对各个寄存器的描述。
表2-1:编程模型的寄存器描述
寄存器名称描述
W0到W15工作寄存器阵列
ACCA和ACCB40位DSP累加器
PC23位程序计数器
SR ALU和DSP引擎状态寄存器
SPLIM堆栈指针极限值寄存器
TBLPAG表存储器页地址寄存器
PSVPAG程序空间可视性页地址寄存器
RCOUNT REPEAT循环计数寄存器
DCOUNT DO循环计数寄存器
DOSTART DO循环起始地址寄存器
DOEND DO循环结束地址寄存器
CORCON包含DSP引擎和DO循环控制位
除了编程模型中包含的寄存器之外,dsPIC30F还包含模寻址、位反转寻址和中断控制寄存器。
这些寄存器将在本文档随后的章节中介绍。
与编程模型有关的所有寄存器都是存储器映射的,如表2-8中所示。
DS70049D_CN第 2-4页? 2011 Microchip Technology Inc.
? 2011 Microchip Technology Inc.DS70049D_CN 第2-5页
第2章 CPU
CPU
2
dsPIC30F系列参考手册
2.2.1工作寄存器阵列
16个工作寄存器(W)可以作为数据、地址或地址偏移寄存器。 W寄存器的功能由访问它的指
令的寻址模式决定。
dsPIC30F指令集可被分成两种指令类型:寄存器和文件寄存器指令。寄存器指令可以把每个W
寄存器用作数据值或地址偏移量。例如:
MOV W0,W1; move contents of W0 to W1
MOV W0,[W1]; move W0 to address contained in W1
ADD W0,[W4],W5; add contents of W0 to contents pointed
; to by W4. Place result in W5.
2.2.1.1W0和文件寄存器指令
W0是一个特殊的工作寄存器,因为它是可在文件寄存器指令中使用的惟一的工作寄存器。文件
寄存器指令对在指令操作码和W0中包含的指定的存储器地址进行操作。在文件寄存器指令中,
W1到W15不可被指定为目标寄存器。
文件寄存器指令与只有一个W寄存器的现有PIC?器件向后兼容。在汇编器语法中使用标号
“WREG”来表示文件寄存器指令中的W0。例如:
MOV WREG,0x0100; move contents of W0 to address 0x0100
ADD0x0100,WREG; add W0 to address 0x0100, store in W0
注:关于寻址模式和指令语法的完整说明,请参见《16位MCU和DSC程序员参考手
册》(DS70157E_ CN)。
2.2.1.2W寄存器存储器映射
因为W寄存器是存储器映射的,所以在文件寄存器指令中访问W寄存器是可能的,示例如下:MOV0x0004, W10; equivalent to MOV W2, W10
其中0x0004是W2存储器中的地址。
此外,执行一条试图将W寄存器用作地址指针和操作数目标的指令也是可能的。例如:
MOV W1,[W2++]
其中:
W1 = 0x1234
W2 = 0x0004;[W2] addresses W2
在上面的示例中,W2的内容是0x0004。因为W2被用作地址指针,它指向存储器中的单元
0x0004。W2也映射到存储器中的该地址空间。虽然这是不太可能发生的事件,但不到运行时不
可能检测到。 dsPIC30F确保数据写操作将占据主导,使上面示例中W2 的结果为 0x1234。
2.2.1.3W寄存器和字节模式指令
把W寄存器阵列当作目标寄存器的字节指令只影响目标寄存器的最低有效字节。因为工作寄存器
是存储器映射的,所以可以通过对数据存储器空间进行字节宽度的访问来控制工作寄存器的最低
和最高有效字节。
2.2.2影子寄存器
如图2-2中所示,在编程模型中的许多寄存器都有相关的影子寄存器。影子寄存器都不能直接访
问。有两种类型的影子寄存器:一类被PUSH.S和POP.S指令使用,另一类被DO指令使用。DS70049D_CN第 2-6页? 2011 Microchip Technology Inc.
? 2011 Microchip Technology Inc.DS70049D_CN 第2-7页
第2章 CPU
CPU
2
2.2.2.1
PUSH.S 和POP .S 影子寄存器
在执行函数调用或中断服务程序(Interrupt Service Routine ,ISR )时,PUSH.S 和POP.S 指令可用于快速的现场保存/恢复。 PUSH.S 指令会将下列寄存器的值传输到它们各自的影子寄存器:? W0……W3
? SR (仅N 、OV 、Z 、C 和DC 位)
POP.S 指令会将值从影子寄存器恢复到这些寄存器单元。 下面是使用PUSH.S 和POP.S 指令的代码示例:MyFunction:
PUSH.S ; Save W registers, MCU status MOV #0x03,W0; load a literal value into W0ADD RAM100; add W0 to contents of RAM100BTSC SR,#Z ; is the result 0?BSET Flags,#IsZero ; Yes, set a flag POP.S ; Restore W regs, MCU status RETURN
PUSH.S 指令会改写先前保存在影子寄存器中的内容。 影子寄存器深度只有一级,所以如果多个软件任务使用影子寄存器,必须小心。 用户必须确保使任何使用影子寄存器的任务均不会被同样使用该影子寄存器且具有较高优先级的任务中断。 如果允许较高优先级的任务中断较低优先级的任务,较低优先级任务保存在影子寄存器中的内容将被较高优先级任务改写。
2.2.2.2
DO 循环影子寄存器
当执行DO 指令时,下列寄存器的内容将自动保存在影子寄存器中。? DOSTART ? DOEND ? DCOUNT
DO 影子寄存器的深度为一级,允许两个循环自动嵌套。 更多详细信息,请参见第2.9.2.2节“DO 循环嵌套”。
2.2.3未初始化的W 寄存器的复位
W 寄存器阵列(除W15之外)在发生所有复位时被清零,并且在被写入前视为未经初始化。 试图把未初始化的寄存器用作地址指针将会复位器件。
必须执行字写操作来初始化W 寄存器。 字节写操作不会影响初始化检测逻辑。
dsPIC30F 系列参考手册
DS70049D_CN 第 2-8页? 2011 Microchip Technology Inc.
2.3
软件堆栈指针
W15作为专用的软件堆栈指针并被异常处理、子程序调用和返回自动修改。 但是,W15可以被任何指令以与所有其他W 寄存器相同的方式引用。 这样就简化了对堆栈指针的读、写和控制(例如,创建堆栈帧)。所有复位均将W15初始化为0x0800。 此地址确保在所有dsPIC30F 器件中,堆栈指针(SP )将指向有效的RAM 并允许在SP 被用户软件初始化前发生的不可屏蔽异常陷阱使用堆栈。 在初始化期间,用户可以将SP 重新编程以指向数据空间内的任何单元。
堆栈指针总是指向第一个可用的空字并从低地址到高地址填充软件堆栈。 堆栈出栈(读)时,堆栈指针先递减;堆栈进栈(写)时,堆栈指针后递增,如图2-3所示。 当PC 压入堆栈时,PC<15:0>被压入第一个可用的堆栈字,然后PC<22:16>被压入第二个可用的堆栈单元。 对于任何CALL 指令执行期间的PC 进栈,进栈前PC 的MSB 是以零扩展的,如图2-3所示。异常处理期间,PC 的MSB 与CPU 状态寄存器SR 的低8位相连。这样就使SRL 的内容在中断处理期间能被自动保存。图2-3:
CALL 指令的堆栈操作注:
为了防止偏离的堆栈访问,W15<0>被硬件固定为0。
<空字>
PC<15:0>
PC<22:16>
15
W15(CALL 之前)W15(CALL 之后)
堆栈往B'000000000'CALL SUBR
高地址递增
? 2011 Microchip Technology Inc.DS70049D_CN 第2-9页
第2章 CPU
CPU
2
2.3.1
软件堆栈示例
使用PUSH 和POP 指令可控制软件堆栈。 PUSH 和POP 指令相当于将W15用作目标指针的MOV 指令。 例如,要把W0的内容压入堆栈,可通过:
PUSH W0
此语法相当于:
MOV W0,[W15++]
要把栈顶的内容返回W0,可通过:
POP W0
此语法相当于:
MOV [--W15],W0
图2-4到图2-7给出了如何使用软件堆栈的示例。图2-4所示为器件初始化时的软件堆栈。W15已经初始化为0x0800。 此外,此示例假设0x5A5A 和0x3636这两个值已被分别写入W0和W1。图2-5中堆栈第一次进栈,W0中包含的值被复制到堆栈中。 W15自动更新以指向下一个可用的堆栈单元(0x0802)。 在图2-6中,W1的内容被压入堆栈。 图2-7中,堆栈出栈并且栈顶值(先前从W1压入)被写入W3。 图2-4:
器件复位时的堆栈指针
图2-5:
第一次执行PUSH 指令后的堆栈指针
图2-6:
第二次执行PUSH 指令后的堆栈指针
0x0000
0xFFFE
0x0800
W15
W15 = 0x0800
W0 = 0x5A5A W1 = 0x3636
0x0000
0xFFFE
0x5A5A
W15 = 0x0802W0 = 0x5A5A W1 = 0x3636
0x0800PUSH W0
0x0802
W15
0x0000
0xFFFE
0x5A5A 0x3636
W15 = 0x0804W0 = 0x5A5A W1 = 0x3636
0x0800PUSH W1
0x08020x0804W15
dsPIC30F 系列参考手册
DS70049D_CN 第 2-10页? 2011 Microchip Technology Inc.
图2-7:
执行一条POP 指令后的堆栈指针
2.3.2W14软件堆栈帧指针
帧是堆栈中用户定义的存储器段,供单个子程序使用。 W14是特殊工作寄存器,因为通过使用LNK (link ,连接)和ULNK (unlink ,不连接)指令可以把它用作堆栈帧指针。 当不用作帧指针时,W14可被指令当作普通的工作寄存器使用。
若要获取将W14用作堆栈帧指针的软件示例,请参见《16位MCU 和DSC 程序员参考手册》 (DS70157E_ CN )。
2.3.3堆栈指针上溢
有一个与堆栈指针相关的堆栈极限寄存器(SPLIM ),复位时为0x0000。 SPLIM 是一个16位寄存器,但是SPLIM<0>被固定为0,因为所有的堆栈操作必须字对齐。
直到一个字写入SPLIM 后才使能堆栈上溢检查,在此之后,只能通过器件复位禁止堆栈上溢检查。 所有将W15用作源或目标寄存器而产生的有效地址将与SPLIM 中的值作比较。 如果堆栈指针(W15)的内容比SPLIM 寄存器的内容大2,并且执行了进栈操作,将不会产生堆栈错误陷阱(Stack Error Trap ) 。 堆栈错误陷阱将在随后的进栈操作时产生。 所以,例如,如果想要在堆栈指针递增超出RAM 中的地址0x2000时,引起堆栈错误陷阱,可将SPLIM 初始化为0x1FFE 。如果已经使能了堆栈上溢检查,则当W15有效地址计算越过了数据空间的末尾(0xFFFF )时,也将产生堆栈错误陷阱。更多有关堆栈错误陷阱的信息,请参见第6章“中断”(DS70053)。
2.3.4堆栈指针下溢
发生复位时,堆栈初始化为0x0800。 如果堆栈指针地址小于0x0800,堆栈错误陷阱将会产生。0x0000
0xFFFE
0x05A5A 0x03636
0x3636 → W3
W15 = 0x0802POP W3
0x0802
0x0800W15
注:
堆栈错误陷阱可以由任何使用W15寄存器的内容来产生有效地址(Effective Address ,
EA )的指令引起。 所以,如果W15的内容比SPLIM 寄存器的内容大2,并且执行了一条CALL 指令或发生了中断,那么将产生堆栈错误陷阱。
注:
对堆栈指针极限寄存器SPLIM 的写操作后面不应紧跟一个使用W15的间接读操作。
注:
一般而言,数据空间中0x0000和0x07FF 之间的单元预留给内核和外设的特殊功能寄
存器。
? 2011 Microchip Technology Inc.DS70049D_CN 第2-11页
第2章 CPU
CPU
2
2.4CPU 寄存器描述2.4.1
SR :CPU 状态寄存器
dsPIC30F 的CPU 有一个16位状态寄存器(SR ),它的低字节称为低状态寄存器(Lower Status Register ,SRL )。 SR 的高字节称为SRH 。 寄存器2-1中给出了对SR 的详细描述。SRL 包含了所有的MCU ALU 操作状态标志,加上CPU 中断优先级状态位IPL<2:0>和REPEAT 循环有效状态位RA (SR<4>)。异常处理期间,SRL 与PC 的MSB 相连形成一个完整的字值,然后将该字值压入堆栈。
SRH 包含DSP 加法器/减法器状态位、DO 循环有效位DA (SR<9>)和辅助进位标志位DC (SR<8>)。 SR 位可读/写,但以下各位例外:1.DA 位(SR<8>):DA 是只读位。2.RA 位(SR<4>):RA 是只读位。
3.OA 、OB (SR<15:14>)和OAB (SR<11>)位:这些位是只读位而且只能被DSP 引擎硬件修改。
4.
SA 、SB (SR<13:12>)和SAB (SR<10>)位:这些位是只读只清零的,而且只能通过DSP 引擎硬件置1。 一旦被置1,它们就保持置1状态直到被用户清零,与任何随后的DSP 操作的结果无关。2.4.2CORCON :内核控制寄存器
CORCON 寄存器包含控制DSP 乘法器和DO 循环硬件操作的位。 CORCON 寄存器还包含IPL3状态位,它与IPL<2:0>(SR<7:5>)相连形成CPU 中断优先级。
注:
清零SAB 位的同时将清零SA 和SB 位。
注:
请参见《16位MCU 和DSC 程序员参考手册》(DS70157E_ CN )中提供了对受各条指令影响的SR 位的描述。
dsPIC30F系列参考手册
寄存器2-1:SR:CPU状态寄存器
高字节:
R-0R-0R/C-0R/C-0R-0R/C-0R-0R/W-0
OA OB SA SB OAB SAB DA DC
bit 15bit 8
低字节:(SRL)
R/W-0(2)R/W-0(2)R/W-0(2)R-0R/W-0R/W-0R/W-0R/W-0
IPL<2:0>RA N OV Z C bit 7bit 0
bit 15OA:累加器A溢出状态位
1=累加器A已溢出
0=累加器A未溢出
bit 14OB:累加器B溢出状态位
1= 累加器B已溢出
0 = 累加器B未溢出
bit 13SA:累加器A饱和“粘着”(Sticky)状态位
1= 累加器A饱和或在某时已经饱和
0 = 累加器A未饱和
注:此位可读或被清零(不能置1)。
bit 12SB:累加器B饱和“粘着”状态位
1=累加器B饱和或在某时已经饱和
0= 累加器B未饱和
注:此位可读或被清零(不能置1)。
bit 11OAB:OA || OB组合的累加器溢出状态位
1= 累加器A或B已溢出
0 = 累加器A和B未溢出
bit 10SAB:SA || SB组合的累加器“粘着”状态位
1= 累加器A或B饱和或在过去某时已经饱和
0 = 累加器A和B都未饱和
注:此位可读或被清零(不能置1)。清零此位的同时将清零SA和SB。
bit 9DA:DO循环有效位
1= 正在进行DO循环
0 = 未进行DO循环
bit 8DC:MCU ALU半进位/借位标志位
1= 结果的第4低位(对于字节大小的数据)或第8低位(对于字大小的数据)发生了向高位的进位
0= 结果的第4低位(对于字节大小的数据)或第8低位(对于字大小的数据)未发生向高位的进位
DS70049D_CN第 2-12页? 2011 Microchip Technology Inc.
? 2011 Microchip Technology Inc.DS70049D_CN 第2-13页
第2章 CPU
CPU
2
寄存器2-1:SR :CPU 状态寄存器(续)
bit 7-5
IPL<2:0>:CPU 中断优先级状态位(1)111 = CPU 中断优先级为7(15)。 禁止用户中断。110 = CPU 中断优先级为6(14)101 = CPU 中断优先级为5(13)100 = CPU 中断优先级为4(12)011 = CPU 中断优先级为3(11)010 = CPU 中断优先级为2(10)001 = CPU 中断优先级为1(9)000 = CPU 中断优先级为0(8)注
1:IPL<2:0>位与IPL<3>位(CORCON<3>)相连以形成CPU 中断优先级。 如果IPL<3> = 1,那么括号中的值表示IPL 。 当IPL<3> = 1时,禁止用户中断。2:当NSTDIS = 1(INTCON1<15>)时,IPL<2:0>状态位为只读。
bit 4
RA :REPEAT 循环有效位
1 = 正在进行REPEAT 循环0 = 未进行REPEAT 循环bit 3
N :MCU ALU 负标志位1 = 结果为负
0 = 结果为非负(零或正)
bit 2
OV :MCU ALU 溢出标志位
此位用于带符号的算术运算(2进制补码)。 它表明数量级的溢出,这样导致了符号位改变状态。 1 = 带符号的算术运算中发生溢出(本次运算)0 = 未发生溢出
bit 1
Z :MCU ALU 零标志位
1 = 影响Z 位的运算在过去某时将该位置1
0 = 影响Z 位的最近一次运算已经将该位清零(即运算结果非零)bit 0
C :MCU ALU 进位/借位标志位1 = 结果的最高有效位发生了进位0 = 结果的最高有效位未发生进位图注:R = 可读位W = 可写位U =未实现位,读为0C = 只清零位S = 只置1位-n = POR 时的值1 =置1
=清零
x =未知
dsPIC30F系列参考手册
寄存器 2-2:CORCON:内核控制寄存器
高字节:
U-0U-0U-0R/W-0R/W-0R-0R-0R-0
———US EDT DL<2:0>
bit 15bit 8
低字节:
R/W-0R/W-0R/W-1R/W-0R/C-0R/W-0R/W-0R/W-0
SATA SATB SATDW ACCSAT IPL3PSV RND IF bit 7bit 0
bit 15-13未实现:读为0
bit 12US:DSP乘法无符号/有符号控制位
1 = DSP引擎执行无符号乘法运算
0 = DSP引擎执行有符号乘法运算
bit 11EDT:DO循环提前终止控制位
1 = 在当前循环的迭代结束时终止执行DO循环
0 = 无影响
注:此位总是读为0。
bit 10-8DL<2:0>:DO循环嵌套级状态位
111 = 7个DO循环有效
?
?
001 = 1个DO循环有效
000 = 0个DO循环有效
bit 7SATA:AccA饱和使能位
1 = 使能累加器A饱和
0 = 禁止累加器A饱和
bit 6SATB:AccB饱和使能位
1 = 使能累加器B饱和
0 = 禁止累加器B饱和
bit 5SATDW:来自DSP引擎的数据空间写操作饱和使能位
1 = 使能数据空间写操作饱和
0 = 禁止数据空间写操作饱和
bit 4ACCSAT:累加器饱和模式选择位
1 = 9.31饱和(超饱和)
0 = 1.31饱和(正常饱和)
bit 3IPL3:CPU中断优先级状态位3
1 = CPU中断优先级高于7
0 = CPU中断优先级等于或低于7
注:IPL3位与IPL<2:0>位(SR<7:5>)相连形成CPU中断优先级。
DS70049D_CN第 2-14页? 2011 Microchip Technology Inc.
? 2011 Microchip Technology Inc.DS70049D_CN 第2-15页
第2章 CPU
CPU
2
寄存器2-2:CORCON :内核控制寄存器(续)
bit 2
PSV :数据空间中的程序空间可视性使能位1 = 程序空间在数据空间中可视0 = 程序空间在数据空间中不可视bit 1
RND :舍入模式选择位
1 = 使能带偏置(传统)舍入0 = 使能非偏置(收敛)舍入bit 0
IF :整数或小数乘法器模式选择位1 = 使能DSP 乘法运算器的整数模式0 = 使能DSP 乘法运算器的小数模式图注:R = 可读位W = 可写位U=未实现位,读为0C =
可清零位-n = POR 时的值
1 = 置1
=清零
x = 未知
dsPIC30F系列参考手册
2.4.3其他dsPIC30F CPU控制寄存器
以下所列的寄存器与dsPIC30F CPU内核有关,本手册的其他章节会对它们进行更详细的描述。
2.4.
3.1TBLPAG:表页寄存器
TBLPAG寄存器用于在读表和写表操作过程中保存程序存储器地址的高8位。表指令用于传输程
序存储空间和数据存储空间之间的数据。更多详细信息,请参见第4章“程序存储器”
(DS70051)。
2.4.
3.2PSVPAG:程序空间可视性页寄存器
程序空间可视性允许用户将程序存储空间的32 KB区域映射到数据地址空间的高32 KB。此特性
允许通过操作数据存储器的dsPIC30F指令对常数数据进行透明访问。 PSVPAG寄存器选择映射
到数据地址空间的程序存储空间的32 KB区域。更多有关PSVPAG寄存器的信息,请参见第4
章“程序存储器”(DS70051)。
2.4.
3.3MODCON:模控制寄存器
MODCON寄存器用于使能并配置模寻址(循环缓冲)。更多有关模寻址的详细信息,请参见第
3章“数据存储器”(DS70050)。
2.4.
3.4XMODSRT和XMODEND:X模起始和结束地址寄存器
XMODSRT和XMODEND寄存器保持X数据存储地址空间中执行模(循环)缓冲的起始和结束
地址。更多有关模寻址的详细信息,请参见第3章“数据存储器”(DS70050)。
2.4.
3.5YMODSRT和YMODEND:Y模起始和结束地址寄存器
YMODSRT和YMODEND寄存器保持Y数据存储地址空间中执行模(循环)缓冲的起始和结束
地址。更多有关模寻址的详细信息,请参见第3章“数据存储器”(DS70050)。
2.4.
3.6XBREV:X模位反转寄存器
XBREV寄存器用于设置位反转寻址的缓冲区大小。更多有关位反转寻址的详细信息,请参见第
3章“数据存储器”(DS70050)。
2.4.
3.7DISICNT:禁止中断计数寄存器
DISI指令使用DISICNT寄存器将优先级为1-6的中断在指定的几个周期内禁止。更多的信息,请
参见第6章“中断”(DS70053)。
DS70049D_CN第 2-16页? 2011 Microchip Technology Inc.
? 2011 Microchip Technology Inc.DS70049D_CN 第2-17页
第2章 CPU
CPU
2
2.5
算术逻辑单元(ALU )
dsPIC30F ALU 为16位宽,能进行加、减、单位移位和逻辑运算。 除非特别指明,算术运算一般是以2进制补码的方式进行的。 根据不同的运算,ALU 可能会影响SR 寄存器中的进位标志位(C )、全零标志位(Z )、负标志位(N )、溢出标志位(OV )和辅助进位标志位(DC )的值。
在减法运算中,C 和DC 位分别作为借位和辅助借位位。
根据所使用的指令模式,ALU 可以执行8位或16位操作。 根据指令的寻址模式,ALU 操作的数
据可以来自W 寄存器阵列或数据存储器。 同样,ALU 的输出数据可以被写入W 寄存器阵列或数据存储单元。
有关受到指令、寻址模式和8位/16位指令模式影响的SR 位的信息可以参见《16位MCU 和DSC 程序员参考手册》(DS70157E_ CN )2.5.1字节到字的转换
dsPIC30F 有两条指令有助于混合8位和16位ALU 操作。 符号扩展(SE )指令获取W 寄存器
或数据存储器的一个字节值并创建存储在W 寄存器中的符号扩展字值。 零扩展(ZE )指令清零W 寄存器或数据存储器中字值的8 MSb 并将结果放在目标W 寄存器中。
注
1:字节操作使用16位ALU ,并可以产生多于8位的结果。 但是,如果要保持和PIC
器件的向后兼容性,所有字节操作的ALU 结果必须被回写为一个字节(即,不修改MSB ),且只根据结果LSB 的状态更新SR 寄存器。2:字节模式中执行的所有寄存器指令只会影响W 寄存器的LSB 。 可以使用访问W 寄存器的存储器映射内容的文件寄存器指令修改任何W 寄存器的MSB 。
dsPIC30F系列参考手册
2.6DSP引擎
DSP引擎是一个硬件模块,它从W寄存器阵列装入数据,但它有自己专门的结果寄存器。 DSP
引擎由与MCU ALU相同的指令译码器驱动。此外,W寄存器阵列中还产生所有操作数有效地址
(EA)。虽然MCU ALU和DSP引擎资源都可以通过指令集中的所有指令共享,但是DSP不能
与MCU指令流同时运行。
DSP引擎由以下组件组成:
? 高速17位 ×17位乘法器
? 桶形移位寄存器
? 40位加法器/减法器
? 两个目标累加寄存器
? 带可选模式的舍入逻辑
? 带可选模式的饱和逻辑
DSP引擎的数据输入来自以下资源:
? 对于双源操作数DSP指令,源操作数直接来自W阵列(寄存器W4、W5、W6或W7)。
通过X和Y存储器数据总线预取W4、W5、W6和W7寄存器的数据值。
? 对于所有其他DSP指令,来自X存储器数据总线
从DSP引擎输出的数据被写入以下目标之一:
? 由执行的DSP指令定义的目标累加器。
? 到数据存储器地址空间中任何单元的X存储器数据总线。
DSP引擎能够执行固有的“累加器到累加器”的操作,而无需额外数据。
MCU移位和乘法指令使用DSP引擎硬件获得结果。在这些操作中使用X存储器数据总线进行数
据读写。
图2-8所示为DSP引擎的框图。
注:详细代码示例和与本节相关的指令语法,请参见《16位MCU和DSC程序员参考手
册》(DS70157E_ CN)。
DS70049D_CN第 2-18页? 2011 Microchip Technology Inc.
? 2011 Microchip Technology Inc.DS70049D_CN 第2-19页
第2章 CPU
CPU
2
图2-8:
DSP 引擎框图
我是补零
我e 符号扩展
g
桶形移位器
中新40位累加器A 中心40位累加器B
我e
舍入逻辑
X 数据总线
到/从W 阵列
e
加法器
饱和控制
中取补
32
32
32
16
16
16
16
40
40
40
40Y 数据总线
40
16
40
乘法器/小数调整器17位×17位16位到17位
转换e 我饱和逻辑
dsPIC30F系列参考手册
2.6.1数据累加器
共有两个40位数据累加器ACCA和ACCB,它们是表2-3所列DSP指令的结果寄存器。每个累
加器经存储器映射到以下三个寄存器,其中“x”表示特定的累加器:
? ACCxL:ACCx<15:0>
? ACCxH:ACCx<31:16>
? ACCxU:ACCx<39:32>
对于使用累加器的小数运算,小数点位于bit 31的右侧。存储在每个累加器中的小数值范围为
-256.0到(256.0 –2-31)。对于使用累加器的整数运算,小数点位于bit 0的右侧。可存储在每
个累加器中的整数值范围为-549,755,813,888到549,755,813,887。
2.6.2乘法器
dsPIC30F具备一个由MCU ALU和DSP引擎共享的17位×17位的乘法器。此乘法器可以进行
有符号或无符号的运算,而且支持1.31小数(Q.31)或32位整数结果。
此乘法器取16位输入数据并将其转换为17位数据。进入乘法器的有符号操作数将进行符号扩
展。无符号的输入操作数将进行零扩展。 17位转换逻辑对于用户是透明的,并允许乘法器支持有
符号和无符号混合/无符号的乘法运算。
IF控制位(CORCON<0>)确定表2-3所列指令的整数/小数运算。 IF位不会影响表2-4所列的
MCU指令,因为这些MCU总是进行整数运算。对于小数运算,乘法器将乘积左移1位来进行小
数调整。结果的最低有效位(Least Significant bit,LSb)总是保持清零。在器件复位时,默认
乘法器执行DSP运算的小数模式。
硬件中,每个模式的数据表示方式如下:
? 整数数据固有表示为带符号的2进制补码值,其中MSb被定义为符号位。一般来说,
N位2进制补码整数的范围为2N-1到2N-1 – 1
? 小数数据表示为一个2进制补码小数,其中MSb被定义为符号位,并暗示小数点就在
符号位之后(Q.X 格式)。带这种暗示小数点的N位2进制补码小数的范围为-1.0到
(1 – 21-N)。
图2-9和图2-10说明了乘法器硬件如何处理整数和小数模式的数据。整数和小数模式的数据范围
如表2-2所列。
DS70049D_CN第 2-20页? 2011 Microchip Technology Inc.