我已连接上ZYNQ板的ADC到FPGA。所以我现在在fpga中有数字数据。我想在DDR内存保存这些数据我ZYNQ板,为了这个,我必须写一个VHDL程序。 任何帮助都非常感谢。
答案 0 :(得分:0)
假设您的DDR已连接到ARM PS,将数据导入DDR的最简单方法是将数字数据路由到AXI总线可以访问的寄存器中。这是在FPGA架构和ARM处理器之间移动数据的典型方法。然后,ARM处理器将负责对该寄存器执行AXI总线读取,并将结果存储在DDR中。如果采样率足够慢,则只需在Vivado框图中实例化AXI_GPIO块,然后将数字信号路由到“输入”端口即可。 CPU只需简单地定期轮询AXI_GPIO寄存器并寻找新的数据样本。这种方法很简单,但是有很多问题。首先,CPU必须浪费时钟周期来定期检查寄存器。
将AXI_GPIO中断信号附加到ARM处理器将有一点改进。每当有新的数据样本时,您的VHDL代码就会触发中断。这样,CPU不必不断轮询。
下一个改进是创建自己的自定义AXI总线模块。它可能具有结构FIFO来缓冲多个样本,具有状态标志寄存器,以便主机CPU知道正在发生的事情,并且还具有中断。有大量的模板和示例可用于创建您自己的AXI总线模块。
如果您具有相对较高的数据速率,则下一个改进将是在混合中添加AXI DMA模块。这样,CPU不必为每个数据样本执行AXI总线读取,而是可以定期设置从AXI总线到DDR的硬件块传输。 CPU仍需要花费一些时间来设置DMA描述符,但这对于吞吐量和CPU利用率要好得多。在CPU在Linux上运行时,要使其正常工作是很棘手的。
最后,您可以设计一个模块来访问ARM处理器的AXI总线HP从端口,该模块可以将数据直接从FPGA架构直接推入DDR,而无需占用CPU。有许多障碍需要克服,特别是如果您在CPU上运行Linux。这有些先进,因此需要一些时间才能使其正常工作。
因此,有一些选项,从快速解决方案到高级内容。我建议您尝试确定哪种解决方案适合您的情况,并采用可以实现目标的最简单方法。
答案 1 :(得分:0)
通常,您的电路板是使用io和DDR内存进行自我配置的,可以使用Linux或裸机通过DMA对其进行访问。我认为这将是一种更容易的方法,只需较少的开发即可管理DDR。仅用于驱动ADC的HDL代码。