Space 高效的数据总线实现

Space efficient data bus implementations

我正在用 VHDL 编写一个微控制器,基本上已经为我实际的 microcontroller 部分准备了一个核心。我现在要开始包括内存映射外设了。我使用的是一个非常简单的总线,由一个主机(CPU)和多个从机(peripherals/RAM)组成。我的总线通过 acknowledge CPU->perip 和 acknowledge perip->CPU 工作。 CPU 也有独立的输入和输出数据总线以避免三态。

我选择这种方法是因为我希望外围设备能够停止 CPU。总线事务通过以下方式实现: 主机将数据、地址和 read/write 位放在总线上,将 ack(c->p) 置为高电平。一旦从机成功接收到信息并将响应放回数据 (p->c) 总线,从机将其 ack(p->c) 设置为高电平。 master 注意到 slave 已成功放置数据,获取数据进行处理并释放 ack(c->p)。总线现在再次处于空闲状态,准备好进行进一步的交易。

显然,这是一个非常简单的总线协议,不包括突发特性、可变字长或其他更复杂的特性。然而,我的问题是什么 space 有效的方法可以用来将外围设备连接到主机 CPU?

到目前为止,我已经研究了 3 种不同的方法。我目前正在使用从主机到所有外围设备的单个输出数据总线,所有外围设备的数据输出为或'd,以及它们的ack(p-> c) 产出。每个外设都包含一个小地址多路复用器,如果地址在预定义范围内,它只允许从机响应。这减少了在外设之间切换的逻辑,但显然会为地址多路复用器推断出很多 logic/peripheral,这让我相信未来的可扩展性会受到影响。

我想到的另一种方法是从主机连接一个大地址多路复用器,它解码地址并将其连同数据和确认信号一起发送到每个从机。然后将输出数据多路复用回主设备。这似乎是一种稍微更有效的方法,尽管我似乎总是以长得离谱的数据向量结束,而且跟踪起来有点麻烦。

我想到的第三个方法就是像时尚一样把它排成一个环。主站地址发送给所有从站,有一个较小的多路复用器,它只选择发送哪些 ack 信号。主机输出的数据然后串行传输到每个从机。每个从站都包含一个多路复用器,它可以允许它让进入它的数据不受影响地通过,或者允许从站将自己的数据放在总线上。我觉得这对慢速系统最有效,因为只需要一个小的 mux/slave 来在输入数据和从属数据之间进行多路复用,以及一个解码地址并发出 ack 信号的小型多路复用器。然而,我认为这里的问题是,如果有很多外围设备,从主机输出到主机输入的传播延迟会非常大,因为它必须经过每个从机!

任何人都可以为我提供不同方法的合适推理吗?我正在使用 Quartus 为 Altera EP4CE10E22C8 FPGA 进行综合和布线,我正在寻找关于 FPGA LUT 的最小实现。我的系统使用 16 位地址和数据总线。我希望在理想的内存条件下(即没有等待状态)至少达到 ~50MHz,并且希望拥有大约 12 个从机,每个从机具有 8 到 16 位的可寻址 space.

谢谢!

我建议您从 ARM 网站 (http://www.arm.com/) 下载 AMBA 规范并查看 AXI4-lite 总线或更旧的 APB 总线。在大多数具有单个主机的总线标准中,地址上没有多路复用器,只有一个驱动外围 selection 信号的地址解码器。由于来自从站的 "response valid" 信号,只有来自从站的响应数据被多路复用到主站。如果在从站数量增加并且您无法再达到目标时钟频率时流水线化它,则它是可扩展的。硬件开销主要是读数据多路复用,即一个N位P对1多路复用器。

这几乎是你的第二个选择。

第一个选项是第二个选项的变体,其中读取数据多路复用器被或门取代。我不认为它会改变硬件成本:或者门没有多路复用器复杂,但每个从机现在必须将其读取数据总线归零,这会增加很多和门。一个好处可能是减少 activity 从而降低功耗:主控未访问的从属将保持其读取数据总线低。但是当你用逻辑合成器综合所有这些并用 CAD 工具对其进行布局和布线时,我几乎可以肯定你最终会得到与更经典的第二个选项相同的结果(面积、功率、频率)。

你的第三个选项让我想起了菊花链或令牌环的原理。但是因为你想避免三态,我怀疑它会在硬件成本方面带来任何好处。如果你正确地流水线(每个从站采样传入的主站请求并处理它们或将它们传递给下一个),你可能会达到比经典总线更高的时钟频率,尤其是在有大量从站的情况下,但平均而言,一个完整的事务将花费更多的时钟周期,你也不会提高性能。

对于非常小(但速度很慢)的互连网络,您还可以查看串行外设接口 (SPI) 协议。这就是它们的用途:用很少的电线从一个主机驱动多个从机。

考虑到您的目标硬件 (Altera Cyclone IV)、目标时钟频率 (50MHz) 和其他规格,我会首先尝试经典总线。地址解码器将根据 16 位地址总线的 8 个最高有效位为 12 个从机中的每一个产生一个 select 信号。成本将可以忽略不计。除了这些单独的 select 信号外,所有从机都将接收所有其他信号(地址总线、写数据总线、读使能、写使能)。主机的 16 位读取数据总线将是 16 位 12 对 1 多路复用器的输出,select 是 12 个从机响应中的一个。这将是消耗大部分资源的部分你的互连。但它应该没问题,运行 在 50 MHz 时没有问题......如果你避免主请求和从属响应之间的组合路径。

一个很好的开端是 WISHBONE SoC Interconnect from OpenCores.org. The classic read and write cycles are easy to implement. Beyond that, also burst transfers are specified for high throughput and much more. The website 还托管了许多 WISHBONE 兼容项目,提供范围广泛的 I/O 设备。

最后但同样重要的是,WISHBONE 标准属于 public 领域。