片上总线Wishbone 学习—— 转载请注明出处:http://blog.csdn.net/ce123

来源:互联网 发布:java 将日期格式化 编辑:程序博客网 时间:2024/06/06 05:06

片上总线Wishbone 学习(零)前言

          声明:版权所有,欢迎转载!
                   转载请注明出处:http://blog.csdn.net/ce123

            为了更加升入的理解片上系统,比如S3C2440等,今天开始学习片上总线。首先学习Silicon的Wishbone,之后学习ARM的AMBA。之所以先学习Wishbone,主要是因为Wishbone是一个轻量级规范,适合入门学习。

片上总线Wishbone 学习(一)片上总线综述

1 引言

         传统的IC设计方法已无法适应新的SoC设计要求,需要根本的变革,即从以功能设计为基础的传统IC设计流程转变到以功能整合为基础的SoC设计全新流程。SoC设计以IP的设计复用和功能组装、整合来完成。SoC设计的重点为系统功能的分析与划分、软硬件功能的划分、IP 的选择与使用、多层次验证环境和外界设计咨询服务等。随着以IP核复用为基础的SoC设计技术的发展,如何有效地对众多IP供应商提供IP核,在实际设计时进行有效互联的问题日益受到重视。为了使IP核集成更快速、更方便,缩短进入市场的时间,迫切需要一种标准的互联方案。在这一背景下产生的片上总线OCB(on-chip bus)技术,基于IP 核互联标准技术的发展,目前已形成较有影响力的三种总线标准为:IBM公司的CoreConnect,ARM 公司的AMBA(Advanced MicrocontrollerBusArchitecture)和SilicoreCorp公司的Wishbone。

2 片上总线与板上总线的差异

            ①片上总线多采用单向信号线,而板上总线多采用三态信号。片上三态总线无论在功耗、速度、可测性上都存在很大缺陷,而且一旦出现多驱动情况便会损毁芯片(比如若应该输出"Z"的信号实际输出为"1",而另有一个信号输出为"0",就形成一个低电阻通路,导致局部电流过大,热量难以及时释放,从而增加芯片功耗和大大降低芯片寿命)。由于片上布线资源较为丰富,因此片上总线多采用单向信号线。由于电路板上布线资源较为昂贵,因此板上总线多采用三态总线,但是由于三态总线的功耗问题和速度限制,目前板上总线也在向串行和非三态方向发展,如USB 和PCI Express。
           ②片上总线比板上总线更加简单灵活。首先片上总线结构要简单,这样可以占用较少的逻辑单元;其次时序要简单,以利于提高总线的速度;第三接口要简单,如此可减少与IP 核连接的复杂度。片上系统应用广泛,不同的应用对总线的要求各异,因此片上总线具有较大的灵活性。其一,多数片上总线的数据和地址宽度都可变,其二,部分片上总线的互连结构可变,如Wishbone 总线支持点到点、数据流、共享总线和交叉开关四种互连方式;其三,部分片上总线的仲裁机制灵活可变,如Wishbone 总线的仲裁机制可以完全由用户定制。而板上总线则较为死板,时序也更加苛刻。

3 CoreConnect总线

        CoreConnect拥有完备的一整套技术文档,在技术上可行性较强。IBM 公司的CoreConnect连接总线还提供了三种基本类型连接功能块,即处理器内部总线PLB(Processor Local Bus)、片上外围总线OPB(On-ChipPeripheral Bus)和设备控制总线DCR(Device Control Register)。CoreConnect总线的逻辑结构如图1所示,它清楚地定义了所有的系统构成部件以及它们是如何连接的,下面分别介绍PLB 、DCR 和OPB 的主要技术特征。

3.1 PLB

         PLB标准是为总线传输的主要发出者和接受者之间提供高带宽、低延迟的连接。其主要特征为:
● 高性能处理器内部总线;
● 交叠的读和写功能(最快每周期两次传输);
● 支持分段传输;
● 地址流水(减少延迟);
● 读和写分开;
● 32~64位数据总线;
● 32位地址空间;
● 支持16~64字节突发传输模式;
● 支持字节使能(非对准和3 字节传输);
● 支持仲裁、R E Q、G N T 和L O C K;
● 延迟和隐藏仲裁(减少延迟);
● 4级仲裁优先权;
● 特殊DMA(Direct Memory Access)模式,如快速的从内存到内存;
● 地址和数据状态扼制(Address and data phase throttling);
● 延迟计数器(保证保持延迟到预想的程度)。

3.2 OPB

         OPB标准为连接具有不同的总线宽度及时序要求的外设和内存提供了一条途径,并尽量减小对PLB 性能的影响。其主要特性如下:
● 片上外围总线;
● 多个主设备;
● 32位地址空间;
● 读和写数据总线分开;
● 8~32位数据总线;
● 动态总线宽度;
● 支持重试模式(如果主设备要求的从设备忙,主设备隔一段时间再次请求);
● 支持突发(burst)传输模式;
● 支持D M A;
● 设备可以是内存映射(支持D M A);
● 检测总线超时功能(在仲裁器中);
● 支持仲裁、R E Q、G N T 和L O C K。

3.3 DCR

        设备控制寄存器总线DCR是用来规范CPU通用寄存器设备,控制寄存器之间传输数据。DCR 总线在内存地址映射中取消了配置寄存器,减少取操作,增加处理器内部总线的带宽。其主要特征如下:
● 10位地址总线;
● 32位数据总线;
● 同步和异步的传输;
● 分布式结构。
         CoreConnect是一套精心设计和构造完整、通用的解决方案,可以应用在类似于工作站这样的高性能系统的连接,对于简单的嵌入式应用来说可能有点太复杂,提供的许多特性无法用到,但可以适应于未来更庞大、更复杂的系统连接。

4 AMBA总线

          先进的微控制器总线体系结构AMBA规范定义了三种总线:
(1)AHB(Advanced High-performance Bus):用于连接高性能系统模块。它支持突发数据传输方式及单个数据传输方式,所有时序参考同一个时钟沿;
(2)ASB(Advanced System Bus):用于连接高性能系统模块,它支持突发数据传输模式;
(3)APB(Advance Peripheral Bus):是一个简单接口支持低性能的外围接口。
          一个典型的基于AMBA 的微控制器同时集成AHB(或ASB )和APB 接口,如图2 所示。A S B总线是旧版的系统的总线,而新版的AHB 总线增强了对性能、综合及时序验证的支持。APB 总线通常用作的局部的第二总线,作为AHB 或ASB 上的单个从属模块。

          根据AMBA 的规范,连接AHB/ASP 和APB 的APB 桥的唯一功能是提供更简单的接口。任何由低性能外围设备产生的延迟会由连接高性能(AHB/ASP)总线的桥反映出来。桥本身仿佛是一个简单APB总线的主设备,它访问与之相连的从设备,并且通过高性能总线上控制信号的子集控制它们。下面给出AHB、ASP 和APB 的主要特征。

4.1 AHB

       AHB是先进的系统总线。它主要的目的就是连接高性能、高吞吐率的设备,例如CPU、DMA 和DSP。它的主要特性:
● 高性能新一代总线;
● 多控制器;
● 分段传输;
● 单周期总线控制权移交;
● 没有三态实现方式;
● 32~128位总线宽;
● 包含一种访问保护机制,用来区别特权访问和无特权访问模式,或指令和数据提取等;
● 突发传输模式最大为16节;
● 访问空间限制在32 位;
● 提供为较慢设备使用而扼制数据流的机制;
● 支持仲裁、R E Q、G N T 和L O C K;
● 支持字节、半字和字传输。
         AHB 总线和ASB 总线有下列不同的特点:
