在进行复杂系统的架构开发时,架构师和设计师很少对设计的系统控制方面予以重视。最好的情况是,系统控制在整个系统的设计考虑中排第二位。而最坏的情况是直接被遗忘,直到设计后期,板上只有很小的空间能实现系统控制功能,也不可能再有时间来重新进行架构设计。
过去,设计师常常会使用一些方法来解决这些问题:请软件设计师想办法在软件中实现某些控制功能;在电路板上四处增加小的PLD,因为受到电路板空间限制而不得不忍受布局布线的不便和拥挤;或者,以时间进度为由,牺牲某些功能。这些方法听起来都不怎么样。我们需要一种方法,最大限度地减少电路板的面积和布线,同时减少微处理器的使用并且实现所需的功能。
CPLD和小型FPGA往往是这种情况下的首选解决方案。使用CPLD和FPGA,设计人员可以不再需要集中监测和控制,而更多的采用本地化控制和分配。创建一条通信路径,尽可能地减少中央处理器和分布的PLD之间的连接,将会是一个最接近理想的解决方案。幸运的是,串行外设接口(SPI)标准和内部集成电路(I2C)标准就是理想的低开销的通信路径,他们最初分别由Motorola公司和Phillips公司开发。这两个标准并非设计用于提供大多数数据路径所需的高吞吐量,但它们在监控和控制应用中表现良好,相比之下这些应用中的延迟问题不是那么重要。
将FPGA和CPLD的灵活性和这些低开销总线相结合,为系统设计师提供了大量的系统控制功能,同时最大限度地减少所需的电路板面积。
低速串行总线
从物理学和电气学的角度来看,SPI和I2C都是低开销的总线标准,一般从电路板实现的角度来看就很容易理解。I2C只需要两个信号来实现:SDA(数据线)和SCK(时钟线)。这些线路都是漏极开路,并要求端接上拉电阻。这些连线可以跨越多个主器件和从器件,如图1所示。该电路还需要的唯一一个额外要求就是使用适当的端接上拉电阻来处理线路电容。两线总线上的多个主器件的问题需要使用总线仲裁来处理消息冲突。但是使用一个简单的专用总线结构和一个主器件,这些问题就可以全部解决。
图1——典型的I2C连接
SPI是一个4线串行总线,由于总线上仅允许有一个主器件因而无需总线仲裁。此外,还有两个数据引脚,都不是真正的双向引脚。MOSI(主器件输出,从器件输入)线负责将数据发送给外设;MISO(主器件输入,从器件输出)负责将数据发送给主器件。时钟(SCLK)和从器件选择(SS)信号提供总线控制,它们都是由主器件驱动。虽然这种安排避免了总线仲裁的需要,但是需要使用更多的信号。
图2——典型的三个从器件的SPI总线
今天使用哪种串行总线方面的限制相对较少。截至2006年,NXP(原Phillips)不再需要许可证即可使用I2C协议。应当指出的是,获取I2C从器件地址仍需收取费用。然而,对于外设无需与外界通信的应用,这是没有必要的。而SPI是一个没有正式规范文档而被广泛使用的标准。然而,该标准已经在许多不同的嵌入式处理器中实现,由此看出虽然它没有正式规范文档,但是并未阻碍其广泛使用。
低开销的I2C和SPI两种标准被广泛采用并且集成到微控制器和外设中。
系统监测和控制
单块电路板上的应用监测和控制相对比较简单。复位、中断线路和选择线路可以直接由微控制器或本地PLD控制。然而,在多块电路板的系统中则需要进行集中控制,因而尽量减少连接的数量是很重要的。这可以通过使用低开销的串行总线与PLD进行通信来实现,如图3中所示。
图3——将PLD用作一个串行IO扩展器
接下来就需要一个协议,定义从微控制器到外部PLD的数据流的指令和寻址机制。对于基于SPI的实现,无需太多担心。SPI不需要数据流中的任何信息进行寻址,因为SS和SCLK信号已经根据协议提供了控制寻址。因此,用户只需控制整个数据有效载荷的传输。
外部PLD的I2C实现稍微复杂一些。首先,在将数据传输到总线上之前,要对器件寻址,必须识别出这个PLD。这种差异正是选择这两种串行总线架构时需要考虑权衡的地方:SPI架构不需要一个指令翻译器来寻找到特定的从器件,但比I2C结构需要更多引脚。
远程故障记录
考虑到外部的非易失性存储器成本低,以及便于通过串行总线如I2C或SPI接口进行连接,将外部非易失性存储器与PLD结合使用,可以为用户提供极具成本效益的方式来实现系统中的远程故障记录管理。图4显示了一个典型的系统应用,不仅使用了之前重点介绍的IO扩展功能,也说明了怎样将外部存储器纳入系统架构中使用。
图4——远程故障记录
在这个架构中,PLD主要负责监测、控制和与微控制器通信。然而,它也负责执行线路上额外的监测/控制分析和故障信息记录,通过串行总线写入非易失性存储器。电压监控、看门狗定时器和PCB上的其他故障条件可以通过PLD写入非易失性存储器。通常情况下,检测到故障后,系统中其他监控器的状态,如温度和电压以及时间信息将被保存。
应当注意的是,这样一个系统在实现时有一个重要的考虑。如果PLD是外部非易失性存储器的主器件,那么它还需要决定串行总线的控制和寻址。这个决定对于使用SPI总线而言很容易;设计师必须实现一个从SPI器件,与微控制器进行通信,以及一个独立的主SPI器件,可以访问外部存储器。
对于I2C总线,设计师有几个选择。第一种选择是设计类似SPI那样的设计,使用一个从器件与微控制器通信,以及一个主器件访问外部存储器。第二种选择是使用PLD,同时作为主器件和从器件。这种方法的好处是,系统中只有一条串行总线,因此微控制器可以直接访问非易失性存储器,而无需PLD翻译指令然后从存储器中读取信息。然而,由于不是在PLD中简单地使用一个从器件,现在设计必须处理寻址和总线控制。
传感器和外设汇聚
基于串行接口的标准产品的数量日益增长。你可以在温度传感器、压力传感器、A/D转换器、数字电位器、实时时钟和LCD控制器等等应用中找到串行接口,这里仅列举了几个来说明。要了解如何将这些集成到设计中的关键是要知道哪些外设需要“实时”使用以及“实时”意味着什么。举例来说,在系统中温度是一个相对缓慢变化的对象,并可以很容易地通过串行总线监控。用于电流或电压检测的A/D转换器可能是也可能不是一个“实时”需求,这要根据正在测量的内容,以及需要多快的检测速度而定。
一旦你已经确定了外设的优先级,然后你可以将较低优先级的外设让PLD处理,减轻处理器的负担,如图5所示。
图5——传感器汇聚示例
在上面的例子中,微控制器只需与2个而非4个外设进行通信。
这种安排还有另外一个好处。你可以使用一个功能强大的PLD来预处理数据,然后由微控制器读取。例如,请考虑一个应用,使用A/D采样测量一个三相电力系统的电压和电流,并进行故障检查。一个拥有强大DSP功能的PLD可以代替DSP或微控制器执行RMS计算、峰值电流分析、相位计算和FFT。现在采样速率受到PLD收集样本和处理数据所需时间的限制。然后,微控制器可以读取编译的数据,将更多的时间用于处理控制和报告工作。设计师们应该好好考虑微控制器处理能力、PLD处理能力、成本和空间之间的权衡。
下一步:集成
鉴于这些串行总线与小型可编程逻辑器件相结合使用的实用性,下一步将是将至少一种串行总线标准(如果不能兼顾)集成到PLD中。这种集成降低了PLD解决方案的成本和功耗。此外,串行总线接口的编码不再是设计师需要解决的问题。设计师只需要处理他们的应用和逻辑要求,而不是集成一个开放的核。
莱迪思半导体公司提供的最新的CPLD就可以为设计师带来这些优点。MachXO2™系列中的嵌入式功能块(EFB),包含预先设计的解决方案,可以用来实现上面所述的任意系统控制功能。MachXO2器件包含一个SPI控制器以及2个I2C控制器。所有串行总线控制器都可以配置为主或从器件。此外,MachXO2还为设计师们提供了一个定时器/计数器块以及少量的用户可访问的闪存(UFM)。
除了上面提到的解决方案,串行总线与PLD相结合可以为系统提供其他的好处,即使有时它们在架构设计过程后才显现出来。它们并不是所有弊病的灵丹妙药,但它们在设计中的实用性是有据可查的,有无数的开源核和设计方案可以给予不同的架构设计师们指引,实现最佳的解决方案。