我的FPGA中有一个内存映射的IO元素(准确地说,是AXI GPIO元素,它基本上将AXI内存映射的接口映射到一组引脚上),它通过GP0主端口连接并映射到ARM处理器的地址空间。FPGA和ARM处理器都是ZYNQ7000系列设备的一部分。当我写到元素的地址时,我应该在哪里查找文档,或者一般机制是什么,以确保电路‘看到’这个写入?让我们假设我有到volatile
内存映射变量port
的写入序列。
port = 0;
port = 1;
那么,如何确保在一个10‘s的周期中,时钟过程(如果这与此相关的话)能够看到0
,而在以后的周期中,时钟过程会看到一个1
?理想情况下,如果有可能的话,这将是下一个周期。对于第一种方法,我只需等待足够长的cpu周期(使用循环计数器)。但这看起来是一种相当“残忍”的做事方式。
发布于 2017-08-19 18:42:24
对于一般的MMIO :没有“多长时间”可以看到一个写。如果你写一篇文章,它就会到公共汽车上去。如果你再写一篇文章,以后它就会到公共汽车上去。(假设MMIO范围的非缓存、非写入组合映射)。如果总线另一端的设备需要一些时间来处理写操作,那么通常会通过轮询设备来处理。
我不完全理解您的具体情况,但由于您说它的功能类似于GPIO外围设备,我将假设它非常简单,而且FPGA方面不会将写入看作总线上的事件,它只会看到"GPIO行“的更改状态。考虑到这一点,你有几个选择:
发布于 2017-08-19 20:02:20
上一个答覆中没有提及另一个问题。仅在写入前插入读是不够的,特别是当位置被隐藏时。在这种情况下,有可能两个连续的写操作可能会按顺序到达目的地。这就是为什么ARM核心有特殊的屏障指令。
最理想的情况是下一个周期
你不能做这样的假设。你需要你分析特定的案例并选择合适的方法。
发布于 2017-12-12 23:11:35
在几乎任何具有“外部内存总线”外围设备的微控制器上,该外围设备将自动暂停任何CPU读取请求,直到数据可用为止,或者将停止任何CPU写入请求直到它们完成,或者暂停任何跟随写入请求的操作直到该请求完成。注意,外部总线上的操作只能相对于彼此进行排序,而不能相对于微控制器中的其他存储器或设备进行排序。例如,如果地址0xABCD 1234上有内存映射的外围设备,并且代码将1写入GPIO引脚A0,然后写入该外设,然后将1写入GPIO引脚A1,则外围写入的效果可能发生在写入A0之前,或写入A1之后,或者在I/O端口上的两个操作之间。使用内存屏障指令可能有助于确保排序,但是没有任何方法可以代替读取数据表。ARM上的内存屏障可以保证外部总线写入在设置I/O端口的指令之前完成,但是如果外部硬件需要两个周期来执行响应总线写入的动作(并非非常不寻常),则I/O端口上的操作可能仍会首先发生。
https://stackoverflow.com/questions/45774895
复制相似问题