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

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

这里给一个小例子:

往0地址写入
突发长度为256突发,数据位宽为64bit
数据为0~255

//------------------------------------------------------------------------------------------------------------------------------------//
	//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
  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: B'axi4-lite总线读verilog是一种硬件描述语言,用于设计数字电路。它可以用于描述电路的行为、结构和时序特性等方面。在设计复杂的数字电路时,使用Verilog可以方便地进行设计、仿真和验证,帮助工程师快速有效地实现设计目标。B'axi4-lite总线是一种高效的接口协议,可以连接处理器、外设和存储器等,Verilog编码可以有效地实现其功能。 ### 回答2: ### 回答3: AXI4-Lite是一种轻量级的总线协议,用于在SoC (System on Chip) 中连接处理器和低带宽周边设备,它是一种简单、高效且易于实现的总线协议。 在Verilog实现AXI4-Lite总线,首先需要了解AXI4-Lite总线的基本结构和信号: 1.地址信号:有两个地址信号,一个是地址输入信号awaddr,一个是地址输出信号araddr,用于指定读的起始地址。 2.数据信号:有两个数据信号,一个是读数据输出信号rdata,一个是数据输入信号wdata,用于传输数据。 3.读/使能信号:有两个读/使能信号,一个是读使能信号arvalid,一个是使能信号awvalid,指示传输方式。 4.应答信号:有两个应答信号,一个是读应答信号rvalid,一个是应答信号bvalid,用于指示传输是否成功。 在实现时需要编两个模块:读控制器和设备模块。 读控制器模块主要完成读数据的控制。在读操作中,首先读控制器将传来的地址和读使能信号以及其他必要的信号保存到寄存器中,同时发出读请求。然后等待设备模块响应后,将响应数据传递给CPU。在操作中,将数据和地址信息保存到寄存器中,并发出请求,等待设备模块响应后,将完成信号传递给CPU。 设备模块主要完成对读请求的响应,根据传来的地址信息,读取或入相应的数据,然后将读取或入的结果封装为响应信号,传递给读控制器模块。 读控制器模块和设备模块之间需要进行时序同步,以确保传输正确性及时。建议在模块之间增加FIFO buffer进行同步。 总之,实现AXI4-Lite总线读需要掌握其基本结构及信号,编控制器和设备模块,并进行时序同步。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值