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

WB_BIU模块是OR1200处理器与外部Wishbone总线连接的接口模块。15.1节给出了WB_BIU模块的对外连接关系,并指出WB_BIU模块的三个作用。由于OR1200处理器支持Wishbone B3版本号。所以在15.2节介绍了Wishbone B3版本号中的寄存反馈总线周期,重点说明了当中的周期类型识别地址标签CTI_O/CTI_I、突发类型扩展地址标签BTE_O/BTE_I的作用。

15.1 WB_BIU模块的对外连接关系

通过图1.6能够发现,OR1200处理器使用了两个WB_BIU(Wishbone
Bus Interface Unit)模块。分别作为处理器的指令Wishbone总线接口单元、数据Wishbone总线接口单元。处理器通过这些总线接口单元进行取指、载入存储数据等操作。

读者朋友可能会有疑问:为何不去掉WB_BIU,使得ICache、SB直接与外部的Wishbone总线连接,毕竟ICache、SB模块的对外接口信号也符合Wishbone总线规范。这就涉及到WB_BIU模块的作用,本节在后面对其接口的介绍中会给出WB_BIU模块的作用,届时读者就会明确。

WB_BIU模块的接口以及对外连接关系如图15.1所看到的。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGVpc2hhbmd3ZW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

图15.1中,WB_BIU模块对处理器外部的接口名称都是wb_xxx_x的形式,对处理器内部的接口名称都是biu_xxx_x的形式,这一点须要注意,在后面代码分析中,能够据此推断某一信号是WB_BIU与处理器外部模块之间的信号。还是WB_BIU与处理器内部模块之间的信号。

从图15.1中还能够发现:WB_BIU与处理器外部模块之间的信号比WB_BIU与处理器内部模块之间的信号多,重点就是图中使用斜体标示的6个信号,这6个信号揭示了WB_BIU模块的作用:

(1)clmode、wb_rst_i、wb_clk_i

处理器外部Wishbone总线的时钟能够小于处理器的时钟。这样做的目的是减少系统功耗,这三个信号的作用就是在Wishbone总线时钟与处理器时钟不一致时,协调WB_BIU模块对处理器内部、外部的Wishbone总线信号,使其正常工作。当中wb_rst_i、wb_clk_i是外部Wishbone总线的复位信号、时钟信号。clmode是时钟模式选择信号。长度是两位。能够设置例如以下:

  • 2’b00:外部Wishbone总线时钟wb_clk_i等于处理器时钟clk
  • 2’b01:外部Wishbone总线时钟wb_clk_i等于处理器时钟clk的一半
  • 2’b10:没有定义
  • 2’b11:外部Wishbone总线时钟wb_clk_i等于处理器时钟clk的1/4

(2)wb_rty_i

当外部设备回复重试信号时(wb_rty_i为1)。WB_BIU模块会再次与外部设备開始Wishbone总线操作周期,仅仅有当重试次数超过一个阈值(默认是64次)的时候,才向处理器报告Wishbone总线操作错误。这样能够提高系统的容错能力。

(3)wb_cti_i、wb_bte_i

wb_cti_i是周期类型识别地址标签,wb_bte_i是突发类型扩展地址标签,两者都是在Wishbone规范B3版中使用的信号,作用是实现Wishbone寄存反馈总线周期。本章第2节会介绍Wishbone寄存反馈总线周期的含义。此处读者仅仅须要知道在处理器内部的Wishbone总线中没有这两个信号。所以WB_BIU模块还起一个不同Wishbone总线规范之间转换的作用。

眼下Wishbone已经制定了B4版,假设要使得OR1200支持新版本号,仅仅须要改动WB_BIU模块就可以,提高了系统的移植能力。

在上面对接口的分析中,已经揭示了WB_BIU模块的作用,假设去掉WB_BIU,那么须要将这些作用在ICache、SB模块中分别实现,显然不是一种好的设计方法。所以不能够去掉WB_BIU模块。

15.2 Wishbone寄存反馈总线周期

假设读者朋友是从本书的開始一章一章阅读到这里的,那么应该会对Wishbone总线的操作周期有一个基本印象:

