DSP F2803x中CLA模块介绍

DSP之CLA模块

1 概述

控制律加速器通过添加并行处理扩展C28x CPU的功能。由CLA服务的时间是关键的控制回路,可以实现ADC采样到输出的低延迟。因此,CLA能够实现更快的系统响应和更高的频率控制环路。将CLA用于时间是关键的任务,可以释放主CPU,进而并发地执行其他系统和通信功能。

以下是CLA的主要特性:

  1. 时钟频率和主频一致(SYSCLKOUT)

  2. 有一个独立的架构,允许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. 指令集包括:

    3.1 IEEE单精度(32位)浮点数学操作

    3.2 并行加载或储存的浮点数学

    3.3 并行加法或减法的浮点乘法

    3.4 1/X和 1/sqrt(X) 估算

    3.5 数据类型转换

    3.6 条件分支和调用

    3.7 数据加载/数据存储操作

  4. CLA程序代码可以由多达8个任务或中断服务程序组成:

    4.1 由MVECT寄存器指定每一个任务的起始地址

    4.2 对任务大小没有限制,只要任务适合CLA程序内存空间

    4.3 每次服务一个任务直到完成。没有任务的嵌套

    4.4 当任务完成时,将在PIE中标记一个特定于任务的中断

    4.5 当一个任务完成时,下一个优先级最高的挂起任务将自动启动

  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. 内存和共享外设:

    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模块保护。

  1. CLA程序内存

    CLA程序可以被加载在指定的存储块。在复位状态下,所有的存储都被映射到CPU。在被映射到CPU空间,CPU可以将CLA程序代码拷贝到对应储存器。在debug调试时,可以通过CCS直接加载到存储器中。

    一旦存储器被CLA代码初始化,CPU就可以通过设置MMEMCFG寄存器的PROGE位来将存储器映射到CLA程序空间

    当一个存储模块被配置为CLA程序存储模块,debug调试访问只允许在CLA没有获取新指令的周期内进行。

    所有CLA程序的获取都是作为32位读操作执行的,所有操作码必须对齐到一个偶数地址。因为所有CLA操作码都是32位的,所以这种对齐是自然发生的。

  2. CLA数据内存

    指定的内存位置可以作为CLA的数据内存块。在重置时,所有块都映射到CPU内存空间,因此CPU可以用数据表、系数等初始化内存,以便CLA使用。

    一旦内存被CLA数据初始化,CPU通过设置相应的MMEMCFG[RAMxE]位将其映射到CLA数据空间。

    当将内存块配置为CLA数据内存时,CLA的读写访问将与CPU访问一起进行仲裁。用户可以选择通过写入适当的MMEMCFG[RAMnCPUE]位来打开CPU取或者写内存保护。

  3. 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将在之前的偶数地址上开始读或者写。这种对齐不影响有地址通用逻辑产生的地址值。

  1. CLA程序总线

    CLA程序总线具有2048条32位指令的访问范围。因为所有的CLA指令都是32位的,因此这条总线上总是一次获取32位,操作码必须偶字对齐。可用的程序空间数受限于分配的内存快数。该内存快数各个设备不同,具体需要查对应的数据手册。

  2. CLA数据读总线

    CLA的数据读总线大小为64K x 16范围。总线上可以执行16位或者32位读操作,并且如果存在内存访问冲突,则自动停止。数据读总线可以访问消息RAM、CLA数据内存和共享外设。

  3. 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优先级最低。

一个任务可以由外设中断或者软件来请求,具体如下:

  1. 外设中断触发

    每一个任务都可以由软件设定的中断源来触发。每个任务的触发是通过给MPISRCSEL1寄存器中的PERINTnSEL位写入正确的值来确定。每个选项指定一个由共享总线上的指定外设确定的中断源。具体中断触发见手册。

    比如,任务1(MVECT1)可以通过给MPISRC1SEL寄存器中的PERINT1SEL位写入2,从而设定EPWM1_INT触发该任务。为了禁止任务由外设触发,用户必须配置MPISRC1SEL寄存器中的PERINTnSEL位为“No interrupt source”。

  2. 软件触发

    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)的最高优先级的中断请求将会开始。流程如下:

  1. 置位关联的RUN寄存器位(MIRUN),清除标志位(MIFR)。
  2. CLA在关联的中断向量(MVECTx)的位置开始执行。MVECT包含任务在较低的64K内存空间中的绝对16位地址。
  3. CLA一直执行指令,直到MSTOP指令。该MSTOP指令表示任务的结束。
  4. 清除MIRUN位
  5. 向PIE发出特定于任务的中断。这通知主CPU任务已经完成。
  6. CLA空闲

一旦任务完成,下一个优先级最高的挂起任务将自动得到服务,并重复此顺序。

3 CLA和CPU仲裁

3.1 CLA和CPU仲裁

CLA是独立于CPU运作。当出现CLA和CPU都想访问内存和外设寄存器情况时,就会发生仲裁。仲裁可以使得当CPU和CLA同时读取ADC结果寄存器时,不会出现矛盾。

可能发生访问冲突的接口有:

  1. CLA消息RAM
  2. CLA程序内存
  3. CLA数据RAM

3.1.1 CLA消息RAM

消息RAM包含两个快。这两个快用于在CPU和CLA只见传递数据。不允许从消息ram中获取操作码。消息RAM具有如下特征:

  1. CLA到CPU的消息RAM

    允许如下访问:

    (1) CPU读取

    (2) CLA读取和写入

    (3) CPU调试debug读取和写入

    如下操作会被忽略:

    (1) CPU写入

    访问优先级:

    (1) CLA写入

    (2) CPU调试debug写入

    (3) CPU读取、程序读取、CPU调试debug读取

    (4) CLA数据读取

  2. 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空间。

  1. MMEMCFG[PROGE] == 0

    这种情况下是映射到CPU的。CLA将被悬挂,并且此时没有CLA任务要执行。

    (1) 任何CLA获取将被认为是非法操作。如果遵循正确的过程来映射程序内存,则不会发生这种情况。

    (2) CLA读取和写入都不会发生

    (3) 内存块的行为就像任何普通RAM块映射到CPU内存空间

    访问优先级如下:

    (1) CPU数据写入、程序写入、调试debug写入

    (2) CPU数据读取、程序读取、调试debug读取

    (3) CPU获取、程序读取

  2. 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空间。

  1. MMEMCFG[RAMxE] == 0

    这种情况下内存快映射到CPU

    (1) CLA不能获取该内存快

    (2) CLA读取返回0

    (3) CLA写入被忽略

    (4) 内存快和其他普通RAM块一样映射到CPU内存空间

    反问优先级如下:

    (1) CPU数据写入、CPU程序写入、debug调试写入

    (2) CPU数据读取、debug调试读取

    (3) CPU获取、程序读取

  2. 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)

访问寄存器遵循如下规则:

  1. 如果CPU和CLA同时访问,那么CLA优先,CPU停止工作。

  2. 如果已经有一个CPU访问操作正在进行了,并且另一个CPU访问操作准备进行,此时CLA相比准备进行的CPU访问操作的优先级高。这种情况下,CLA访问将开始于当前CPU访问完成。

  3. 已经有了一个正在进行的CPU访问,那么任务将要进行的CLA访问就要暂停。

  4. 已经有了一个正在进行的CLA访问,那么任务将要进行的CPU访问就要暂停。

  5. CPU写入操作相比CPU读取优先级高。

  6. CLA写入操作相比CLA读取优先级高。

  7. 如果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执行的,如下所述:

  1. 将CLA代码拷贝到CLA程序RAM中

    CLA代码的源代码最初可以在flash或来自通信外围设备的数据流中,或者主CPU可以访问它的任何地方。调试器还可以用于在开发期间将代码直接加载到CLA程序RAM中。

  2. 如有必要,初始化CLA数据RAM

    用任何需要的数据系数或常数填充CLA数据RAM。

  3. 配置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更新生效。

  4. 初始化PIE向量表和寄存器

    当一个CLA任务完成时,将标记PIE中关联的中断。CLA溢出和下流标志在PIE中也有关联的中断。

  5. 使能CLA任务/中断

    在中断中设置适当的位使寄存器(MIER)允许CLA服务中断。

  6. 初始化其他外设

    初始化将为启用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执行。

  1. 硬复位

    向MCTL[HARDRESET]位写入1将执行CLA的硬复位。硬复位的行为与系统复位(通过 X R S ‾ \overline{XRS} XRS或调试器))相同。在这种情况下,所有CLA配置和执行寄存器将被设置为默认状态,CLA执行将停止。

  2. 软复位

    向MCTL[SOFTRESET]位写入1将执行CLA的软复位。如果一个任务正在执行,它将停止并清除相关的MIRUN位。中断使能(MIER)寄存器中的所有位也将被清除,这样就不会有新的任务开始。

5 流水线

5.1 流水线概述

