
1. 项目概述与核心价值在嵌入式系统尤其是那些需要处理多路并发任务或集成多个智能外设的复杂应用中一个核心的挑战是如何让多个“主设备”Master Device高效、有序地共享同一套系统总线。想象一下在一个车间里只有一条传送带总线但有多台机器主设备如CPU、DMA控制器、协处理器都需要用它来运送原料数据。如果大家一拥而上必然导致混乱和碰撞。总线仲裁Bus Arbitration就是这套系统的“交通警察”和“调度员”它定义了谁在什么时候可以独占传送带以及如何安全地交接控制权。MC68306作为摩托罗拉后飞思卡尔M68000家族中的一款经典集成微处理器其内置的总线仲裁单元是理解这类老派但设计精良的微处理器系统架构的绝佳范例。它不像现代基于高速串行总线的SoC那样复杂但其清晰、严谨的“请求-应答”机制以及与之紧密配合的异步操作时序是构建稳定、可靠多主系统的基石。很多工业控制板、通信设备中的主控模块其底层逻辑依然能看到这些设计的影子。深入理解MC68306的总线仲裁不仅仅是读懂一份二十多年前的数据手册。它的价值在于你能掌握一套经典的多主系统协同方法论。当你需要调试一个DMA传输导致系统挂起的问题或者设计一个带有多片处理器的板卡时这些关于BRBus Request、BGBus Grant、BGACKBus Grant Acknowledge信号何时拉高、何时拉低、如何同步的细节就是定位问题的“手术刀”。本文将带你穿透时序图的表象拆解三线与两线仲裁的运作差异并厘清异步操作下DTACK、BERR、HALT这三个关键握手信号如何决定一个总线周期的“生死”。无论你是正在维护遗产系统还是希望从经典设计中汲取营养这篇文章都将提供可直接用于电路设计和软件调试的干货。2. 总线仲裁机制深度解析总线仲裁的本质是解决多个主设备对共享资源的竞争问题。MC68306作为默认的总线主设备通常是系统的中央处理器它需要一套机制来响应外部其他主设备如另一个CPU、DMA控制器或智能I/O处理器使用总线的请求并在适当时机交出控制权。2.1 仲裁信号与基本流程MC68306支持两种仲裁协议三线仲裁和两线仲裁。核心信号如下BR(Bus Request)输入信号。由希望获得总线控制权的外部主设备发出。多个设备的BR信号可以通过“线或”Wire-OR的方式连接至处理器的BR引脚这意味着任一设备拉低BR处理器就能感知到请求。BG(Bus Grant)输出信号。处理器收到有效的BR后在完成当前总线周期后会发出BG信号表示“我同意交出总线你们外部仲裁逻辑可以开始决定下一个主设备是谁了”。BGACK(Bus Grant Acknowledge)输入信号仅用于三线仲裁。被授权成为新总线主设备的外部设备在确认满足所有接管条件后发出此信号。它向处理器和系统中所有设备宣告“我现在是总线主设备了总线由我控制”。注意“线或”连接通常需要集电极开路Open-Collector或漏极开路Open-Drain输出结构以确保多个输出连接在同一线上时不会发生短路。但手册也提到并非必须使用这类器件只要逻辑设计能保证“或”的关系即可这为设计提供了灵活性。基本流程可以概括为外部设备请求(BR) - 处理器授权(BG) - 外部设备确认并接管(BGACK三线) - 外部设备使用总线 - 外部设备释放总线(撤销BGACK和BR) - 处理器收回控制权。2.2 三线仲裁 vs. 两线仲裁设计取舍与适用场景这是理解MC68306仲裁的关键。两种方案并非孰优孰劣而是针对不同系统复杂度和成本的设计取舍。三线仲裁BR/BG/BGACK这是功能最完整、安全性最高的方案。BGACK信号的存在建立了一个明确的总线所有权“交接仪式”。明确的占有宣告BGACK有效是当前总线主设备的唯一、权威标识。所有从设备Slave都监听此信号只响应当前BGACK有效的主设备的访问。安全的释放条件外部设备必须在AS地址选通、DTACK数据传输应答和上一个BGACK均无效后才能发出自己的BGACK。这确保了前任主设备已经完全释放了总线AS无效并且与从设备的交易也已结束DTACK无效避免了总线冲突。支持重叠仲裁处理器可以在当前外部主设备还未完成操作BGACK仍有效时就为下一个等待的请求再次发出BG。外部仲裁电路如优先级编码器可以提前决定下一任主设备一旦当前BGACK撤销下一任可以立即宣告接管实现了总线使用权的“流水线”式交接最大化总线利用率。两线仲裁BR/BG此方案省去了BGACK信号简化了硬件连接但将更多的责任转移给了外部主设备。简化与成本减少一根信号线对于简单系统或对成本敏感的设计有吸引力。更长的请求保持外部主设备必须持续保持BR有效直到它完成所有的总线操作。处理器在检测到BR撤销后才会撤销BG。这意味着总线控制权的释放时机完全由外部主设备通过BR信号来指示。无重叠仲裁由于没有BGACK来明确标识当前主设备处理器必须等待当前主设备撤销BR表示用完并随之撤销BG后才能响应下一个BR请求。这会导致总线在两次主设备切换之间存在“空窗期”利用率稍低。对设计的要求更高外部主设备必须非常清楚自己需要占用总线多久并在完成后及时撤销BR。如果BR撤销过早可能导致操作未完成就被打断撤销过晚则浪费总线带宽。同时所有从设备必须能够响应来自任何地址源的访问因为它们无法通过BGACK区分主设备。实操心得方案选择选三线当系统中有多个超过两个潜在总线主设备且对总线利用率和系统稳定性要求极高时。例如一个由MC68306作为主CPU搭配多个DMA控制器和通信协处理器的复杂通信网关。选两线当系统只有两个主设备如一个CPU和一个DMA且连接复杂度需要尽可能降低时。或者当你使用的第三方IP核作为总线主设备只支持两线协议时。3. 仲裁时序与状态机实战拆解手册中的时序图是理论的呈现而状态机则是其内在逻辑的抽象。结合两者才能透彻理解。3.1 关键时序节点剖析我们以三线仲裁、处理器活跃Processor Active的时序图对应手册图3-18为例拆解每一个关键边沿的意义T0请求发生外部主设备在处理器某个总线周期例如S2状态期间发出BR。注意BR是异步信号。T1内部同步处理器在下一个时钟下降沿对BR采样再经过最多1.5个时钟周期的内部同步产生有效的内部BR信号。这是所有异步输入RESET,HALT,DTACK,BERR,IPL的标准处理流程旨在避免亚稳态。T2授权发出处理器在完成当前总线周期图中AS撤销S7结束后立即在下一个时钟上升沿发出BG。同时处理器将其地址、数据、控制总线置于高阻态Three-state与总线物理断开。T3外部设备接管外部设备检测到BG有效并等待AS、DTACK和BGACK来自上一个主设备全部无效。一旦条件满足它便发出自己的BGACK。从BGACK生效的这一刻起该设备正式成为总线主设备。T4外部设备操作新主设备开始驱动地址、数据线发出AS等进行读写操作。此时处理器“旁观”。T5释放请求外部设备应在发出BGACK后尽快撤销BR。如果系统中有其他等待的请求处理器会在撤销BG几个时钟周期后重新为下一个请求发出BG实现重叠仲裁。T6交还总线外部设备完成操作后先撤销BGACK然后对于两线仲裁是撤销BR。处理器在检测到BGACK撤销后在下一个合适的时钟边沿收回总线控制权并可能立即开始自己的下一个总线周期。注意图中有一个极易忽略的细节——BG的撤销时机。手册指出BG会在BGACK有效后的几个时钟周期被撤销。但如果此时有其他BRpending处理器会在撤销当前BG后仅几个周期就重新发出BG给下一个请求。这个设计保证了仲裁链的连续性。3.2 状态机仲裁逻辑的“大脑”手册图3-17的有限状态机FSM是仲裁单元的核心逻辑。我们将其翻译成更易理解的描述状态0 (STATE 0)空闲态。无外部请求R0无外部设备确认占用A0。处理器控制总线G0 T0。状态1 (STATE 1)请求收到。外部请求有效R1但处理器可能还在进行自己的总线周期S0或S1状态此时状态机暂不跳转见Note 1。这是为了确保处理器完整完成当前原子操作。状态2 (STATE 2)授权态。处理器已准备好释放总线发出BGG1并准备将总线置为高阻T1。它等待外部设备确认A。状态3 (STATE 3)外部设备占用态。外部设备已发出BGACKA1总线处于高阻态T1由外部设备驱动。处理器持续监控BRR。状态4 (STATE 4)释放准备态。外部设备已撤销BGACKA0但可能BR仍有效R1表示该设备或另一个设备还想用。处理器撤销BGG0但总线仍保持高阻T1为一个新的仲裁周期做准备。这个状态机清晰地刻画了从请求、授权、占用到释放的完整闭环以及在不同输入R, A组合下的状态迁移路径。理解它对于用硬件描述语言如VHDL/Verilog实现兼容的外部仲裁器至关重要。3.3 特殊时序案例解析手册还给出了两种特殊情况的时序图这往往是实际调试中坑点所在总线空闲时请求Bus Inactive当处理器在执行内部长操作如乘法指令而不使用外部总线时AS持续无效。此时收到BR请求处理器可以更快地响应因为它无需等待当前总线周期结束。BG发出后总线立即进入高阻态外部设备可以更快接管。S0状态早期请求如果BR恰好在处理器刚启动一个新总线周期进入S0状态但还未发出AS时到来BG的发出会被延迟一个额外的时钟周期。这是因为处理器需要先通过AS的生效向外部宣告“我正在用总线”然后再处理释放。忽略这个细节可能导致对BG响应时间的误判。4. 异步操作与总线周期终止控制MC68306的经典之处在于其异步总线设计。它不依赖全局时钟的严格同步来协调主从设备而是通过一组握手信号AS,UDS/LDS,DTACK,BERR,HALT来完成通信。这使得它可以与不同速度的外设协作但同时也让总线周期的终止变得复杂。4.1 握手信号的角色AS(Address Strobe)主设备发出表示地址线上的地址有效。是总线周期开始的标志。UDS/LDS(Upper/Lower Data Strobe)主设备发出指示当前访问的是数据总线的高字节D15-D8、低字节D7-D0还是字两者。DTACK(Data Transfer Acknowledge)从设备或外部控制逻辑发出向主设备确认“数据已准备好读”或“数据已接收写”。这是正常结束一个总线周期的关键信号。BERR(Bus Error)外部控制逻辑发出告知主设备本次访问出错如访问了不存在的地址、校验错误等。HALT(Halt)外部设备发出请求处理器暂停。4.2 总线周期终止的四种命运一个总线周期的结局由DTACK、BERR、HALT在特定时刻的组合决定。手册表3-1是这方面的“圣经”我们将其解读为四种命运正常终止 (Normal Termination)DTACK在BERR和HALT无效时被断言。这是99%的情况。主设备在DTACK有效后结束当前周期继续执行。暂停终止 (Halt Termination)HALT在DTACK之前或同时有效且BERR无效。处理器完成当前周期后进入暂停状态直到HALT撤销。用于单步调试。总线错误终止 (Bus Error Termination)BERR在DTACK之前、同时或代替DTACK被断言。处理器终止当前周期并触发总线错误异常跳转到错误处理程序。这是处理硬件访问错误的标准机制。重试终止 (Retry Termination)BERR和HALT在DTACK之前或同时被断言。处理器终止当前周期并在HALT撤销后自动重试该周期。这对于处理短暂的、可恢复的访问故障如动态存储器的刷新冲突非常有用。重要提示手册特别强调对于读-修改-写周期如TAS测试并置位指令处理器不会重试。一旦发生BERR无论HALT是否有效都按总线错误处理。这是因为读-修改-写是一个不可分割的原子操作重试可能破坏其语义。4.3 异步与伪异步操作模式完全异步 (Fully Asynchronous)从设备完全忽略处理器时钟仅根据AS、UDS/LDS等握手信号来操作。DTACK可以在AS有效后的任意时间发出处理器会无限插入等待状态Wait States直到收到DTACK或BERR。这种模式兼容性最好但性能最低。伪异步 (Pseudo-Asynchronous)从设备了解系统时钟频率但不与其严格同步。它可以利用一些与时钟相关的建立Setup和保持Hold时间参数来优化性能。例如它可以在数据真正稳定之前就提前发出DTACK参数#31规定了最大提前量处理器会在下一个时钟边沿锁存数据只要数据在锁存前满足建立时间即可。这能在保证兼容性的前提下提升速度。实操心得调试总线问题当遇到系统随机挂起、数据错误时总线周期终止问题是首要怀疑对象。逻辑分析仪是关键必须抓取AS、DTACK、BERR、HALT以及地址/数据线的波形。检查DTACKDTACK是否在AS有效后的合理时间内根据外设速度被拉低是否在AS撤销后及时拉高参数#28如果DTACK一直为高处理器会永远等待。检查BERR是否意外被触发可能是地址译码错误或访问了未初始化的存储区域。检查HALT调试接口是否意外拉低了HALT注意同步问题DTACK/BERR/HALT是异步输入。它们必须在处理器时钟的特定边沿上升沿之前满足建立时间参数#47才能被正确采样。不稳定的信号毛刺或过长的走线延迟可能导致采样错误引发不可预知的行为。在PCB设计时这些信号线应作为关键路径处理。5. 复位、双重总线故障与系统可靠性5.1 复位操作时序RESET信号用于初始化处理器。手册图3-27的时序需要关注两点外部复位需要至少132个时钟周期的低电平以确保内部逻辑完全复位。复位序列复位后处理器从地址$00000和$00004分别读取初始堆栈指针SSP和程序计数器PC。这两个地址必须存放有效的ROM代码地址否则系统无法启动。这是一个常见的硬件设计检查点。5.2 双重总线故障最严重的错误这是系统设计的“最后防线”也是调试中最棘手的问题之一。何时发生当处理器在处理一个总线错误异常的过程中即在执行异常处理程序的第一条指令之前正在将状态寄存器、PC、错误信息压入堆栈时再次发生总线错误。后果处理器认为系统已严重损坏无法可靠地进行异常处理因为连栈操作都可能失败。它会停止一切操作并拉高HALT信号进入“死机”状态。恢复方法只有外部复位拉低RESET引脚才能让处理器从双重总线故障中恢复。设计经验双重总线故障通常意味着系统存在根本性硬件问题例如用于异常堆栈的内存区域通常是RAM本身故障或不可访问。地址/数据总线在异常处理期间发生严重冲突。电源不稳定导致逻辑混乱。 在设计阶段确保异常向量表和初始堆栈区位于绝对可靠的存储介质如ROM或已初始化的静态RAM中是预防双重总线故障的关键。6. 同步操作模式及其性能考量虽然MC68306以异步总线闻名但它也支持同步操作模式以获取最高性能。6.1 同步模式工作原理在同步模式下外部设备通常是高速静态RAM与处理器时钟紧密同步。它不再依赖异步的DTACK而是根据时钟边沿来预测数据就绪时间。处理器在固定的时钟状态如S4的下降沿采样数据只要数据在该边沿满足建立时间即可。手册中图3-32和3-33的同步读写周期时序图显示一个无等待状态的标准周期正好是4个时钟周期S0-S7。DTACK在同步设备中可能由时钟逻辑生成必须在S4状态下降沿之前满足建立时间参数#47这样才能让周期在S7正常结束。如果DTACK没准备好处理器就会在S4之后插入整数倍的等待周期整个时钟周期直到DTACK满足条件。6.2 同步与异步模式混合设计一个典型的优化系统采用混合模式同步区域将零等待状态Zero Wait-State的SRAM映射到关键的高速代码/数据区使用同步接口实现最大吞吐量。异步区域将低速的外设如UART、定时器、ADC以及大容量DRAM映射到其他地址区域使用异步接口简化设计提高兼容性。地址译码器需要根据访问的地址范围来生成或选择不同的DTACK信号路径。对于同步区域DTACK可能由固定延迟线或与时钟对齐的逻辑生成对于异步区域DTACK则来自实际外设的响应。性能调优要点计算建立/保持时间根据处理器时钟频率如16MHz周期62.5ns仔细核算同步SRAM的访问时间tAA、输出使能时间tOE是否满足处理器的数据建立时间参数#27如20ns和保持时间要求。DTACK生成电路对于同步设备一个简单而可靠的方法是使用一个由地址译码输出和时钟共同触发的单稳态触发器或小型CPLD来产生脉宽固定的DTACK。必须确保其下降沿相对于时钟边沿的延迟是稳定且满足参数#47的。等待状态插入如果SRAM速度不够快无法在S4下降沿前提供数据则需要在地址译码逻辑中设计等待状态发生器。常见的做法是用一个计数器在AS有效后开始计数经过预定的时钟周期数1个或多个后再产生DTACK。