📄 usbf_pl.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/usb/ //////// ///////////////////////////////////////////////////////////////////////////// //////// Copyright (C) 2000 Rudolf Usselmann //////// 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: usbf_pl.v,v 1.2 2001/08/10 08:48:33 rudi Exp $//// $Date: 2001/08/10 08:48:33 $// $Revision: 1.2 $// $Author: rudi $// $Locker: $// $State: Exp $//// Change History:// $Log: usbf_pl.v,v $// Revision 1.2 2001/08/10 08:48:33 rudi//// - Changed IO names to be more clear.// - Uniquifyed define names to be core specific.//// Revision 1.1 2001/08/03 05:30:09 rudi////// 1) Reorganized directory structure//// Revision 1.2 2001/03/31 13:00:52 rudi//// - Added Core configuration// - Added handling of OUT packets less than MAX_PL_SZ in DMA mode// - Modified WISHBONE interface and sync logic// - Moved SSRAM outside the core (added interface)// - Many small bug fixes ...//// Revision 1.0 2001/03/07 09:17:12 rudi////// Changed all revisions to revision 1.0. This is because OpenCores CVS// interface could not handle the original '0.1' revision ....//// Revision 0.1.0.1 2001/02/28 08:11:11 rudi// Initial Release////`include "usbf_defines.v"module usbf_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, mode_hs, usb_reset, usb_suspend, usb_attached, // memory interface madr, mdout, mdin, mwe, mreq, mack, // Register File Interface fa, idin, ep_sel, match, dma_in_buf_sz1, dma_out_buf_avail, buf0_rl, buf0_set, buf1_set, uc_bsel_set, uc_dpd_set, int_buf1_set, int_buf0_set, int_upid_set, int_crc16_set, int_to_set, int_seqerr_set, out_to_small, csr, buf0, buf1, // Misc frm_nat, pid_cs_err, nse_err, crc5_err );parameter SSRAM_HADR = 14;// 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;input mode_hs; // High Speed Modeinput usb_reset; // USB Resetinput usb_suspend; // USB Suspendinput usb_attached; // Attached to USB// Memory Arbiter Interfaceoutput [SSRAM_HADR:0] madr; // word addressoutput [31:0] mdout;input [31:0] mdin;output mwe;output mreq;input mack;// Register File interfaceinput [6:0] fa; // Function Address (as set by the controller)output [31:0] idin; // Data Inputoutput [3:0] ep_sel; // Endpoint Number Inputinput match; // Endpoint Matchedinput dma_in_buf_sz1;input dma_out_buf_avail;output nse_err; // no such endpoint erroroutput buf0_rl; // Reload Buf 0 with original valuesoutput buf0_set; // Write to buf 0output buf1_set; // Write to buf 1output uc_bsel_set; // Write to the uc_bsel fieldoutput uc_dpd_set; // Write to the uc_dpd fieldoutput int_buf1_set; // Set buf1 full/empty interruptoutput int_buf0_set; // Set buf0 full/empty interruptoutput int_upid_set; // Set unsupported PID interruptoutput int_crc16_set; // Set CRC16 error interruptoutput int_to_set; // Set time out interruptoutput int_seqerr_set; // Set PID sequence error interruptoutput out_to_small; // OUT packet was to small for DMA operationinput [31:0] csr; // Internal CSR Outputinput [31:0] buf0; // Internal Buf 0 Outputinput [31:0] buf1; // Internal Buf 1 Output// Miscoutput pid_cs_err; // pid checksum erroroutput crc5_err; // crc5 erroroutput [31:0] frm_nat;/////////////////////////////////////////////////////////////////////// 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;wire [7:0] rx_data_st;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 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 donewire [SSRAM_HADR + 2:0] adr; // Byte Addresswire [13:0] size; // Size in byteswire [10:0] sizu_c; // Up and Down counting size registers, used // to updatewire [13:0] buf_size; // Actual buffer sizewire dma_en; // external dma enabled// Memory Arbiter Interfacewire [SSRAM_HADR:0] madr; // word addresswire [31:0] mdout;wire [31:0] mdin;wire mwe;wire mreq;wire mack;// Local signalswire pid_bad, pid_bad1, pid_bad2;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 frame_no_same; // Indicates current and prev. frame numbers // are equalreg [3:0] mfm_cnt; // Micro Frame Counterreg [11:0] sof_time; // Time since last sofreg clr_sof_time;wire fsel; // This Function is selectedwire match_o;reg frame_no_we_r;/////////////////////////////////////////////////////////////////////// Misc Logic//// PIDs we should never receiveassign pid_bad1 = pid_ACK | pid_NACK | pid_STALL | pid_NYET | pid_PRE | pid_ERR | pid_SPLIT;// PIDs we should never get in full speed mode (high speed mode only)assign pid_bad2 = !mode_hs & pid_PING;// All bad pidsassign pid_bad = pid_bad1 | pid_bad2;assign match_o = !pid_bad & match & token_valid & !crc5_err;// 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) if(!rst) frame_no_r <= #1 0; else if(frame_no_we_r) frame_no_r <= #1 frame_no;// Micro Frame Counteralways @(posedge clk) frame_no_same <= #1 frame_no_we & (frame_no_r == frame_no);always @(posedge clk) if(!rst) mfm_cnt <= #1 0; else if(frame_no_we_r & !frame_no_same) mfm_cnt <= #1 0; else if(frame_no_same) mfm_cnt <= #1 mfm_cnt + 1;//SOF delay counteralways @(posedge clk) clr_sof_time <= #1 frame_no_we;always @(posedge clk) if(clr_sof_time) sof_time <= #1 0; else if(hms_clk) sof_time <= #1 sof_time + 1;assign frm_nat = {mfm_cnt, 1'b0, frame_no_r, 4'h0, sof_time};// 0.5 Micro Seconds Clock Generatoralways @(posedge clk) if(!rst | hms_clk | frame_no_we_r) hms_cnt <= #1 0; else hms_cnt <= #1 hms_cnt + 1;always @(posedge clk) hms_clk <= #1 (hms_cnt == `USBF_HMS_DEL);///////////////////////////////////////////////////////////////////// This function is addressedassign fsel = (token_fadr == fa);/////////////////////////////////////////////////////////////////////// Module Instantiations////Packet Decoderusbf_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 ), .rx_data_valid( rx_data_valid ), .rx_data_done( rx_data_done ), .crc16_err( crc16_err ), .seq_err( rx_seq_err ) );// Packet Assemblerusbf_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 ), .rd_next( rd_next ) );// Internal DMA / Memory Arbiter Interfaceusbf_idma #(SSRAM_HADR) u2( .clk( clk ), .rst( rst ), .rx_data_st( rx_data_st ), .rx_data_valid( rx_data_valid ), .rx_data_done( rx_data_done ), .send_data( send_data ), .tx_data_st( tx_data_st ), .rd_next( rd_next ), .rx_dma_en( rx_dma_en ), .tx_dma_en( tx_dma_en ), .abort( abort ), .idma_done( idma_done ), .adr( adr ), .size( size ), .buf_size( buf_size ), .dma_en( dma_en ), .madr( madr ), .sizu_c( sizu_c ), .mdout( mdout ), .mdin( mdin ), .mwe( mwe ), .mreq( mreq ), .mack( mack ) );// Protocol Engineusbf_pe #(SSRAM_HADR) 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_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 ), .mode_hs( mode_hs ), .token_valid( token_valid ), .crc5_err( crc5_err ), .rx_data_valid( rx_data_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 ), .adr( adr ), .size( size ), .buf_size( buf_size ), .sizu_c( sizu_c ), .dma_en( dma_en ), .fsel( fsel ), .idin( idin ), .ep_sel( ep_sel ), .match( match_o ), .dma_in_buf_sz1( dma_in_buf_sz1 ), .dma_out_buf_avail( dma_out_buf_avail ), .nse_err( nse_err ), .buf0_rl( buf0_rl ), .buf0_set( buf0_set ), .buf1_set( buf1_set ), .uc_bsel_set( uc_bsel_set ), .uc_dpd_set( uc_dpd_set ), .int_buf1_set( int_buf1_set ), .int_buf0_set( int_buf0_set ), .int_upid_set( int_upid_set ), .int_crc16_set( int_crc16_set ), .int_to_set( int_to_set ), .int_seqerr_set( int_seqerr_set ), .out_to_small( out_to_small ), .csr( csr ), .buf0( buf0 ), .buf1( buf1 ) );endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -