赞
踩
在Zynq7000系列FPGA中,DMA控制器是一个关键组件,用于在PL中的片上存储器、DDR存储器和从外设之间高效地传输数据。所有DMA事务都使用AXI接口进行数据传输。
将微代码写入内存以进行DMA传输
a. 为DMA通道创建程序:创建一个DMA通道的程序,该程序定义了数据传输的具体行为,包括源地址、目标地址、传输长度、传输类型(如读、写、内存到内存、外设到内存等)等。
b. 将程序存储在系统内存的某个区域:将您为DMA通道创建的程序存储在系统内存的一个适当区域。这通常是DMA控制器可以访问的RAM区域。确保内存区域被正确配置,并且DMA控制器具有访问它的权限。
启动DMA通道线程
当DMA控制器向处理器(PS)的中断控制器发送中断信号时,有两种类型的DMA中断信号:
八个DMAC IRQs [75:72] 和 [49:46]:这些是DMA控制器产生的常规中断请求(IRQs),用于通知处理器DMA传输的完成情况、错误状态或其他与DMA操作相关的事件。通常,每个IRQ都与特定的DMA通道或事件相关联。
一个DMAC ABORT IRQ [45]:这是DMA控制器产生的中止中断,通常表示DMA传输由于某种原因被异常中止或取消。
在DMA中断服务程序(ISR)中,需要执行一系列步骤来处理来自DMA控制器的中断。以下是支持所有8个DMAC IRQs的ISR的步骤:
dmac.INT_EVENT_RIS
寄存器来确定是哪个DMA事件导致了中断。这个寄存器通常包含多个位,每个位对应一个可能的中断源。dmac.INTCLR
寄存器写入相应的值来完成的。确保只清除已发生的事件,以避免意外地清除其他未发生的事件。以下提供了如何处理DMA管理器故障和DMA通道故障的详细步骤,以及如何通过写入dmac.DBGINST0
寄存器来执行DMAKILL
指令来停止DMA管理器或DMA通道线程。
dmac.FSRD
寄存器。检查fs_mgr
字段是否设置(即检查是否有DMA管理器故障)。如果fs_mgr
字段被设置,读取dmac.FTRD
寄存器以获取故障类型。dmac.FSRC
寄存器。检查特定通道的fault_status
字段是否设置(即检查是否有DMA通道故障)。如果某个通道的fault_status
字段被设置,读取对应通道的dmac.FTRx
(Fault Type Register for DMA Channel x,其中x是通道编号)寄存器以获取故障类型。(1)写入dmac.DBGINST0
寄存器来执行DMAKILL
指令:
(2)设置指令字节0的编码为DMAKILL
。
(3)将debug_thread
位设置为0(选择DMA管理器)。
(1)写入dmac.DBGINST0
寄存器来执行DMAKILL
指令:
(2)设置指令字节0的编码为DMAKILL
。
(3)将channel_num
位设置为要停止的通道编号。
(4)将debug_thread
位设置为1(选择DMA通道线程)。
(5)需要在软件中等待DMA控制器的调试状态(dbgstatus
字段)变为“忙”状态时,这通常意味着DMA控制器正在处理一个调试操作或指令,并且在此期间不应该被其他操作打断。
(6)将0x0写入dmac.DBGCMD寄存器,以执行DBGINSTx寄存器包含的指令。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。