● AHB 总线支持分开处理。有很长响应延迟的从机在准备传输的数据时让出总线从事其它传送操作;
● 使用单一时钟沿控制所有操作,有利于综合和设计验证(通过使用静态时序分析和其他相似工具);
● 使用中心多路器总线方案而不是三态驱动的双向总线;
● 支持更宽的64位或128位数据总线配置。

4.2 ASP

        ASP是通用系统总线,是一种微处理器和系统外设的高性能互连,主要特征如下:
● 多控制器;
● 突发数据传输方式;
● 流水线传送;
● 32-128位总线宽度;
● 包含一种访问保护机制,用来区别特权访问和无特权访问模式,或指令和数据提取等;
● 双向数据总线;
● 提供为较慢设备使用而扼制数据流的机制;
● 仲裁支持REQ 、GNT 和LOCK。

4.3 APB

      APB是外围互联总线,重点是最小功耗和易于使用,主要特征如下:
● 低性能、低功率外围总线;
● 单控制器;
● 非常简单,只有4 个控制信号(加上时钟和复位);
● 32位地址空间;
● 多达32位数据总线;
● 分开读和写数据总线。
            AMBA 是一种基本的SoC 总线,它分成三种总线。根据需要,系统设计者必须选择对接三种总线中的哪一种。一个高性能设备可能选择AHB 或ASP 总线,这将给IP 核集成者带来困难,因为两种总线都试图访问同一类型的设备。还没有明确的办法将设备与AHB 和ASP 总线集成。APB 桥似乎不但不会提供任何好处,而且会限制连接在上面的高性能总线。所有三种总线都包含一个地址状态和一个或多个数据状态。

5 Wishbone总线

        Wishbone总线是Silicore公司推出的片上总线协议。它的结构极其简单、灵活,又完全公开、完全免费,获得众多支持。图3 给出了Wishbone总线的逻辑结构:
Wishbone 总线的主要特征概括如下:

● 所有应用使用一个总线体系结构;
● 简单、紧凑的体系结构;
● 支持多控制器;
● 64位地址空间;
● 8~64 位数据总线(可扩展);
● 单周期读和写;
● RMW(R E A D - M O D I F Y - W R I T E )周期;
● 事件周期;
● 支持重试;
● 支持内存映射,FIFO(FISRT IN FIRST O U T )和十字互连接口;
● 提供为较慢设备使用而扼制数据流的机制;
● 使用者定义标志为,确定数据传输类型;
● 由终端用户定义仲裁方式。
          Wishbone 总线采用握手协议。当MASTER 准备好传输数据时置STB_O 为高,STB_O 将保持高状态直到SLAVE 将ACK_I、ERR_I 或RTY_I 之一置为高, 数据传输周期结束。这种机制下,MASTER 和SLAVE 均可控制数据传输速率。其握手时序如图4。

         Wishbone 总线有四种将MASTER 与SLAVE 连接在一起方式,分别为点对点、数据流、共享总线和十字互连。其中点对点方式可以最简单地将一个MASTER 与一个SLAVE 相连;数据流方式可以实现数据传输的流水;共享总线方式将多个MASTER和SLAVE 相连,不过任何时刻只能有一个MASTER 占据总线;十字互连则可实现多个MASTER和多个SLAVE之间同时传输数据。图5给出了采用点对点互联方式的Wishbone总线主从接口。

       Wishbone有三种数据传输方式,分别为单读写、块读写和R M W(R E A D - M O D I F Y - W R I T E )。其中单读写为最简单。图6 给出了单读周期的时序。为了更直观地了解Wishbone总线接口连接如何简单、灵活,图7 给出了8 位SLAVE 的输出端口图。


       Wishbone只定义了一种高速总线,在既需要高速总线又需要低速总线的系统中,提供了两Wishbone接口,比起设计两个不同的接口要简单得多。

6 总结

            在以上介绍的三种总线中,CoreConnect虽免费不过需要IBM 公司许可,ARM 没有明确的正式说法,可能也会免费,而Wishbone 是绝对免费的。三种总线都是同步的总线,使用时钟上升沿驱图7 8-bit SLAVE输出端口动和采样信号。总线的基本操作几乎没有区别,最大的区别在于提供的特性和规范的完整性。CoreConnect和AMBA都给设计者提供了一种系统总线的选择。系统集成设计者当试图连接为不同连接设计的设备时会遇到问题,在建立全面完整的系统时需要桥。而在Wishbone 中,所有的IP核都连接在同一标准接口上。系统设计者可以选择在一个微处理器核上实现两个接口,一个给高速低延迟设备,一个给低速低性能设备。综上所述,我们认为采取Wishbone作为IP核的基本互联的接口标准更便于设计,它的信号十分直接,如果需要可以很容易被其它接口所采用。Wishbone 总线完全公开、完全免费,易于推广,当然一个规范能否成为行业标准,除了本身的技术特性外,还要看是否被业界接受。Wishbone已被OPENCORE 联盟采用,并且有可能成为IEEE标准。因此,Wishbone 总线从技术上讲简单、灵活、功能强大及易于移植,从经济角度考虑又全部免费,易于全面推广。我们认为它极有可能成为未来SoC
片上总线的通用标准,其前景看好。

片上总线Wishbone 学习(二)Wishbone总线标准介绍

Wishbone总线产生、发展

            市场是推动技术前进的主要动力,人们对各种电子产品不断的更新,更好,更完美的追求刺激了技术的不断升级和创新。反映在IC设计领域,人们开始追求芯片的系统化,单一化,整体化,突出强调从宏观上提高芯片上的性能。SoC正是在这样的环境下孕育而生,并获得了快速的发展。调查,2004年SoC芯片占芯片设计的26%;预测,到2010年市场上90%的芯片是SOC芯片。Wishbone总线也是顺应了芯片技术的发展,提出的一种片上总线系统方案。该方案有助于SoC芯片的整合,加快芯片设计及充分利用前人开发的IP核等。传统的IP核设计没有考虑到可重用设计方法,因此在SoC中要将这些由不同厂家开发的IP核集成到一个芯片中不是一件很容易的事。首先遇到的是如何有效,可靠的把两个或以上的IP核信号互联起来。Silicore公司开发的Wishbone总线能有效的将各种需要的IP核整合起来,使他们之间可以无障碍的通信。而且Wishbone的设计简单、易行,能够适应各种类型IP(软核,固核,硬核)。
1999年6月,Silicore公司发布Wishbone总线标准A版,即初级版:
1999年7月,Silicore公司发布Wishbone总线标准A.1版;
2001年1月,Silicore公司发布Wishbone总线标准B版;
2001年1月,Silicore公司发布Wishbone总线标准B.1版;
2002年1月,Silicore公司发布Wishbone总线标准B.2版:
2002年9月,Silicore公司发布Wishbone总线标准B.3版。

Wishbone总线设计思想

               片上总线设计遵循简单,灵活和可移植性。这样能够在不增加复杂度的情况下将各个不同IP模块连接起来。Wishbone就是这样的一种总线,它能够有效的帮助系统工程师标准化IP模块的接口,实现SOC。Wishbone是采用主端(MASTER)和从端(S“wE)的架构。主端模块发出数据传送请求,然后通过一个互连网络和从端进行数据交换,如图3一l所示。这个互连网络我们称之为INTERCON,它使得主端顺利访问从端。图3—1中圆圈部分是INTERCON,起到连接主端和从端的作用。它的作用