(1)单次读操作的过程:主设备置位CYC_O/STB_O表示总线操作周期開始。然后通过ADR_O接口送出地址信号,WE_I置低表示读操作。若干个时钟周期后。主设备的ACK_I变为高电平。表示数据读取到,主设备从DAT_I读取数据,同一时候置低CYC_O/STB_O表示总线操作周期结束。从设备也置低ACK_O。

(2)单次写操作的过程:主设备置位CYC_O/STB_O表示总线操作周期開始,然后通过ADR_O接口送出地址信号。DAT_O接口送出要写入的数据。WE_I置高表示写操作,若干个时钟周期后,主设备的ACK_I变为高电平。表示数据写入,主设备置低CYC_O/STB_O表示总线操作周期结束。从设备也置低ACK_O。

(3)块读操作的过程:主设备置位CYC_O/STB_O表示总线操作周期開始,然后通过ADR_O接口送出地址信号。WE_I置低表示读操作,若干个时钟周期后。主设备的ACK_I变为高电平,表示数据读取到,主设备从DAT_I读取数据。从设备置低ACK_O,主设备再次通过ADR_O接口送出新的地址信号,若干个时钟周期后,主设备的ACK_I又变为高电平。表示新数据读取到,主设备从DAT_I读取数据。从设备再次置低ACK_O,如此重复直到主设备置低CYC_O/STB_O。表示总线操作周期结束。

(4)块写操作的过程:主设备置位CYC_O/STB_O表示总线操作周期開始,然后通过ADR_O接口送出地址信号。DAT_O接口送出要写入的数据。WE_I置高表示写操作,若干个时钟周期后,主设备的ACK_I变为高电平,表示数据写入。从设备置低ACK_O。主设备再次通过ADR_O、DAT_O接口送出新的地址信号、数据信号,若干个时钟周期后。主设备的ACK_I又变为高电平。表示新数据写入,从设备再次置低ACK_O。如此重复直到主设备置低CYC_O/STB_O,表示总线操作周期结束。

当中块读、写操作的过程在第13章分析DCache时都接触过。在第13章演示样例程序的第8步,当第一次使用l.sw指令载入数据时,会发生DCache失靶,假设配置的是回写法,那么处理器会从外部RAM中连续读入4个字填充到DCache(也能够称为突发读入4个字)。代码例如以下:

##############################           第8步            ##############################
指令地址 指令 指令相应的二进制
0x800078 l.addi r1,r0,0x10 0x9c200010
_loop1:
0x80007C l.sw 0x0(r1),r1 0xd4010800 //第一次运行该指令时会发生DCache失靶
0x800080 l.sfeqi r1,0x1C 0xbc01001c
0x800084 l.bnf _loop1 0x0ffffffe
0x800088 l.addi r1,r1,0x4 0x9c210004

ModelSim仿真波形如图15.2所看到的,这里就是块读操作的过程。

从图中可知,每次都是在主设备收到ACK_I为1后,才给出新的地址,然后从设备根据新的地址開始下一次操作,假如从设备事先知道主设备将要发起新的操作,而且知道新的地址。那么就能够在上次操作后,马上開始下一次操作。而不用等待从主设备接收到新的地址后才開始。从而能够节省时钟周期,提高系统的吞吐量,这样的方式就是“Wishbone寄存反馈总线周期”。

在Wishbone寄存反馈总线周期中。从设备须要事先知道在当前操作完毕后。主设备是否将发起新的总线操作,这是通过周期类型识别地址标签CTI_O/CTI_I、突发类型扩展地址标签BTE_O/BTE_I完毕的。

CTI_O/CTI_I提供描写叙述当前操作突发模式的信息,从设备能够依据该信息确定在下一个时钟周期怎样操作。其详细定义如表15.1所看到的。

恒定地址突发总线周期指的是在一个总线周期中完毕多次操作,可是地址不变,这样的方式的典型应用是以DMA方式读写FIFO。递增突发总线周期指的是在一个总线周期中完毕多次操作,可是地址递增,且地址添加方式分为线性添加、折叠添加。BTE_O/BTE_I描写叙述的就是地址添加方式。如表15.2所看到的。

