美国思科公司总裁约翰·钱伯斯他在谈到新经济的规律时说,现代竞争已“不是大鱼吃小鱼,而是快的吃慢的。”在现代竞争中,效率有着决定性的作用。
做嵌入式开发的工程师都知道,一旦产品需要量产,批量生产的烧录器必不可少。在调试阶段,工程师可以用串口下载来实现代码的烧录,如果用串口进行生产,工厂是绝不会允许的,因为效率实在太低。
烧录器的功能,主要对非易失性的存储器进行操作(MCU内部Flash也都是各类非易失性的存储器)。这些存储器通常都需要擦除、编程和校验。这些基本操作和一些控制设置操作,是烧录的主要内容。
通常情况下,这些操作都是依次执行的,先擦除,擦除完成后,对存储器进行加电编程,编程完成后,再对编程的部分进行校验、对比。这些步骤都是环环相扣,一步一步实现的,串行的处理效率是很低的。正如,一个人处理一件事忙不过,那么两个人三个人一起来呢,效率立即提高3倍。
一步一步实现的方式,就是目前市面上很多山寨烧录器的做法,效率低下。
图1山寨的烧录器
专业烧录器厂商,不仅提高烧录时的工作频率,而且命令之间也尽量提高并行度,以达到效率最大化。
稍微思考下,就会发现,烧录器在编程过程中是按照这样一个顺序执行的:从上位机取命令数据→命令解析→执行。这个过程是一个按顺序循环执行的,对应的操作为取指、译码和执行,解释如下:
取指----从命令FIFO中取出指令。
译码----根据指令,产生对应的控制信号。
执行----执行擦除、编程或者检验操作,或者设置相关参数。
如果没有采用流水线技术,时空图如图2所示。
图2无流水线时空图
从图2可知,每条命令都要经过取指、译码和执行后才能进行下一条命令,这严重影响系统的效率。最致命的是,取指、译码和执行都不能同时工作,只有完成取指之后才能译码,译码之后才能执行。
因此,烧录器做出了改变,采用了“流水线”技术。根据编程器的操作步骤,可以把工作流程分为取指、译码和执行三部分,每一部分负责自己的工作。这样不仅细化了整个工作流程,而且能够使三部分同时工作,从而提高了并行度,进而提高了工作效率。在FPGA硬件实现上,这三部分分别对应三个电路,并且在它们之间都插入寄存器组,组成三级流水线,如图3所示。这样,在每个时钟周期下,取指、译码和执行部分同时使用上级传下来的数据工作,并且在下一个周期把结果传给寄存器以供下一级电路使用。在这个过程中,寄存器起到了暂存结果的作用。
图3 流水线电路示意图
采用流水线技术的时空图如图4所示。
图4流水线时空图
从图4中可知,相关的命令执行在时间上是交叠在一起的,也就是说三条命令同时工作(经过首次延迟之后)!比如,在时刻T4,指令N+3在取值,指令 N+2在译码,指令N+1执行。值得注意的是,在某一时刻,它们虽然同时工作,但操作的都不是同一条指令。另外,在每个周期,都有一条命令在“执行”,也就是说一个周期产生一个结果,而无流水线技术需要3个周期才有一个结果,相比之下,工作效率提高了3倍。可喜的是,流水线技术会提高频率上限。
在FPGA设计上,需要估算取值、译码和之下三部分的延时,尽量做到它们之间的延时相等或者接近,才能发挥流水线的优势。另外,理论上,流水线级数越多,工作频率越快,效率相对也高。