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如下:
参考上述说明,以下适用于延迟条件指令:
(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。
- ; I1 Last instruction that can affect flags for
- ; the branch, call or return operation
- ; I2 Cannot be stop, branch, call or return
- ; I3 Cannot be stop, branch, call or return
- ; I4 Cannot be stop, branch, call or return
- ; MBCNDD, MCCNDD or MRCNDD
- ; I5-I7: Three instructions after are always
- ; executed whether the branch/call or return is
- ; taken or not
- ; I5 Cannot be stop, branch, call or return
- ; I6 Cannot be stop, branch, call or return
- ; I7 Cannot be stop, branch, call or return
- ; I8
- ; I9
- ....
- 停止或暂停任务: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)
- ; I1 Will use the old value of MAR0 (50)
- ; I2 Will use the old value of MAR0 (50)
- ; I3 Cannot use MAR0
- ; I4 Will use the new value of MAR0 (20)
- ; 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 指令集
具体指令集见官方数据手册。
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如下:
参考上述说明,以下适用于延迟条件指令:
(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。
- ; I1 Last instruction that can affect flags for
- ; the branch, call or return operation
- ; I2 Cannot be stop, branch, call or return
- ; I3 Cannot be stop, branch, call or return
- ; I4 Cannot be stop, branch, call or return
- ; MBCNDD, MCCNDD or MRCNDD
- ; I5-I7: Three instructions after are always
- ; executed whether the branch/call or return is
- ; taken or not
- ; I5 Cannot be stop, branch, call or return
- ; I6 Cannot be stop, branch, call or return
- ; I7 Cannot be stop, branch, call or return
- ; I8
- ; I9
- ....
- 停止或暂停任务: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)
- ; I1 Will use the old value of MAR0 (50)
- ; I2 Will use the old value of MAR0 (50)
- ; I3 Cannot use MAR0
- ; I4 Will use the new value of MAR0 (20)
- ; 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 指令集
具体指令集见官方数据手册。
举报