在Xilinx EDK的Microblaze软核中有用到多种总线接口,其中OPB(On-chip Peripheral Bus)是一种将各种外部设备连接到Microblaze处理系统中的一种总线接口,比如Timer/Counter、Gpio、Uart等,就是通过OPB总线连接到Microblaze处理器内核。
OPB总线能够在不影响OPB仲裁器(Arbiter)和总线上已连接的外围设备基础上添加新的外围设备,同步于系统时钟,共享32位地址总线,以及32位数据总线,支持主从设备之间单一周期数据传送。
(这里要说明下PLB总线,它是PowerPC硬核的高速总线,64位数据总线宽度,地址和读写数据总线分离,具备分别传输的能力。现在最新的ISE11已经将Microblaze的OPB总线也搞成PLB总线,目前还不确定是不是仅仅改了名称而已。问题:地址和读写数据总线分离怎么理解?是读和写操作可以同时进行?)
OPB总线包含4个组成部分:(1)主设备 Master Device 最大16个(可能是受限于仲裁器)
(2)从设备 Slave Device 无限制,受限于FPGA的硬件资源
(3)仲裁器 Arbiter 根据设定的优先级,判决主设备的总线占用顺序
(4)互联器 Interconnect 用OR逻辑将各个主设备的地址,数据连接起来
总线的结构:
总线,是指提供的一个数据通道,使得多个设备之间可以进行数据传递。能够主动向总线发出请求的是主设备(Master),只能被动接收请求的是从设备(Slave)。所以总线的系统结构一般分为三个部分:(1)Master
(2)Slave,
(3)总线逻辑,总线逻辑由互连器(Interconnect)和仲裁器(Arbiter)两部分组成。
总线操作的一般流程是:Master向总线发出读写请求,总线逻辑接受请求并负责把这些请求传送给从设备;从设备收到后执行读写操作,完成后给出确认信号,总线逻辑再负责把确认信号传送给主设备,主设备收到确认后,数据传输过程完成。
有的总线结构只允许有一个Master,而有的可以有几个Master。OPB总线属于后者。当可以有好几个Master时,如果多个Master都向总线发出请求,这时就需要进行仲裁,以确定哪个Master可以占有总线。因此,如果总线上挂有多个Master,就需要仲裁器(Arbiter);反之,如果只有一个Master(包括可以有几个Master但实际上只使用一个Master的情况),就一定不需要仲裁器。
总线上往往有多个Slave,因为如果只有一个Master和一个Slave的话,似乎也就没有必要采用总线,直接传输数据就可以了。那么既然有多个Slave,Master向总线发出请求时,如何区分是对哪个Slave进行操作呢?这是通过地址来分辨的。Master向总线发出请求时,总是会将要操作的地址送出来,这个地址可能是通过单独的地址线,也可能是复用数据线。(片上总线往往采用单独的地址线,与外部连接的总线则往往复用以节省引脚数。)每个Slave都被分配有互不重叠的地址空间,根据这个地址和自己的地址空间比较,就可以知道Master是不是对自己进行操作,从而可以判断是否应该做出响应。
OPB总线信号命名规则:
OPB总线中的信号命有三种:
(1)Mn_打头的,是Master的输出;
(2)Sln_打头的,是Slave的输出;
(3)OPB_打头的,是总线逻辑的输出。
OPB总线的连经逻辑采用OR逻辑,因此,当一个Master或者Slave不对总线输出时,应该将其输出置为0,就可以不影响总线的正常工作。
总线逻辑一般都是接受Master的输出后,进行一定的或运算,变成OPB_打头的输出,送给Slave;或者接受Slave的输出后,进行一定的或运算,变成OPB_打头的输出,送给Master。所以,对于Master而言,它需要处理的信号有两种,Mn_打头的是它的输出,OPB_打头的是它的输入。对于Slave而言,它需要处理的信号也是两种,Sln_打头的是它的输出,OPB_打头的是它的输入。
OPB总线的复位:
OPB总线可以被多种复位信号复位,不过上电复位优先级最高。当FPGA装载成功后,系统会自动花费16个时钟周期来复位OPB总线,在这期间,OPB不响应任何其他复位信号的复位动作。其他复位信号有:
(1)SYS_Rst 系统复位 (2)WDT_Rst 看门狗定时器溢出复位 (3)Debug_SYS_Rst 通过JTAG接口,在调试软件上控制复位OPB总线(如何操作还需要另外研究研究)
OPB总线事物处理流程:
(1)Master首先发出Mn_Request信号,要求占用总线;
(2)仲裁器根据该周期的总线情况和其他Master的请求及优先权,可能回复OPB_Grant信号告知Master可能使用总线。
(3)Master收到Grant后,发出Mn_Select占用总线,同时发出地址Mn_ABus和读写信号Mn_RNW,如果是写还会给出数据Mn_DBus。总线逻辑将这些转化为OPB_Select,OPB_ABus,OPB_RNW,OPB_DBus并送给Slave。
(4)Slave根据OPB_Select和OPB_ABus来判断是否应该做出响应。如果是属于自己的地址空间,则升高Sln_En占据总线,同时完成相应的操作,并返回数据Sln_DBus和数据有效信号Sln_XferAck。
(5)总线逻辑将Sln_DBus和Sln_XferAck转化为OPB_DBus和OPB_XferAck,并送给Master。Master收到后降低Mn_Select,结束总线事务。