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

📄 usb1_pl.v

📁 USB 1.1的verilog代码
💻 V
字号:
/////////////////////////////////////////////////////////////////////////                                                             ////////  Protocol Layer                                             ////////  This block is typically referred to as the SEI in USB      ////////  Specification. It encapsulates the Packet Assembler,       ////////  disassembler, protocol engine and internal DMA             ////////                                                             ////////  Author: Rudolf Usselmann                                   ////////          rudi@asics.ws                                      ////////                                                             ////////                                                             ////////  Downloaded from: http://www.opencores.org/cores/usb1_fucnt/////////                                                             /////////////////////////////////////////////////////////////////////////////                                                             //////// 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: usb1_pl.v,v 1.2 2002/09/25 06:06:49 rudi Exp $////  $Date: 2002/09/25 06:06:49 $//  $Revision: 1.2 $//  $Author: rudi $//  $Locker:  $//  $State: Exp $//// Change History://               $Log: usb1_pl.v,v $//               Revision 1.2  2002/09/25 06:06:49  rudi//               - Added New Top Level//               - Remove old top level and associated files//               - Moved FIFOs to "Generic FIFOs" project////               Revision 1.1.1.1  2002/09/19 12:07:28  rudi//               Initial Checkin//////////////////module usb1_pl(	clk, rst,		// UTMI Interface		rx_data, rx_valid, rx_active, rx_err,		tx_data, tx_valid, tx_valid_last, tx_ready,		tx_first, tx_valid_out,		token_valid,		// Register File Interface		fa,		ep_sel, 		x_busy,		int_crc16_set, int_to_set, int_seqerr_set,		// Misc		frm_nat,		pid_cs_err, nse_err,		crc5_err,		rx_size, rx_done,		ctrl_setup, ctrl_in, ctrl_out,		// Block Frames		ep_bf_en, ep_bf_size,		dropped_frame, misaligned_frame,		// EP Interface		csr,		tx_data_st, rx_data_st, idma_re, idma_we,		ep_empty, ep_full, send_stall		);// UTMI Interfaceinput		clk, rst;input	[7:0]	rx_data;input		rx_valid, rx_active, rx_err;output	[7:0]	tx_data;output		tx_valid;output		tx_valid_last;input		tx_ready;output		tx_first;input		tx_valid_out;output		token_valid;// Register File interfaceinput	[6:0]	fa;		// Function Address (as set by the controller)output	[3:0]	ep_sel;		// Endpoint Number Inputoutput		x_busy;		// Indicates USB is busyoutput		int_crc16_set;	// Set CRC16 error interruptoutput		int_to_set;	// Set time out interruptoutput		int_seqerr_set;	// Set PID sequence error interrupt// Miscoutput		pid_cs_err;	// pid checksum erroroutput		crc5_err;	// crc5 erroroutput	[31:0]	frm_nat;output		nse_err;	// no such endpoint erroroutput	[7:0]	rx_size;output		rx_done;output		ctrl_setup;output		ctrl_in;output		ctrl_out;input		ep_bf_en;input	[6:0]	ep_bf_size;output		dropped_frame, misaligned_frame;// Endpoint Interfacesinput	[13:0]	csr;	input	[7:0]	tx_data_st;output	[7:0]	rx_data_st;output		idma_re, idma_we;input		ep_empty;input		ep_full;input		send_stall;/////////////////////////////////////////////////////////////////////// Local Wires and Registers//// Packet Disassembler Interfacewire		clk, rst;wire	[7:0]	rx_data;wire		pid_OUT, pid_IN, pid_SOF, pid_SETUP;wire		pid_DATA0, pid_DATA1, pid_DATA2, pid_MDATA;wire		pid_ACK, pid_NACK, pid_STALL, pid_NYET;wire		pid_PRE, pid_ERR, pid_SPLIT, pid_PING;wire	[6:0]	token_fadr;wire		token_valid;wire		crc5_err;wire	[10:0]	frame_no;reg	[7:0]	rx_data_st;wire	[7:0]	rx_data_st_d;wire		rx_data_valid;wire		rx_data_done;wire		crc16_err;wire		rx_seq_err;// Packet Assembler Interfacewire		send_token;wire	[1:0]	token_pid_sel;wire		send_data;wire	[1:0]	data_pid_sel;wire	[7:0]	tx_data_st;wire	[7:0]	tx_data_st_o;wire		rd_next;// IDMA Interfacewire		rx_dma_en;	// Allows the data to be storedwire		tx_dma_en;	// Allows for data to be retrievedwire		abort;		// Abort Transfer (time_out, crc_err or rx_error)wire		idma_done;	// DMA is done// Memory Arbiter Interfacewire		idma_we;wire		idma_re;// Local signalswire		pid_bad;reg		hms_clk;	// 0.5 Micro Second Clockreg	[4:0]	hms_cnt;reg	[10:0]	frame_no_r;	// Current Frame Number registerwire		frame_no_we;reg	[11:0]	sof_time;	// Time since last sofreg		clr_sof_time;wire		fsel;		// This Function is selectedwire		match_o;reg		frame_no_we_r;reg		ctrl_setup;reg		ctrl_in;reg		ctrl_out;wire		idma_we_d;wire		ep_empty_int;wire		rx_busy;wire		tx_busy;/////////////////////////////////////////////////////////////////////// Misc Logic//assign x_busy = tx_busy | rx_busy;// PIDs we should never receiveassign pid_bad = pid_ACK | pid_NACK | pid_STALL | pid_NYET | pid_PRE |			pid_ERR | pid_SPLIT |  pid_PING;assign match_o = !pid_bad & token_valid & !crc5_err;// Receiving Setupalways @(posedge clk)	ctrl_setup <= #1 token_valid & pid_SETUP & (ep_sel==4'h0);always @(posedge clk)	ctrl_in <= #1 token_valid & pid_IN & (ep_sel==4'h0);always @(posedge clk)	ctrl_out <= #1 token_valid & pid_OUT & (ep_sel==4'h0);// Frame Number (from SOF token)assign frame_no_we = token_valid & !crc5_err & pid_SOF;always @(posedge clk)	frame_no_we_r <= #1 frame_no_we;always @(posedge clk or negedge rst)	if(!rst)		frame_no_r <= #1 11'h0;	else	if(frame_no_we_r)	frame_no_r <= #1 frame_no;//SOF delay counteralways @(posedge clk)	clr_sof_time <= #1 frame_no_we;always @(posedge clk)	if(clr_sof_time)	sof_time <= #1 12'h0;	else	if(hms_clk)		sof_time <= #1 sof_time + 12'h1;assign frm_nat = {4'h0, 1'b0, frame_no_r, 4'h0, sof_time};// 0.5 Micro Seconds Clock Generatoralways @(posedge clk or negedge rst)	if(!rst)				hms_cnt <= #1 5'h0;	else	if(hms_clk | frame_no_we_r)		hms_cnt <= #1 5'h0;	else					hms_cnt <= #1 hms_cnt + 5'h1;always @(posedge clk)	hms_clk <= #1 (hms_cnt == `USBF_HMS_DEL);always @(posedge clk)	rx_data_st <= rx_data_st_d;///////////////////////////////////////////////////////////////////// This function is addressedassign fsel = (token_fadr == fa);// Only write when we are addressed !!!assign idma_we = idma_we_d & fsel; // moved full check to idma ...  & !ep_full;/////////////////////////////////////////////////////////////////////// Module Instantiations////Packet Decoderusb1_pd	u0(	.clk(		clk		),		.rst(		rst		),		.rx_data(	rx_data		),		.rx_valid(	rx_valid	),		.rx_active(	rx_active	),		.rx_err(	rx_err		),		.pid_OUT(	pid_OUT		),		.pid_IN(	pid_IN		),		.pid_SOF(	pid_SOF		),		.pid_SETUP(	pid_SETUP	),		.pid_DATA0(	pid_DATA0	),		.pid_DATA1(	pid_DATA1	),		.pid_DATA2(	pid_DATA2	),		.pid_MDATA(	pid_MDATA	),		.pid_ACK(	pid_ACK		),		.pid_NACK(	pid_NACK	),		.pid_STALL(	pid_STALL	),		.pid_NYET(	pid_NYET	),		.pid_PRE(	pid_PRE		),		.pid_ERR(	pid_ERR		),		.pid_SPLIT(	pid_SPLIT	),		.pid_PING(	pid_PING	),		.pid_cks_err(	pid_cs_err	),		.token_fadr(	token_fadr	),		.token_endp(	ep_sel		),		.token_valid(	token_valid	),		.crc5_err(	crc5_err	),		.frame_no(	frame_no	),		.rx_data_st(	rx_data_st_d	),		.rx_data_valid(	rx_data_valid	),		.rx_data_done(	rx_data_done	),		.crc16_err(	crc16_err	),		.seq_err(	rx_seq_err	),		.rx_busy(	rx_busy		)		);// Packet Assemblerusb1_pa	u1(	.clk(		clk		),		.rst(		rst		),		.tx_data(	tx_data		),		.tx_valid(	tx_valid	),		.tx_valid_last(	tx_valid_last	),		.tx_ready(	tx_ready	),		.tx_first(	tx_first	),		.send_token(	send_token	),		.token_pid_sel(	token_pid_sel	),		.send_data(	send_data	),		.data_pid_sel(	data_pid_sel	),		.tx_data_st(	tx_data_st_o	),		.rd_next(	rd_next		),		.ep_empty(	ep_empty_int)		);// Internal DMA / Memory Arbiter Interfaceusb1_idma	u2(	.clk(		clk		),		.rst(		rst		),		.tx_valid(	tx_valid	),		.rx_data_valid(	rx_data_valid	),		.rx_data_done(	rx_data_done	),		.send_data(	send_data	),		.rd_next(	rd_next		),		.tx_data_st_i(	tx_data_st	),		.tx_data_st_o(	tx_data_st_o	),		.ep_sel(	ep_sel		),		.ep_bf_en(	ep_bf_en	),		.ep_bf_size(	ep_bf_size	),		.dropped_frame(dropped_frame	),		.misaligned_frame(misaligned_frame),		.tx_busy(	tx_busy		),		.tx_dma_en(	tx_dma_en	),		.rx_dma_en(	rx_dma_en	),		.idma_done(	idma_done	),		.size(		csr[8:0]	),		.rx_cnt(	rx_size		),		.rx_done(	rx_done		),		.mwe(		idma_we_d	),		.mre(		idma_re		),		.ep_empty(	ep_empty	),		.ep_empty_int(	ep_empty_int	),		.ep_full(	ep_full		)		);// Protocol Engineusb1_pe	u3(	.clk(			clk			),		.rst(			rst			),		.tx_valid(		tx_valid_out		),		.rx_active(		rx_active		),		.pid_OUT(		pid_OUT			),		.pid_IN(		pid_IN			),		.pid_SOF(		pid_SOF			),		.pid_SETUP(		pid_SETUP		),		.pid_DATA0(		pid_DATA0		),		.pid_DATA1(		pid_DATA1		),		.pid_DATA2(		pid_DATA2		),		.pid_MDATA(		pid_MDATA		),		.pid_ACK(		pid_ACK			),		.pid_PING(		pid_PING		),		.token_valid(		token_valid		),		.rx_data_done(		rx_data_done		),		.crc16_err(		crc16_err		),		.send_token(		send_token		),		.token_pid_sel(		token_pid_sel		),		.data_pid_sel(		data_pid_sel		),		.rx_dma_en(		rx_dma_en		),		.tx_dma_en(		tx_dma_en		),		.abort(			abort			),		.idma_done(		idma_done		),		.fsel(			fsel			),		.ep_sel(		ep_sel			),		.ep_full(		ep_full			),		.ep_empty(		ep_empty		),		.match(			match_o			),		.nse_err(		nse_err			),		.int_upid_set(		int_upid_set		),		.int_crc16_set(		int_crc16_set		),		.int_to_set(		int_to_set		),		.int_seqerr_set(	int_seqerr_set		),		.csr(			csr			),		.send_stall(		send_stall		)		);endmodule

⌨️ 快捷键说明

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