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

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. linux文件时间的查看和改动touch

    1. linux文件的时间 linux下文件时间主要有以下三种: 1.1 modification time(mtime) 文件改动时间.即文件内容的改动时,更新这个时间.不包含文件权限和属性的改动. ...

  2. [PHP]怎样在SAE的CodeIgniter项目中隐藏掉index.php

    第一步:改动项目根文件夹的config.yaml文件.加入例如以下内容: handle: - rewrite: if(!is_dir() && !is_file() && ...

  3. 前端到后台ThinkPHP开发整站--php开发案例

    前端到后台ThinkPHP开发整站--php开发案例 总结 还是需要做几个案例,一天一个为佳,那样才能做得快. 从需求分析着手,任务体系要构建好,这样才能非常高效. 转自: 前端到后台ThinkPHP ...

  4. hdoj--1408--盐水的故事(技巧)

    盐水的故事 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  5. nyoj--1011--So Easy[II](数学几何水题)

    So Easy[II] 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 这是一道基础的计算几何问题(其实这不提示大家也都看的出).问题描述如下: 给你一个N边形.且N边形 ...

  6. AvtiveMQ 参考

    推荐学习:https://www.cnblogs.com/zhuxiaojie/p/5564187.html#autoid-2-1-0

  7. Keyboard input

    Keyboard input Python provides a build-in function called raw_input (in version 2.x) that gets input ...

  8. RelativeLayout中的baseline

    比如,加入两个相邻的TextView,给第二个TextView一个大一点的padding(比如20dp),如果加了layout_alignBaseline到第二个TextView中的话, TextVi ...

  9. 记intel杯比赛中各种bug与debug【其二】:intel caffe的使用和大坑

    放弃使用pytorch,学习caffe 本文仅记录个人观点,不免存在许多错误 Caffe 学习 caffe模型生成需要如下步骤 编写network.prototxt 编写solver.prototxt ...

  10. shell中处理用户输入

    1.使用命令行参数 在shell执行的时候命令行中输入的所有参数可以赋值给一些特殊变量,这些变量成为位置变量参数. 包括: $0返回脚本名称.$1为第一个参数.$2为第二个参数 ...$9第九个参数 ...