类似电信领域的术语“云朵”。在电信领域,电话系统被模拟成云朵,它代表电话交换和传输系统。电话机根据电话号码通过云朵和另一端建立连接。如果电话连接的是同一幢大楼的另一电话,那么云朵代表的是当地的一个小交换系统:如果电话连接是另一个国家的,那么云朵代表的是光纤和卫星组成的一个传输系统。也就是说,不同地域的主端和从端相连,使用不同的连接方式。Wishbone总线与此相同,终端类似电话机,1NTERCON类似电话网络“云朵”,各终端之间访问通过INTERCON,再根据不同的情况采用不同的互连方式。Wishbone将它称为可变互连网络。可变互连网络的连接形式有点对点,数据流,共享总线和交叉总线。

图 1 Wishbone系统架构



Wishbone名字的由来

           根据美国韦伯斯特(Webster,1758—1843,美国词典编辑家)词典,WISHBONE是指大多数鸟类胸骨前的一块叉状型的锁骨。在名字定义初期,Silicore公司设想找一个能够反映双向总线这一特点的名字。这些总线是由多路选择器和三态门实现的,它们的形状类似Y,和锁骨(WISHBONE)相似,所以后来被称为WISHBONE总线。这个名字是由Wade Peterson,一名Silicore公司的工程师,在当年美国感恩节上提出的。

Wishbone总线的主要特征

          一般总线规范的共同特点为同时适用于于软核、固核和硬核设计;对开发工具和目标硬件没有特殊要求,并且几乎兼容已有的所有综合工具;可以用多种硬件描述语言来实现;支持结构化设计方法学,以提高大团队的设计效率;灵活的数据和地址总线宽度,支持大端和小端操作;支持主从设备接口,支持多主设备,这是片上共享总线通信所必须的,多个主设备同时需要进行总线操作时,由仲裁器决定当前哪个主设备可以使用总线,仲裁逻辑用户可以自行定义。此外,在作者看来,Wishbone总线规范的特点还包括: 

          1. 支持点到点、共享总线、十字交叉(Crossbar)和基于交换结构(Switch fabric)的互联。Wishbone总线规范是"轻量级(Lightweight)"规范,它实际上更加侧重于点对点互联以及复杂度不高的共享总线片上系统互联。因此,与其他总线规范相比,Wishbone的接口更加简单紧凑,接口需要的互联逻辑非常少(见本章后续的例子),这是Wishbone的一个重要优势。熟悉AMBA总线的读者在读完本章后就能够理WishboneAMBA总线简单的多,但是两者各有个的优势。AMBA将所有的外设分为高速设备和低速设备,高速设备连接到系统总线,通常通信的数据量也较大,如SDRAM控制器、NAND Flash控制器、LCD控制器,低速设备连接外设总线,通常通信数据量小,如通用串口、计时器等。外设总线与系统总线通过总线桥接器相连。在实际系统中,处理器、系统总线、外设总线间的时钟频率的典型比值之一是4:2:1,因此整个系统的功耗被有效降低。另外一个好处是通过在总线桥接器中添加DMA引擎,系统总线和外设总线可以实现速率解耦。而依照Wishbone规范,Wishbone总线上所有设备都要连接到同一总线,无论是高速设备还是低速设备。与Wishbone总线相比,AMBA的缺点是设计较为复杂。但是实际上,Wishbone总线也设计为类似AMBA总线的架构,但此时系统为双Wishbone总线架构。 

         2. 支持典型的数据操作,包括:单次读/写操作、块读/写操作,读改写(RMWRead-Modify- Write,细节见后文)操作。最快情况下一个时钟周期可完成一次操作,操作的结束方式包括:成功、错误和重试(Retry)。一个总线周期完成一次操作,一次操作可以是单次读/写操作、块读/写操作或者读改写操作。操作总是在某一总线周期内完成的,因此操作结束方式也称为总线周期结束方式,两者说法在后文将视情况使用。成功是操作的正常结束方式,错误表示操作失败,造成失败的原因可能是地址或者数据校验错误,写操作或者读操作不支持等。重试表示从设备当前忙,不能及时处理该操作,该操作可以稍后重新发起。接收到操作失败或者重试后,主设备如何响应取决于主设备的设计者。 

        3. 允许从设备进行部分地址解码,有利于减少了冗余地址译码逻辑,提高地址译码速度。这一点本书将通过实例说明。 

        4. 支持用户定义的标签。这些标签可以用于为地址、数据总线提供额外的信息如奇偶校验,为总线周期提供额外的信息如中断向量、缓存控制操作的类型等。Wishbone规范只定义标签的时序,而标签的具体含义用户可自行定义。支持用户定义的标签是Wishbone规范区别与其他片上总线规范的重要特征之一。 

        5. 全同步化设计,包括复位方式。但是实际上复位方式采用同步还是异步并不影响IP的互联互通,因此兼容Wishbone规范的IP完全可以采用异步方式,http://www.opencores.org上面的很多兼容Wishbone规范的开源IP采用的就是异步复位。 

           总结以上内容,Wishbone总线规范区别于其他总线规范的两个核心特点是:(1)是轻量级规范,因此接口更加简单紧凑;(2)支持支持用户定义的标签。 

片上总线Wishbone 学习(三)Wishbone互联的类型

               Wishbone可变互连方式允许系统工程师可以采用不同的IP核互连方式,以满足不同场合的要求。Wishbone规范支持的互联类型有四种:点到点、数据流方式、共享总线、交叉(Crossbar)互连方式。这四种互联方式在Wishbone规范中有明确的定义。

           下面介绍四种Wishbone总线互连形式。

点到点方式

           点到点互连是最简单一种的形式。它适用于两个IP核之间的连接。如图1所示,总线的一边是主端(如微控制器),一边是从端(如存储器)。



图1 点到点互连

数据流方式

            数据流互连框图如图2所示,当数据以连续的方式进行处理时可采用此模式。图中每个IP核兼有主端和从端。数据从一个IP核传送到下一个,与流水线相似。


图2 数据流互连

           IP核A处理完数据后将处理结果送给IP核B,IP核B处理完IP核A送来的数据后再将处理结果送给IP核C处理。数据从一个IP核送往另一个IP核,常常将这种处理方式称作流水线。流水线在处理器设计中非常重要,其好处是多个数据可以并行处理,从而提高系统的整体数据处理能力。 

共享总线方式

           共享总线互联方式适合于系统中有两个或者多个主设备需要与一个或者多个从设备通信的场合,它们通过共享的总线进行通信,其好处是结构紧凑,节省布线资源,缺点是主设备希望与特定从设备通信时可能需要等待。主设备在需要与一个从设备通信时,需要先向仲裁器申请总线占有权,获得允许后开始占用总线并与目标从设备开始通信,通信结束后释放总线。当多个主设备同时希望占有总线时,仲裁器通过一定的优先级逻辑分配总线使用机会。 共享总线互联方式在片上系统中得到了广泛的使用,几乎成了片上系统的标志技术之一。共享总线技术在板级系统如PCI总线中也得到了应用。  共享总线方式主要适用于多主端和多从端的情况。其典型框图如图3所示。主端发起访问请求,对某一从端进行访问。


图3 共享总线互连

            图中的仲裁(Arbiter)模块起到仲裁总线的作用。当两个或两个以上的主端同时申请总线使用时,由仲裁器来决定谁使用总线资源。仲裁器的判定规则是由系统工程师决定的,可以使用有优先级别的仲裁方式,也可以使用循环令牌方式(无优先级别)。
            共享总线是用的较多的一种,在微机中就有使用。它的主要优点是互连系统紧凑,所需添加逻辑门少。它的主要缺点是同一时间只能有一个主端使用总线,其它主端要等待正在使用总线的主端结束使用总线。因此这种互连方式,它的数据传输率比较低。

