AXI4-写DMA如何使用verilog实现(三)DMA例子

这篇具有很好参考价值的文章主要介绍了AXI4-写DMA如何使用verilog实现(三)DMA例子。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本章内容:一个DMA写的小例子

这里给一个小例子:

往0地址写入
突发长度为256突发,数据位宽为64bit
数据为0~255文章来源地址https://www.toymoban.com/news/detail-653544.html

//------------------------------------------------------------------------------------------------------------------------------------//
	//Ourself 
	/*
	Write Addr channel  	: 1. axi_awvalid  2. axi_awaddr   3. M_AXI_AWREADY
	Write  channel 			: 1. axi_wvalid   2. axi_wdata    3. axi_wlast     4.M_AXI_WREADY
	Write response channel	: 1. axi_bready   2. M_AXI_BVALID 3. M_AXI_BRESP
	*/     

	//--------------------------------------------------------------//
	//----------------------parameter define------------------------//
	//--------------------------------------------------------------//
	parameter ADDR_OFFSET = C_M_AXI_BURST_LEN * C_M_AXI_DATA_WIDTH >> 2;//自己写的时候可不敢这么写嗷,不能用乘法
	reg [1:0] init_valid;   
	reg [7:0] data_cnt;

	//--------------------------------------------------------------//
	//-----------------------Write Addr channel---------------------//
	//--------------------------------------------------------------//

	always @(posedge M_AXI_ACLK) begin
		init_valid <= {init_valid[0],INIT_AXI_TXN};
	end

	//axi_awvalid
	always @(posedge M_AXI_ACLK) begin
		if (M_AXI_ARESETN == 0)
			axi_awvalid <= 1'b0;
		else if(M_AXI_AWREADY == 1'b1 && axi_awvalid == 1'b1)
			axi_awvalid <= 1'b0;
		else if (init_valid == 2'b01)
			axi_awvalid <= 1'b1;
	end

	//axi_awaddr
	always @(posedge M_AXI_ACLK) begin
		if (M_AXI_ARESETN == 0) begin
			// reset
			axi_awaddr <= 32'd0;
		end
		else if (axi_awvalid == 1'b1 && M_AXI_AWREADY == 1'b1) begin
			axi_awaddr <= axi_awaddr + ADDR_OFFSET;
		end
	end
	//--------------------------------------------------------------//
	//-----------------------Write      channel---------------------//
	//--------------------------------------------------------------//
	//axi_wvalid
	always @(posedge M_AXI_ACLK) begin
		if (M_AXI_ARESETN == 0)
			axi_wvalid <= 1'b0;
		else if(axi_wlast == 1'b1 && axi_wvalid == 1'b1 && M_AXI_WREADY == 1'b1)
			axi_wvalid <= 1'b0;
		else if (axi_awvalid == 1'b1 && M_AXI_AWREADY == 1'b1)
			axi_wvalid <= 1'b1;
	end
    //data_cnt
	always @(posedge M_AXI_ACLK) begin
		if (M_AXI_ARESETN == 0)
			data_cnt <= 'd0;
		else if (axi_wvalid == 1'b1 && M_AXI_WREADY == 1'b1)
			data_cnt <= data_cnt + 1'b1;
		else if((data_cnt == C_M_AXI_BURST_LEN-1) && axi_wvalid == 1'b1 && M_AXI_WREADY == 1'b1)
			data_cnt <= 'd0;
	end

	//axi_wlast
	always @(posedge M_AXI_ACLK) begin
		if (M_AXI_ARESETN == 0)
			axi_wlast <= 1'b0;
		else if (M_AXI_WREADY == 1'b1 && axi_wvalid == 1'b1 && (data_cnt == C_M_AXI_BURST_LEN-1))
			axi_wlast <= 1'b0;
		else if (M_AXI_WREADY == 1'b1 && axi_wvalid == 1'b1 && (data_cnt == C_M_AXI_BURST_LEN-2))
			axi_wlast <= 1'b1;
	end
	//axi_wdata
	always @(*) begin
		axi_wdata <= data_cnt;
	end
	//--------------------------------------------------------------//
	//-----------------------Write response channel-----------------//
	//--------------------------------------------------------------//
	always @(posedge M_AXI_ACLK) begin
		if (M_AXI_ARESETN == 0)
			axi_bready <= 1'b0;
		else
			axi_bready <= 1'b1;
	end

到了这里,关于AXI4-写DMA如何使用verilog实现(三)DMA例子的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ZYNQ通过AXI DMA实现PL发送连续大量数据到PS DDR

    硬件:ZYNQ7100 软件:Vivado 2017.4、Xilinx SDK 2017.4   ZYNQ PL 和 PS 的通信方式有 AXI GPIO、BRAM、DDR等。对于数据量较少、地址不连续、长度规则的情况,BRAM 比较适用。而对于传输速度要求高、数据量大、地址连续的情况,比如 ADC,可以通过 AXI DMA 来完成。 1、硬件设计 1.1 ZYNQ7

    2024年02月04日
    浏览(44)
  • FPGA基于AXI 1G/2.5G Ethernet Subsystem实现UDP通信DMA传输 提供工程源码和技术支持

    目前网上的fpga实现udp基本生态如下: 1:verilog编写的udp收发器,但不带ping功能,这样的代码功能正常也能用,但不带ping功能基本就是废物,在实际项目中不会用这样的代码,试想,多机互联,出现了问题,你的网卡都不带ping功能,连基本的问题排查机制都不具备,这样的代

    2024年02月10日
    浏览(44)
  • ZYNQ使用AXI DMA(Scatter/Gather)模式进行PL与PS数据交互附源码(ps端移植freertos或者裸机)

    AXI DMA 操作需要先提供一个在内存中驻留的不变空间,用于存储需要进行的DMA操作。形容这“每一次操作”的东西叫做Buffer Descriptor,缩写叫BD,这些BD是连接成链表的形式的,因为BD会动态增加,而预先分配存储BD的空间是恒定的,因此BD被连成一个环(BD Ring),其实就是一个循

    2024年02月09日
    浏览(41)
  • DDR3 控制器 MIG IP 详解完整版 (AXI4&VIVADO&Verilog)

    DDR系列文章分类地址: (1)DDR3 基础知识分享 (2)DDR3 控制器 MIG IP 详解完整版 (AXI4VivadoVerilog) (3)DDR3 控制器 MIG IP 详解完整版 (nativeVivadoVerilog) (4)基于 DDR3 的串口传图帧缓存系统设计实现 (5)基于 DDR3 的native接口串口局部传图缓存系统设计实现 (6)基于 DDR3 的

    2024年02月11日
    浏览(51)
  • ZYNQ AXI_DMA_UDP以太网传输(二)问题记录

    上一篇文章只是简单的记录一下调试成功的代码 但调试成功这个过程很痛苦,踩了很多坑,特此记录,留眼以后查看 参考博客 xilinx dma调试笔记 ZYNQ AXI DMA调试细节 在调试过程中出现这类问题基本上都是这一句代码出了问题: 再往里面跳可以看见这样一个函数,在正点原子提

    2024年03月14日
    浏览(66)
  • AXI三种接口及DMA DDR XDMA介绍(应用于vivado中的ip调用)

    参考资源: 【SDK篇_58~62_AXI接口简介【Xilinx】+【Vivado】+【AXI4总线】+【FPGA】-哔哩哔哩】 关于AXI握手过程都讲解的很细致 ug1037(三种AXI的介绍,相关AXI IP的介绍) IHI0022D(握手过程的详细介绍) FPGA_HP:AXI4的学习与使用1——基础知识积累 这个博主写的其他内容也不错 从零学

    2024年01月24日
    浏览(45)
  • 详解AXI4-Stream接口(3)--AXI4 STREAM DATA FIFO IP的使用

    目录 1、AXI4 STREAM DATA FIFO是什么? 2、自己编写的仿真验证 3、官方例程仿真         IP核----AXI4 STREAM DATA FIFO也是一种先入先出形式的数据缓存队列(FIFO),不过输入输出接口

    2024年02月09日
    浏览(51)
  • FPGA - AXI4_Lite(实现用户端与axi4_lite之间的交互逻辑)

    在之前的博客中对AXI4总线进行了介绍(FPGA-AXI4接口协议概述),在这篇博客中, 实现用户端与axi4_lite之间的交互逻辑。 对AXI4总线简单介绍(具体可见FPGA-AXI4接口协议概述) ①AXI4是ARM公司提出的是一种高性能、高带宽、低延迟的片内总线 ②主要描述了主设备和从设备之间的

    2024年04月11日
    浏览(41)
  • axi4-stream-fifo使用

    1.读TDFV( 0xC )寄存器                                                //查询FIFO可写次数 2.写TDFD(lite接口: 0x10 ,full接口:0x0)寄存器       //写待发数据 3.写TLR ( 0x14 )寄存器                                                 //写包长度 ,单位Byte

    2024年02月12日
    浏览(41)
  • STM32使用DMA实现GPIO的高速翻转

    接着上一篇博客的内容,上一篇博客实现了定时器输出pwm,这次我们使用DMA来驱动gpio高速翻转,来探索一下stm32h750的gpio翻转极限 这里大家可能有点疑惑,为什么要用dma来控制gpio 使用DMA的原因有两点: 第一点就是资源消耗问题,我的项目中有个数组,该数组有13240个元素,

    2024年02月03日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包