dsPIC30F2011/2012/3012/3013:高性能数字信号控制器
发布日期:2025-03-13
高性能改进型RISC CPU:
•修改哈佛架构
•C编译器优化的指令集架构
•灵活的寻址模式
•83条基本指令
•24位宽指令,16位宽数据路径
•高达24KB的片上闪存程序空间
•高达2 KB的片上数据RAM
•高达1K字节的非易失性数据EEPROM
•16 x 16位工作寄存器阵列
•高达30 MIPS的操作:
-DC至40 MHz外部时钟输入
-4 MHz-10 MHz振荡器输入,PLL激活(4x、8x、16x)
•多达21个中断源:
-8个用户可选择的优先级
-3个外部中断源
-4个处理器陷阱源
DSP特点:
•双数据提取
•模和位反转模式
•两个带可选饱和逻辑的40位宽累加器
•17位x 17位单周期硬件分数/整数乘法器
•所有DSP指令都是单周期乘法累加(MAC)操作
•单循环±16档
外围功能:
•大电流汇/源I/O引脚:25mA/25mA
•三个16位定时器/计数器;可选择将16位定时器配对为32位定时器模块
•16位Capture输入功能
•16位比较/PWM输出功能
•3线SPI模块(支持四种帧模式)
•I2C™模块支持多主/从模式和7位/10位寻址
•最多两个带FIFO缓冲区的可寻址UART模块
模拟特性:
•12位模数转换器(ADC),带:
-200ksps转换率
-多达10个输入通道
-睡眠和空闲期间可进行转换
•可编程低压检测(PLVD)
•可编程断电复位
特殊微控制器功能:
•增强型闪存程序存储器:
-10000次擦除/写入循环(最小值),适用于工业温度范围,100K(典型值)
•数据EEPROM存储器:
-工业温度范围内100000次擦除/写入循环(最小),1M(典型)
•可在软件控制下自行重新编程
•上电复位(POR)、上电定时器(PWRT)和振荡器启动定时器(OST)
•灵活的看门狗定时器(WDT),带片上低功耗RC振荡器,可实现可靠运行
•故障安全时钟监视器操作:-检测时钟故障并切换到片上低功耗RC振荡器
•可编程代码保护
•在线串行编程™(ICSP™)
•可选电源管理模式:睡眠、空闲和备用时钟模式
CMOS技术:
•低功耗、高速闪存技术
•宽工作电压范围(2.5V至5.5V)
•工业和扩展温度范围
CPU架构概述
本节概述了dsPIC30F的CPU架构。内核有一个24位指令字。程序计数器(PC)为23位宽,最低有效位(LSb)始终为空。除某些特殊指令外,在正常程序执行过程中忽略最重要位(MSb)。因此,PC可以寻址多达4M个指令字的用户程序空间。指令预取机制有助于保持吞吐量。程序循环构造不受循环计数管理开销的影响,使用DO和REPEAT指令支持,这两条指令在任何时候都是可中断的。
核心概述
工作寄存器阵列由16 x 16位寄存器组成,每个寄存器都可以作为数据、地址或偏移寄存器。一个工作寄存器(W15)作为软件堆栈指针用于中断和调用。
数据空间为64KB(32K字),分为两个块,称为X和Y数据存储器。每个块都有自己的独立地址生成单元(AGU)。大多数指令仅通过X存储器AGU运行,AGU提供了单个统一数据空间的外观。双源DSP指令的乘法累加(MAC)类通过X和Y AGU运行,将数据地址空间分为两部分。X和Ydata空间边界是特定于设备的,用户不能更改。每个数据字由2个字节组成,大多数指令可以将数据寻址为字或字节。
访问程序内存中数据的两种方法是:
•数据空间存储器的上32KB可以映射到任何16K程序字边界处的程序空间的下半部分(用户空间),该边界由8位程序空间可见性页面(PSVPAG)寄存器定义。因此,任何指令都可以像访问数据空间一样访问程序空间,但访问需要额外的周期。使用此方法只能访问每个指令字的低16位。
•通过表读写指令,使用任何工作寄存器也可以在程序空间内线性间接访问32K字页。表读写指令可用于访问指令字的所有24位。
X和Y地址空间都支持无开销循环缓冲区(模寻址)。这主要是为了消除DSP算法的循环开销。
X AGU还支持位反转寻址有效地址,大大简化了基2 FFT算法的输入输出数据重新排序。有关模和位反向寻址的详细信息,请参阅第4.0节“地址生成器单元”。
内核支持固有(无操作数)、相对、文字、内存直接、寄存器直接、寄存器间接、寄存器偏移和文字偏移寻址模式。指令与预定义的寻址模式相关联,具体取决于它们的功能要求。
对于大多数指令,内核能够在每个指令周期执行数据(或程序数据)存储器读取、工作寄存器(数据)读取、数据存储器写入和程序(指令)存储器读取。因此,支持3条操作数指令,允许在单个周期内执行C=A+B操作。
内置DSP引擎,显著提高了核心运算能力和吞吐量。它具有高速17位乘17位乘法器、40位ALU、两个40位饱和累加器和一个40位双向桶形移位器。累加器或任何工作寄存器中的数据可以在一个周期内向右移动15位,或向左移动16位。DSP指令与所有其他指令无缝运行,旨在实现最佳的实时性能。MAC类指令可以同时从内存中获取两个数据操作数,同时将两个W寄存器相乘。为了实现数据操作数的并发提取,这些指令的数据空间被分割,所有其他指令的数据区域都是线性的。这是通过将某些工作寄存器专用于MAC类指令的每个地址空间,以透明和灵活的方式实现的。
核心不支持多阶段指令管道。然而,使用单级指令预取机制,在执行前一个周期访问和部分解码指令,以最大限度地延长可用执行时间。大多数建筑都是在一个周期内执行的,有一定的例外。
该内核具有一个用于陷阱和中断的矢量异常处理结构,有62个独立的矢量。异常最多由8个陷阱(其中4个被保留)和54个中断组成。每个中断都根据用户分配的1到7之间的优先级(1是最低优先级,7是最高优先级)以及预定的“自然顺序”进行优先级排序。陷阱有固定的优先级,从8到15。
程序员模型
编程器的模型如图2-1所示,包括16 x 16位工作寄存器(W0至W15)、2 x 40位累加器(ACCA和ACCB)、状态寄存器(SR)、数据表页寄存器(TBLPAG)、程序空间可见性页寄存器(PSVPAG)、DO和REPEAT寄存器(DOSTART、DOEND、DCOUNT和RCOUNT)以及程序计数器(PC)。工作寄存器可以充当数据、地址或偏移寄存器。所有寄存器都被内存映射。W0充当文件寄存器寻址的W寄存器。
如图2-1所示,其中一些寄存器都有一个与之关联的影子寄存器。影子寄存器用作临时持有寄存器,可以在事件发生时将其内容传输到其主机寄存器或从其主机寄存器传输其内容。所有阴影寄存器都不能直接访问。以下规则适用于将寄存器移入和移出阴影。
•推。S和POP。SW0、W1、W2、W3、SR(DC、N、OV、Z和C位)被传输。
•DO指令DOSTART、DOEND、DCOUNT阴影在循环开始时推送,在循环结束时弹出。
当在工作寄存器上执行字节操作时,只有目标寄存器的最低有效字节(LSB)受到影响。然而,内存映射工作寄存器的一个好处是,可以通过字节范围的数据内存空间访问来操纵最低和最高有效字节(MSB)。
软件堆栈指针/帧指针
dsPIC®DSC设备包含一个软件栈。W15是专用的软件堆栈指针(SP),通过异常处理和子例程调用和返回自动修改。然而,W15可以以与所有其他W寄存器相同的方式被任何指令引用。这简化了堆栈指针的读取、写入和操作(例如,创建堆栈帧)。
注意:为了防止错误的堆栈访问,W15<0>始终是明确的。
在重置过程中,W15被初始化为0x0800。用户可以在初始化期间将SP重新编程到数据空间内的任何位置。W14被指定为堆栈帧指针,如LNK和ULNK指令所定义。然而,W14可以以与所有其他W寄存器相同的方式被任何指令引用。
状态寄存器
dsPIC DSC核心有一个16位STATUS寄存器(SR),其LSB称为SR低字节(SRL),MSB称为SR高字节(SRH)。
SRL包含所有MCU ALU操作状态标志(包括Z位),以及CPU中断优先级状态位IPL<2:0>和重复活动状态位RA。在异常处理过程中,SRL与PC的MSB连接,形成一个完整的字值,然后进行堆叠。
STATUS寄存器的上部字节包含DSP加法器/减法器状态位、DO循环活动位(DA)和数字进位(DC)状态位。
程序计数器
程序计数器的宽度为23位宽;位0总是清晰的。因此,PC最多可以寻址4M个指令字。
分割支持
dsPIC DSC器件具有16/16位带符号分数除法运算,以及32/16位和16/16位有符号和无符号整数除法运算,采用单指令迭代除法的形式。支持以下说明和数据大小:
1.DIVF-16/16有符号分数除法
2.DIV.sd-32/16签名分割
3.DIV.ud-32/16无符号除法
4.DIV.s-16/16签名分割
5.DIV.u-16/16无符号除法
16/16除法类似于32/16(相同的迭代次数),但在第一次迭代中,股息要么是零扩展,要么是符号扩展。
除法指令必须在aREPEAT循环中执行。任何其他形式的执行(例如,一系列离散除法指令)都无法正常工作,因为指令流依赖于RCOUNT。除法指令不会自动设置RCOUNT值,因此必须在REPEAT指令中明确正确地指定它,如表2-1所示(REPEAT执行目标指令{操作数值+1}次)。重复循环计数必须设置为DIV/DIVF指令的18次迭代。因此,一个完整的分割操作需要19个周期。
DSP引擎
DSP引擎由一个高速17位x17位乘法器、一个桶形移位器和一个40位加法器/减法器(带有两个目标累加器、舍入和饱和逻辑)组成。
DSP引擎还具有执行相干累加器到累加器操作的能力,这不需要额外的数据。这些指令是ADD、SUB和NEG。
dsPIC30F是一种单周期指令流架构,因此,DSP引擎与MCU指令流的并发操作是不可能的。然而,一些MCU ALU和DSP引擎资源可能会被同一指令同时使用(例如ED、EDAC)。
DSP引擎具有通过CPU核心配置寄存器(CORCON)中的各种位选择的各种选项,如下所示:
1.分数或整数DSP乘法(IF)。
2.有符号或无符号DSP乘法(US)。
3.常规或收敛舍入(RND)。
4.ACCA(SATA)自动饱和开/关。
5.ACCB(SATB)自动饱和开/关。
6.写入数据存储器(SATDW)时自动饱和开/关。
7.蓄能器饱和模式选择(ACCSAT)。
乘法器
17 x 17位乘法器能够进行有符号或有设计的操作,并且可以使用ascaler对其输出进行多路复用,以支持1.31分数(Q31)或32位整数结果。无符号操作数零扩展到乘法器输入值的第17位。符号运算符被符号扩展到乘法器输入值的第17位。17 x 17位乘法器/定标器的输出是一个33位的值,其符号扩展为40位。整数数据固有地表示为带符号的二进制补码值,其中MSB定义为符号位。一般来说,N位二进制补码整数的范围是-2N-1到2N-1–1。对于16位整数,数据范围是-32768(0x8000)到32767(0x7FFF),包括“0”。对于32位整数,数据范围为-2147483648(0x80000000)到2147483645(0x7FFF FFFF)。
当乘法器配置为分数乘法时,数据表示为2的补积分数,其中MSB被定义为符号位,theradix点隐含在符号位之后(QX格式)。具有此隐含基点的N位二补分数的范围为-1.0到(1-21-N)。对于16位分数,Q15数据范围为-1.0(0x8000)到0.999969482(0x7FFF),包括“0”,精度为3.01518x10-5。在分数模式下,16x16乘法运算产生1.31的乘积,精度为4.65661 x 10-10。
相同的乘法器用于支持MCU乘法指令,其中包括整数16位有符号、无符号和混合符号乘法。可以指示MUL指令使用字节或字大小的操作数。字节操作数指示16位结果。字操作数将32位结果定向到W数组中的指定寄存器。
数据累加器和加法器/减法器
数据累加器由一个带自动符号扩展逻辑的40位加法器/减法器组成。它可以选择两个累加器(A或B)中的一个作为其预累加源和后累加目的地。对于ADD和LAC指令,在累积之前,可以通过桶形移位器对要累积或加载的数据进行缩放。
加减法、溢出和饱和度
加法器/减法器是一个40位加法器,一侧有可选的零输入,另一侧有真或补码数据。在加法的情况下,进位/借位输入为高有效值,其他输入为未补充的数据;而在减法的情况下则为低有效值,另一输入为补充的数据。加法器/减法器产生溢出状态位SA/SB和OA/OB,这些位被锁存并反映在Status寄存器中:
•第39位溢出:这是一个灾难性的溢出,累加器的符号被破坏。
•溢出到保护位32到39:这是可预防的溢出。只要所有保护位彼此不相同,就会设置此位。
加法器有一个额外的饱和块,如果选择,它可以控制累加器数据饱和。它使用加法器的结果、上述溢出状态位以及SATA/B(CORCON<7:6>)和ACCSAT(CORCON>4>)模式控制位来确定何时饱和以及饱和到什么值。
提供了六个STATUS寄存器位来支持饱和和溢出。他们是:
1.OA:ACCA溢出到保护位
2.OB:ACCB溢出到保护位
3.SA:ACCA饱和(第31位溢出和饱和)或ACCA溢出到保护位并饱和(第39位溢出和饱和度)
4.SB:ACCB饱和(第31位溢出和饱和)或ACCB溢出到保护位并饱和(第39位溢出和饱和度)
5.OAB:OA和OB的逻辑OR
6.SAB:SA和SB的逻辑OR
每次数据通过加法器/减法器时,OA和OB位都会被修改。当设置时,它们表示最近的操作已经溢出累加器保护位(位32到39)。OA和OB位还可以在设置时选择性地生成算术警告陷阱,并设置INTCON1寄存器中相应的溢出陷阱标志启用位(OVATE、OVBTE)(请参阅第8.0节“中断”)。这允许用户立即采取行动,例如,纠正系统增益。
每次通过加法器/减法器对数据集进行修改时,SA和SB位都会被修改,但只能由用户清除。设置后,它们表示累加器已超出其最大范围(位31表示32位饱和,位39表示40位饱和),如果启用饱和,则将饱和。当饱和未启用时,SA和SB默认为第39位溢出,因此表示发生了灾难性的溢出。如果INTCON1寄存器中的COVTE位被设置,则SA和SB位在饱和被禁用时会生成算术警告陷阱。
溢出和饱和状态位可以在状态寄存器(SR)中作为OA和OB的逻辑OR(在位OAB中)和SA和SB的逻辑OR进行查看(在位SAB中)。这允许程序员检查STATUS寄存器中的一个位,以确定累加器是否溢出,或者一个位确定累加器是否饱和。这对于通常使用累加器的复数运算非常有用。
该设备支持三种饱和和飞越模式:
1.第39位溢出和饱和:当第39位发生溢出和饱和时,饱和逻辑将最大正9.31(0x7FFFFFFFF)或最大负9.31值(0x800000000)加载到目标累加器中。SA或SB位已设置,并保持设置状态,直至用户清除。这被称为“过饱和”,可以防止错误的数据或意外的算法问题(例如增益计算)。
2.第31位溢出和饱和:当第31位发生溢出和饱和时,饱和逻辑会将最大正1.31值(0x007FFFffff-ic/" title="0x007FFFFFFF">0x007FFFFFFF)或最大负1.31值。SA或SB位被设置并继续设置,直到用户清除为止。当此饱和模式生效时,不使用保护位,因此OA、OB或OAB位永远不会被使用。
3.位39灾难性溢出:加法器的位39溢出状态位用于设置SA或SB位,该位在用户清除之前保持设置状态。不进行饱和操作,允许蓄能器溢流(破坏其标志)。如果INTCON1寄存器中的COVTE位被设置,灾难性溢出可能会引发陷阱异常。
累加器“回写”
MAC类指令(MPY、MPY.N、ED和EDAC除外)可以选择将指令不针对的累加器高位字(位31至16)的环绕版本写入数据空间存储器。通过X总线将写入操作执行到X和Y地址空间的组合中。支持以下寻址模式:
1.W13,寄存器直接:非目标累加器的四舍五入内容作为1.15分数写入W13。
2.[W13]+=2,后增量间接寄存器:非目标累加器的四舍五入内容作为1.15的分数写入W13指向的地址。W13然后加2(用于单词写入)。
舍入逻辑
循环逻辑是一种组合块,在累加器写入(存储)期间执行传统(有偏)或收敛(无偏)循环函数。Round模式由CORCON寄存器中RND位的状态决定。它生成一个16位、1.15的数据值,并将其传递给数据空间写入饱和逻辑。如果指令中没有指示舍入,则存储截断的1.15数据值,并简单地丢弃最低有效字(lsw)。
常规舍入取累加器的第15位,零将其扩展并将其添加到ACCxH字(累加器的第16至31位)。如果ACCxL字(累加器的位0到15)在0x8000和0xFFFF之间(包括0x8000),则ACCxH递增。如果ACCxL在0x0000和0x7FFF之间,则ACCxH保持不变。该算法的一个结果是,在一系列随机舍入操作中,该值往往略微偏正。
收敛(或无偏)舍入的操作方式与常规舍入相同,除非ACCxL等于0x8000。如果是这种情况,则检查ACCxH的LSb(累加器的位16)。如果为“1”,则ACCxH递增。如果为“0”,则不会修改ACCxH。假设比特16实际上是随机的,则该方案将消除可能累积的任何舍入偏差。
SAC和SAC。R指令通过X总线将目标累加器内容的截断(SAC)或舍入(SAC.R)版本存储到数据存储器中(受数据饱和影响,请参阅第2.4.2.4节“数据空间写入饱和”)。请注意,对于MAC类指令,累加器回写操作以相同的方式工作,通过X总线寻址组合MCU(X和Y)数据空间。对于这类指令,数据总是会被遍历。
数据空间写入饱和
除了加法器/减法器饱和外,对数据空间的写入也可能饱和,但不会影响源累加器的内容。数据空间写入饱和逻辑块接受来自循环逻辑块的16位1.15分数值作为其输入,以及来自原始源(累加器)和16位循环加法器的溢出状态。这些被组合起来,用于选择适当的1.15分数值作为输出,以写入数据空间内存。
如果设置了CORCON寄存器中的SATDW位,则测试数据(四舍五入或截断后)是否溢出并相应调整。对于大于0x007FFF的输入数据,写入内存的数据被强制为最大正1.15值0x7FFF。对于小于0xFF8000的输入数据,写入内存的数据将强制为最大负1.15值0x8000。源的MSb(位39)用于确定异常和被测的符号。如果CORCON寄存器中的SATDW位未设置,则在所有条件下,输入数据始终保持不变。
桶式变速器
桶形移位器能够在单个周期内执行高达16位的算术或逻辑右移,或高达16位数的左移。源可以是两个DSP累加器中的任何一个,也可以是X总线(以支持寄存器或存储器数据的多位移位)。
移位器需要一个带符号的二进制值来确定移位操作的幅度(位数)和方向。正值将操作数向右移动。负值将操作数向左移动。值“0”不会修改操作数。
桶形移位器的宽度为40位宽,从而为DSP移位操作获得40位结果,为MCU移位操作获得16位结果。来自X总线的数据在右移位位置16至31和左移位位置0至16之间呈现给桶形移位器。