交叉方式       

            交叉互连方式较共享总线互联方式略复杂。共享总线互联方式在任一时刻只允许最多有一对主设备和从设备通过共享总线进行通信,而十字交叉互联方式最多同时允许超过一对的主设备和从设备对同时进行通信,如图4所示。当然,在交叉互连方式中,一个从设备在任一时刻只能与一个主设备进行通信,两个主设备不能同时访问同一从设备。交叉互连主要使用在多个主端同时访问多个从端的情况。其典型框图如图4所示。在这种连接方式下,主端发出地址总线请求对某个从端进行访问,仲裁器查看总线总线和从端空闲,并决定是否给主端总线访问权利。注意,这里的多个主端不能同时访问同一个从端,也就是一个从端在某一时刻只能被一个主端访问。


图4 交互互连

             图中建立了两条总线连接,很明显数据的传输速度要比共享总线方式大大增加,直同时系统的开销也相应的增加。这种模式主要在有高速数据传输率要求情况下使用。           此外,还有一种更复                杂的基于交换结构的互连。基于交换结构的互 交叉互连方式的INTERCON模块更复杂,一般的,基于交换结构的互联比 交叉互连允许同时通信的主从设备对更多。 随着技术的发展,已经出现了比片上总线更复杂的片上网络技术(Network on chip)。基于片上网络技术,已经出现了内含几十个32位处理器的芯片,已应用于CISCO的高端路由器中。

片上总线Wishbone 学习(四)接口信号定义

               所有的Wishbone接口信号都是高电平有效,设计成高电平有效的主要原因是由于低电平有效信号的书写问题,不同的设计者表达低电平有效信号的方式不同,拿最常见的低电平有效的复位信号来说,其表示方法就有_RST_IN_RST_I#RST_I/RST_I,而高电平有效的信号其表达方式通常只有一种。 所有的Wishbone接口信号都以_I或者_O结束。_I表示输入,_O表示输出。()表示该信号为总线信号,总线的宽度可以为1,也可以为大于1的任何值。 


信号分类

SYSCON模块信号
CLK_O:输出信号,系统时钟,作为MASTER和SLAVE的时钟输入:
RST_O: 输出复位信号,作为MASTER和SLAVE的复位输入,使得WISHBONE接口内部的状态机全部恢复到起始态。

MASTER和SLAVE的共有信号
CLK_I:输入信号,MASTER和SLAVE的时钟输入端,所有WISHBONE输出信号都在CLK-I的上升沿有效;
DAT_O():数据输出信号,最大位宽为64位;
RST_I:输入信号,使得WISHBONE接口内部的状态机全部恢复到起始态;
TGD_I():输入信号,数据标签类型;
TGD_O():输出信号,数据标签类型;
MASTER端信号
ACK_I:输入信号,确认信号,当该信号有效时,表明一个总线周期结束;
ADR_O():输出信号,地址输出;
CYC_O:周期输出信号,当该信号有效,表明进程中的总线是有效的,即它确定了总线周期的持续时间。CYC_O从数据传输的第一个比特开始有效,到数据传输结束为止。
ERR_l:输入信号,当该信号有效,表明总线周期非正常结束,表示有错误发生:
LOCK_O:输出信号,当该信号有效,表明当前总线周期锁定,不能被其他进程中断;
RTY_I:输入信号,当该信号有效,表明MASTER还没有准备好接收或发送数据,重新请求总线;
SEL_O():输出信号,用于选择数据信号线的输出;
STB_O:输出信号,表明一个有效数据传送周期;
WE_O():读使能信号,决定信号的读和写功能。
SLAVE端信号
ACK_O:输出确认信号,表明总线周期结束;
ADR_I():地址输入信号:
CYC_I:输入信号,当该信号有效,表明进程中的总线是有效的,即它确定了总线周期的持续时间。CYC一0从数据传输的第一个比特开始有效,到数据传输结束为止。
ERR_O:错误输入信号,表明由于发生错误,周期终止;
LOCK_I:输入信号,当该信号有效,表明当前总线周期锁定,不能被其他进程中断;
RTY_O:输出信号,当该信号有效,表明SLAVE还没有准备好接收或发送数据,重新请求总线;
STB_I:输入信号,表明SLAVE被选中和主端通信;
WE_I:读写使能输入信号;


图1 Wishbone总线规范中使用的主要信号(一个点到点互联的例子)

         在图1中,主设备具有遵守Wishbone规范的主设备接口,从设备具有遵守Wishbone规范的从设备接口,INTERCON模块将主设备和从设备的对应数据、地址和控制线连接起来,SYSCON模块提供时钟和复位信号,这两个信号被送入主设备和从设备。图1给出了Wishbone接口的常见信号,这些信号有些是必须的,有些是可选的。这些信号的基本功能描述如下: 

        CLK_O/CLK_I:时钟信号。时钟信号由SYSCON模块产生,并送入各个主设备和从设备。SYSCON通常内部存在一个锁相环,将来源于芯片外的晶体振荡器或者时钟输入信号整形、分频或者倍频为芯片内所需要的时钟信号。所有Wishbone信号都同步到时钟信号上,包括复位信号。 

        RST_O/RST_I:同步复位信号,高电平有效。复位信号由SYSCON模块产生,并送入各主设备及从设备。 

        DAT_O()/DAT_I():主设备和从设备的之间的数据信号,数据可以由主设备传送给从设备,也可以由从设备传送给主设备。一对主设备和从设备之间最多存在两条数据总线,一条用于主设备向从设备传输数据,另外一条用于从设备向主设备传输数据。Wishbone规定数据总线的最大宽度为64位,这一规定实际上是考虑到目前商用处理器的最大位数为64,实际上数据总线的宽度可以是任意值。就笔者看来,在64位处理器以后,处理器将向多核方向发展,总线将向高速串行方向发展。 

        ADR_O(n…m)/ADR_I(n…m):地址信号,主设备输出地址到从设备。n取决于IP核的地址宽度,m取决于数据总线DAT_O()/DAT_I()的宽度和粒度。数据总线的粒度指的是数据总线能够一次传送的最小比特数,很多处理器如ARM的数据总线的粒度为1个字节,但是也有一些处理器如CEVA TeakLite DSP的数据总线粒度为2个字节。一个位宽为32比特、粒度为1个字节的数据总线的地址信号应定义为ADR_O(n…2)/ADR_I(n…2)。在传送数据时,具体哪些字节有效通过SEL_O()/SEL_I()信号(见下文)控制。 

       TGD_O/TGD_I()TGA_O()/TGA_I()TGD_O/TGD_I()为数据标签,具体讲是附加于在数据总线DAT_O()/DAT_I()的标签,该标签可以用于传送关于数据总线的额外信息如奇偶校验信息、时间戳信息等。TGA_O/TGA_I()为地址标签,具体讲是附加于在地址总线ADR_O()/ADR_I()的标签,该标签可以用于传送关于地址总线的额外信息如地址总线奇偶校验信息、存储器保护信息等。Wishbone只规定了TGD_O/TGD_ITGA_O()/TGA_I()的接口时序,用户可以定义TGD_O/TGD_I的具体含义。 

