OpenRISC—OR1200总线标准Wishbone
admin 于 2021年02月22日 发表在 软核OR1200

上一篇《OpenRISC—OR1200各子模块总览》对OR1200各子模块进行了介绍。针对5大子模块,不免产生一个疑问,这些模块之间通过怎样的接口进行连接和数据传输呢?这就要介绍Wishbone总线标准了。

1. 各端口信号定义

or1200各子模块.png

    标准OR1200的IO端口可以分为5类:系统、指令wishbone总线接口、数据wishbone总线接口、调试接口和电源管理接口。

1.1 系统IO端口信号

OR1200系统IO端口信号

序号

信号

宽度

方向

功能

1

clk_i

1

输入

CPU主时钟

2

rst_i

1

输入

复位

3

pic_ints_i

20

输入

中断

4

clmode_i

2

输入

CPU时钟与wish-bone时钟比例

1.2 指令wishbone总线接口IO端口信号

OR1200指令wishbone总线接口IO端口信号

序号

信号

宽度

方向

功能

1

iwb_clk_i

1

输入

时钟

2

iwb_rst_i

1

输入

复位

3

iwb_ack_i

1

输入

响应

4

iwb_err_i

1

输入

错误

5

iwb_rty_i

1

输入

重试

6

iwb_dat_i

32

输入

数据输入

7

iwb_cyc_o

1

输出

循环

8

iwb_adr_o

32

输出

地址

9

iwb_stb_o

1

输出

选通

10

iwb_we_o

1

输出

写使能

11

iwb_sel_o

4

输出

字节选择

12

iwb_dat_o

32

输出

数据输出

13

iwb_cab_o

1

输出

突发

14

iwb_cti_o

3

输出

循环类型

15

iwb_bte_o

2

输出

突发类型扩展

1.3 数据wishbone总线接口IO端口信号

OR1200数据wishbone总线接口IO端口信号

序号

信号

宽度

方向

功能

1

dwb_clk_i

1

输入

时钟

2

dwb_rst_i

1

输入

复位

3

dwb_ack_i

1

输入

响应

4

dwb_err_i

1

输入

错误

5

dwb_rty_i

1

输入

重试

6

dwb_dat_i

32

输入

数据输入

7

dwb_cyc_o

1

输出

循环

8

dwb_adr_o

32

输出

地址

9

dwb_stb_o

1

输出

选通

10

dwb_we_o

1

输出

写使能

11

dwb_sel_o

4

输出

字节选择

12

dwb_dat_o

32

输出

数据输出

13

dwb_cab_o

1

输出

突发

14

dwb_cti_o

3

输出

循环类型

15

dwb_bte_o

2

输出

突发类型扩展

1.4 调试IO端口信号

OR1200调试IO端口信号

序号

信号

宽度

方向

功能

1

dbg_stall_i

1

输入

停止CPU

2

dbg_dat_i

32

输入

数据输入

3

dbg_adr_i

32

输入

地址输入

4

dbg_op_i

3

输入

操作选择

5

dbg_ewt_i

1

输入

观察点触发

6

dbg_lss_o

4

输出

Load/Store单元状态

7

dbg_is_o

2

输出

指令预取状态

8

dbg_wp_o

11

输出

观察点

9

dbg_bp_o

1

输出

断点

10

dbg_dat_o

32

输出

数据输出

1.5 电源管理IO端口信号

OR1200电源管理IO端口信号

序号

信号

宽度

方向

功能

1

pm_cpustall_i

1

输入

停止CPU

2

pm_clksd_o

4

输出

时钟停止因数

3

pm_dc_gate_o

1

输出

门控数据缓存时钟

4

pm_ic_gate_o

1

输出

门控指令缓存时钟

5

pm_dmmu_gate_o

1

输出

门控数据MMU时钟

6

pm_immu_gate_o

1

输出

门控指令MMU时钟

7

pm_tt_gate_o

1

输出

门控滴答定时器时钟

8

pm_cpu_gate_o

1

输出

门控CPU主时钟

9

pm_wakeup_o

1

输出

唤醒

10

pm_lvolt_o

1

输出

低压状态

2. Wishbone总线

    总线规范是一种片上系统IP核互连体系结构。它定义了一种IP 核之间公共的逻辑接口,减轻了系统组件集成的难度,提高了系统组件的可重用性、可靠性和可移植性,加快产品市场化的速度。目前常见的片上总线规范有ARM公司的AMBA、IBM公司的CoreConnect、Altera公司的Avalon、以及Wishbone。

    Wishbone是Silicore公司提出来的,现已被移交给OpenCores组织维护。由于其开放性,已有不少的用户群体,特别是一些免费的IP核,大多采用Wishbone标准。Wishbone总线规范用于软核、固核和硬核,对开发工具和目标硬件没有特殊要求,并且兼容绝大多数已有的综合工具,可以用多种硬件描述语言来实现。

    为满足不同系统的需要,Wishbone总线提供了四种不同的IP核互连方式:

  • 点到点(Point to Point):用于两IP核直接互连;

  • 数据流(Data Flow):用于多个串行IP之间的数据并发传输;

  • 共享总线(Shared Bus):多个IP核共享一条总线;

  • 交叉开关(Crossbar Switch):同时连接多个主从部件,提高系统吞吐量。

