总线控制
看了网络上的文章,质量真的不太行,就自己结合着整理一下。
总线控制主要是两个大方面,总线判优控制和总线通信控制。
一、总线判优控制
总线上同一时刻只允许一个设备进行占用,为了防止冲突,我们引入了判优逻辑,仲裁谁可以先占用。
(实际上我也没有想到居然不是这里提出排队器的,排队器要到IO中断那里。)
总线判优控制的集中式方式有三种:链式查询、计数器定时查询、独立请求方式。
1.链式查询方式
实际上就是最简单的方式。通过三个单向的信号进行控制。
基本的流程也是按照从上到下。
信号 (英文名我随便取的) | 描述 | 控制信号经过控制总线 |
---|---|---|
BR (Bus Request) | 总线请求申请 | 多个设备共用一条总线申请线(一条控制总线),当需要占用总线的时候,就向这个发出申请信号。 |
BG (Bus Grant) | 总线允许 | 当总线控制设备收到BR信号后,从BG线上发出BG信号。但是这个的优先权的决定就是由这个BG线决定的,BG线是类似于一个链式结构,只有经过了前一个,才会到达下一个。当信号到达有需求的设备,那么就会被拦截。所以离总线近的会有高优先权。 |
BS (Bus Suspend) | 总线忙 | 在截获BG信号后,设备要向总线设备控制器发出BS信号,说明匹配成功。 |
注:在查询链中离总线控制器最近的部件具有最高优先权,离总线控制器越远,优先权越低。
链式查询通过接口的优先权排队电路实现。
优点:结构简单,主要运用在简单的嵌入式系统中
缺点:速度慢,需要一直向下查询,对电路故障特别敏感
2.计数器定时查询方式:
实际上就是一种轮询的思想,跟Clock算法可以有点像。
去除了BG线,加上了一组设备地址线(LogN
条,为的是覆盖所有地址)
与链式查询的早期的流程一样,就是有需求就发出请求,当匹配成功就发出BS信号。
但是匹配方式发生了改变,现在是按照设备的地址进行扫描,也就是在控制器内部加入了一个计数器(数电PTSD),回忆一下计数器是干嘛的,进行的就是一个一个数字的遍历,二进制的形式输出到我们的设备地址线。
也就是控制器不管外面发生了什么,就一直在向外面报数。
如果这个时候外面的一个想要占用总线的设备被叫到了名字,那么它就马上回应给控制器(BS信号),然后就占用了。
-
注:计数器的初值可用程序设置,以方便地改变优先次序。当然这种灵活性是以增加控制线数为代价的。
-
如果计数器的初值是从0开始,各部件的优先次序与链式查询法相同。
-
如果从中止点开始,则每个设备使用总线的优先级相等
3.独立请求方式
这个就是最奢侈的方式了,对每个设备都连上一个BR和BG,然后我们就可以直接上排队器了。或者可以用软件控制。
二、总线通信控制
总线通信控制主要负责管理双方是什么时候开始通信,什么时候结束。
总线周期
通常将完成一次总线操作的时间称为总线周期。
阶段 | |
---|---|
申请分配阶段 | 也就是我们的主设备发出请求,判优,是否拿到使用权 |
寻址阶段 | 获得了使用权的主设备,发出地址与信息,启动我们的从设备 |
传数阶段 | 数据交换阶段 |
结束阶段 | 撤出主模块 |
下面讲讲我们的四种方式
同步通信
同步通信的主要特征就是我们的主从设备是使用同一时标(同一CP)。
- 主模块发出命令需要占用总线
- 从模块准备数据不需要占用总线
- 从模块发出数据占用总线
在同步方式下,读操作过程:
- 在第一个时钟周期的上升沿,CPU发出地址。
- 在到第二个时钟周期的上升沿,CPU发出读命令。
- 在到第三个时钟周期的上升沿,内存会内部寻址,把存储单元中的数据送往数据总线。
- CPU对内存的工作速度心知肚明,经过一个时钟周期,CPU就在数据总线上采样,取走数据,内存要在数据总线撤销数据信号,CPU要在控制总线撤销读信号。
- 要确保数据在传送过程无误,地址信息要在地址总线多保持一个周期,最终才会在地址总线上撤销地址信息,这样就经过一个完整的第四个时钟周期。
在同步方式下,写操作过程:
- 在T1的上升沿,CPU发出地址信息;
- 在到T1的下降沿,CPU发送数据到数据总线。
- 再到T2的上升沿,CPU发出写命令信号,这时内存就知道CPU要将一个数据写入内存,于是就从地址总线取走要写入的地址信息,从数据总线取走数据,将数据写到指定的存储单元中。
- 这个过程持续了相当长的过程,经历T2,T3这两个时钟周期,写完后,CPU撤销数据总线的数据信息,及控制总线的写信号。
- 为了确保数据能完整写入内存,地址信息要在地址总线多保持一个时钟周期。最终撤销在地址总线的地址信息。
异步通信
异步通讯克服了同步通信的缺点,允许各模块的速度不一致,给设计者充分的灵活性和选择余地。它没有公共的时钟标准,不要求所有部件严格的统一操作时间,而是采用应答方式(又称握手方式),即当主模块发出请求信号时,一直等待从模块反馈回来“响应”信号后,才开始通信。这要求主从模块之间增加两条应答线。
异步通讯又称应答通讯,是一种建立在应答式或互锁机制基础上的通讯方式。即后一事件出现在总线上的时刻取决于前一事件的出现。在这种系统中,不需要统一的公共时钟信号,总线周期的长度是可变的,不把响应时间强加到功能部件上,因而允许快速和慢速的功能部件都能连接到同一总线上,但这是以增加总线的复杂性和成本为代价的。
异步通讯中根据应答信号是否互锁,即请求和回答信号的建立和撤消是否互相依赖,异步通讯可分为三种类型:非互锁通讯、半互锁通讯和全互锁通讯。
不互锁
- 主模块发出请求信号后,不必等待接到从模块的回答信号,而是进过一段时间,确认从模块已收到请求信号后,便撤销其请求信号;
- 从模块接到请求信号后,在条件允许时发出回答信号,并且经过一段时间(这段时间的设置对不同设备而言是不同的)确认主模块已经收到回答信号后,自动撤销回答信号。
- 可见通信双方并无互锁关系。
半互锁(一次握手)
- 主模块发出请求信号,必须待接到从模块的回答信号后再撤销其请求信号,或互锁关系;
- 而从模块在接到请求信号后发出回答信号,但不必等待获知蛛魔款的请求已经撤销,而是隔一段时间后自动撤销其回答信号,无互锁关系。
- 由于一方存在互锁关系,一方不存在互锁关系,故称半互锁方式。
全互锁(二次握手)
- 主模块发出请求信号,必须待从模块回答后再撤销其请求信号;
- 从模块发出回答信号,必须待获知主模块请求信号已经撤销后,再撤销其应答信号。
- 双发存在互锁关系,故称全互锁方式。
半同步通信
半同步通信集同步与异步通信之优点,既保留了同步通信的基本特点,如所有的地址、命令、数据信号的发出时间,都严格参照系统时钟的某个前沿开始,而接收方都采用系统时钟后沿时刻来进行判断识别。同时又像异步通信那样,允许不同速度的模块和谐地工作。为此增设了一条“等待”响应信号线。
以读命令为例,在同步通信中,主模块在T1发出地址,T2发出命令,T3传输数据,T4结束传输。
倘若从模块工作速度较慢,无法在T3时刻提供数据,则必须在T3之前通知主模块,使其进入等待状态,此刻,从模块置 为低电平有效。
主模块在T3测得“等待”有效,则不立即从数据线上取数,这样一个时钟周期、一个时钟周期地等待,直到主模块测得为高电平即等待无效时,主模块即把此刻的下一周期当作正常周期T3,即时获取数据,T4结束传输。
半同步通信时序可为:
- T1 主模块发地址;
- T2 主模块发命令;
- Tw 当 为低电平有效时,进入等待,其间隔与T统一;
- Tw 当 为低电平有效时,进入等待,其间隔与T统一;
- ……
- T3 从模块提供数据(若属读命令);
- T4 从模块撤消数据。
半同步通信适用于系统工作速度不高,但又包含了许多工作速度差异较大的各类设备的简单系统。半同步通信控制方式比异步通信简单,在全系统内各模块又在统一的系统时钟控制下同步工作,可靠性较高,同步结构较方便。其缺点是对系统时钟频率不能要求太高,故从整体上来看,系统工作的速度还是不很高。
总结:半同步通信的核心就是加入了一个等待线(因为从模块准备的过程可能会比较慢,需要几个周期),如果没有准备好,主模块就等从模块,但是按照以周期为步长。
分离式通信
同步通讯、异步通信和半同步通信都是从主模块发出地址和读写命令开始,直到数据传输结束。在整个传输周期中,系统总线的使用权完全有占有使用权的主模块和由他选中的从模块占据。进一步分析读命令传输周期,发现除了申请总线这一阶段外,其余时间主要花费在如下3个方面。
- 1.主模块通过传输总线向从模块发送地址和命令。
- 2.从模块按照命令进行读数据的必要准备。
- 3.从模块经数据线向主模块提供数据。
对系统总线而言,从模块内部读数据过程并无实质性的信息传输,总线纯属空闲等待。
为了克服和利用这种消极等待,尤其在大型计算机系统中,总线的负载已经处于饱和状态,充分挖掘系统总线每瞬间的潜力,对提高系统系能起到极大作用。
为此提出了“分离式”的通信方式。
基本思想:即将一个传输周期(或总线周期)分解为两个子周期。
在第一个子周期中,主模块A在获得总线使用权后将命令、地址以及其他有关信息,包括主模块编号(当有多个主模块时,此编号尤为重要)发到系统总线上,经过总线传输后,由有关的从模块B接收下来。
主模块A向系统总线发布这些信息只占用总线很短的时间,一旦发送完成,立即放弃总线使用权,以便其他模块使用。
在第二个子周期中,当B模块接收到A模块发来的有关命令信号后,经过选择、译码、读取等一系列内部操作,将A模块所需的数据准备好,便由B模块申请总线使用权,一旦获准,B模块便将A模块的编号、B模块的地址、A模块所需的数据等一系列信息送到总线上,供A模块接收。很显然,上述两个子周期都只有单方向的信息流,每个模块都变成了主模块。
这种通信方式的特点如下:
- 1.个模块占用总线使用权都必须提出申请。
- 2.在得到总线使用权后,主模块在限定的时间内向对方发送信息,采用同步方式传送,不再等待对方的回答信号。
- 3.各模块在准备数据的过程中都不占用总线,是总线可以接受其他模块的请求。
- 4.总线被占用时都在做有效工作,或者通过他发送命令,或者通过他传送数据,不存在空闲等待时间,充分地利用了总线的有效占用,从而实现了在多个主、从模块间进行交叉重叠并行式传送,这对大型计算机是极为重要的。
这种方式控制比较复杂,一般在普通微型计算机系统很少采用。