TGC_O/TGC_I()TGC_O/TGC_I()为总线周期标签,该标签可以用于传送关于当前总线周期所进行操作的描述如操作类型(包括单次操作、块操作、RMW操作)、中断应答类型、缓存操作类型等。类似的,Wishbone只规定了TGC_O/TGC_I()的接口时序,用户可以定义TGD_O/TGD_I的具体含义。 

       ACK_O/ACK_IERR_O/ERR_IRTY_O/RTY_I:主从设备间的操作结束方式信号。ACK表示成功,ERR表示错误,RTY表示重试(Retry)。操作总是在某一总线周期内完成的,因此操作结束方式也称为总线周期结束方式。成功是操作的正常结束方式,错误表示操作失败,造成失败的原因可能是地址或者数据校验错误,写操作或者读操作不支持等。重试表示从设备当前忙,不能及时处理该操作,该操作可以稍后重新发起。接收到操作失败或者重试后,主设备如何响应取决于主设备的设计者。 

       SEL_O()/SEL_I():有效数据总线选择信号,标识当前操作中数据总线上哪些比特是有效的,以总线粒度为单位。SEL_O()/SEL_I()的宽度为数据总线宽度除以数据总线粒度。比如一个具有32位宽、粒度为1个字节的数据总线的选择信号应定义为SEL_O(3:0)/ SEL_I(3:0)SEL(4’b1001)代表当前操作中数据总线的最高和最低字节有效。 

        CYC_O/CYC_ILOCK_O/LOCK_IGNT_O()/GNT_I:总线周期信号CYC_O/CYC_I有效代表一个主设备请求总线使用权或者正在占有总线,但是不一定正在进行总线操作(是否正在进行总线操作取决于选通信号STB_O/STB_I是否有效)。只有该信号有效,Wishbone主设备和从设备接口的其它信号才有意义。CYC_O/CYC_I信号在一次总线操作过程中必须持续有效,比如一次块读操作可能需要多个时钟周期,CYC_O/CYC_I信号必须保持持续有效。实际上,该信号的实际作用等同于其他总线标准中的仲裁申请信号。当存在多个主设备时,它们可能希望同时进行总线操作,主设备通过仲裁申请信号向仲裁器申请总线占有权,仲裁器通过一定的仲裁优先级逻辑向其中一个选定的主设备发送总线允许信号GNT_O()/GNT_I,表示该主设备可以占用总线。GNT_O()是仲裁器输出的允许信号,一般有多个;而对于一个主设备,其允许信号输入GNT_I却只有一个。一次总线操作可能需要多个时钟周期,比如一次块操作。在操作过程中,仲裁器可能会提前将总线占用权收回并分配给其他主设备从而打断当前主设备的操作,LOCK_O/LOCK_I有效代表本次总线操作是不可打断的。仲裁器收到LOCK_I信号,就不会提前收回总线使用权。图1中只有一个主设备和一个从设备,因此没画出仲裁器模块,该模块可以视为是INTERCON的一部分,见本章最后给出的例子。 

         STB_O/STB_I:选通信号。选通有效代表主设备发起一次总线操作。只有选通信号有效(此时CYC_O/CYC_I也必须为高),ADR_O/ADR_I()DAT_O()/DAT_I()SEL_O()/SEL_I()才有意义。在Wishbone总线规范中,CYC_O/CYC_I是最高层的控制信号,只有该信号有效,STB_O/STB_I信号才有意义。一个信号有意义是指该信号的当前值是需要主设备或者从设备解释的,0为无效,1为有效,而一个信号没有意义是指该信号的当前值主设备和从设备不必关心,是0还是1都无效。 

        WE_O/WE_I:写使能信号,代表当前周期中进行的操作是写操作还是读操作。1代表写,0代表读。

片上总线Wishbone 学习(五)总线周期之复位操作

总线周期概述

              一个总线周期由多个不可分的时钟周期构成,完成单次读/写操作、块读/写操作或者读改写操作。总线周期也分为单次读/写周期、块读/写周期和读改写周期。一次块读/写总线周期完成多次数据读/写操作。一般情况下,一次操作由主设备和从设备控制信号间的一次握手,以及同时进行的地址和数据总线的一次传输构成。块操作表示整个操作需要完成多次数据传送。在总线周期中主设备和从设备预先设定好的共同遵守控制信号握手规则,以及地址和数据总线的传输规则称作总线协议。 

           在以后的文章中,所给图例中给出的信号均为主设备的输入输出信号。因此,对操作的描述也从主设备信号的角度展开,以便于对照正文理解图例。比如"在时钟上升沿1到达之前,从设备检测到主设备发起的操作,将适当的数据放到主设备的输入信号DAT_I()TGD_I(),将主设备的ACK_I置高作为对主设备STB_O的响应。"的等价描述为:"在时钟上升沿1到达之前,从设备检测到主设备发起的操作,将适当的数据放到其输出信号DAT_O()TGD_O(),将输出信号ACK_O置高作为对主设备STB_O的响应。

复位操作

             复位是数字系统最基本的操作。复位后,系统进入预定的状态。在遵守Wishbone总线规范的系统中,当RST_I信号有效,系统开始复位。由于Wishbone规范规定的复位是同步复位,因此在复位信号有效后接下来的时钟上升沿,所有信号和寄存器进入预定状态。因此,Wishbone规范要求RST_I信号有效时间至少要一个时钟周期。在数字系统中,实际上更多的采用的是异步复位,而且复位信号的长度一般大于系统电平稳定时间和系统时钟频率稳定时间。如果在Wishbone接口中使用的是异步复位,需要在文档中说明,因为Wishbone接口默认的是同步复位。 



图 1 Wishbone总线的复位操作

关于同步复位和异步复位,可以参看《同步复位和异步复位的比较》。

片上总线Wishbone 学习(六)总线周期之操作发起

            一个总线周期由至少一次总线操作构成。操作总是由主设备发起,主设备发起的操作可以是单次读/写、块读/写或者RMW操作。当主设备将CYC_O置为高时,一个总线周期开始。总线周期开始后,当主设备将STB_O置为高时,一次总线操作开始。当主设备将CYC_O置为低时,主设备的所有其他信号没有意义。从设备只在CYC_I为高时才会对主设备发起的操作进行响应。 


        CYC_O和STB_O可以同时从无效变为有效表示操作开始,CYC_O持续有效直到操作结束,CYC_O和STB_O可以同时从无效变有效表示同时发起一次总线周期的同时,也发起总线操作,也可以同时从有效变为无效表示操作结束。因此,在只有一个主设备时,可以将CYC_O和STB_O合并为一个信号,比如在OpenRISC1200的源码中就广泛的使用了这种方式,信号的名字称作CYCSTB_O。 


         当存在多个主设备时,一个主设备完成操作后必须及时将CYC_O信号置为低,以让出总线给其他主设备。此时,CYC_O信号等价于为总线占用请求信号。

片上总线Wishbone 学习(七)总线周期之握手协议

                由于在整个总线周期,CYC_O必须始终保持有效,因此,此后我们将在给出的图中忽略该信号,只在必要的时候给出。 

                握手发生在主设备和从设备之间。握手协议是主设备和从设备在握手时所遵守的共同规则。如图6,当主设备准备好,它将STB_O信号置高。STB_O信号一直为高,直到从设备通过置高ACK_OERR_ORTY_O对本次操作发起响应。在图7中我们以主设备的ACK_I信号作为示例,后文也如此。通过握手,主设备和从设备不仅可以完成通信,而且可以控制它们之间的通信速率。

 


