DMA copy和CPU copy

DMA(Direct Memory Access)

  • 直接内存访问,是一种无需CPU的参与就可以让外设与系统内存之间进行双向数据传输的硬件机制。使用DMA可以使系统CPU从实际的I/O数据传输过程中摆脱出来,从而大大提高系统的吞吐率。DMA方式的数据传输由DMA控制器(DMAC)控制,在传输期间,CPU可以并发的执行其他任务。当DMA结束后,DMAC通过中断通知CPU数据传输已经结束,由CPU执行相应的中断服务程序进行后续处理。

    在这里插入图片描述

与CPU copy的区别

  • 当程序或者操作者对CPU发出指令,这些指令和数据暂存在内存里,在CPU空闲时传送给CPU,CPU处理后把结果输出到输出设备上,输出设备就是显示器,打印机等。在没有显示完之前,这些数据也保存在内存里,如果内存不足,那么系统自动从硬盘上划分一部分空间作为虚拟内存来用。但写入和读取的速度 跟物理内存差的很远很远,所以,在内存不足的时候,会感到机器反应很慢,硬盘一直在响。CPU对数据进行判断以及逻辑处理,本身不能存储数据,这时cpu从内存取数据进行逻辑计算,如果内存没有数据,才会从硬盘读取数据。要把外设的数据读入内存或把内存的数据传送到外设,一般都要通过CPU控制完成,如CPU程序查询或中断方式。利用中断进行数据传送,可以大大提高CPU的利用率。
  • 但是采用中断传送有它的缺点,对于一个高速I/O设备,以及批量交换数据的情况,只能采用DMA方式,才能解决效率和速度问题。DMA在外设与内存间直接进行数据交换,而不通过CPU,这样数据传送的速度就取决于存储器和外设的工作速度。
  •   通常系统的总线是由CPU管理的。在DMA方式时,就希望CPU把这些总线让出来,即CPU连到这些总线上的线处于第三态–高阻状态,而由DMA控制器接管,控制传送的字节数,判断DMA是否结束,以及发出DMA结束信号。DMA控制器必须有以下功能:
      1. 能向CPU发出系统保持(HOLD)信号,提出总线接管请求;
      2. 当CPU发出允许接管信号后,负责对总线的控制,进入DMA方式;
      3. 能对存储器寻址及能修改地址指针,实现对内存的读写操作;
      4. 能决定本次DMA传送的字节数,判断DMA传送是否结束 ;
      5. 发出DMA结束信号,使CPU恢复正常工作状态。

在这里插入图片描述

在这里插入图片描述

中断方式IO:缺点:中断次数取决于缓冲寄存器的大小

  • 用户进程发起数据读取请求
  • 系统调度为该进程分配cpu
  • cpu向io控制器(ide,scsi)发送io请求
  • 用户进程等待io完成,让出cpu
  • 系统调度cpu执行其他任务
  • 数据写入至io控制器的缓冲寄存器
  • 缓冲寄存器满了向cpu发出中断信号
  • cpu读取数据至内存

在这里插入图片描述

DMA方式IO: 优点:减少cpu中断次数,不用cpu拷贝数据

  • 用户进程发起数据读取请求
  • 系统调度为该进程分配cpu
  • cpu向DMA发送io请求
  • 用户进程等待io完成,让出cpu
  • 系统调度cpu执行其他任务
  • 数据写入至io控制器的缓冲寄存器
  • DMA不断获取缓冲寄存器中的数据(需要cpu时钟)
  • 传输至内存(需要cpu时钟)
  • 所需的全部数据获取完毕后向cpu发出中断信号
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的Verilog代码示例,用于实现AXI DMA数据传输: ``` module dma_copy ( input aclk, aclkrst, input [31:0] src_addr, input [31:0] dst_addr, input [31:0] length, input start, output done ); // AXI DMA control registers reg [31:0] control; reg [31:0] status; // AXI DMA writer interface wire [31:0] axi_waddr; wire [31:0] axi_wdata; wire [3:0] axi_wstrb; wire axi_wvalid; wire axi_wready; // AXI DMA reader interface wire [31:0] axi_raddr; wire [31:0] axi_rdata; wire [3:0] axi_rstrb; wire axi_rvalid; wire axi_rready; // Internal read/write pointers and length counter reg [31:0] src_ptr; reg [31:0] dst_ptr; reg [31:0] len_count; // State machine states parameter IDLE = 0; parameter READ = 1; parameter WRITE = 2; reg [1:0] state; // Initialize state machine always @(posedge aclk) begin if (aclkrst) begin state <= IDLE; control <= 0; status <= 0; src_ptr <= 0; dst_ptr <= 0; len_count <= 0; end else begin case (state) IDLE: begin if (start) begin state <= READ; control <= 0x10002; // Start DMA transfer src_ptr <= src_addr; dst_ptr <= dst_addr; len_count <= length; end end READ: begin if (axi_rvalid) begin status <= axi_rdata; // Save DMA status state <= WRITE; end axi_raddr <= src_ptr; axi_rstrb <= 4'b1111; axi_rready <= 1; end WRITE: begin if (axi_wvalid) begin len_count <= len_count - 4; // Decrement length counter if (len_count == 0) begin state <= IDLE; control <= 0x10004; // Stop DMA transfer done <= 1; end else begin src_ptr <= src_ptr + 4; // Increment read pointer dst_ptr <= dst_ptr + 4; // Increment write pointer state <= READ; end end axi_waddr <= dst_ptr; axi_wdata <= axi_rdata; axi_wstrb <= 4'b1111; axi_wvalid <= axi_rvalid; axi_wready <= 1; end endcase end end // Connect AXI DMA writer interface axi_lite_slave #( .C_S_AXI_DATA_WIDTH(32), .C_S_AXI_ADDR_WIDTH(32) ) axi_writter ( .aresetn(aclkrst), .aclk(aclk), .awaddr(axi_waddr), .awprot(3'b000), .awvalid(axi_wvalid), .awready(axi_wready), .awlen(0), .awsize(2), .awburst(2), .wdata(axi_wdata), .wstrb(axi_wstrb), .wvalid(axi_wvalid), .wready(axi_wready), .bresp(2'b00), .bvalid(), .bready() ); // Connect AXI DMA reader interface axi_lite_slave #( .C_S_AXI_DATA_WIDTH(32), .C_S_AXI_ADDR_WIDTH(32) ) axi_reader ( .aresetn(aclkrst), .aclk(aclk), .araddr(axi_raddr), .arprot(3'b000), .arvalid(axi_rvalid), .arready(axi_rready), .arlen(0), .arsize(2), .arburst(2), .rdata(axi_rdata), .rvalid(axi_rvalid), .rready(axi_rready), .rresp(2'b00), .rlast() ); endmodule ``` 此代码使用AXI DMA接口在两个地址之间传输数据。 输入参数包括源地址,目标地址和数据长度,以及一个启动信号(start)和一个完成信号(done)。 AXI DMA控制寄存器和状态寄存器分别保存DMA传输的控制信息和状态信息。 在状态机中,从源地址读取数据并将其写入目标地址,直到数据传输完成。状态机的状态IDLE,READ和WRITE分别表示空闲,读取和写入。 AXI DMA的读取和写入接口分别连接到axi_reader和axi_writer模块。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值