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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值