图1 Wishbone总线的基本握手协议      

         如果从设备保证能够在主设备发起操作时及时作出操作成功的响应,其ACK_O信号可以设计为STB_ICYC_I信号的逻辑与,而ERR_ORTY_O信号也可以不使用。因此ERR_ORTY_O信号是可选的,而ACK_O信号是必须的。在点对点连接中,甚至可以将ACK_I信号直接置高。当存在ERR_ORTY_O信号,主设备当发现ERR_ORTY_O信号之一有效时如何进行响应取决于主设备的设计。 

对于从设备,只有STB_ICYC_I同时为高时,才能发起对主设备的响应。 

         实际上,对于主设备,其最小配置为只有ACK_ICLK_ICYC_ORST_ISTB_O;而对于从设备,其最小配置为只有ACK_OCLK_ICYC_IRST_ISTB_I,这里CYC STB信号可以合并到一起成为一个信号,通常命名为CYCSTB_O/。 

        在图1中,从STB_OACK_I存在一个长组合逻辑路径,在实际系统中很可能成为关键路径。因此,在设计中应尽量保证STB_O是触发器的直接输出。如果从STB_OACK_I存在一个长组合逻辑路径延迟不能满足设计的时序要求,可将从设备的ACK_O经过触发器寄存后再输出,从而将长组合逻辑打破,但系统的吞吐量也将因此减小。关于如何即打破长组合逻辑又不影响系统的吞吐量,以后的文章将进行详细讨论。 

片上总线Wishbone 学习(八)周期的同步结束和异步结束

         为了实现在给定时钟频率下的最大可能吞吐量,Wishbone采用了周期异步结束方式。这样做的结果是从主设备的STB_O到从设备的ACK_O/ERR_O/RTY_O再到主设备的ACK_I/ERR_I/RTY_I输入形成了一个异步回路,如图1所示。在大型SoC设计中,该回路往往成为整个设计的关键路径,限制系统时钟频率的进一步提高。在深亚微米时代,由于线延迟往往比门延迟更大,这一异步回路更加可能成为系统性能的瓶颈。 


图1 Wishbone总线的异步周期结束路径

         这一问题的最简单解决方法是插入寄存器将回路断开,但这样做的缺点是在每一次总线操作中都需要插入一个等待周期,从而制约了总线吞吐量。如图2所示,在上升沿0主设备发起了一次操作,在上升沿1从设备发起响应将ACK_O置高,在上升沿2主设备检测到ACK_I为高完成第一次操作并发起第二次操作,但是在上升沿2从设备并不知道主设备会发起第二次操作,因此只能将ACK_O信号置低。在上升沿3从设备才能对第二次操作发起响应将ACK_O置高,在上升沿4主设备检测到ACK_I为高完成第二次操作。

 

图2  Wishbone总线的传统同步周期结束方式

         在图2中,每一次传输都需要两个时钟周期,一半的带宽被浪费。如果从设备在上升沿2知道主设备将发起新的操作,它将能够在上升沿3完成第二次操作,从而节省时钟周期提高了系统的吞吐量,利用该思想改进后的同步时序如图3所示。

 

图3 Wishbone总线改进的同步周期结束方式

          在图3的上升沿0,主设备发起操作,在上升沿1,从设备将ACK_O置高,在上升沿2完成第一次操作且从设备知道主设备将发起新的操作,于是将ACK_O继续置高,在上升沿3完成第二次操作。因此, 3个时钟周期就完成了2次操作,而不是原来大的4个时钟周期,于是吞吐量提高了25%。一般的,改进后,N次操作需要N+1个时钟周期,而不是2N个时钟周期,吞吐量改善为(N-1)/N%。 


图4 不同结束方式性能的对比

    改进后的同步周期结束方式具备异步周期结束方式的吞吐量优势,同时具备传统同步结束方式的延迟优势。改进后的同步周期结束方式称作Wishbone寄存反馈周期结束方式。 


片上总线Wishbone 学习(九)总线周期之单次读操作

异步周期结束方式

              单次读操作每次操作只完成一次读或者写,是最基本的总线操作方式。但是,Wishbone主设备或者从设备也可以不支持单次读/写操作,甚至没有地址和数据总线。 

              单次读操作如图1在时钟上升沿0,主设备将地址信号ADR_O()TGA_O()放到总线上,将WE_O置为低表示读操作,将适当的SEL_O()信号置高通知从设备将数据放在数据总线的适当位置,将CYC_OTGC_O置高表示操作正在进行,将STB_O置高表示操作开始。 

              在时钟上升沿1到达之前,从设备检测到主设备发起的操作,将适当的数据放到主设备的输入信号DAT_I()TGD_I(),将主设备的ACK_I置高作为对主设备STB_O的响应。 

            在时钟上升沿1,主设备发现ACK_I信号为高,将DAT_I()TGD_I()采样,并将STB_OCYC_O置为低表示操作完成。从设备发现STB_O置低后,也将主设备的输入信号ACK_I置低。 

             在图1中,从设备可以上升沿0和上升沿1之间插入任意多个等待周期。 



图1 Wishbone总线的单次读操作(周期异步结束方式)

同步周期结束方式

图2 Wishbone总线的单次读操作(周期同步结束方式)
在时钟上升沿0
  • Master在[ADR_O()]和[TGA_O()]发出有效的地址
  • Master拉低[WE_O],表明是一个读周期
  • Master发出有效数据选择信号[SEL_O()]表明哪些数据是有效的
  • Master发出[CYC_O]和[TGC_O()]表明总线周期的开始
  • Master发出[STB_O]表明操作的开始

在时钟上升沿1
  • Slave检测到主设备发起的操作,准备发出[ACK_I]
  • Slave在[DAT_O]和[TGD_O()]发出有效的数据
  • Slave发出[ACK_I]应答[STB_O],表明数据有效,可以读取数据了
  • Master发现[ACK_I],准备锁存[DAT_I]和[TGD_I()]
注意:Slave可以在发出[ACK_I]前插入等待周期(-WSS-),以控制传速度。可以插入任意多个等待周期。

在时钟上升沿2
  • Master锁存[DAT_I]和[TGD_I()]
  • Master拉低[STB_O]和[CYC_O],表明总线周期的结束
  • Slave发现Master拉低[STB_O],也将[ACK_I]拉低

片上总线Wishbone 学习(十)总线周期之单写读操作

异步周期结束方式

             单次写操作如图1所示。

      在时钟上升沿0,主设备将地址信号ADR_O()TGA_O()放到总线上,将数据信号DAT_O()TGD_O()放到总线上,将WE_O置高表示写操作,将适当的SEL_O()信号置高通知从设备数据总线DAT_O()的哪些信号是有效的,将CYC_OTGC_O置高表示操作正在进行,将STB_O置高表示操作开始。 

            在时钟上升沿1到达之前,从设备检测到主设备发起的操作,将主设备的ACK_I置高作为对主设备STB_O的响应。 

            在时钟上升沿1,从设备将DAT_I()TGD_I()采样;主设备发现ACK_I信号为高,将STB_OCYC_O置为低表示操作完成;从设备发现STB_O置低后,也将主设备的ACK_I置低。 

            在图1中,从设备可以在上升沿0和上升沿1之间插入任意多个等待周期。 



图1 Wishbone总线的单次写操作(周期异步结束方式)

同步周期结束方式

图2 Wishbone总线的单次写操作(周期同步结束方式)

在时钟上升沿0
  • Master在[ADR_O()]和[TGA_O()]发出有效的地址
  • Master在[DAT_O()]和[TGD_O()]发出数据
  • Master发出[WE_O],表明是一个写周期
  • Master发出有效数据选择信号[SEL_O()]表明哪些数据是有效的
  • Master发出[CYC_O]和[TGC_O()]表明总线周期的开始
  • Master发出[STB_O]表明操作的开始