wishbone总线形式.png

    wishbone总线主要特征如下:

  • 所有应用适用于同一种总线体系结构;

  • 是一种简单、紧凑的逻辑IP核硬件接口,只需很少的逻辑单元即可实现;

  • 时序非常简单

  • 主/从结构的总线,支持多个总线主设备

  • 8~64位数据总线(可扩充)

  • 单周期读/写

  • 支持所有常用的总线数据传输协议,如单字节读/写周期、块传输周期、控制操作及其他的总线事务等;

  • 支持多种IP核互连网络,如单向总线、双向总线、基于多路互用的互连网络、基于三态的互连网络等;

  • 支持总线周期的正常结束、重试结束和错误结束;

  • 使用用户自定义标记(TAG),确定数据传输类型、中断向量等;

  • 仲裁机制由用户自定义;

  • 独立于硬件技术(FPGA、ASIC、bipolar、MOS等),IP核类型(软核、固核、硬核),综合工具,布局和布线技术等。

2.1 Wishbone总线信号

 总线各信号线功能.png

    Wishbone总线信号分为四类:系统控制信号、主从共有信号、主设备信号和从设备信号。

2.1.1 系统控制信号

序号

信号

功能

描述

1

CLK_O

系统时钟输出

系统时钟输出。由SYSCON模块产生,它同步Wishbone互连的所有内部信号有效。INTERCON(主/从设备连接)模块连接CLK_O和主从设备的CLK_I信号。

2

RST_O

复位输出

由SYSCON模块产生,它强制所有的Wishbone接口重新启动。所有的内部自启动状态将被强制处于初始状态。INTERCON模块(主/从设备连接模块)连接RST_O和主设备的RST_I信号。

2.1.2 主从共有信号

序号

信号

功能

描述

1

CLK_I

时钟输入

同步Wishbone互连的所有内部信号有效。所有的Wishbone输出信号在CLK_I的上升沿寄存,在CLK_I的上升沿前处于稳定状态。

2

RST_I

复位输入

强制Wishbone接口重新启动。此外,所有的内部自启动状态机将被强制处于初始状态。这个信号只复位Wishbone接口,不需复位IP Core的其他部分。

3

DAT_I

数据输入总线

用来传递二进制数据。总线的边界由端口大小决定,端口的最大值为64位(如DAT_I[0:63])

4

DAT_O

数据输出总线

用于传递二进制数据。总线的边界由端口大小决定,端口的最大值64位(如DAT_O[0:63])

5

TGD_I

数据标记类型

用于主设备和从设备的接口上。它包含与数据输入总线DAT_I有关的信息,并且由STB_I信号决定有效性。比如,奇偶保护、错误修正和时序标记信号可以附加在数据总线上。由于新信号的时序已经预先定义,这些标记简化了新信号的定义工作。在接口的数据手册中必须定义数据标记的名称和操作。

6

TGD_O

数据标记类型

用于主设备和从设备的接口上。它包含与数据输出总线DAT_O有关的信息,并且由STB_I信号决定有效性。由于新信号的时序已经预先定义,这些标记位简化了新信号的定义工作。在接口的数据手册中必须定义数据标记的名称和操作。

2.1.3 主设备信号

序号

信号

功能

描述

1

ADR_O

地址输出总线

用于传递二进制地址。总线的高端边界由IP Core的地址总线的宽度决定,总线的低端边界由数据端口的宽度和粒度决定。比如,一个32位的数据端口的字节粒度是ADR_O[2:n]。对于有些情况(比如FIFO接口),在接口中没有这个总线。

2

WE_O

写使能输出

指示当前的本地总线循环是READ循环还是WRITE循环。

1代表写,0代表读。

3

SEL_O

选择输出总线

指示在READ循环时有效数据在DAT_I总线中的位置,以及在WRITE循环时有效数据在DAT_O总线中的位置。选择输出总线的边界由端口的粒度决定。比如,如果在一个64位的端口中使用8位的粒度,那么选择输出总线将有8个信号,边界是SEL_O[0:7]。每个单独的选择信号确定64位数据总线的8个有效字节中的一个。

4

STB_O

选通输出

指示一个有效的数据传输循环。它用于确定像SEL_O这样的接口上的其他信号的有效性。对于每个STB_O信号的声明,从设备需要声明ACK_I、ERR_I或RTY_I信号。

5

ACK_I

应答输入

当它有效时,表明一个总线循环的正常结束。

ERR_I

错误输入

提示一次错误的总线循环的结束。错误源和主设备的反应由IP Core的提供方定义。

