1. 项目概述与核心挑战
在嵌入式系统,尤其是通信基础设施、高端工业控制或雷达信号处理这类对实时性和数据吞吐量要求极高的领域,单一处理器往往难以胜任。这时,异构多处理器架构就成了必然选择。我最近在复盘一个老项目的硬件设计时,重新梳理了德州仪器(TI)的TMS320C6000系列DSP与摩托罗拉(现恩智浦)MPC860 PowerPC微处理器通过扩展总线(Expansion Bus, 简称XBUS)直连的方案。这个方案的核心目标,是让MPC860作为主设备(Master),能够像访问本地内存一样,高效地读写C6000 DSP的内部或外部存储空间,实现数据共享与任务协同。
这听起来像是简单的“连线”问题,但实际做起来,坑多得让人头皮发麻。C6000的扩展总线是一种同步并行主机接口,而MPC860的本地总线(Local Bus)也是同步并行接口,两者看似匹配,但在信号定义、时序模型、仲裁机制乃至上电配置流程上都有显著差异。直接对连必然导致系统无法启动,或者运行时出现间歇性数据错误。这份二十多年前的应用笔记(SPRA540B)之所以至今仍有参考价值,正是因为它精准地指出了这些“坑”并给出了经过仿真验证的解决方案。本文将基于这份文档,结合我个人的实操经验,深入拆解从硬件连接到时序验证的全过程,特别是如何用一片PAL(可编程阵列逻辑)芯片完成关键的“胶合逻辑”(Glue Logic),以及如何确保在36MHz乃至更高频率下的时序收敛。
2. 接口整体设计与思路拆解
2.1 为什么选择扩展总线接口?
在C6000与MPC860之间,存在多种通信方式,如HPI(主机端口接口)、McBSP(多通道缓冲串口)或通过外部共享存储器。选择扩展总线接口主要基于以下几点考量:
- 高带宽与低延迟:扩展总线是并行接口,数据宽度可达32位,在同步模式下工作频率与DSP内核时钟成比例,能提供远超串行接口的数据传输速率,适合大数据块(如雷达波束数据、图像帧)的搬移。
- 主从灵活性:在此设计中,我们将MPC860配置为主设备,C6000配置为从设备。这意味着MPC860的CPU可以主动发起对DSP内存空间的读写,编程模型更直观,类似于操作一段映射到CPU地址空间的外部设备存储器。
- 总线仲裁支持:扩展总线内置仲裁器,允许总线上有多个主设备。虽然本设计主要让MPC860作为主设备,但C6000的仲裁器被启用,为未来扩展(例如增加另一个主设备,或让DSP在特定情况下主动访问总线)留下了可能性。
- 与MPC860本地总线架构匹配:MPC860的本地总线接口同样支持同步传输、突发(Burst)操作和外部仲裁,这使得两者的信号交互在协议层面有相通之处,减少了协议转换的复杂度。
注意:这个方案并非没有代价。它需要占用双方大量的I/O引脚(地址、数据、控制线),并需要额外的“胶合逻辑”芯片来处理信号转换,增加了PCB布线的复杂度和硬件成本。因此,它更适合对性能有极致要求、且处理器引脚资源充裕的场景。
2.2 核心设计框图与角色定义
整个接口的核心,可以用一个简化的框图来理解(参考原文档图1)。MPC860作为总线主控,其本地总线信号需要经过一层“翻译”和“调度”,才能正确驱动C6000的扩展总线。
关键角色与信号分类:
MPC860(主设备端):
- 地址/数据总线:
A[31:0],D[31:0],提供寻址信息和读写数据。 - 控制信号:
TS(传输开始)、TA(传输应答)、RD/WR(读写指示)、TSIZE[1:0](传输尺寸)、BDIP(突发数据输入)。 - 仲裁信号:
BR(总线请求)、BG(总线授权)、BB(总线忙)。
- 地址/数据总线:
TMS320C6000(从设备端):
- 地址/数据总线:
XD[31:0],复用为地址和数据。 - 控制信号:
XAS(地址选通)、XCS(片选)、XW/R(读写)、XBLAST(突发结束)、XCNTL(控制周期指示)、XRDY(就绪)。 - 仲裁信号:
XHOLD(总线保持请求)、XHOLDA(总线保持应答)。 - 时钟:
XCLKIN,所有同步操作的参考时钟。
- 地址/数据总线:
“胶合逻辑”(Glue Logic - PAL): 这是设计的精髓所在。它不是一个简单的电平转换器,而是一个小型的状态机和译码器,主要完成三大功能:
- 地址解码:将MPC860输出的部分地址线(如
A[28:0])进行译码,生成C6000扩展总线所需的片选信号XCS。 - 字节使能生成:将MPC860的
TSIZE[1:0](传输大小)和地址线A[31:30]组合逻辑,转换为C6000的4位字节使能信号XBE[3:0],以支持8位、16位、32位等不同宽度的访问。 - 仲裁信号转换:将MPC860的三线仲裁协议(
BR,BG,BB)与C6000的两线握手协议(XHOLD,XHOLDA)进行适配,确保总线所有权能正确、无冲突地转移。
- 地址解码:将MPC860输出的部分地址线(如
总线开关(Bus Switch - SN74CBT16390): 这是一个非常巧妙且关键的设计。由于MPC860和C6000在上电复位时,都需要通过检测数据总线(
XD[31:0]/D[31:0])上的上拉/下拉电阻状态来读取“硬件配置字”(Boot Configuration Word),而两者所需的配置值可能冲突。总线开关在复位期间将两者的数据总线物理隔离,让它们各自读取正确的配置;复位结束后,开关闭合,两者共享数据总线进行正常通信。这解决了异构处理器协同启动的一个经典难题。
3. 核心细节解析与实操要点
3.1 引脚映射:信号“翻译”的艺术
原文档表1提供了详细的引脚连接关系,但这不仅仅是连线表,更体现了信号协议的映射逻辑。
控制信号的巧妙复用:
XCNTL(控制周期)连接到A[29]。这是因为在C6000扩展总线周期中,XCNTL信号用于区分当前是控制寄存器访问还是数据存储器访问。利用MPC860地址线的高位来生成此信号,是一种节省引脚且逻辑清晰的方案。XBLAST(突发结束)连接到BDIP。BDIP在MPC860突发传输中指示当前是否为最后一个数据节拍,其功能与XBLAST高度吻合。XW/R(读写)直接连接RD/WR,两者定义一致。XAS(地址选通)连接TS(传输开始)。两者都标志着一次总线传输的开始。XRDY(从设备就绪)连接TA(传输应答)。这是主从握手的关键:C6000通过拉低XRDY告诉MPC860“我还没准备好数据”,MPC860则通过检测TA的无效状态来插入等待周期。
字节使能生成的逻辑:这是最容易出错的地方。C6000的XBE[3:0]是低有效信号,分别对应32位数据总线的高字节(XD[31:24])到低字节(XD[7:0])。而MPC860的TSIZE[1:0]表示传输的字节数(00=8位,01=16位,10=32位),A[31:30]有时用于对齐。表2的转换逻辑就是PAL需要实现的核心功能之一。例如,当TSIZE=01(16位)且A[31:30]=00时,意味着访问最低的16位(即XD[15:0]),因此XBE[3:0]应为1100(二进制,高两位无效,低两位有效)。
3.2 关键配置:让两个处理器“说同一种语言”
硬件连接只是物理基础,要让两个复杂的处理器协同工作,必须正确配置它们的内部寄存器,特别是与总线接口相关的部分。
1. C6000 DSP的启动配置:C6000在上电复位时,会从XD[31:0]总线上采样一组配置位。这些位决定了扩展总线的工作模式,至关重要。
BLPOL=1:设置XBLAST为高有效。这与我们连接BDIP(高有效)相匹配。RWPOL=1:设置XW/R为高电平表示写操作。需要确认MPC860的RD/WR信号极性是否与此一致(通常高为写,低为读)。HMOD=1:将主机接口设置为同步主/从模式。这是我们此设计的工作模式。XARB=1:启用内部扩展总线仲裁器。即使DSP作为从设备,启用仲裁器也允许它在需要时请求总线控制权(例如访问其自身的异步I/O空间)。LEND=1:设置为小端模式。必须与MPC860的字节序设置保持一致,否则读写的数据内容将是错误的。
这些配置值需要通过硬件电路,在DSP复位期间,稳定地呈现在其XD[31:0]引脚上。这就是为什么需要总线开关——在DSP复位时,MPC860可能还未完成自身配置,无法驱动正确的电平。
2. MPC860的配置要点:
- 禁用内部仲裁器:通过设置硬复位配置字中的
ERAB位,告知MPC860使用外部仲裁(即由C6000的仲裁器或外部逻辑仲裁)。这样,MPC860在需要总线时会发出BR,并等待BG和BB信号。 - 设置
SETA位:在MPC860的选项寄存器中,将SETA位设为1。这告诉MPC860,其TA(传输应答)信号是由外部设备(即我们的C6000 DSP)驱动的,而不是内部生成的。这是实现主从握手的必要条件。 - 关键:禁用数据缓存(Data Cache):对于映射为C6000存储空间的地址区域,必须在MPC860的MMU(内存管理单元)中将其设置为“Cache Inhibit”(缓存禁止)。如果使能了缓存,MPC860可能会将对该区域的读写操作缓存在片内,而不实际发起总线访问,导致C6000侧无法收到正确的指令。这是一个极其隐蔽的bug来源。操作流程通常是:先通过
sync指令同步,然后写DC_CST寄存器禁用缓存,再通过MMU设置特定页面的属性为不可缓存。
3.3 总线仲裁逻辑设计
本设计采用了C6000的内部仲裁器作为系统仲裁器。因此,需要将MPC860的仲裁信号(BR,BG,BB)转换为C6000能理解的XHOLD/XHOLDA握手信号。
转换逻辑(基于附录C的PAL方程简化描述):
- 当MPC860需要总线(发起
BR)且当前总线空闲(BB无效)时,PAL逻辑应驱动XHOLD有效,向C6000请求总线。 - C6000仲裁器在适当的时候响应,输出
XHOLDA有效,表示已释放总线。 - PAL逻辑在检测到
XHOLDA有效后,应驱动BG有效,授权给MPC860。 - MPC860获得
BG后,拉低BB表示占用总线,开始传输。 - 传输结束后,MPC860释放
BB和BR。 - PAL逻辑随之释放
XHOLD,C6000收回XHOLDA,总线回归空闲。
这个状态机需要仔细设计,避免仲裁死锁或竞争条件。附录C中的PAL方程(使用PAL22V10器件)实现了这部分逻辑,但需要注意的是,它没有包含字节使能(XBE[3:0])的生成逻辑。这部分逻辑可能需要另一片PAL或CPLD来实现。
4. 时序验证:理论与仿真的碰撞
硬件设计完成后,最令人焦虑的就是时序是否满足。文档通过VHDL仿真进行了验证,并给出了在MPC860本地总线时钟36MHz(周期27.8ns)、C6000工作频率100-250MHz条件下的关键时序参数对比表。这是设计的“生死线”。
4.1 关键时序参数解读
我们重点关注MPC860作为主设备写入和读取C6000时,两个器件接口时序的匹配情况。文档中的表4和表5是分析的精华。
以MPC860写C6000为例:MPC860在时钟CLKOUT的上升沿后一段时间(参数B8),将数据D[31:0]放到总线上。这个数据经过PAL逻辑的微小延迟(tPAL),到达C6000的XD[31:0]引脚。C6000要求其在自身时钟XCLKIN上升沿到来之前,数据必须稳定至少一段时间(建立时间Tsu(XD-XCKIH),最小3.5ns),并且在上升沿之后还要保持一段时间(保持时间Th(XCKIH-XD),最小2.8ns)。
时序裕量计算:从表4中“Data (XD) valid before XCLKIN high (WRITE)”一行看:
- MPC860要求(Min):
Tcyc - B8 = 27.8ns - 15ns = 12.8ns(这是MPC860发出数据后,到下一个CLKOUT上升沿的时间,CLKOUT与XCLKIN同源)。 - C6000要求(Min):
Tsu(XD-XCKIH) = 3.5ns。 - 理论裕量:
12.8ns - 3.5ns = 9.3ns。这看起来非常充裕。
但是,这里隐藏了一个关键点:这个计算假设CLKOUT与XCLKIN完全同步,且PCB走线延迟为零。实际上,时钟偏移(Skew)、数据路径延迟(包括PAL延迟tPAL和走线延迟)会严重侵蚀这个裕量。文档特别提到了tPAL,并在计算MPC860的Chip-select valid before XCLKIN high时减去了它(Tcyc-B8-tPAL),说明PAL的传播延迟是必须考虑的因素。
4.2 最苛刻的时序路径:读操作的建立时间(B16)
文档明确指出,当总线时钟超过37MHz时,MPC860的B16建立时间要求可能被违反。这是整个接口时序的瓶颈。
B16是什么?B16是MPC860对从设备应答信号TA(在本设计中即C6000的XRDY)的建立时间要求。MPC860要求,在CLKOUT上升沿到来之前,TA信号必须已经有效(低电平)至少9.75ns。
问题出在哪里?C6000的XRDY信号,是在XCLKIN上升沿之后,由内部逻辑产生的,它需要一段时间才能传播到引脚上。这个时间就是C6000的参数Td(XCKIH-XRY),其最大值是16.5ns。
矛盾点:
- MPC860要求:
TA (XRDY)在CLKOUT上升沿前9.75ns有效。 - C6000最慢情况:
XRDY在XCLKIN上升沿后16.5ns才有效。 假设时钟完全同步,那么从XCLKIN上升沿到下一个CLKOUT上升沿,中间隔了一个时钟周期Tcyc = 27.8ns(36MHz)。C6000在第一个XCLKIN上升沿后16.5ns发出XRDY,那么到下一个CLKOUT上升沿,还有27.8ns - 16.5ns = 11.3ns的稳定时间。这刚刚满足MPC860的9.75ns要求,裕量仅有1.55ns。
这1.55ns的裕量非常紧张,它必须覆盖:
CLKOUT与XCLKIN之间的时钟网络偏移。XRDY信号从C6000引脚到MPC860引脚的PCB走线延迟。- 任何可能的信号完整性问题(过冲、振铃)导致的时序抖动。
因此,文档得出结论:在36MHz时,设计是可行的但裕量很小;超过37MHz,风险极高,很可能无法稳定工作。
实操心得:在进行此类高速并行接口设计时,时序仿真(如VHDL/Verilog功能仿真加时序反标)是必不可少的。不能仅仅依赖数据手册的“最坏情况”值做加减法。必须使用实际的PCB布线参数(传输线延迟、寄生电容)和器件模型(IBIS模型)进行后仿真。此外,在PCB布局时,必须将
XCLKIN/CLKOUT时钟线作为关键路径,进行严格的等长和阻抗控制,并尽量缩短XRDY/TA等关键握手信号的走线长度。
5. 常见问题与排查技巧实录
基于这个设计,在实际调试中可能会遇到以下典型问题:
5.1 系统无法启动,DSP或MPC860挂死在复位状态
- 问题现象:上电后,处理器无法从Boot ROM启动,或调试器无法连接。
- 排查思路:
- 首先检查电源、时钟和复位:这是所有硬件调试的第一步。确保所有电源轨电压正确、纹波在范围内;检查主时钟和总线时钟是否有输出且频率正确;确认复位信号满足处理器要求的��冲宽度和时序。
- 重点检查配置字:这是该设计特有的问题。使用示波器或逻辑分析仪,在DSP和MPC860的复位释放瞬间,捕获其数据总线
XD[31:0]和D[31:0]上的电平。确认与软件中预期的配置字(BLPOL,RWPOL,HMOD,XARB,LEND等)是否一致。总线开关的控制逻辑是关键,确保在复位期间开关是断开的,复位结束后可靠闭合。 - 检查PAL逻辑电源和编程:确认PAL芯片已正确编程,且供电正常。可以用逻辑分析仪抓取PAL的输入输出信号,对照真值表或仿真波形逐一核对。
5.2 可以启动,但进行总线访问时数据错误或系统锁死
- 问题现象:MPC860能够读写DSP的某些地址,但数据不一致,或在连续访问时发生总线超时(
TA无响应)导致系统异常。 - 排查思路:
- 检查字节序和字节使能:这是数据错误的常见原因。首先确认双方处理器都设置为小端模式。然后,编写一个简单的测试程序,让MPC860按8位、16位、32位分别写入一个已知模式(如0xAA, 0xBBCC, 0xDDEEFF11)到DSP内存,再用DSP读取验证。同时用逻辑分析仪捕获
XBE[3:0]信号,对照表2检查其生成是否正确。 - 检查MMU/Cache设置:百分之百确认MPC860访问DSP内存空间的地址段,在MMU中已被设置为
Cache Inhibit和Guarded。Guarded属性可以防止MPC860的预取操作对DSP地址空间进行投机访问,避免引发不可预期的副作用。一个验证方法是,在MPC860的MMU设置完成后,尝试读取该地址范围,如果读到的总是旧数据或错误数据,很可能是Cache未禁用。 - 进行时序测量:使用高性能示波器或混合信号示波器(MSO),重点测量最坏情况的时序路径:
- 写操作:测量MPC860的
CLKOUT到C6000XD数据线的建立/保持时间。 - 读操作(最关键):测量C6000
XRDY信号相对于MPC860CLKOUT的建立时间(即B16参数)。在36MHz下,这个裕量可能只有1-2ns,任何额外的延迟都可能导致失败。
- 写操作:测量MPC860的
- 检查信号完整性:并行总线在高速下易受反射和串扰影响。检查
XRDY、TA、XAS、TS等关键控制信号是否有过冲、振铃或边沿过于缓慢的情况。可能需要调整端接电阻(串联或并联)或重新优化布线。
- 检查字节序和字节使能:这是数据错误的常见原因。首先确认双方处理器都设置为小端模式。然后,编写一个简单的测试程序,让MPC860按8位、16位、32位分别写入一个已知模式(如0xAA, 0xBBCC, 0xDDEEFF11)到DSP内存,再用DSP读取验证。同时用逻辑分析仪捕获
5.3 突发传输(Burst Transfer)不稳定
- 问题现象:单次读写正常,但进行四字突发读写时,常在第二或第三个数据节拍出错。
- 排查思路:
- 检查
XBLAST/BDIP信号:突发传输依赖于XBLAST信号来指示传输结束。用逻辑分析仪确认在突发传输的最后一个周期,BDIP(连接XBLAST)是否被正确置位。时序上需满足C6000对XBLAST的建立保持时间要求。 - 检查仲裁信号在突发期间的稳定性:在突发传输过程中,总线应被MPC860持续占用(
BB保持有效)。确认PAL逻辑没有在突发中间错误地撤销XHOLD,导致C6000试图收回总线。 - 审视DSP内部缓冲区:确认C6000的同步主机接口(HPI)相关缓冲区是否已正确配置,能否跟上MPC860的突发速率。
- 检查
5.4 调试工具与技巧
- 逻辑分析仪是你的最佳伙伴:设置多组触发条件,例如在
TS下降沿触发,捕获完整的读写周期。同时观察地址、数据、控制线(XAS,XCS,XRDY,TA,XBLAST)和仲裁线(BR,BG,BB,XHOLD,XHOLDA)。对比捕获的波形与VHDL仿真波形或数据手册时序图。 - 编写分层测试程序:不要一开始就进行复杂的数据搬移测试。先从MPC860端编写最底层的内存访问函数,进行“写-读-回读”验证。先测试固定的32位访问,再测试8/16位,最后测试突发模式。在DSP端,也编写对应的内存内容检查程序。
- 利用仿真模型:如果条件允许,在硬件制作前,使用MPC860和C6000的仿真模型(如SmartModel)进行完整的系统级VHDL/Verilog仿真。这可以在早期发现逻辑错误和严重的时序违规。
这个将TMS320C6000与MPC860通过扩展总线直连的方案,是早期高性能嵌入式系统设计中一个经典的异构集成案例。它完美诠释了硬件接口设计不仅是“连连看”,更是对协议、时序、电气特性乃至启动流程的深刻理解与精密协调。其中,用PAL实现胶合逻辑、用总线开关解决启动冲突、以及对XRDY/TA建立时间的极限考量,都体现了老一代工程师在有限资源下解决复杂问题的智慧。虽然如今处理器间更倾向于使用高速串行接口(如PCIe, RapidIO),但掌握这种并行总线接口的设计与调试方法,对于理解底层硬件交互、进行FPGA与处理器的接口设计,仍然具有不可替代的价值。在调试这种系统时,耐心、严谨的测量和分层验证的策略,远比盲目尝试更有效。