在线性添加中。新的地址总是比旧的地址大一个单位添加值,单位添加值取决于总线的宽度和粒度。对于粒度为8的总线。当总线宽度是8时,单位添加值为1。当总线宽度是16时,单位添加值为2。当宽度是32时,单位添加值为4。

在折叠添加中,分为叠4添加、叠8添加、叠16添加。新地址的获得方式为在旧地址的部分位上加1,比方:叠4添加,且单位添加值为4时。那么通过在旧地址的2-3位上加1获得新地址,之前ICache、DCache中突发读入4个字时採用的就是这样的地址计算方法。

从设备能够根据其输入信号CTI_I、BTE_I的值,提前知道下一个操作的地址,从而能够提前进行操作,节省了时钟周期。当主设备将CTI_O置为3’b111时。表示当前操作是当前突发的最后一个操作,主设备在当前操作结束后紧接着的时钟周期不再发起操作,Wishbone寄存反馈总线周期结束。

主设备和从设备若以寄存反馈总线周期工作。至少必须同一时候支持CTI_O/CTI_I信号。

若主设备或从设备之中的一个不支持CTI_O/CTI_I,那么仅仅能以传统总线周期方式工作,此时主设备或者从设备必须将CTI_O/CTI_I置为3’b000或者3’b111,两者是等价的。

在11.5节,简单SOPC的建立过程中,改动了OR1200中WB_BIU模块的代码,例如以下,读者能够临时觉得当中的信号wb_cti_nxt就是WB_BIU与处理器外部Wishbone总线之间的CTI_O接口信号:

