⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wb_dma_de.v

📁 DMA的控制器的IP核,和ATA控制器配合,可以实现DMA方式高速传输数据.
💻 V
📖 第 1 页 / 共 2 页
字号:
/////////////////////////////////////////////////////////////////////////                                                             ////////  WISHBONE DMA DMA Engine Core                               ////////                                                             ////////                                                             ////////  Author: Rudolf Usselmann                                   ////////          rudi@asics.ws                                      ////////                                                             ////////                                                             ////////  Downloaded from: http://www.opencores.org/cores/wb_dma/    ////////                                                             /////////////////////////////////////////////////////////////////////////////                                                             //////// Copyright (C) 2000-2002 Rudolf Usselmann                    ////////                         www.asics.ws                        ////////                         rudi@asics.ws                       ////////                                                             //////// This source file may be used and distributed without        //////// restriction provided that this copyright statement is not   //////// removed from the file and that any derivative work contains //////// the original copyright notice and the associated disclaimer.////////                                                             ////////     THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY     //////// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED   //////// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS   //////// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR      //////// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,         //////// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES    //////// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE   //////// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR        //////// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  //////// LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT  //////// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT  //////// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE         //////// POSSIBILITY OF SUCH DAMAGE.                                 ////////                                                             ///////////////////////////////////////////////////////////////////////////  CVS Log////  $Id: wb_dma_de.v,v 1.3 2002/02/01 01:54:45 rudi Exp $////  $Date: 2002/02/01 01:54:45 $//  $Revision: 1.3 $//  $Author: rudi $//  $Locker:  $//  $State: Exp $//// Change History://               $Log: wb_dma_de.v,v $//               Revision 1.3  2002/02/01 01:54:45  rudi////               - Minor cleanup////               Revision 1.2  2001/08/15 05:40:30  rudi////               - Changed IO names to be more clear.//               - Uniquifyed define names to be core specific.//               - Added Section 3.10, describing DMA restart.////               Revision 1.1  2001/07/29 08:57:02  rudi//////               1) Changed Directory Structure//               2) Added restart signal (REST)////               Revision 1.3  2001/06/13 02:26:48  rudi//////               Small changes after running lint.////               Revision 1.2  2001/06/05 10:22:36  rudi//////               - Added Support of up to 31 channels//               - Added support for 2,4 and 8 priority levels//               - Now can have up to 31 channels//               - Added many configuration items//               - Changed reset to async////               Revision 1.1.1.1  2001/03/19 13:10:44  rudi//               Initial Release//////`include "wb_dma_defines.v"module wb_dma_de(clk, rst,	// WISHBONE MASTER INTERFACE 0	mast0_go, mast0_we, mast0_adr, mast0_din,	mast0_dout, mast0_err, mast0_drdy, mast0_wait, 	// WISHBONE MASTER INTERFACE 1	mast1_go, mast1_we, mast1_adr, mast1_din,	mast1_dout, mast1_err, mast1_drdy, mast1_wait,	// DMA Engine Init & Setup	de_start, nd, csr, pointer, pointer_s, txsz,	adr0, adr1, am0, am1,	// DMA Engine Register File Update Outputs	de_csr_we, de_txsz_we, de_adr0_we, de_adr1_we, ptr_set,	de_csr, de_txsz, de_adr0, de_adr1, de_fetch_descr,	// DMA Engine Control Outputs	next_ch, de_ack,	// DMA Engine Status	pause_req, paused,	dma_abort, dma_busy, dma_err, dma_done, dma_done_all	);input		clk, rst;// --------------------------------------// WISHBONE MASTER INTERFACE 0output		mast0_go;	// Perform a Master Cycleoutput		mast0_we;	// Read/Writeoutput	[31:0]	mast0_adr;	// Address for the transferinput	[31:0]	mast0_din;	// Internal Input Dataoutput	[31:0]	mast0_dout;	// Internal Output Datainput		mast0_err;	// Indicates an error has occurredinput		mast0_drdy;	// Indicated that either data is available				// during a read, or that the master can accept				// the next data during a writeoutput		mast0_wait;	// Tells the master to insert wait cycles				// because data can not be accepted/provided// --------------------------------------// WISHBONE MASTER INTERFACE 1output		mast1_go;	// Perform a Master Cycleoutput		mast1_we;	// Read/Writeoutput	[31:0]	mast1_adr;	// Address for the transferinput	[31:0]	mast1_din;	// Internal Input Dataoutput	[31:0]	mast1_dout;	// Internal Output Datainput		mast1_err;	// Indicates an error has occurredinput		mast1_drdy;	// Indicated that either data is available				// during a read, or that the master can accept				// the next data during a writeoutput		mast1_wait;	// Tells the master to insert wait cycles				// because data can not be accepted/provided// --------------------------------------// DMA Engine Signals// DMA Engine Init & Setupinput		de_start;	// Start DMA Engine Indicatorinput		nd;		// Next Descriptor Indicatorinput	[31:0]	csr;		// Selected Channel CSRinput	[31:0]	pointer;	// Linked List Descriptor pointerinput	[31:0]	pointer_s;	// Previous Pointerinput	[31:0]	txsz;		// Selected Channel Transfer Sizeinput	[31:0]	adr0, adr1;	// Selected Channel Addressesinput	[31:0]	am0, am1;	// Selected Channel Address Masks// DMA Engine Register File Update Outputsoutput		de_csr_we;	// Write enable for csr registeroutput		de_txsz_we;	// Write enable for txsz registeroutput		de_adr0_we;	// Write enable for adr0 registeroutput		de_adr1_we;	// Write enable for adr1 registeroutput		ptr_set;	// Set Pointer as Validoutput	[31:0]	de_csr;		// Write Data for CSR when loading External Desc.output	[11:0]	de_txsz;	// Write back data for txsz registeroutput	[31:0]	de_adr0;	// Write back data for adr0 registeroutput	[31:0]	de_adr1;	// Write back data for adr1 registeroutput		de_fetch_descr;	// Indicates that we are fetching a descriptor// DMA Engine Control Outputsoutput		next_ch;	// Indicates the DMA Engine is doneoutput		de_ack;// DMA Abort from RF (software forced abort)input		dma_abort;// DMA Engine Statusinput		pause_req;output		paused;output		dma_busy, dma_err, dma_done, dma_done_all;//////////////////////////////////////////////////////////////////////// Local Wires//parameter	[10:0]	// synopsys enum state		IDLE		= 11'b000_0000_0001,		READ		= 11'b000_0000_0010,		WRITE		= 11'b000_0000_0100,		UPDATE		= 11'b000_0000_1000,		LD_DESC1	= 11'b000_0001_0000,		LD_DESC2	= 11'b000_0010_0000,		LD_DESC3	= 11'b000_0100_0000,		LD_DESC4	= 11'b000_1000_0000,		LD_DESC5	= 11'b001_0000_0000,		WB		= 11'b010_0000_0000,		PAUSE		= 11'b100_0000_0000;reg	[10:0]	/* synopsys enum state */ state, next_state;// synopsys state_vector statereg	[31:0]	mast0_adr, mast1_adr;reg	[29:0]	adr0_cnt, adr1_cnt;wire	[29:0]	adr0_cnt_next, adr1_cnt_next;wire	[29:0]	adr0_cnt_next1, adr1_cnt_next1;reg		adr0_inc, adr1_inc;reg	[8:0]	chunk_cnt;reg		chunk_dec;reg	[11:0]	tsz_cnt;reg		tsz_dec;reg		de_txsz_we;reg		de_csr_we;reg		de_adr0_we;reg		de_adr1_we;reg		ld_desc_sel;wire		chunk_cnt_is_0_d;reg		chunk_cnt_is_0_r;wire		tsz_cnt_is_0_d;reg		tsz_cnt_is_0_r;reg		read, write;reg		read_r, write_r;wire		rd_ack, wr_ack;reg		rd_ack_r;reg		chunk_0;wire		done;reg		dma_done_d;reg		dma_done_r;reg		dma_abort_r;reg		next_ch;wire		read_hold, write_hold;reg		write_hold_r;reg	[1:0]	ptr_adr_low;reg		m0_go;reg		m0_we;reg		ptr_set;// Aliaseswire		a0_inc_en = csr[4];	// Source Address (Adr 0) increment enablewire		a1_inc_en = csr[3];	// Dest. Address (Adr 1) increment enablewire		ptr_valid = pointer[0];wire		use_ed = csr[`WDMA_USE_ED];reg		mast0_drdy_r;reg		paused;reg		de_fetch_descr;		// Indicates that we are fetching a descriptor//////////////////////////////////////////////////////////////////////// Misc Logic//always @(posedge clk)	dma_done_r <= #1 dma_done;// Address Counter 0 (Source Address)always @(posedge clk)	if(de_start | ptr_set)		adr0_cnt <= #1 adr0[31:2];	else	if(adr0_inc & a0_inc_en)	adr0_cnt <= #1 adr0_cnt_next;// 30 Bit Incrementor (registered)wb_dma_inc30r u0(	.clk(	clk		),			.in(	adr0_cnt	),			.out(	adr0_cnt_next1 	)	);assign adr0_cnt_next[1:0] = adr0_cnt_next1[1:0];assign adr0_cnt_next[2] = am0[4] ? adr0_cnt_next1[2] : adr0_cnt[2];assign adr0_cnt_next[3] = am0[5] ? adr0_cnt_next1[3] : adr0_cnt[3];assign adr0_cnt_next[4] = am0[6] ? adr0_cnt_next1[4] : adr0_cnt[4];assign adr0_cnt_next[5] = am0[7] ? adr0_cnt_next1[5] : adr0_cnt[5];assign adr0_cnt_next[6] = am0[8] ? adr0_cnt_next1[6] : adr0_cnt[6];assign adr0_cnt_next[7] = am0[9] ? adr0_cnt_next1[7] : adr0_cnt[7];assign adr0_cnt_next[8] = am0[10] ? adr0_cnt_next1[8] : adr0_cnt[8];assign adr0_cnt_next[9] = am0[11] ? adr0_cnt_next1[9] : adr0_cnt[9];assign adr0_cnt_next[10] = am0[12] ? adr0_cnt_next1[10] : adr0_cnt[10];assign adr0_cnt_next[11] = am0[13] ? adr0_cnt_next1[11] : adr0_cnt[11];assign adr0_cnt_next[12] = am0[14] ? adr0_cnt_next1[12] : adr0_cnt[12];assign adr0_cnt_next[13] = am0[15] ? adr0_cnt_next1[13] : adr0_cnt[13];assign adr0_cnt_next[14] = am0[16] ? adr0_cnt_next1[14] : adr0_cnt[14];assign adr0_cnt_next[15] = am0[17] ? adr0_cnt_next1[15] : adr0_cnt[15];assign adr0_cnt_next[16] = am0[18] ? adr0_cnt_next1[16] : adr0_cnt[16];assign adr0_cnt_next[17] = am0[19] ? adr0_cnt_next1[17] : adr0_cnt[17];assign adr0_cnt_next[18] = am0[20] ? adr0_cnt_next1[18] : adr0_cnt[18];assign adr0_cnt_next[19] = am0[21] ? adr0_cnt_next1[19] : adr0_cnt[19];assign adr0_cnt_next[20] = am0[22] ? adr0_cnt_next1[20] : adr0_cnt[20];assign adr0_cnt_next[21] = am0[23] ? adr0_cnt_next1[21] : adr0_cnt[21];assign adr0_cnt_next[22] = am0[24] ? adr0_cnt_next1[22] : adr0_cnt[22];assign adr0_cnt_next[23] = am0[25] ? adr0_cnt_next1[23] : adr0_cnt[23];assign adr0_cnt_next[24] = am0[26] ? adr0_cnt_next1[24] : adr0_cnt[24];assign adr0_cnt_next[25] = am0[27] ? adr0_cnt_next1[25] : adr0_cnt[25];assign adr0_cnt_next[26] = am0[28] ? adr0_cnt_next1[26] : adr0_cnt[26];assign adr0_cnt_next[27] = am0[29] ? adr0_cnt_next1[27] : adr0_cnt[27];assign adr0_cnt_next[28] = am0[30] ? adr0_cnt_next1[28] : adr0_cnt[28];assign adr0_cnt_next[29] = am0[31] ? adr0_cnt_next1[29] : adr0_cnt[29];// Address Counter 1 (Destination Address)always @(posedge clk)	if(de_start | ptr_set)		adr1_cnt <= #1 adr1[31:2];	else	if(adr1_inc & a1_inc_en)	adr1_cnt <= #1 adr1_cnt_next;// 30 Bit Incrementor (registered)wb_dma_inc30r u1(	.clk(	clk		),			.in(	adr1_cnt	),			.out(	adr1_cnt_next1 	)	);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -