PLD和数据通路来释放微控制器中CPU资源
扫描二维码
随时随地手机看文章
本文介绍了一种采用PLD和数据通路(datapath)来解放微控制器系统中CPU任务的方案。在大多数微控制器结构中,智能的CPU身边总会环绕着一系列不可编程的外设。外设的功能有限,通常它们只负责数据形式的转换。例如,I2C外设只是实现串行和并行数据格式之间的转换,而ADC则实现模拟到数字信号的转换。CPU因此不得不完成所有的数据处理工作,实际上它还能做些更有用的事情。此外,管理外设将会导致CPU固件异常复杂,并可能需要一个快速高效的CPU在实时的时序限制下执行这些固件。这又会导致更多的潜在程序漏洞,从而需要使用更复杂和昂贵的调试设备等。
但是如果外设具备足够的复杂度、灵活度与智能,是否能有效地减轻CPU的许多任务呢?本文将展示如何把智能、灵活、低成本、可定制的数字外围设备设计到微控制器并配置,以帮助实现稳定的分布式系统设计。
智能逻辑选择—PLD还是数据通路?
通常有两种方法构建一个智能的可配置外设。首先是使用PLD。如图1所示,PLD有一个驱动若干宏单元的积和(sum of products)逻辑门阵列。“T”和“C”符号表示每一个乘积项都能产生一个真值或补数(反向)输出,这样无论是正、负逻辑都可以支持。
图1:一个PLD实例(包括12个输出项、8个乘积项、4个宏单元)。
图1显示了一个简单的PLD例子。PLD可以有成百上千的宏单元,每个宏单元最高由16个乘积项驱动。乘积项里的与门和或门可以互联形成高度灵活的定制逻辑功能。宏单元是典型的时钟架构,它们的输出可以反馈到乘积项阵列,因此允许创建状态机。
大规模PLD可以用来形成复杂的逻辑功能,甚至是完全的CPU,因此PLD当然可以用来实现智能数字外设。然而,很多门可能只是实现诸如计数器或加法器等简单的逻辑功能,但对于更复杂功能的实现,基于PLD的方案就会变得很贵。从某种程度上说,使用真正的CPU会更合理。
CPU的一个非常简单的形式是基于算术逻辑单元(ALU)的数据通路,也称为纳米处理器(nano-processor)。数据通路只是实现几个常用函数,但会比使用PLD实现的效率更高。图2:显示了一个基于ALU的简单的数据通路。典型的ALU可以进行各种操作,通常是8位操作:向上计数(递增)、向下计数(递减)、加、减、逻辑与、逻辑或、逻辑异或,左位移、右位移。这里有两个8位累加器,它们能够为ALU输出充当输入数据寄存器或存储器。一个输入时钟信号沿产生一次操作。函数选择寄存器用来控制:
图2:基于ALU的数据通路。
* 产生什么操作。
* 该操作的源寄存器。
* 输出的目的寄存器。[!--empirenews.page--]
根据数据通路的具体设计,其可能会做一系列复杂操作,如表1显示。
表1:数据通路函数的实现举例。
这个函数选择模块实际上可以是一个小容量的SRAM,预加载所需的函数选择位,SRAM的地址线可以用来选择运行哪个操作。最后,多数据通路可以用进位和移位信号链在一起,以便可以进行多字节操作数。
由于数据通路只有少数特定功能函数,很容易优化设计,因此其创建成本较低。然而,对于实现复杂的逻辑,数据通路远远没有PLD那么灵活。那么,对于创建智能、灵活、低成本的数字外设来说,哪一种方法是更好的呢?是PLD还是数据通路?答案是,将两者相结合。下面是一个实例,来看看是如何实现的。
通用数字模块
同时使用PLD和数据通路的系统实例是赛普拉斯半导体的PSoC3和PSoC5芯片。每个系统包含最高24个通用数字逻辑子系统,称为通用数字模块(UDB),其结构如图3所示。一个UDB包含两个图1所示的PLD,一个数据通路以及状态机和控制寄存器。有两个链路路径,一个用于PLD,一个用于数据通路。由一个路由通道来连接各UDB子块之间以及UDB之间的信号。PLD配置、数据通路和路由通过写入UDB配置寄存器来实现。
UDB的PLD设计在图1中进行了描述。如图4,UDB数据通路类似于图2所示的基本的数据通路,但是它更精密复杂,因为拥有更多寄存器和更多的功能。
图4:UDB数据通路框图。
* 8位ALU可以实现所有的七个基本函数—递增、递减、加、减、与、或以及异或,并且它有单独的位移和位掩码模块来进行ALU结果后处理(8位ALU传输功能只需通过ALU传送一个值到位移和位掩码模块)。位移模块可以做左位移、右位移、半字节交换和传输。掩码模块可以和单独的掩码寄存器里的内容逐位相与(图中未显示)。
* 操作可以使用两个累加器(A0,A1)和两个数据寄存器(D0,D1)来完成。两个FIFO寄存器(F0、F1)可用来在数据通路和CPU之间传输数据。FIFO深度可达4字节。这一结构可以使多任务处理变得简单;在不同的时间,独立操作可以在寄存器子集完成。例如,A0、D0、F0可以用于一个任务,而A1、D1、F1则可用于不同的任务。
* 广泛的状态条件(例如:比较、零检测、所有个体检测、溢出检测)可以应用到累加器,数据寄存器,以及路由到器件其它地方。[!--empirenews.page--]灵活的路由
虽然UDB在PLD和数据通路两个子系统都有很多特色,但广泛的数字路由让它们如虎添翼。信号可以在PLD和数据通路之间路由,遍及整个UDB和器件的其它地方,形成了复杂的数字系统互连(DSI)结构。
实例
本例中,用一个UDB数据通路来创建一个带重载(reload)功能的8位数字计数器。为了实现这点,连接一个状态条件回到控制存贮SRAM地址线,如图5所示。
图5:用UDB数据通路创建带重载功能的计数器。
在这个设计中,A0是计数寄存器,D0是重载寄存器。需要两个函数,一个用来递减计数,一个从周期寄存器重载计数器;这些函数在控制储存RAM里预载了。
逻辑如下:当A0不为0时,状态输出将会变低,在地址0会执行递减操作。当A0为0时,状态输出将为高,在地址1会执行重载操作。
所有操作都发生在时钟输入的上升沿,可以记录时钟沿数量。时钟输入可以来自各种时钟源。状态输出可以通过DSI路由,包括到DMA和中断请求输入。使用数据通路链和掩码模块,该计数器的大小可以是任何位数,不受限于8的倍数。
图5所示为减法计数器。它可以很容易的转换成加法计数器,可以通过使用不同的状态输出(A0= =D0)和控制存储SRAM里的不同函数:A0=A0+1和A0=A0A0。异或任何值的结果永远为0。
通过使用PLD这个简单的设计可以创造更复杂的应用。以一个红绿灯控制器为例,红绿灯控制器周期由绿、黄、红三种状态构成,因此需要一个状态机。每个状态变化到下一个状态之前会持续一定时间,所以必需有一个计数器。为了简单起见,假设“绿灯”时间和“红灯”是相同,但“黄灯”时间不同。
只需要使用3个数据通路寄存器(假设为8位计数值)就可以实现这个时序结构。A0为计数寄存器,D0为“绿”和“红”状态保持计数器重载值,D1为“黄”状态保持计数器重载值。模块框图如图6显示。
图6:采用UDB PLD和数据通路构建的红绿灯控制器框图
要保存在控制存储RAM里的操作是:
A0 = A0 - 1 // 计数
A0 = D0 // 重载“绿”或“红”
// 计数值
A0 = D1 //重载“黄”值
状态机在PLD里实现。数据通路条件输出反馈到PLD,以表明需要改变状态了。PLD也有这样的逻辑,根据当前的状态和从数据通路反馈的信号,控制执行哪个数据通路操作和哪个灯要点亮。
超越基础
红绿灯控制器是一种简单的应用类型,通常使用CPU编程。然而,我们已经看到,除了初始化代码,这个功能可以完全和CPU没关系而可以由智能的可配置外设完成。这个功能可以很容易地扩展以支持附加需求,例如转换信号、行人行走信号、车辆检测传感器、流量/紧急事件转发器。
[!--empirenews.page--]CPU需要做什么
通过使用PLD和数据通路的有效组合,可以创建智能的、灵活的、低成本的外设,以减轻CPU的负担。然而,如果这么多的功能都由外设处理了,那还留着CPU做什么呢?在许多情况下,CPU不需要做很多事,在某些情况下系统初始化后,CPU就可以关掉了。不过,更实用的方案是使用CPU做CPU能做得最好的事情,例如:
* 复杂的计算
* 字符串和文本处理
* 数据库管理
* 通信管理
* 系统管理
例如,在我们的红绿灯应用中,CPU可以用于以下几个方面:
* 检测车辆闯红灯
* 使用相机拍摄牌照
* 从照片上提取车牌文字信息
* 从国家数据库中查阅车主信息,以及向车主发送罚单