Zynq7000系列FPGA中的DMA控制器编程指南

在Zynq7000系列FPGA中,DMA控制器是一个关键组件,用于在PL中的片上存储器、DDR存储器和从外设之间高效地传输数据。所有DMA事务都使用AXI接口进行数据传输。

启动(Startup 或上电启动)的示例流程如下:

  1. 配置时钟(Configure Clocks):在系统启动时,首先要确保时钟系统被正确配置。这通常包括设置主时钟源(如晶振、PLL等)、分频器、以及各个模块的时钟使能。
  2. 配置安全状态(Configure Security State):涉及配置控制器的安全特性,如访问控制、加密/解密引擎、信任根等。
  3. 重置控制器(Reset the Controller):在配置完必要的系统参数后,可能需要执行一个系统重置或控制器重置来使这些设置生效。重置可以确保控制器从一个已知的状态开始运行,并且所有之前的错误状态或配置都被清除。
  4. 创建中断服务程序(Create Interrupt Service Routine):中断服务程序(ISR)是处理硬件中断的函数。在控制器运行过程中,当某个事件发生时(如按键按下、定时器超时等),硬件会生成一个中断请求。在系统启动时,需要为每个中断源编写并注册相应的ISR,以便在中断发生时能够正确地处理它。
  5. 执行DMA传输(Execute DMA Transfers):在系统启动并配置好DMA控制器后,可以开始执行DMA传输来传输数据。这可以提高数据传输的效率,并释放CPU以执行其他任务。

执行DMA传输

  1. 将微代码写入内存以进行DMA传输

    a. 为DMA通道创建程序:创建一个DMA通道的程序,该程序定义了数据传输的具体行为,包括源地址、目标地址、传输长度、传输类型(如读、写、内存到内存、外设到内存等)等。

    b. 将程序存储在系统内存的某个区域:将您为DMA通道创建的程序存储在系统内存的一个适当区域。这通常是DMA控制器可以访问的RAM区域。确保内存区域被正确配置,并且DMA控制器具有访问它的权限。

  2. 启动DMA通道线程

中断服务例程

当DMA控制器向处理器(PS)的中断控制器发送中断信号时,有两种类型的DMA中断信号:

  • 八个DMAC IRQs [75:72] 和 [49:46]:这些是DMA控制器产生的常规中断请求(IRQs),用于通知处理器DMA传输的完成情况、错误状态或其他与DMA操作相关的事件。通常,每个IRQ都与特定的DMA通道或事件相关联。

  • 一个DMAC ABORT IRQ [45]:这是DMA控制器产生的中止中断,通常表示DMA传输由于某种原因被异常中止或取消。

示例:IRQ中断服务例程

在DMA中断服务程序(ISR)中,需要执行一系列步骤来处理来自DMA控制器的中断。以下是支持所有8个DMAC IRQs的ISR的步骤:

  1. 检查是哪个事件触发了中断:读取dmac.INT_EVENT_RIS寄存器来确定是哪个DMA事件导致了中断。这个寄存器通常包含多个位,每个位对应一个可能的中断源。
  2. 清除对应的事件:一旦确定了触发中断的事件,您需要清除该事件以允许DMA控制器继续正常工作。这通常是通过向dmac.INTCLR寄存器写入相应的值来完成的。确保只清除已发生的事件,以避免意外地清除其他未发生的事件。
  3. 通知应用程序DMA传输已完成:如果在DMA传输设置期间注册了用户回调函数(user callback function),则在ISR中调用该函数来通知应用程序DMA传输已完成。这允许应用程序根据需要进行后续处理,如更新数据缓冲区、检查传输结果等。

示例:IRQ_ABORT中断服务例程

以下提供了如何处理DMA管理器故障和DMA通道故障的详细步骤,以及如何通过写入dmac.DBGINST0寄存器来执行DMAKILL指令来停止DMA管理器或DMA通道线程。

  1. 确定是否发生了管理器故障:读取dmac.FSRD寄存器。检查fs_mgr字段是否设置(即检查是否有DMA管理器故障)。如果fs_mgr字段被设置,读取dmac.FTRD寄存器以获取故障类型。
  2. 确定是否发生了通道故障:读取dmac.FSRC寄存器。检查特定通道的fault_status字段是否设置(即检查是否有DMA通道故障)。如果某个通道的fault_status字段被设置,读取对应通道的dmac.FTRx(Fault Type Register for DMA Channel x,其中x是通道编号)寄存器以获取故障类型。
  3. 执行DMAKILL指令。对DMA管理器或DMA通道线程执行以下操作:
  •  对于DMA管理器

(1)写入dmac.DBGINST0寄存器来执行DMAKILL指令:

(2)设置指令字节0的编码为DMAKILL

(3)将debug_thread位设置为0(选择DMA管理器)。

  • 对于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寄存器包含的指令。

  • 27
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Zynq SoC 上,AXI DMA(Direct Memory Access)是一种能够在外设和存储器之间进行高速数据传输的IP核。Cyclic DMA 模式允许通过循环传输数据,从而实现连续的数据流。下面是一些关于在 Zynq SoC 上编程 AXI DMA 的基本步骤: 1. 配置 AXI DMA IP:首先,在 Vivado 配置和实例化 AXI DMA IP 核,并连接到 Zynq SoC 的 PS(Processing System)部分。确保正确连接 AXI DMA 的信号和端口,包括数据输入/输出端口、断线和控制寄存器。 2. 设置 DMA 控制寄存器:使用 AXI DMA 的控制寄存器来配置 DMA 的工作模式和参数。在 Cyclic DMA 模式下,你需要设置循环传输模式,并指定传输的数据长度和起始地址。 3. 配置 DMA 缓冲区:为 DMA 设置输入和输出缓冲区。这些缓冲区将用于在外设和存储器之间传输数据。 4. 启动 DMA 传输:通过设置 AXI DMA 控制寄存器的位来启动数据传输。在 Cyclic DMA 模式下,你可以选择是否在每次传输完成后自动重启传输。 5. 处理断:如果需要,在 AXI DMA 完成传输时,你可以使用断机制来通知处理器。在断处理程序,你可以执行必要的操作,如处理传输的数据或触发下一次传输。 需要注意的是,以上步骤只是一个基本的框架,具体的实现可能因应用需求而有所差异。你可以参考 Xilinx 提供的文档和示例代码来详细了解 AXI DMA编程和配置方法。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值