在时钟上升沿1
  • Slave检测到主设备发起的操作,准备发出[ACK_I]
  • Slave准备锁存[DAT_O]和[TGD_O()]
  • Slave发出[ACK_I]应答[STB_O],表明数据有效,可以读取数据了
  • Master发现[ACK_I],准备结束总线周期
注意:Slave可以在发出[ACK_I]前插入等待周期(-WSS-),以控制传速度。可以插入任意多个等待周期。

在时钟上升沿2
  • Slave锁存[DAT_I]和[TGD_I()]
  • Master拉低[STB_O]和[CYC_O],表明总线周期的结束
  • Slave发现Master拉低[STB_O],也将[ACK_I]拉低
 

片上总线Wishbone 学习(十一)总线周期之块读操作

异步周期结束方式

            块读/写操作每次读/写数据多次。块读/写操作实际上是由顺序进行的多个单次读/写操作组合而成的。在同时存在多个主设备时,块读/写操作非常有用,一个块读写一般是不能打断的,比如一次DMA,如图9所示,在一次块操作中,CRC_O信号必须保持为高。同时为了保证整个块操作不被打断,LOCK_O也可以置为高,但是LOCK_O不必须为高。典型地,主设备进行一次DMA连续传输4个或者8个总线宽度单位的数据,然后主动释放总线,其后又试图占用总线重新进行DMA,直到所有的数据都传输完毕。这样做的好处是允许其他优先级更高的主设备在两次DMA之间插入操作以完成更加紧急的任务。 


图1 Wishbone总线块操作中CYC_O信号的用法

           块读操作如图2所示。块操作最多能够在每个时钟周期进行一次数据读或者写,但是主设备和从设备都可以通过插入等待周期控制块操作的速度。一次块操作包括多次子操作。每一次子操作都是块操作的一个阶段,完成一次数据读或者写。图10的块操作由五次读操作完成,其过程如下: 

           在时钟上升沿0,主设备将地址信号ADR_O()TGA_O()放到总线上,将WE_O置为低表示读操作,将适当的SEL_O()信号置高通知从设备将数据放在数据总线的适当位置,将CYC_OTGC_O()置高表示操作正在进行,将STB_O置高表示一次子操作开始。CYC_OTGC_O()从无效变为有效可以发生在上升沿0以前的任何时刻。 

           在时钟上升沿1到达之前,从设备检测到主设备发起的操作,将适当的数据放到主设备的DAT_I()TGD_I(),将主设备的ACK_I置高作为对主设备STB_O的响应。 

           在时钟上升沿1,主设备发现ACK_I信号为高,将DAT_I()TGD_I()采样,完成第一次子操作。主设备将新地址信号ADR_O()、新TGA_O()放到总线上,将新的SEL_O()信号置高通知从设备将数据放在数据总线的适当位置。 

           在时钟上升沿2到达之前,从设备检测到主设备发起的第二次操作,将适当的数据放到主设备的DAT_I()TGD_I(),继续将主设备的ACK_I置高。 

           在时钟上升沿2,主设备发现ACK_I信号为高,将DAT_I()TGD_I()采样,完成第二次子操作。主设备将STB_O信号置低表示插入等待周期。 

           在时钟上升沿3到达之前,从设备检测到STB_O信号为低,将ACK_I置低。 

           在时钟上升沿3,主设备发起第三次操作,将新的地址信号ADR_O()、新的TGA_O()放到总线上,将WE_O置为低表示读操作,将适当的SEL_O()信号置高通知从设备将数据放在数据总线的适当位置,将STB_O置高表示第三次子操作开始。 

           在时钟上升沿4到达之前,从设备检测到主设备发起的第三次子操作,将适当的数据放到主设备的DAT_I()TGD_I(),将主设备的ACK_I置高作为对主设备STB_O的响应。 


图2 Wishbone总线的块读操作(异步周期结束方式)

       在时钟上升沿4,主设备发现ACK_I信号为高,将DAT_I()TGD_I()采样,完成第三次子操作。主设备同时发起第四次子操作,将新地址信号ADR_O()、新TGA_O()放到总线上,将新的SEL_O()信号置高通知从设备将数据放在数据总线的适当位置。 

      在时钟上升沿5到达之前,从设备检测到主设备发起的第四次子操作,将适当的数据放到主设备的DAT_I()TGD_I(),将主设备的ACK_I置高作为对主设备STB_O的响应。 

      在时钟上升沿5,主设备发现ACK_I信号为高,将DAT_I()TGD_I()采样,完成第五次子操作。主设备同时发起第六次子操作,将新地址信号ADR_O()、新TGA_O()放到总线上,将新的SEL_O()信号置高通知从设备将数据放在数据总线的适当位置。 

      在时钟上升沿5过后,从设备检测到主设备发起的第五次子操作,但是由于数据没有准备好,它在新上升沿到达之前将ACK_I信号置低表示插入等待周期。
     上升沿56之间被插入了多个等待周期。当从设备准备好数据,在时钟上升沿6到达之前,将适当的数据放到主设备的DAT_I()TGD_I(),将主设备的ACK_I置高作为对主设备STB_O的响应。 

     在时钟上升沿6,主设备发现ACK_I信号为高,将DAT_I()TGD_I()采样,并将STB_OCYC_O置为低表示整个块读操作完成。 从设备发现STB_O置低后,也将主设备的ACK_I置低。 

同步周期结束方式

图3 Wishbone总线的块读操作(同步周期结束方式)
在时钟上升沿0:
  • Master在[ADR_O()]和[TGA_O()]发出有效的地址
  • Master拉低[WE_O],表明是一个读周期
  • Master发出有效数据选择信号[SEL_O()]表明哪些数据是有效的
  • Master发出[CYC_O]和[TGC_O()]表明总线周期的开始
  • Master发出[STB_O]表明操作的开始
注意:Mater必须在时钟上升沿1或之前发出[CYC_O]和/或[TGC_O()]


在时钟上升沿1:
  • Slave检测到主设备发起的操作,发出[ACK_I]
  • Slave在[DAT_O]和[TGD_O()]发出有效的数据
  • Slave发出[ACK_I]应答[STB_O],表明数据有效,可以读取数据了
  • Master发现[ACK_I],准备锁存[DAT_I]和[TGD_I()]

在时钟上升沿2:
  • Master锁存[DAT_I]和[TGD_I()]
  • Master拉低[STB_O]插入等待周期(-WSS-)


在时钟上升沿3:
  • Master在[ADR_O()]和[TGA_O()]发出有效的地址
  • Master拉低[WE_O],表明是一个读周期
  • Master发出有效数据选择信号[SEL_O()]表明哪些数据是有效的
  • Master发出[STB_O]表明操作的开始

在时钟上升沿4:
  • Slave检测到主设备发起的操作,发出[ACK_I]
  • Slave在[DAT_O]和[TGD_O()]发出有效的数据

在时钟上升沿5:
  • Master锁存[DAT_I]和[TGD_I()]
  • Master拉低[STB_O]和[CYC_O],结束总线周期   

片上总线Wishbone 学习(十二)总线周期之块写操作

