Wishbone总线快速了解

来源:互联网 发布:明朝朝鲜知乎 编辑:程序博客网 时间:2024/05/18 15:29

以下内容摘自《步步惊芯——软核处理器内部设计分析》一书


      PC机一般都提供PCI插槽,各种板卡(包括显卡、语音卡、网卡,甚至用户自制的板卡)只要满足PCI接口标准,就可以直接插在PC机的PCI插槽使用,十分方便。同样的道理,目前有很多IP核的研发者或公司,为了方便不同研发者或公司的IP核能够直接连接,就要求这些IP核遵守共同的接口标准。在片上系统(SoC)中,处理器核与其他IP核通过共享总线互通互联,这些IP核必须遵守相同的总线规范。总线规范定义了IP核之间的通用接口。目前常见的片上总线规范有ARM公司的AMBA、IBM公司的CoreConnect、Altera公司的Avalon,以及本节介绍的Wishbone,笔者不对这些规范进行比较,只介绍Wishbone规范。

      Wishbone总线规范是Silicore公司最先提出的,由于其开放性,现在已有不少用户群,特别是一些免费的IP核,大多数都采用Wishbone规范。Wishbone除了开放、免费,还有简单、灵活、轻量、支持用户自定义标签的特点。目前已有B4版本的规范,OR1200中遵循的是Wishbone B2与B3版本的规范,用户可以自行配置是采用B2还是B3规范。

      Wishbone有多种互联方式:点对点、数据流、共享总线、交叉互联等。OR1200内部使用的都是点对点连接方式。在点对点连接方式中,有一个主设备,一个从设备,连接关系如图3.3所示,注意图中输出信号使用“_O”结束,输入信号使用“_I”结束,同时所有的信号都是高电平有效。



图3.3 Wishbone总线规范点对点互联方式


      图3.3中主从设备接口的含义如下:

      (1)CLK_I、RST_I:分别是时钟信号、复位信号,由外部输入。

      (2)DAT_O/DAT_I:主设备和从设备的之间的数据信号,数据可以由主设备传送给从设备,也可以由从设备传送给主设备。一对主设备和从设备之间最多存在两条数据总线,一条用于主设备向从设备传输数据,另一条用于从设备向主设备传输数据。

      (3)ADR_O/ADR_I:地址信号,主设备输出地址到从设备。

      (4)WE_O/WE_I:写使能信号,主设备输出到从设备,代表当前周期中进行的操作是写操作还是读操作,1代表写,0代表读。

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

      (6)CYC_O/CYC_I:总线周期信号,CYC_O/CYC_I有效代表一个主设备请求总线使用权或者正在占有总线,但是不一定正在进行总线操作(是否正在进行总线操作取决于选通信号STB_O/STB_I是否有效)。只有该信号有效,Wishbone主设备和从设备之间的其它信号才有意义。CYC_O/CYC_I信号在一次总线操作过程中必须持续有效,比如一次块读操作可能需要多个时钟周期,那么CYC_O/CYC_I信号必须在多个时钟周期中持续有效。

      (7)STB_O/STB_I:选通信号。选通有效代表主设备发起一次总线操作。只有选通信号有效时(此时CYC_O/CYC_I也必须为高),ADR_O/ADR_I、DAT_O/DAT_I、SEL_O/SEL_I才有意义。

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

      (9)TAGN_O/TAGN_I:标签信号,用户可以利用标签信号传递自定义的信息。

      一个总线周期由多个不同的时钟周期构成,完成单次读/写操作、块读/写操作、读改写操作,总线周期也相应分为单次读/写周期、块读/写周期、读改写周期。本节重点介绍单次读/写周期。

      一般情况下,一次操作由主设备和从设备控制信号的一次握手,以及同时进行的地址和数据总线的一次传输构成。当主设备将CYC_O置高,一个总线周期开始,此后当STB_O为高时,一次总线操作开始。CYC_O和STB_O可以同时从低电平变为高电平,表示发起总线周期的同时开始一次总线操作,因此在只有一个主设备时可以将两者合并为一个信号。在OR1200中就直接将CYC_O、STB_O合并成CYCSTB_O。

      主从设备之间信号虽然很多,但单次读写操作实际上十分简单。单次读操作的Wishbone总线信号如图3.4所示,此处是从主设备的角度观察信号变化。




图3.4 Wishbone总线单次读操作时主设备的信号(不考虑TAGN_O/TAGN_I)


       在时钟上升沿0,主设备将地址信号ADR_O、适当的SEL_O放到总线上,将WE_O置低表示读操作,将CYC_O、STB_O置高表示一次总线操作开始。在时钟上升沿1到达之前,从设备检测到主设备发起的操作,将适当的数据放到主设备的输入信号DAT_I,同时将主设备的ACK_I置高作为对主设备STB_O的响应。从设备可以在ACK_I有效之前插入任意数量的等待状态。

      在时钟上升沿1,主设备发现ACK_I信号为高,将DAT_I采样,并将STB_O和CYC_O置低表示操作完成。从设备发现STB_O置低后,将主设备的输入信号ACK_I也置低。单次读操作就完成了。

      单次写操作的Wishbone总线信号如图3.5所示,此处还是从主设备的角度观察信号变化。



图3.5 Wishbone总线单次写操作时主设备的信号(不考虑TAGN_O/TAGN_I)


      在时钟上升沿0,主设备将地址信号ADR_O、数据信号DAT_O放到总线上,将WE_O置高表示写操作,将适当的SEL_O放到总线上指示从设备DAT_O中哪些字节是有效的,将CYC_O、STB_O置高表示一次总线操作开始。

      在时钟上升沿1到达之前,从设备检测到主设备发起的操作,将锁存DAT_O的数据,同时将主设备的ACK_I置高作为对主设备STB_O的响应。从设备可以在ACK_I有效之前插入任意数量的等待状态。

      在时钟上升沿1,主设备发现ACK_I信号为高,将STB_O和CYC_O置低表示操作完成。从设备发现STB_O置低后,将主设备的输入信号ACK_I也置低。单次写操作就完成了。

       以上介绍了Wishbone总线规范的单次读/写操作的操作周期,在OR1200中将STB_O与CYC_O合并成了一个信号CYCSTB_O,所以对于单次读/写操作我们可以简单的认为CYCSTB_O为1时,总线操作开始,依据WE_O的值决定是读还是写,当ACK_I为1时表示总线操作结束。

      读/写周期实际就是连续的多个单次读/写周期,在块读/写周期中CYC_O、STB_O持续有效,本章3.6节的理想取指模型中使用的就是块读/写周期。

      在第一章介绍OR1200内各个模块的时候提到模块WB_BIU,这是一个Wishbone总线接口单元,使得OR1200可以访问具备Wishbone总线接口的外设、存储器等。实际在OR1200内部也大量使用到了Wishbone规范,比如:CPU模块与IMMU、IMMU与QMEM、QMEM与ICache、ICache与WB_BIU之间都使用到了Wishbone总线规范。图3.6中加粗的连线表示模块之间使用的是Wishbone总线规范。使用的都是点对点互联标准。



图3.6 Wishbone总线规范在OR1200内部大量使用


1 0
原创粉丝点击