RTY_I

重试输入

指示接口没有准备好接收或者发送数据,并且循环应当重试。何时以及如何进行重试由IP Core的提供方定义。

6

CYC_O

循环输出

当它有效时,表明正在进行一个正确的总线循环。这个信号在所有总线循环持续过程中保持有效。比如,在一个块传送过程中有很多次数据传动。CYC_O在多端口接口(如双口存储器的接口)中很有用。在这种情况下,CYC_O信号需要使用仲裁器提供的共有总线。

7

LOCK_O

锁定输出

当它有效时,表明当前的总线循环不能被打断。锁定信号用于声明需要获取对总线完全拥有权。一旦传送开始,INTERCON模块不会将总线控制权交给其他主设备,直到当前主设备放弃LOCK_O或CYC_O。

8

TGA_O

地址标记类型

包含与地址线ADR_O有关信息,并且由STB_O信号确定有效性。比如,地址尺寸(24位、32位)和存储器管理(保护与非保护)信号可以附加在某一个地址上。由于新信号的时序已经预先定义,这些标记位简化了新信号的定义工作。在接口的数据手册中必须定义数据标记的名称和操作。

9

TGC_O

循环标记类型

包含与总线循环有关的信息,并且由CYC_O信号决定有效性。比如,数据传输、中断响应和缓存控制循环由循环标记来唯一确定。它们也可以用来区别SINGLE、BLOCK和RMW循环。由于新信号的时序已经预先定义,这些标记位简化了新信号的定义工作。在接口的数据手册中必须定义数据标记的名称和操作。

2.1.4 从设备信号

序号

信号

功能

描述

1

ADR_I

地址输入总线

用于传递二进制地址。总线的高端边界由IP Core的地址总线的宽度决定,总线的低端边界由数据端口的宽度和粒度决定。比如,一个32位的数据端口的字节粒度是ADR_O[2:n]。对于有些情况(比如FIFO接口),在接口中没有这个总线。

2

WE_I

写使能输入

指示当前的本地总线循环是READ循环还是WRITE循环。

1代表写,0代表读。

3

SEL_I

选择输入总线

指示在WRITE循环时有效数据在DAT_I总线中的位置,和在READ循环时有效数据在DAT_O总线中的位置。选择输出总线的边界由端口的粒度决定。比如,如果在一个64位的端口中使用8位的粒度,那么选择输出总线将有8个信号,边界是SEL_I[0:7]。每个单独的选择信号确定64位数据总线的8个有效字节中的一个。

4

STB_I

选通输入

当它有效时,指示这个从设备被选中。当STB_I有效时,一个从设备应当只对其他的Wishbone信号作出反应。对于每个STB_I信号的声明,从设备需要声明ACK_O、ERR_O或RTY_O。

5

ACK_O

应答输出

当它有效时,表明一个总线循环的正常结束。

ERR_O

错误输出

指示一次错误的总线循环的结束。错误源和主设备的反应由IP Core的提供定义。

RTY_O

重试输出

指示接口没有准备好接收或发送数据,并且循环应该重试。何时以及如何进行重试由IP Core的提供定义。

6

CYC_I

循环输入

当它有效时,表明正在进行一个正确的总线循环。这个信号在所有总线循环的持续过程中保持有效。比如,在一个块传送过程中会有多次输出传送。CYC_I信号在第一次数据传输时有效,并且一直保持到最后一个数据传输。

7

LOCK_I

锁定输入

当它有效时,表明当前的总线循环不能被打断。一个收到LOCK_I信号的从设备只能被一个主设备访问,直到LOCK_I或CYC_I无效。

8

TGA_I

地址标记类型

包含与地址线ADR_I有关的信息,并且由STB_O信号确定有效性。比如,地址尺寸(24位、32位)和存储器管理(保护与非保护)信息可以附加在某一个地址上。由于新信号的时序已经预先定义,这些标记位简化了新信号的定义工作。在接口的数据手册中必须定义数据标记的名称和操作。

9

TGC_I

循环标记类型

包含与总线循环有关信息,并且由CYC_I信号决定有效性。比如,数据传输、中断响应和缓存控制循环,由循环标记来唯一确定。他们也可以用来区别SINGLE、BLOCK和RMW循环。由于新信号的时序已经预先定义,这些标记位简化了新信号的定义工作。在接口的数据手册中必须定义数据标记的名称和操作。

2.2 Wishbone总线时序

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

    具体时序,请参考对应书籍。

参考来源:

[1] 《步步惊芯—软核处理器内部设计分析》      雷思磊                    电子工业出版社

[2] 《开源软核处理器OpenRisc的SOPC设计》  徐敏、孙恺等          北京航空航天出版社

下一篇:《OpenRISC—OR1200子模块QMEM》

注意:本站所有文章除特别说明外,均为原创,转载请务必以超链接方式并注明作者出处。 标签:OpenRISC,OR1200软核,wishbone总线