CLA流水线和C28x流水线类似,有八个阶段:

  1. 获取1(F1)

    在F1阶段,程序读取放在CLA程序地址总线上的地址。

  2. 获取2(F2)

    在F2阶段,使用CLA程序数据总线读取指令。

  3. 解码1(D1)

    在D1阶段,解码指令。

  4. 解码2(D2)

    生成数据读地址。对MAR0和MAR1的变化,由于使用间接寻址后增量发生在D2阶段。在此阶段,还会根据MSTF寄存器标志做出条件转移决定。

  5. 读取1(R1)

    将数据读地址放在CLA数据读地址总线上。如果存在内存冲突,R1阶段将被停止。

  6. 读取2(R2)

    使用CLA数据读取数据总线,以读取数据值。

  7. 执行(EXE)

    执行该操作。在这一阶段,由于从内存中加载一个或多个即时值而对MAR0和MAR1进行更改。

  8. 写入(W)

    将写地址和写数据放在CLA写数据总线上。如果存在内存冲突,W阶段将被停止。

5.2 流水线对齐

大多数CLA指令不需要考虑任何的注意事项。以下列出需要考虑流水线的操作:

  1. 写操作后的读操作

    在C28x和CLA流水线中,读操作发生在写操作之前。这意味着,如果一个写操作之后,立即跟着一个读操作,那么读取将会先完成。如下表所示:请添加图片描述

    在大多数情况下,这不会造成问题,因为一个内存位置的内容不依赖于另一个内存位置的状态。对于外设的访问,如果对一个位置的写操作可能影响到另一个位置的值,则代码必须等待写操作完成后才发出读操作,如下表所示:
    请添加图片描述

    即I1的W操作完成之后再进行I2的R1操作。

    这种行为对于28x CPU是不同的。对于28x CPU,对同一位置的任何写后读都被称为写后读保护。这种保护会自动停止流水线,以便在读之前完成写操作。此外,一些外围帧被保护,这样一个28x CPU写入帧内的一个位置总是在读取帧之前完成。CLA没有这种保护机制。相反,代码必须等待执行读取。

  2. 延迟条件说明: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。

  3. 停止或暂停任务:MSTOP和MDEBUGSTOP

    MSTOP和MDEBUGSTOP指令不能在一个条件分支、调用或返回指令(MBCNDD、MCCNDD或MRCNDD)之前或之后放置三个指令。参见例5-1。要单步通过分支/调用或返回,插入MDEBUGSTOP至少四个指令,并从那里步进。

  4. 装载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 指令描述

每条指令可能会提供以下信息:

  1. 操作数
  2. 操作码
  3. 描述
  4. 例外
  5. 流水线
  6. 距离
  7. 类似的

展示的示例INSTRUCTION是为了让您熟悉每条指令的描述方式。该示例描述了您将在单个指令描述的每个部分中找到的信息类型,以及在哪里可以获得更多的信息。CLA指令遵循与C28x相同的格式;源操作数总是在右边,而目标操作数总是在左边。

6.2 寻址模式和编码

CLA访问数据、寄存器和主CPU一样,使用相同的地址。比如,主CPU访问地址为0x00 6800地址的ePWM寄存器,那么CLA将使用地址0x6800来访问。因为所有的CLA可访问的内存和寄存器都是低64k x 16内存,所有只低16位的地址用于CLA。

为了寻址CLA数据内存、消息RAM和共享外设,CLA支持两种寻址模式:

  1. 直接模式:直接使用变量或寄存器的地址。
  2. 带有16位后增量的间接寻址。该模式使用XAR0或XAR1。

CLA不使用数据页指针或者堆栈指针。

6.3 指令集

具体指令集见官方数据手册。

6 指令集

本节描述控制律加速器的汇编语言指令。还描述了并行操作、条件操作、资源约束和寻址模式。这里列出的指令独立于C28x和C28x+FPU指令集。

6.1 指令描述

每条指令可能会提供以下信息:

  1. 操作数
  2. 操作码
  3. 描述
  4. 例外
  5. 流水线
  6. 距离
  7. 类似的

展示的示例INSTRUCTION是为了让您熟悉每条指令的描述方式。该示例描述了您将在单个指令描述的每个部分中找到的信息类型,以及在哪里可以获得更多的信息。CLA指令遵循与C28x相同的格式;源操作数总是在右边,而目标操作数总是在左边。

6.2 寻址模式和编码

CLA访问数据、寄存器和主CPU一样,使用相同的地址。比如,主CPU访问地址为0x00 6800地址的ePWM寄存器,那么CLA将使用地址0x6800来访问。因为所有的CLA可访问的内存和寄存器都是低64k x 16内存,所有只低16位的地址用于CLA。

为了寻址CLA数据内存、消息RAM和共享外设,CLA支持两种寻址模式:

  1. 直接模式:直接使用变量或寄存器的地址。
  2. 带有16位后增量的间接寻址。该模式使用XAR0或XAR1。

CLA不使用数据页指针或者堆栈指针。

6.3 指令集

具体指令集见官方数据手册。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值