c++ - 写入内存映射 IO。这个值需要稳定多久才能被IO看到?

标签 c++ arm fpga memory-mapping zynq

我的 FPGA 中有一个内存映射 IO 元件(准确地说,是一个 AXI GPIO 元件,它基本上将 AXI 内存映射接口(interface)映射到一组引脚),它连接并映射到 ARM 处理器的地址空间由 GP0 主端口。 FPGA 和 ARM 处理器都是 ZYNQ7000 系列器件的一部分。当我写入元素的地址时,我应该在哪里寻找文档,或者一般机制是什么,以确保电路“看到”这个写入?假设我有这个写入 volatile 内存映射变量 port

的序列
port = 0;
port = 1;

那么我如何才能确保在一个 10ns 的周期内,时钟进程(VHDL,如果有任何相关性)看到 0,而在稍后的周期中,时钟进程看到 1?理想情况下,如果可能的话,它会用于下一个周期。对于第一种方法,我会简单地等待足够长的 cpu 周期(使用周期计数器)。但这看起来像是一种相当“野蛮”的做事方式。

最佳答案

对于一般的 MMIO:没有“多长时间”可以看到写入。如果你写,它会去总线。如果你再写一次,它会在之后去公共(public)汽车。 (假设 MMIO 范围的非缓存、非写入组合映射)。如果总线另一端的设备需要一些时间来处理写入,那么通常会通过轮询设备来处理。

我不完全理解你的具体情况,但既然你说它就像一个 GPIO 外围设备,我会假设它非常简单并且 FPGA 端不会将写入视为总线上的事件,它只看到“GPIO 线”改变状态。鉴于此,您有几个选择:

  1. 什么都不做。两次写入应该击中 GPIO 外设,间隔至少一个总线周期,如果这足够好(即 GPIO 不需要任何保持时间,并且一个总线周期足够长),那么它就足够了。

  2. 在两次写入之间插入端口读取。这应该会增加一个额外的巴士周转时间。

  3. 请稍等,就像您在问题中建议的那样。在处理硬件时,这是一件非常正常的事情,10 纳秒并不是很长的时间。

关于c++ - 写入内存映射 IO。这个值需要稳定多久才能被IO看到?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45774895/

相关文章:

c++ - 成员函数的decltype

c++ - 使类可迭代:访问冲突读取位置

gcc - 了解 gcc 缩写

linux - 使用交叉编译器为 arm 编译 native GCC

binary - 使用门级图理解二进制乘法器

c++ - 有效输入迭代器的默认构造

c++ - 在通用编程/TMP 世界中,模型/策略和 "concept"究竟是什么?

linux - 内核中的奇怪锁定

verilog - 将 Altera M9K 的内容重置为 0(上电值)

c - C 中的中断