异步周期结束方式

         块写操作的例子如图1所示。图1的一次块写操作由五个相互关联的单次写操作完成。 

         在时钟上升沿0,主设备将地址信号ADR_O()TGA_O()放到总线上,将数据信号DAT_O()TGD_O()放到总线上,将WE_O置为高表示写操作,将适当的SEL_O()信号置高通知从设备将数据总线上哪些信号是有效的,将CYC_OTGC_O置高表示操作正在进行,将STB_O置高表示第一次写操作开始。 

         在时钟上升沿1到达之前,从设备检测到主设备发起的操作,将主设备的ACK_I置高作为对主设备STB_O的响应。 

         在时钟上升沿1,从设备将DAT_I()TGD_I()采样;主设备发现ACK_I信号为高,得知第一次写操作完成,于是将新地址信号ADR_O()、新TGA_O()放到总线上,将新数据信号DAT_O()、新TGD_O()放到总线上,将WE_O置为高表示写操作,将适当的SEL_O()信号置高通知从设备将数据总线上哪些信号是有效的,将CYC_OTGC_O置高表示操作继续在进行,将STB_O置高表示第二次写操作开始。 

         在时钟上升沿2到达之前,从设备检测到主设备发起的第二次写操作,将主设备的ACK_I置高作为对主设备STB_O的响应。 

         在时钟上升沿2,从设备将DAT_I()TGD_I()采样;主设备发现ACK_I信号为高,得知第二次写操作完成,发现自己的数据还没有准备好,于是将STB_O置低表示插入等待周期。 

         在时钟上升沿3到达之前,从设备检测到STB_O为低,也将ACK_I置低。 

         在时钟上升沿3,主设备发起第三次操作,将新地址信号ADR_O()、新TGA_O()放到总线上,将新数据信号DAT_O()、新TGD_O()放到总线上,将WE_O置为高表示写操作,将适当的SEL_O()信号置高通知从设备将数据总线上哪些信号是有效的,将CYC_OTGC_O置高表示操作继续进行,将STB_O置高表示第三次写操作开始。 

          在时钟上升沿4到达之前,从设备检测到主设备发起的第三次写操作,将主设备的ACK_I置高作为对主设备STB_O的响应。 

          在时钟上升沿4,从设备将DAT_I()TGD_I()采样;主设备发现ACK_I信号为高,得知第三次写操作完成,于是将新地址信号ADR_O()、新TGA_O()放到总线上,将新数据信号DAT_O()、新TGD_O()放到总线上,将适当的SEL_O()信号置高通知从设备将数据总线上哪些信号是有效的,将STB_O继续置高表示第四次写操作开始。 

          在时钟上升沿5到达之前,从设备检测到主设备发起的第四次写操作,将主设备的ACK_I置高作为对主设备STB_O的响应。 

          在时钟上升沿5,从设备将DAT_I()TGD_I()采样;主设备发现ACK_I信号为高,得知第四次写操作完成,于是发起第五次操作,将新地址信号ADR_O()、新TGA_O()放到总线上。 

          在时钟上升沿5之后新的时钟上升沿到达之前,从设备发现因为某些原因暂时无法继续接收数据,因此将ACK_I信号置低,插入等待。 

          在时钟上升沿6当从设备发现可以继续接收数据,于是在在最后一个等待周期结束且上升沿5到达之前,将DAT_I()TGD_I()采样;主设备发现ACK_I信号为高,得知第五次写操作完成。并将STB_OCYC_O置低表示整个块写操作完成。 


图1 Wishbone总线的块写操作(异步周期结束方式)

同步周期结束方式


图2 Wishbone总线的块写操作(同步周期结束方式)

在时钟上升沿0:
  • Master在[ADR_O()]和[TGA_O()]发出有效的地址
  • Master在[DAT_O()]和[TGD_O()]发出数据
  • Master发出[WE_O],表明是一个写周期
  • Master发出有效数据选择信号[SEL_O()]表明哪些数据是有效的
  • Master发出[CYC_O]和[TGC_O()]表明总线周期的开始
  • Master发出[STB_O]表明操作的开始
注意:Mater必须在时钟上升沿1或之前发出[CYC_O]和/或[TGC_O()]

在时钟上升沿1:
  • Slave检测到主设备发起的操作,准备发出[ACK_I]
  • Slave准备锁存[DAT_O]和[TGD_O()]
  • Slave发出[ACK_I]应答[STB_O]


在时钟上升沿2:
  • Slave锁存[DAT_I]和[TGD_I()]
  • Master拉低[STB_O]插入等待周期(-WSS-)

在时钟上升沿3:

  • Master在[ADR_O()]和[TGA_O()]发出有效的地址
  • Master在[DAT_O()]和[TGD_O()]发出数据
  • Master发出[WE_O],表明是一个写周期
  • Master发出有效数据选择信号[SEL_O()]表明哪些数据是有效的
  • Master发出[CYC_O]和[TGC_O()]表明总线周期的开始
  • Master发出[STB_O]表明第二次操作的开始

在时钟上升沿4:
  • Slave检测到主设备发起的操作,准备发出[ACK_I]
  • Slave准备锁存[DAT_O]和[TGD_O()]

在时钟上升沿5:
  • Master监视[ACK_I]
  • Master拉低[STB_O]和[CYC_O],结束总线周期
   

片上总线Wishbone 学习(十三)总线周期之RMW操作

          在操作系统中,有一种重要的进程间的同步机制称作信号量机制。信号量即当前可用资源的计数。信号量是一个用来实现同步的整型或记录型(Record)变量,除了初始化外,对它只能执行等待和释放这两种原子操作。一次对信号量的等待操作是获得信号量的过程,读取当前信号量的值,如果发现有可利用资源,则将信号量减1,否则进入等待状态。一次对信号量的释放过程即将信号量加1。一个进程对信号的读取、计算新的信号量值、更新信号量的值这三个步骤是不允许被其他进程打破的,如果被打破,则信号量的值将会发生错误,RMW操作的最大用途在于信号量操作。 

        一次RMW操作对于总线来说,本质上是两次子操作,一次读,一次写,只不过这两次子操作必须由同一个主设备的完成,且读数据和写数据的地址相同。""是不发生在总线上的,它发生在主设备内部。一个RMW操作的例子如图13所示,其过程如下: 

          在时钟上升沿0,主设备将地址信号ADR_O()TGA_O()放到总线上,将WE_O置为低表示读操作,将适当的SEL_O()信号置高通知从设备将数据放在数据总线的适当位置,将CYC_OTGC_O()置高表示操作正在进行,将STB_O置高表示第一次子操作开始。CYC_OTGC_O()可以发生在上升沿0以前的任何时刻。 

         在时钟上升沿1到达之前,从设备检测到主设备发起的操作,将适当的数据放到主设备的DAT_I()TGD_I(),将主设备的ACK_I置高作为对主设备STB_O的响应。 

         在时钟上升沿1,主设备发现ACK_I信号为高,将DAT_I()TGD_I()采样,完成第一次子操作。主设备将STB_O置低表示插入等待。 

         在时钟上升沿1之后新的上升沿到达之前,从设备检测到主设备将STB_O置低,于是将ACK_I置低。 

         经过若干等待周期,在上升沿2,主设备将地址信号ADR_O()TGA_O()放到总线上,将数据信号DAT_O()TGD_O()放到总线上,将WE_O置为高表示写操作,将适当的SEL_O()信号置高通知从设备将数据总线上哪些信号是有效的,将STB_O置高表示第二次子操作开始。 

         在时钟上升沿3到达之前,从设备检测到主设备发起的操作,将主设备的ACK_I置高作为对主设备STB_O的响应。 

         在时钟上升沿3,从设备将DAT_I()TGD_I()采样;主设备发现ACK_I信号为高,得知第二次子操作完成,于是将STB_OCYC_O置低表示整个RMW操作完成。 

         在时钟上升沿之后,从设备发现STB_O为低,于是将ACK_I置低。 


图 Wishbone总线的RMW操作



0 0