例说FPGA连载52:NAND Flash实例之总线的概念 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc 关于总线,比较官方的说法是:总线(Bus)是计算机各种功能部件之间传送信息的公共通信干线。说到计算机,大家不要下意识的就以为只是特指每天我们都要面对的电脑。比较高端的计算机,火箭用的叫箭载计算机,卫星上用的叫星载计算机;稍微逊色一点的,工业上用的叫工控机,我们家里用的叫PC机、笔记本;而嵌入式用的计算机更是数不胜数了,PDD、GPS和手机,MP3、MP4和电纸书,电梯、冰箱和微波炉的电子控制部分,细细找找,发现生活中凡是涉及电的还真没有一样离得开“微电”的控制。提到控制,那么肯定或大或小有个CPU,一旦和CPU搭上边好歹也要算个小型计算机了。计算机不仅有CPU,还需要有各种外设配合CPU与外界通信,那么CPU与外设之间的通信靠什么,总线?YES,虽然不是每一个系统中都要有总线,但凡大一点的系统都会有总线,因为总线能够很好的衔接管理各个外设与CPU之间的通信,能够简化硬件电路设计和系统结构。所以,废话了这么多,你该领悟总线很重要了吧。 光说重要你肯定感觉不过瘾,要打破沙锅问到底,总线到底如何工作?如何连接CPU和外设? 广义上来说,任何衔接多个外设甚至是多个相同外设的一组信号都可以称为“总线”,比如CAN总线、USB总线、IIC总线等等。但在这里所论述的总线,主要是针对CPU与外设之间的总线。在嵌入式系统应用中,最简单也许大家都接触过的有INTEL总线和MOTOROLA总线。这两类总线最初应用于INTEL和MOTOROLA 两家公司生产的处理器,最为典型的是早期的PC系列处理器如INTEL的8086和MOTOROLA的MC6800,以至于后来的很多单片机乃至外设芯片的并口通信都能够兼容这两种模式的总线。为了更好的理解总线的概念,不妨让我们看看这两种总线的工作机制。如图6.4和图6.5所示,是一颗支持与单片机的INTEL和MOROROLA接口连接的芯片的读写时序图。习惯上,大家一谈到8080总线就认定是INTEL总线,6800总线也就是MOTOROLA总线。从这两个时序图上,我们看到的区别恐怕主要是读写选通的区别。INTEL总线分别使用读选通信号RD#和写选通信号WR#两个信号的低电平状态来表示当前处于读或写选通状态。而MOTOROLA总线则只使用一条RW#信号来表示当前的读写状态,当总线选通期间,若RW#为高电平则表示读状态,低电平则为写状态。除此以外,规范的INTEL总线和MOTOROLA总线在地址和数据总线的使用上也是有所区别的。 另外,我们需要从这两个时序图中看到一个基本的“总线雏形”。也就是说,一条规范的总线,无外乎控制信号(有时候我们也习惯的称之为控制总线,但是此总线非彼总线,大家注意区分)、地址信号、数据信号这三类信号组成。如INTEL总线的控制信号主要有片选信号CS#、写选通信号WR#、读选通RD#和地址/数据选择信号RS,他们的功能就是用于指示当前的总线处于怎样的状态——是正在读取数据、正在写入数据、正在写入地址还是闲置中。他们的地址信号和数据信号是复用(很多总线的地址和数据信号不是复用的,如Avalon总线就是分离的)的,即时序图中的DB[15:0]。在一次读写操作中,如果RS为高电平,则表示当前操作为命令的读或写;如果RS低高电平,则表示当前操作为数据的读或写。 图6.4 INTEL总线时序图 图6.5 MOTOROLA总线时序图 INTEL总线和MOTOROLA总线在嵌入式系统中仍大行其道,甚至于随处可见,不信你可以随便download个芯片的datasheet看看。对我们的学习而言,认识一条总线的目的不在于领会总线本身的工作机制而已,尤其是要成为一名FPGA工程师,我们常常要和底层的硬件打交道。因此,我们学习的最终目的是学以致用。在笔者所著的《深入浅出玩转FPGA》笔记8的“单向控制信号检测”小节里就讲述了一种用FPGA逻辑来设计INTEL/MOTOROLA总线的从机。 其实上面提到的INTEL总线和MOTOROLA总线是CPU和外设数据交互的一种方式,在硬件工程师的板级设计中看得到固定信号连接的通信方式。而在我们后面将要重点讨论的这种CPU与外设的互连总线却是硬件工程师在PCB板上看不到的。也就是说,我们这里的外设不在“外”而在“内”,这些外设是集成在CPU内部的,而CPU内部的总线互连架构是板级设计的工程师们无法直观看到的。但是作为Qsys系统架构的工程师,我们就必须深入的研究这些互联总线的工作机理。毕竟,完全DIY出来的Qsys硬件系统中所有的组件都是我们根据系统需求精挑细选出来的,那么他们之间的衔接和数据交换也必须是我们能够去“设计”的一部分。 先不讨论在Altera的Qsys平台主流的Avalon总线,我们可以去研究一下ARM7系统中常见的内部系统总线是什么样的。如图6.6所示,这是NXP公司推出的一款内嵌ARM7TDMI-S内核的控制器内部功能框图。 图6.6 ARM芯片内部功能框图 在这个框图里,我们不是很关心它都集成了哪些外设,而是要看看它的处理器内核与其他外设以及外设与外设之间是如何互连的。简单的看,从内核引出的两条总线分别是Local bus和Advanced high-performance bus(AHB),Local bus即本地总线上挂靠的都是一些实时性要求最高、数据吞吐量最大的“外设”。毫无疑问,在一个系统中,这种实时性最高、数据吞吐量最大的“外设”非存储器莫属,因为程序运行、数据变量读写都要频繁的访问ROM或RAM。除此之外,我们也看到有一个高速GPIO模块也“运行”在这条“高速公路”上,该款芯片特别的增强了GPIO的性能,那一定是为满足一些特定的应用需求而设计的。除了存储器,其实这条高速总线是可以挂靠任何符合总线通信规范的外设组件的,但是一旦这条“高速公路”的“车”多了,就不可避免的发生拥堵,那么所谓“高速”就名不副其实了。 那怎么办,系统还有一大堆外设需要挂靠呢?不是还有一条AHB总线吗,这也是一条高性能总线,虽然可能和本地总线比还是要差点。这条总线上挂着一个中断向量控制器(VECTORED INTERRUPT CONTROLLER)和一个桥(AHB TO APB BRIDGE)。无疑的,系统的中断需要第一时间得到响应,因此它也就被挂在离处理器内核最近的总线上。最后来看那个AHB2APB桥,我们知道一般的嵌入式外设速度都不高,因此在这个系统内部,就把所有余下的外设组件都挂在了一条叫做APB的总线上,而这条APB总线最终也是需要挂在与CPU直接相连的AHB总线上。那么,AHB2APB桥所做的就是连接APB总线和AHB总线,并且它还要像CPU本身一样作为APB总线的主机,来统管各个外设。 费了这么些篇幅,好歹我们讲到CPU内部的片上总线了。除了ARM7上流行的AMBA总线外,还有Silicore的WISHBONE总线(很多开源设计都采用此总线)、IBM的CoreConnect总线,然后就是Altera的Avalon总线。不同总线各有特点,适用范围也有不同。Avalon总线就是Altera公司主推的应用于其软核处理器NIOS II上的总线,主要包括Avalon-MM总线和Avalon-ST总线,下面我们就去认识他们。 基于NIOS II处理器的片内系统互连主要靠的就是Avalon-MM总线和Avalon-ST总线。如图6.7所示,一个典型的NIOS II系统,NIOS II处理器和各外设之间通过Avalon-MM总线进行交互,而外设之间的点到点数据传输则可以通过Avalon-ST总线来完成。Avalon-MM (Avalon Memory Mapped Interface)总线是一种基于地址读写的主从互连的机制。Avalon-ST(Avalon Streaming Interface)总线主要应用于单向数据流传输,可以完成点到点的大数据量吞吐。另外也略带提一下,在Avalon总线规范里,还有Avalon-MM Tristate和Conduit接口。前者主要是Avalon-MM的一个扩展,也可以理解为它是Avalon-MM的一个“集线器”,对一个Avalon-MM从机进行复用,这样做的好处是减少从机接口的数量,用一套总线信号就可以挂接多个从机。比如在接口信号的数量紧张时,尤其是连接到FPGA外部引脚上的多个存储器(如图中的SRAM和FLASH),此时就可以复用到一个Avalon-MM Tristate接口上。而Conduit接口则是Avalon-MM从机引出的可以连接到FPGA其它逻辑模块或是FPGA外部引脚上的信号接口。 图6.7 典型NIOS II系统
|