DSP之CLA模块
文章目录
1 概述
控制律加速器通过添加并行处理扩展C28x CPU的功能。由CLA服务的时间是关键的控制回路,可以实现ADC采样到输出的低延迟。因此,CLA能够实现更快的系统响应和更高的频率控制环路。将CLA用于时间是关键的任务,可以释放主CPU,进而并发地执行其他系统和通信功能。
以下是CLA的主要特性:
-
时钟频率和主频一致(SYSCLKOUT)
-
有一个独立的架构,允许CLA算法独立于主C28x CPU执行。
2.1 完整的总线结构:
(1) 程序地址总线和程序数据总线
(2) 数据地址总线,数据读总线和数据写总线
2.2 独立的八段流水线
2.3 12位程序计数器(MPC)
2.4 四个32位寄存器(MR0~MR3)
2.5 两个16位辅助寄存器(MAR0,MAR1)
2.6 状态寄存器(MSTF)
-
指令集包括:
3.1 IEEE单精度(32位)浮点数学操作
3.2 并行加载或储存的浮点数学
3.3 并行加法或减法的浮点乘法
3.4 1/X和 1/sqrt(X) 估算
3.5 数据类型转换
3.6 条件分支和调用
3.7 数据加载/数据存储操作
-
CLA程序代码可以由多达8个任务或中断服务程序组成:
4.1 由MVECT寄存器指定每一个任务的起始地址
4.2 对任务大小没有限制,只要任务适合CLA程序内存空间
4.3 每次服务一个任务直到完成。没有任务的嵌套
4.4 当任务完成时,将在PIE中标记一个特定于任务的中断
4.5 当一个任务完成时,下一个优先级最高的挂起任务将自动启动
-
任务触发机制:
5.1 C28x CPU通过IACK指令触发
5.2 Task1 ~ Task7:对应的ADC或ePWM模块中断。例如:
(1) Task1:ADCINT1 or EPWM1_INT
(2) Task2:ADCINT2 or EPWM2_INT
(3) Task7:ADCINT7 or EPWM7_INT
5.3 Task8:ADCINT8或者 CPU的Timer0
-
内存和共享外设:
6.1 两个专门用于在CLA和主CPU之间通信的ram
6.2 C28x CPU可以将CLA程序内存和数据内存映射到主CPU空间或CLA空间。
6.3 CLA可以直接访问ADC结果寄存器、比较器寄存器和ePWM+HRPWM寄存器。
CLA框架图如下:
2 CLA接口
2.1 CLA存储
CLA可以访问三种类型储存器:程序、数据、消息RAM。CLA的RAM受CSM模块保护。
-
CLA程序内存
CLA程序可以被加载在指定的存储块。在复位状态下,所有的存储都被映射到CPU。在被映射到CPU空间,CPU可以将CLA程序代码拷贝到对应储存器。在debug调试时,可以通过CCS直接加载到存储器中。
一旦存储器被CLA代码初始化,CPU就可以通过设置MMEMCFG寄存器的PROGE位来将存储器映射到CLA程序空间
当一个存储模块被配置为CLA程序存储模块,debug调试访问只允许在CLA没有获取新指令的周期内进行。
所有CLA程序的获取都是作为32位读操作执行的,所有操作码必须对齐到一个偶数地址。因为所有CLA操作码都是32位的,所以这种对齐是自然发生的。
-
CLA数据内存
指定的内存位置可以作为CLA的数据内存块。在重置时,所有块都映射到CPU内存空间,因此CPU可以用数据表、系数等初始化内存,以便CLA使用。
一旦内存被CLA数据初始化,CPU通过设置相应的MMEMCFG[RAMxE]位将其映射到CLA数据空间。
当将内存块配置为CLA数据内存时,CLA的读写访问将与CPU访问一起进行仲裁。用户可以选择通过写入适当的MMEMCFG[RAMnCPUE]位来打开CPU取或者写内存保护。
-
CLA共享消息RAM
一共有两个内存快用于CLA和CPU只见的数据共享和通讯。这些消息RAM总是被映射到CPU和CLA内存空间。并且这些空间只允许数据访问,不能执行任何程序获取。
(1) CLA到CPU的消息RAM
CLA可以使用这些快将数据传给CPU。CLA可以读写,但是CPU只可以读。如果CPU写,会被忽略。
(2) CPU到CLA的消息RAM
CPU可以使用这些快将数据和消息传给CLA。这些消息RAM,CPU可以读写,CLA可以读取,但是如果CLA写,会被忽略。
2.2 LCA内存总线
CLA具有专用的总线结构,该总线结构和C28x CPU的总线结构相似。这些总线结构具有独立的程序读、数据读和数据写总线。因此,他们可以在一个单周期里,被同步获取、数据读和数据写入。和C28x CPU一样,CLA期望内存逻辑将32位读或者写对齐到偶数地址。如果地址通用逻辑产生一个奇地址,那么CLA将在之前的偶数地址上开始读或者写。这种对齐不影响有地址通用逻辑产生的地址值。
-
CLA程序总线
CLA程序总线具有2048条32位指令的访问范围。因为所有的CLA指令都是32位的,因此这条总线上总是一次获取32位,操作码必须偶字对齐。可用的程序空间数受限于分配的内存快数。该内存快数各个设备不同,具体需要查对应的数据手册。
-
CLA数据读总线
CLA的数据读总线大小为64K x 16范围。总线上可以执行16位或者32位读操作,并且如果存在内存访问冲突,则自动停止。数据读总线可以访问消息RAM、CLA数据内存和共享外设。
-
CLA数据写总线
CLA写总线大小位64K x 16地址范围。总线上可以执行16位或者32位写操作,并且如果存在内存访问冲突,则自动停止。数据写总线可以访问CLA到CPU消息RAM,CLA数据内存和共享外设。
2.3 共享外设及EALLOW保护
CPU和CLA共享访问一下外设。
一些外设控制寄存器通过EALLOW保护机制来防止一些假的28x CPU的误写入。同样的,这些寄存器也防止CLA误写入。
CPU状态寄存器(ST1)中的EALLOW位CPU的保护状态。类似的,在CLA的状态寄存器(MSTF)中的MEALLOW位表示CLA的写保护状态。MEALLOW这个CLA指令使能CLA写操作到EALLOW保护的寄存器。同样,MEDIS 这个CLA指令将禁用写访问。这样,CLA可以独立于CPU启用/禁用写访问。
ADC提供了在采样转换开始时产生更早的中断脉冲的选项。如果使用此选项启动ADC触发的CLA任务,用户可能会使用中间的周期,直到转换完成,执行初步计算或加载和存储,然后才最终读取ADC值。
2.4 CLA任务和中断向量
CLA程序被分为任务和中断服务子程序。任务没有固定的起始位置和长度。CLA程序内存可以按照预期分配。CLA使用中断向量(MVECT1到MVECT8)的内容决定任务的开始。任务通过MSTOP指令停止。
CLA支持8个任务。任务1优先级最高,任务8优先级最低。
一个任务可以由外设中断或者软件来请求,具体如下:
-
外设中断触发
每一个任务都可以由软件设定的中断源来触发。每个任务的触发是通过给MPISRCSEL1寄存器中的PERINTnSEL位写入正确的值来确定。每个选项指定一个由共享总线上的指定外设确定的中断源。具体中断触发见手册。
比如,任务1(MVECT1)可以通过给MPISRC1SEL寄存器中的PERINT1SEL位写入2,从而设定EPWM1_INT触发该任务。为了禁止任务由外设触发,用户必须配置MPISRC1SEL寄存器中的PERINTnSEL位为“No interrupt source”。
-
软件触发
CPU软件可以通过给MIFRC寄存器的写入操作或者使用IACK指令来触发任务。使用IACK指令来触发是更有高效的,因为该指令不需要EALLOW来设定MIFR位。设定MCTL寄存器的IACKE位来使能IACK功能。IACK指令中的每一位操作数相应一个任务。比如,IACK 0x0001置位MIFR寄存器bit0,是开始任务1。类似的,IACK为0x0003设定MIFR寄存器bit0和bit1,是开始任务1和任务2。
CLA具有自己的获取机制,并且是运行和执行独立于CPU的让任务。CLA是每次只执行一个任务,并且没有嵌套。当前运行的任务在MIRUN寄存器中显示。已经接收到但尚未服务的中断在标志寄存器(MIFR)中表示。如果接收到来自外设的中断请求,并且已经标记了相同的任务,则设置了溢出标记位。溢出标志将保持设置,直到它们被CPU清除。
如果CLA是空闲的(没有执行任务),那么即被标志的(MIFR)又被使能(MIER)的最高优先级的中断请求将会开始。流程如下:
- 置位关联的RUN寄存器位(MIRUN),清除标志位(MIFR)。
- CLA在关联的中断向量(MVECTx)的位置开始执行。MVECT包含任务在较低的64K内存空间中的绝对16位地址。
- CLA一直执行指令,直到MSTOP指令。该MSTOP指令表示任务的结束。
- 清除MIRUN位
- 向PIE发出特定于任务的中断。这通知主CPU任务已经完成。
- CLA空闲
一旦任务完成,下一个优先级最高的挂起任务将自动得到服务,并重复此顺序。
3 CLA和CPU仲裁
3.1 CLA和CPU仲裁
CLA是独立于CPU运作。当出现CLA和CPU都想访问内存和外设寄存器情况时,就会发生仲裁。仲裁可以使得当CPU和CLA同时读取ADC结果寄存器时,不会出现矛盾。
可能发生访问冲突的接口有:
- CLA消息RAM
- CLA程序内存
- CLA数据RAM
3.1.1 CLA消息RAM
消息RAM包含两个快。这两个快用于在CPU和CLA只见传递数据。不允许从消息ram中获取操作码。消息RAM具有如下特征:
-
CLA到CPU的消息RAM
允许如下访问:
(1) CPU读取
(2) CLA读取和写入
(3) CPU调试debug读取和写入
如下操作会被忽略:
(1) CPU写入
访问优先级:
(1) CLA写入
(2) CPU调试debug写入
(3) CPU读取、程序读取、CPU调试debug读取
(4) CLA数据读取
-
CPU到CLA消息RAM
允许下入访问:
(1) CPU读取和写入
(2) CLA读取
(3) CPU调试debug读取和写入
如下操作被忽略:
(1) CLA写入
访问优先级如下:
(1) CLA读取
(2) CPU数据写、程序写、CPU调试debug写
(3) CPU数据读取、CPU调试debug读取
(4) CPU程序读取
3.1.2 CLA程序内存
程序内存的表现是由MMEMCFG[PROGE]位决定的。该位确定内存是映射到CLA空间还是CPU空间。
-
MMEMCFG[PROGE] == 0
这种情况下是映射到CPU的。CLA将被悬挂,并且此时没有CLA任务要执行。
(1) 任何CLA获取将被认为是非法操作。如果遵循正确的过程来映射程序内存,则不会发生这种情况。
(2) CLA读取和写入都不会发生
(3) 内存块的行为就像任何普通RAM块映射到CPU内存空间
访问优先级如下:
(1) CPU数据写入、程序写入、调试debug写入
(2) CPU数据读取、程序读取、调试debug读取
(3) CPU获取、程序读取
-
MMEMCFG[PROGE] == 0
这种情况下内存快是被映射到CLA空间。CPU只有debug调试才能访问
(1) CLA读取或写入不能发生
(2) CLA获取是允许的
(3) CPU获取将返回0,这事一个非法操作码,并且会造成ITRAR中断
(4) CPU数据读取和程序读取返回0
(5) CPU数据写入和程序写入被忽略
访问优先级:
(1) CLA获取
(2) CPU debug调试写入
(3) CPU debug调试读取
注意:由于获取CLA的优先级高于CPU调试读取,如果CLA在循环中执行,则CLA有可能永久阻塞调试访问。这可能在最初开发CLA代码时由于错误而发生。为了避免这个问题,当CLA运行时,程序内存将返回所有用于CPU调试读(忽略写)的0x0000。当CLA停止或空闲时,可以执行正常的CPU调试读和写访问。
3.1.3 CLA数据内存
一共有两个独立的数据内存。数据内存的表现取决于MMEMCFG[RAM0E]位和MMEMCFG[RAM1E]位的状态。这两个位确定内存是映射到CLA空间还是CPU空间。
-
MMEMCFG[RAMxE] == 0
这种情况下内存快映射到CPU
(1) CLA不能获取该内存快
(2) CLA读取返回0
(3) CLA写入被忽略
(4) 内存快和其他普通RAM块一样映射到CPU内存空间
反问优先级如下:
(1) CPU数据写入、CPU程序写入、debug调试写入
(2) CPU数据读取、debug调试读取
(3) CPU获取、程序读取
-
MMEMCFG[RAMxE] == 1
这种情况下,内存块映射到CLA空间。CPU只有debug调试才能访问
(1) CLA不能获取
(2) CLA读取和写入都可以
(3) CPU获取返回0
(4) CPU数据获取和程序读取返回0
(5) CPU数据写入或CPU程序写入操作都被忽略
访问优先级如下:
(1) CLA数据写入
(2) CPU debug调试写入
(3) CPU debug调试读取
(4) CLA读取
3.1.4 外设寄存器(ePWM)
访问寄存器遵循如下规则:
-
如果CPU和CLA同时访问,那么CLA优先,CPU停止工作。
-
如果已经有一个CPU访问操作正在进行了,并且另一个CPU访问操作准备进行,此时CLA相比准备进行的CPU访问操作的优先级高。这种情况下,CLA访问将开始于当前CPU访问完成。
-
已经有了一个正在进行的CPU访问,那么任务将要进行的CLA访问就要暂停。
-
已经有了一个正在进行的CLA访问,那么任务将要进行的CPU访问就要暂停。
-
CPU写入操作相比CPU读取优先级高。
-
CLA写入操作相比CLA读取优先级高。
-
如果CPU正在进行读-修改-写操作,而CLA写到相同的位置,在CPU读和写之间发生的操作可能会导致CLA写丢失。由于这个原因,您不应该将CPU和CLA访问混合在同一个位置。
4 CLA配置和调试
4.1 构建CLA应用程序
CLA编写程序可以使用CLA汇编,或者C语言简化子集。CLA汇编代码与C28x代码驻留在同一个项目中。唯一的限制是CLA代码必须位于它自己的汇编部分。这可以很容易地使用.sect汇编指令来完成。这并不会阻止CLA和C28x代码在链接器命令文件中链接到相同的内存区域。
系统和CLA初始化由主CPU执行。这通常是用C或c++完成的,但也可以包括C28x汇编代码。主CPU也将CLA代码复制到程序内存中,如果需要,初始化CLA数据RAM。一旦系统初始化完成并开始应用程序,CLA将使用CLA汇编代码(或任务)为其中断提供服务。主CPU可以在执行CLA程序的同时执行其他任务。
4.2 典型CLA初始化序列
典型的CLA初始化顺序是由主CPU执行的,如下所述:
-
将CLA代码拷贝到CLA程序RAM中
CLA代码的源代码最初可以在flash或来自通信外围设备的数据流中,或者主CPU可以访问它的任何地方。调试器还可以用于在开发期间将代码直接加载到CLA程序RAM中。
-
如有必要,初始化CLA数据RAM
用任何需要的数据系数或常数填充CLA数据RAM。
-
配置CLA寄存器配置CLA寄存器,但需要禁止中断到之后(MIER = 0):
(1) 通过PCLKCRn寄存器使能CLA外设时钟
(2) 填充CLA任务中断向量
MVECT1到MVECT8
当CLA接收到相关的中断时,需要用要执行的任务的起始地址初始化每个向量。该地址是从已分配的CLA程序内存块的基址的偏移量。
(3) 选择任务中断源
在CLA1TASKSR从SELx寄存器中为每个任务选择中断源。如果有任务是通过软件触发的,选择 no interrupt。
(4) 如有需要,使能IACK通过软件开始一个任务
置位MCTL[IACKE]位,使能IACK指令去启动任务。使用IACK指令可以避免设置和清除EALLOW位。
(5) 如有需要,将CLA数据RAM映射到CLA空间
通过向MMEMCFG[RAMxE]位写入1,将数据RAM映射到CLA空间。一旦设置了MMEMCFG[RAMxE]位,CPU将限制对内存块的访问。
(6) 将CLA程序RAM映射到CLA空间
通过设置MMEMCFG[PROGE]位,将CLA程序RAM映射到CLA空间。CPU只有在设置了MMEMCFG[PROGE]位后才有调试访问程序RAM的权限。允许两个SYSCLK周期使MMEMCFG更新生效。
-
初始化PIE向量表和寄存器
当一个CLA任务完成时,将标记PIE中关联的中断。CLA溢出和下流标志在PIE中也有关联的中断。
-
使能CLA任务/中断
在中断中设置适当的位使寄存器(MIER)允许CLA服务中断。
-
初始化其他外设
初始化将为启用CLA任务生成中断触发器的任何外围设备(如ePWM、ADC等)。
CLA现在可以为中断提供服务,消息ram可以用于在CPU和CLA之间传递数据。CLA程序和数据ram的映射通常只在初始化过程中发生。如果在初始化之后需要更改RAM映射,那么在修改RAM所有权之前,必须禁用CLA中断,并且必须完成所有任务(通过检查MIRUN寄存器)。
4.4 CLA非法操作码行为
如果CLA获取了一个与合法指令不对应的操作码,它将表现如下:
(1) CLA将与流水线D2阶段的非法操作码一起停止,就像它是一个断点一样。无论是否启用CLA断点,都会发生这种情况。
(2) CLA将向PIE发出特定任务的中断。
(3) 任务的MIRUN位将保持设置。
一旦执行因非法操作代码而停止,将忽略进一步的单步操作。要退出这种情况,请按4.5节所述对CLA进行软复位或硬复位。
4.5 复位CLA
有时可能需要重置CLA。例如,在代码调试期间,CLA可能由于代码错误而进入一个无限循环。CLA有两种类型的复位:硬复位和软复位。这两种重置都可以由调试器或主CPU执行。
-
硬复位
向MCTL[HARDRESET]位写入1将执行CLA的硬复位。硬复位的行为与系统复位(通过 X R S ‾ \overline{XRS} XRS或调试器))相同。在这种情况下,所有CLA配置和执行寄存器将被设置为默认状态,CLA执行将停止。
-
软复位
向MCTL[SOFTRESET]位写入1将执行CLA的软复位。如果一个任务正在执行,它将停止并清除相关的MIRUN位。中断使能(MIER)寄存器中的所有位也将被清除,这样就不会有新的任务开始。
5 流水线
5.1 流水线概述
CLA流水线和C28x流水线类似,有八个阶段:
-
获取1(F1)
在F1阶段,程序读取放在CLA程序地址总线上的地址。
-
获取2(F2)
在F2阶段,使用CLA程序数据总线读取指令。
-
解码1(D1)
在D1阶段,解码指令。
-
解码2(D2)
生成数据读地址。对MAR0和MAR1的变化,由于使用间接寻址后增量发生在D2阶段。在此阶段,还会根据MSTF寄存器标志做出条件转移决定。
-
读取1(R1)
将数据读地址放在CLA数据读地址总线上。如果存在内存冲突,R1阶段将被停止。
-
读取2(R2)
使用CLA数据读取数据总线,以读取数据值。
-
执行(EXE)
执行该操作。在这一阶段,由于从内存中加载一个或多个即时值而对MAR0和MAR1进行更改。
-
写入(W)
将写地址和写数据放在CLA写数据总线上。如果存在内存冲突,W阶段将被停止。
5.2 流水线对齐
大多数CLA指令不需要考虑任何的注意事项。以下列出需要考虑流水线的操作:
-
写操作后的读操作
在C28x和CLA流水线中,读操作发生在写操作之前。这意味着,如果一个写操作之后,立即跟着一个读操作,那么读取将会先完成。如下表所示:
在大多数情况下,这不会造成问题,因为一个内存位置的内容不依赖于另一个内存位置的状态。对于外设的访问,如果对一个位置的写操作可能影响到另一个位置的值,则代码必须等待写操作完成后才发出读操作,如下表所示:
即I1的W操作完成之后再进行I2的R1操作。
这种行为对于28x CPU是不同的。对于28x CPU,对同一位置的任何写后读都被称为写后读保护。这种保护会自动停止流水线,以便在读之前完成写操作。此外,一些外围帧被保护,这样一个28x CPU写入帧内的一个位置总是在读取帧之前完成。CLA没有这种保护机制。相反,代码必须等待执行读取。
-
延迟条件说明:MBCNDD, MCCNDD和MRCNDD
示例5-1如下:
<Instruction 1> ; I1 Last instruction that can affect flags for ; the branch, call or return operation <Instruction 2> ; I2 Cannot be stop, branch, call or return <Instruction 3> ; I3 Cannot be stop, branch, call or return <Instruction 4> ; I4 Cannot be stop, branch, call or return <branch/call/ret> ; MBCNDD, MCCNDD or MRCNDD ; I5-I7: Three instructions after are always ; executed whether the branch/call or return is ; taken or not <Instruction 5> ; I5 Cannot be stop, branch, call or return <Instruction 6> ; I6 Cannot be stop, branch, call or return <Instruction 7> ; I7 Cannot be stop, branch, call or return <Instruction 8> ; I8 <Instruction 9> ; I9 ....
参考上述说明,以下适用于延迟条件指令:
(1) I1
I1是可以影响分支、调用或返回指令的CNDF标志的最后一条指令。CNDF标志在流水线的D2阶段进行测试。也就是说,当MBCNDD、MCCNDD或MRCNDD处于D2阶段时,决定是否进行分支。
(2) I2、I3和I4
在MBCNDD之前的三条指令可以改变MSTF标志,但对MBCNDD指令是否分支没有影响。这是因为标记修改将发生在分支、调用或返回指令的D2阶段之后。这三个指令不能是MSTOP、MDEBUGSTOP、MBCNDD、MCCNDD或MRCNDD。
(3) I5、I6和I7
不管条件是否为真,跟随分支、调用或返回的三个指令总是被执行。这些指令不能是MSTOP、MDEBUGSTOP、MBCNDD、MCCNDD或MRCNDD。
-
停止或暂停任务:MSTOP和MDEBUGSTOP
MSTOP和MDEBUGSTOP指令不能在一个条件分支、调用或返回指令(MBCNDD、MCCNDD或MRCNDD)之前或之后放置三个指令。参见例5-1。要单步通过分支/调用或返回,插入MDEBUGSTOP至少四个指令,并从那里步进。
-
装载MAR0或MAAR1
装载辅助寄存器MAR0或者MAR1将发生在流水线的EXE。使用间接寻址的MAR0或MAR1的任何后增量都将发生在管道的D2阶段。参考例5-2,加载辅助寄存器时应用如下:
例5-2:
; Assume MAR0 is 50 and #_X is 20 MMOVI16 MAR0, #_X ; Load MAR0 with address of X (20) <Instruction 1> ; I1 Will use the old value of MAR0 (50) <Instruction 2> ; I2 Will use the old value of MAR0 (50) <Instruction 3> ; I3 Cannot use MAR0 <Instruction 4> ; I4 Will use the new value of MAR0 (20) <Instruction 5> ; I5 Will use the new value of MAR0 (20)
(1) I1和I2
加载指令后面的两条指令将在更新发生之前使用MAR0或MAR1中的值。
(2) I3
加载辅助寄存器发生在EXE阶段,而更新由于后增量寻址发生在D2阶段。因此,I3不能使用辅助寄存器,否则会产生冲突。在冲突的情况下,由于地址模式后增量的更新将获胜,辅助寄存器将不会用#_X更新。
(3) I4
从第4条指令开始,MAR0或MAR1将有新的值。
5.2.1 ADC早期中断到CLA响应
ADC可以被配置为在ADC转换完成之前,产生一个早期中断脉冲。如果该选项被用作CLA任务,那么,只要ADC结果寄存器中的值可用,CLA可以读取结果。这种即时采样和CLA的短中断响应组合,可以产生更快的系统响应和更高的频率控制环路。
在ADC章节有ADC转换的时序。如果ADCCLK使用SYSCLK的分频,那用户将不得不考虑SYSCLK周期中的转换时间。
比如,当ADCCLK为SYSCLK/2,那将花费 13 ADCCLK * 2 SYSCLK = 26 SYSCLK个周期完成转换。
从CLA的角度来看,N-cycle (SYSCLK) ADC转换的流水线活动下表所示。N-2指令将及时到达R2阶段以读取结果寄存器。虽然前面的指令将过早地进入流水线的R2阶段,无法读取转换,但它们可以有效地用于任务所需的预处理计算。
5.3 并行指令
并行指令是并行执行两个操作的单个操作码。以下类型的并行指令是可用的:与一个移动操作并行的数学操作,或两个并行的数学操作。这两种操作在一个周期内完成,没有特殊的流水线对齐要求。
例5-3:
; MADDF32 || MMOV32 instruction: 32-bit floating-point add with parallel move
; MADDF32 is a 1 cycle operation
; MMOV32 is a 1 cycle operation
MADDF32 MR0, MR1, #2 ; MR0 = MR1 + 2,
|| MMOV32 MR1, @Val ; MR1 gets the contents of Val
; <-- MMOV32 completes here (MR1 is valid)
; <-- DDF32 completes here (MR0 is valid)
MMPYF32 MR0, MR0, MR1 ; Any instruction, can use MR1 and/or MR0
例5-4:
; MMPYF32 || MADDF32 instruction: 32-bit floating-point multiply with parallel add
; MMPYF32 is a 1 cycle operation
; MADDF32 is a 1 cycle operation
MMPYF32 MR0, MR1, MR3 ; MR0 = MR1 * MR3
|| MADDF32 MR1, MR2, MR0 ; MR1 = MR2 + MR0 (Uses value of MR0 before MMPYF32)
; <-- MMPYF32 and MADDF32 complete here (MR0 and MR1 are valid)
MMPYF32 MR1, MR1, MR0 ; Any instruction, can use MR1 and/or MR0
6 指令集
本节描述控制律加速器的汇编语言指令。还描述了并行操作、条件操作、资源约束和寻址模式。这里列出的指令独立于C28x和C28x+FPU指令集。
6.1 指令描述
每条指令可能会提供以下信息:
- 操作数
- 操作码
- 描述
- 例外
- 流水线
- 距离
- 类似的
展示的示例INSTRUCTION是为了让您熟悉每条指令的描述方式。该示例描述了您将在单个指令描述的每个部分中找到的信息类型,以及在哪里可以获得更多的信息。CLA指令遵循与C28x相同的格式;源操作数总是在右边,而目标操作数总是在左边。
6.2 寻址模式和编码
CLA访问数据、寄存器和主CPU一样,使用相同的地址。比如,主CPU访问地址为0x00 6800地址的ePWM寄存器,那么CLA将使用地址0x6800来访问。因为所有的CLA可访问的内存和寄存器都是低64k x 16内存,所有只低16位的地址用于CLA。
为了寻址CLA数据内存、消息RAM和共享外设,CLA支持两种寻址模式:
- 直接模式:直接使用变量或寄存器的地址。
- 带有16位后增量的间接寻址。该模式使用XAR0或XAR1。
CLA不使用数据页指针或者堆栈指针。
6.3 指令集
具体指令集见官方数据手册。
6 指令集
本节描述控制律加速器的汇编语言指令。还描述了并行操作、条件操作、资源约束和寻址模式。这里列出的指令独立于C28x和C28x+FPU指令集。
6.1 指令描述
每条指令可能会提供以下信息:
- 操作数
- 操作码
- 描述
- 例外
- 流水线
- 距离
- 类似的
展示的示例INSTRUCTION是为了让您熟悉每条指令的描述方式。该示例描述了您将在单个指令描述的每个部分中找到的信息类型,以及在哪里可以获得更多的信息。CLA指令遵循与C28x相同的格式;源操作数总是在右边,而目标操作数总是在左边。
6.2 寻址模式和编码
CLA访问数据、寄存器和主CPU一样,使用相同的地址。比如,主CPU访问地址为0x00 6800地址的ePWM寄存器,那么CLA将使用地址0x6800来访问。因为所有的CLA可访问的内存和寄存器都是低64k x 16内存,所有只低16位的地址用于CLA。
为了寻址CLA数据内存、消息RAM和共享外设,CLA支持两种寻址模式:
- 直接模式:直接使用变量或寄存器的地址。
- 带有16位后增量的间接寻址。该模式使用XAR0或XAR1。
CLA不使用数据页指针或者堆栈指针。
6.3 指令集
具体指令集见官方数据手册。