or1200_wb_biu.v
always @(wb_fsm_state_cur or burst_len or wb_err_i or wb_rty_i or wb_ack or wb_cti_o
or wb_sel_o or wb_stb_o or wb_we_o or biu_cyc_i or biu_stb or biu_cab_i
or biu_sel_i or biu_we_i) begin
case(wb_fsm_state_cur)
wb_fsm_idle : begin
wb_cyc_nxt = biu_cyc_i & biu_stb;
wb_stb_nxt = biu_cyc_i & biu_stb; //原值为wb_cti_nxt = {!biu_cab_i, 1'b1, !biu_cab_i};
wb_cti_nxt = {1'b1, 1'b1, 1'b1};
……

有了Wishbone寄存反馈总线周期的知识。读者就能够理解为何作上述改动了,解释例如以下:

在改动之前,wb_cti_nxt的值是{!biu_cab_i, 1'b1, !biu_cab_i},以指令Wishbone总线接口为例,biu_cab_i来自ICache的输出icbiu_cab_o,回顾一下12.8.3节。当ICache失靶时,须要从外部RAM连续读入4个字。此时会设置icbiu_cab_o为1。从而使得WB_BIU模块的wb_cti_nxt的值为3’b010。參考表15.1可知,也就是採用递增突发总线周期。可是简单SOPC中OR1200处理器挂接在Wishbone总线互联矩阵WB_CONMAX模块上,而WB_CONMAX并不支持Wishbone
B3版本号。也就是没有CTI_O/CTI_I、BTE_I/BTE_O接口。所以会出错。上述改动就是使得WB_BIU的wb_cti_nxt信号保持为3’b111。从而强制使用传统总线操作周期,这样尽管效率低一些,但不会出错。对于数据Wishbone总线接口单元也存在相同的问题。

此外,还能够发现,改动之前wb_cti_nxt的值是{!biu_cab_i, 1'b1, !biu_cab_i}。中间的一位恒定为1,这说明OR1200处理器中的WB_BIU模块仅仅支持传统总线周期或递增突发总线周期,而不支持恒定地址突发总线周期。

OR1200处理器中Wishbone总线接口模块WB_BIU介绍的更多相关文章

  1. or1200处理器的异常处理类指令介绍

    下面内容摘自<步步惊芯--软核处理器内部设计分析>一书 我们在计算机体系结构的学习中知道:中断实质上包含由外部事件引起的硬中断(又称外中断)和由内部预先安排的特定指令或内部异常引起的软中断 ...

  2. ARM中的总线

    ARM中的总线用于不同部件之间的通信.有两种不同类型的设备连接到总线:ARM处理器,它是总线的主设备,拥有对总线的仲裁权,可以通过同一总线主动发起数据传输请求:外围器件,是总线的从设备,在总线上是被动 ...

  3. openrisc 之 Wishbone总线学习笔记——接口信号定义

    这部分内容就是copy下来的,网上到处都有.先看看接口啥样子,在详细说明 接口定义copy http://blog.csdn.net/ce123/article/details/6929897.百度文 ...

  4. openrisc 之 Wishbone总线学习笔记——总线互联

    一,总线命名规范 1,wishbone总线接口信号都是高电平有限 2,wishbone接口信号都是以 _i ,或者是 _o 结束.i表示输入, o表示输出. ()表示该信号为总线信号,总线位宽可以大于 ...

  5. ASP.NET Core Web API下事件驱动型架构的实现(二):事件处理器中对象生命周期的管理

    在上文中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发.订阅和处理的流程.这种实现太简单了,百十行代码就展示了一个基本工作原理.然而,要将这样的解决方案运用到实际生产环境,还有很 ...

  6. Linux操作系统中的文件目录结构详细介绍

    "/" :Linux文件系统的入口.也是最高一级的目录. "/bin":基本系统所需要的命令,功能和"/usr/bin"类似,这个目录下的文 ...

  7. RS485总线典型电路介绍

    一.RS485总线介绍: RS485总线是一种常见的串行总线标准,采用平衡发送与差分接收的方式,因此具有抑制共模干扰的能力.在一些要求通信距离为几十米到上千米的时候,RS485总线是一种应用最为广泛的 ...

  8. meta标签中的http-equiv属性使用介绍(转载)

    meta是html语言head区的一个辅助性标签.也许你认为这些代码可有可无.其实如果你能够用好meta标签,会给你带来意想不到的效果,meta标签的作用有:搜索引擎优化(SEO),定义页面使用语言, ...

  9. jQuery中$.fn的用法示例介绍

    $.fn是指jquery的命名空间,加上fn上的方法及属性,会对jquery实例每一个有效,下面有个不错的示例,喜欢的朋友可以参考下 如扩展$.fn.abc(),即$.fn.abc()是对jquery ...

随机推荐

  1. js 压缩图片 H5

    原理 用 canvas的 toDataURI (type , int )  如果type参数的值为image/jpeg或image/webp,则第二个参数的值如果在0.0和1.0之间的话,会被看作是图 ...

  2. sass10 demo1

    index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  3. 51nod-1322: 关于树的函数

    [传送门:51nod-1322] 简要题意: 给出n个点的两棵无根树,编号都是从0到n-1 现在每棵树任意选出一条边割断,设第一棵树选出的边为e1,第二棵树选出的边为e2 很显然割断后两棵树各分成了四 ...

  4. thinkphp命名空间

    thinkphp命名空间 总结 1.只对函数,类,及const定义的常量有效,对define定义的常量无效 2.如果函数不是为了使用,那有什么意义呢 3.ThinkPHP将命名空间转化为了路径,比如n ...

  5. lightoj--1155-- Power Transmission (最大流拆点)

    Power Transmission Time Limit: 2000MS   Memory Limit: 32768KB   64bit IO Format: %lld & %llu Sub ...

  6. leetcode 生成杨辉三角形, 118 119 Pascal's Triangle 1,2

    Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5, Retu ...

  7. c# 枚举enum

    1 定义枚举 enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday }; 默认情况下,枚举中的每个元素的 ...

  8. sublime text3之修改注释颜色

    在用sublime text3编写Python2代码时总觉得注释颜色太浅了, 看起来吃力,于是就尝试去修改,和sublime text2不同, sublime text3的主题配置文件在Sublime ...

  9. Signal programming

    Signal programming is used in the same sense as dataflow programming, and is similar to event-driven ...

  10. [JLOI2011]飞行路线 分层图最短路

    题目描述: Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在nn个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一 ...