16 位总线上的 vhdl 32 位计数器

vhdl 32bit counter on 16bit bus

通过 16 位数据总线访问不断变化的 32 位寄存器(如计数器)的最佳做法是什么? 我想我必须 'freeze' 或在读取 LSB 时复制 32 位值,直到 MSB 也被读取,反之亦然,以避免在两次访问之间 LSB 溢出到 MSB 时数据损坏。 对此有标准方法吗?

没有标准的方式,但常用的做法是先读取一个地址return的前16位,同时捕获其余16位,稍后在另一个地址读取.

正如问题和 Morten 的回答中所建议的那样,第二个寄存器保存读取前半部分时的值是一种常见的方法。在某些 MCU 中,此寄存器对多个设备是通用的,这意味着您需要禁用两次访问之间的中断或确保 ISR 不会触及额外的寄存器。写入处理类似,通常以相反的顺序(写入第二个字临时存储,然后在设备上写入第一个字,从而触发设备同时读取第二个字)。

也有您无法自动访问寄存器的情况。在这种情况下,您可能需要实施额外的逻辑来计算出真实值。假设三个读取花费的时间远少于 1<<15 计数器滴答,这种算法的一个示例可能是:

earlyMSB = highreg;
midLSB = lowreg;
lateMSB = highreg;
fullword = ((midLSB<0x8000 ? lateMSB : earlyMSB)<<16) | midLSB;

其他变体可能使用溢出标志来表示更重要的字需要递增(通常用于在软件中实现计数器的那部分)。