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

📄 wb_mast_model.v

📁 DMA的控制器的IP核,和ATA控制器配合,可以实现DMA方式高速传输数据.
💻 V
字号:
/////////////////////////////////////////////////////////////////////////                                                             ////////  WISHBONE Master Model                                      ////////                                                             ////////                                                             ////////  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_mast_model.v,v 1.3 2002/02/01 01:55:44 rudi Exp $////  $Date: 2002/02/01 01:55:44 $//  $Revision: 1.3 $//  $Author: rudi $//  $Locker:  $//  $State: Exp $//// Change History://               $Log: wb_mast_model.v,v $//               Revision 1.3  2002/02/01 01:55:44  rudi////               - Minor cleanup////               Revision 1.2  2001/09/07 15:34:36  rudi////               Changed reset to active high.////               Revision 1.1  2001/07/29 08:57:02  rudi//////               1) Changed Directory Structure//               2) Added restart signal (REST)////               Revision 1.1.1.1  2001/03/19 13:11:34  rudi//               Initial Release//////`include "wb_model_defines.v"module wb_mast(clk, rst, adr, din, dout, cyc, stb, sel, we, ack, err, rty);input		clk, rst;output	[31:0]	adr;input	[31:0]	din;output	[31:0]	dout;output		cyc, stb;output	[3:0]	sel;output		we;input		ack, err, rty;//////////////////////////////////////////////////////////////////////// Local Wires//parameter mem_size = 4096;reg	[31:0]	adr;reg	[31:0]	dout;reg		cyc, stb;reg	[3:0]	sel;reg		we;reg	[31:0]	rd_mem[mem_size:0];reg	[31:0]	wr_mem[mem_size:0];integer		rd_cnt;integer		wr_cnt;//////////////////////////////////////////////////////////////////////// Memory Logic//initial   begin	//adr = 32'hxxxx_xxxx;	//adr = 0;	adr = 32'hffff_ffff;	dout = 32'hxxxx_xxxx;	cyc = 0;	stb = 0;	sel = 4'hx;	we = 1'hx;	rd_cnt = 0;	wr_cnt = 0;	#1;	$display("\nINFO: WISHBONE MASTER MODEL INSTANTIATED (%m)\n");   endtask mem_fill;integer n;beginrd_cnt = 0;wr_cnt = 0;for(n=0;n<mem_size;n=n+1)   begin	rd_mem[n] = $random;	wr_mem[n] = $random;   endendendtask//////////////////////////////////////////////////////////////////////// Write 1 Word Task//task wb_wr1;input	[31:0]	a;input	[3:0]	s;input	[31:0]	d;begin@(posedge clk);#1;adr = a;dout = d;cyc = 1;stb = 1;we=1;sel = s;@(posedge clk);while(~ack & ~err)	@(posedge clk);#1;cyc=0;stb=0;adr = 32'hxxxx_xxxx;//adr = 32'hffff_ffff;//adr = 0;dout = 32'hxxxx_xxxx;we = 1'hx;sel = 4'hx;endendtask//////////////////////////////////////////////////////////////////////// Write 4 Words Task//task wb_wr4;input	[31:0]	a;input	[3:0]	s;input		delay;input	[31:0]	d1;input	[31:0]	d2;input	[31:0]	d3;input	[31:0]	d4;integer		delay;begin@(posedge clk);#1;cyc = 1;sel = s;repeat(delay)   begin	@(posedge clk);	#1;   endadr = a;dout = d1;stb = 1;we=1;while(~ack & ~err)	@(posedge clk);#2;stb=0;we=1'bx;dout = 32'hxxxx_xxxx;repeat(delay)   begin	@(posedge clk);	#1;   endstb=1;adr = a+4;dout = d2;we=1;@(posedge clk);while(~ack & ~err)	@(posedge clk);#2;stb=0;we=1'bx;dout = 32'hxxxx_xxxx;repeat(delay)   begin	@(posedge clk);	#1;   endstb=1;adr = a+8;dout = d3;we=1;@(posedge clk);while(~ack & ~err)	@(posedge clk);#2;stb=0;we=1'bx;dout = 32'hxxxx_xxxx;repeat(delay)   begin	@(posedge clk);	#1;   endstb=1;adr = a+12;dout = d4;we=1;@(posedge clk);while(~ack & ~err)	@(posedge clk);#1;stb=0;cyc=0;adr = 32'hxxxx_xxxx;//adr = 0;//adr = 32'hffff_ffff;dout = 32'hxxxx_xxxx;we = 1'hx;sel = 4'hx;endendtasktask wb_wr_mult;input	[31:0]	a;input	[3:0]	s;input		delay;input		count;integer		delay;integer		count;integer		n;begin@(posedge clk);#1;cyc = 1;for(n=0;n<count;n=n+1)   begin	repeat(delay)	   begin		@(posedge clk);		#1;	   end	adr = a + (n*4);	dout = wr_mem[n + wr_cnt];	stb = 1;	we=1;	sel = s;	if(n!=0)	@(posedge clk);	while(~ack & ~err)	@(posedge clk);	#2;	stb=0;	we=1'bx;	sel = 4'hx;	dout = 32'hxxxx_xxxx;	adr = 32'hxxxx_xxxx;   endcyc=0;adr = 32'hxxxx_xxxx;//adr = 32'hffff_ffff;wr_cnt = wr_cnt + count;endendtasktask wb_rmw;input	[31:0]	a;input	[3:0]	s;input		delay;input		rcount;input		wcount;integer		delay;integer		rcount;integer		wcount;integer		n;begin@(posedge clk);#1;cyc = 1;we = 0;sel = s;repeat(delay)	@(posedge clk);for(n=0;n<rcount-1;n=n+1)   begin	adr = a + (n*4);	stb = 1;	while(~ack & ~err)	@(posedge clk);	rd_mem[n + rd_cnt] = din;	//$display("Rd Mem[%0d]: %h", (n + rd_cnt), rd_mem[n + rd_cnt] );	#2;	stb=0;	we = 1'hx;	sel = 4'hx;	adr = 32'hxxxx_xxxx;	repeat(delay)	   begin		@(posedge clk);		#1;	   end	we = 0;	sel = s;   endadr = a+(n*4);stb = 1;@(posedge clk);while(~ack & ~err)	@(posedge clk);rd_mem[n + rd_cnt] = din;//$display("Rd Mem[%0d]: %h", (n + rd_cnt), rd_mem[n + rd_cnt] );#1;stb=0;we = 1'hx;sel = 4'hx;adr = 32'hxxxx_xxxx;rd_cnt = rd_cnt + rcount;//@(posedge clk);for(n=0;n<wcount;n=n+1)   begin	repeat(delay)	   begin		@(posedge clk);		#1;	   end	adr = a + (n*4);	dout = wr_mem[n + wr_cnt];	stb = 1;	we=1;	sel = s;//	if(n!=0)		@(posedge clk);	while(~ack & ~err)	@(posedge clk);	#2;	stb=0;	we=1'bx;	sel = 4'hx;	dout = 32'hxxxx_xxxx;	adr = 32'hxxxx_xxxx;   endcyc=0;adr = 32'hxxxx_xxxx;//adr = 32'hffff_ffff;wr_cnt = wr_cnt + wcount;endendtasktask wb_wmr;input	[31:0]	a;input	[3:0]	s;input		delay;input		rcount;input		wcount;integer		delay;integer		rcount;integer		wcount;integer		n;begin@(posedge clk);#1;cyc = 1;we = 1'bx;sel = 4'hx;sel = s;for(n=0;n<wcount;n=n+1)   begin	repeat(delay)	   begin		@(posedge clk);		#1;	   end	adr = a + (n*4);	dout = wr_mem[n + wr_cnt];	stb = 1;	we=1;	sel = s;	@(posedge clk);	while(~ack & ~err)	@(posedge clk);	#2;	stb=0;	we=1'bx;	sel = 4'hx;	dout = 32'hxxxx_xxxx;	adr = 32'hxxxx_xxxx;   endwr_cnt = wr_cnt + wcount;stb=0;repeat(delay)	@(posedge clk);#1;sel = s;we = 0;for(n=0;n<rcount-1;n=n+1)   begin	adr = a + (n*4);	stb = 1;	while(~ack & ~err)	@(posedge clk);	rd_mem[n + rd_cnt] = din;	//$display("Rd Mem[%0d]: %h", (n + rd_cnt), rd_mem[n + rd_cnt] );	#2;	stb=0;	we = 1'hx;	sel = 4'hx;	adr = 32'hxxxx_xxxx;	repeat(delay)	   begin		@(posedge clk);		#1;	   end	we = 0;	sel = s;   endadr = a+(n*4);stb = 1;@(posedge clk);while(~ack & ~err)	@(posedge clk);rd_mem[n + rd_cnt] = din;rd_cnt = rd_cnt + rcount;//$display("Rd Mem[%0d]: %h", (n + rd_cnt), rd_mem[n + rd_cnt] );#1;cyc = 0;stb = 0;we  = 1'hx;sel = 4'hx;adr = 32'hxxxx_xxxx;endendtask//////////////////////////////////////////////////////////////////////// Read 1 Word Task//task wb_rd1;input	[31:0]	a;input	[3:0]	s;output	[31:0]	d;begin@(posedge clk);#1;adr = a;cyc = 1;stb = 1;we  = 0;sel = s;//@(posedge clk);while(~ack & ~err)	@(posedge clk);d = din;#1;cyc=0;stb=0;//adr = 32'hxxxx_xxxx;//adr = 0;adr = 32'hffff_ffff;dout = 32'hxxxx_xxxx;we = 1'hx;sel = 4'hx;endendtask//////////////////////////////////////////////////////////////////////// Read 4 Words Task//task wb_rd4;input	[31:0]	a;input	[3:0]	s;input		delay;output	[31:0]	d1;output	[31:0]	d2;output	[31:0]	d3;output	[31:0]	d4;integer		delay;begin@(posedge clk);#1;cyc = 1;we = 0;sel = s;repeat(delay)	@(posedge clk);adr = a;stb = 1;while(~ack & ~err)	@(posedge clk);d1 = din;#2;stb=0;we = 1'hx;sel = 4'hx;repeat(delay)   begin	@(posedge clk);	#1;   endwe = 0;sel = s;adr = a+4;stb = 1;@(posedge clk);while(~ack & ~err)	@(posedge clk);d2 = din;#2;stb=0;we = 1'hx;sel = 4'hx;repeat(delay)   begin	@(posedge clk);	#1;   endwe = 0;sel = s;adr = a+8;stb = 1;@(posedge clk);while(~ack & ~err)	@(posedge clk);d3 = din;#2;stb=0;we = 1'hx;sel = 4'hx;repeat(delay)   begin	@(posedge clk);	#1;   endwe = 0;sel = s;adr = a+12;stb = 1;@(posedge clk);while(~ack & ~err)	@(posedge clk);d4 = din;#1;stb=0;cyc=0;we = 1'hx;sel = 4'hx;adr = 32'hffff_ffff;endendtasktask wb_rd_mult;input	[31:0]	a;input	[3:0]	s;input		delay;input		count;integer		delay;integer		count;integer		n;begin@(posedge clk);#1;cyc = 1;we = 0;sel = s;repeat(delay)	@(posedge clk);for(n=0;n<count-1;n=n+1)   begin	adr = a + (n*4);	stb = 1;	while(~ack & ~err)	@(posedge clk);	rd_mem[n + rd_cnt] = din;	#2;	stb=0;	we = 1'hx;	sel = 4'hx;	adr = 32'hxxxx_xxxx;	repeat(delay)	   begin		@(posedge clk);		#1;	   end	we = 0;	sel = s;   endadr = a+(n*4);stb = 1;@(posedge clk);while(~ack & ~err)	@(posedge clk);rd_mem[n + rd_cnt] = din;#1;stb=0;cyc=0;we = 1'hx;sel = 4'hx;adr = 32'hffff_ffff;adr = 32'hxxxx_xxxx;rd_cnt = rd_cnt + count;endendtaskendmodule

⌨️ 快捷键说明

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