📄 usbf_idma.v
字号:
///////////////////////////////////////////////////////////////////////// //////// Internal DMA Engine //////// //////// //////// Author: Rudolf Usselmann //////// rudi@asics.ws //////// //////// //////// Downloaded from: http://www.opencores.org/cores/usb/ //////// ///////////////////////////////////////////////////////////////////////////// //////// Copyright (C) 2000-2003 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: usbf_idma.v,v 1.8 2003/10/17 02:36:57 rudi Exp $//// $Date: 2003/10/17 02:36:57 $// $Revision: 1.8 $// $Author: rudi $// $Locker: $// $State: Exp $//// Change History:// $Log: usbf_idma.v,v $// Revision 1.8 2003/10/17 02:36:57 rudi// - Disabling bit stuffing and NRZI encoding during speed negotiation// - Now the core can send zero size packets// - Fixed register addresses for some of the higher endpoints// (conversion between decimal/hex was wrong)// - The core now does properly evaluate the function address to// determine if the packet was intended for it.// - Various other minor bugs and typos//// Revision 1.7 2001/11/04 12:22:45 rudi//// - Fixed previous fix (brocke something else ...)// - Majore Synthesis cleanup//// Revision 1.6 2001/11/03 03:26:22 rudi//// - Fixed several interrupt and error condition reporting bugs//// Revision 1.5 2001/09/24 01:15:28 rudi//// Changed reset to be active high async.//// Revision 1.4 2001/09/23 08:39:33 rudi//// Renamed DEBUG and VERBOSE_DEBUG to USBF_DEBUG and USBF_VERBOSE_DEBUG ...//// Revision 1.3 2001/09/19 14:38:57 rudi//// Fixed TxValid handling bug.//// Revision 1.2 2001/09/13 13:14:02 rudi//// Fixed a problem that would sometimes prevent the core to come out of// reset and immediately be operational ...//// Revision 1.1 2001/08/03 05:30:09 rudi////// 1) Reorganized directory structure//// Revision 1.2 2001/03/31 13:00:51 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:10:50 rudi// Initial Release//// `include "usbf_defines.v"module usbf_idma( clk, rst, // Packet Disassembler/Assembler interface rx_data_st, rx_data_valid, rx_data_done, send_data, tx_data_st, rd_next, // Protocol Engine rx_dma_en, tx_dma_en, abort, idma_done, buf_size, dma_en, send_zero_length, // Register File Manager Interface adr, size, sizu_c, // Memory Arb interface madr, mdout, mdin, mwe, mreq, mack );parameter SSRAM_HADR = 14;// Packet Disassembler/Assembler interfaceinput clk, rst;input [7:0] rx_data_st;input rx_data_valid;input rx_data_done;output send_data;output [7:0] tx_data_st;input rd_next;// Protocol Engineinput rx_dma_en; // Allows the data to be storedinput tx_dma_en; // Allows for data to be retrievedinput abort; // Abort Transfer (time_out, crc_err or rx_error)output idma_done; // DMA is doneinput [13:0] buf_size; // Actual buffer sizeinput dma_en; // External DMA enabledinput send_zero_length;// Register File Manager Interfaceinput [SSRAM_HADR + 2:0] adr; // Byte Addressinput [13:0] size; // Size in bytesoutput [10:0] sizu_c; // Up and Down counting size registers, used to update// Memory Arb interfaceoutput [SSRAM_HADR:0] madr; // word addressoutput [31:0] mdout;input [31:0] mdin;output mwe;output mreq;input mack;/////////////////////////////////////////////////////////////////////// Local Wires and Registers//parameter [7:0] // synopsys enum state IDLE = 8'b00000001, WAIT_MRD = 8'b00000010, MEM_WR = 8'b00000100, MEM_WR1 = 8'b00001000, MEM_WR2 = 8'b00010000, MEM_RD1 = 8'b00100000, MEM_RD2 = 8'b01000000, MEM_RD3 = 8'b10000000;reg [7:0] /* synopsys enum state */ state, next_state;// synopsys state_vector statereg tx_dma_en_r, rx_dma_en_r;reg [SSRAM_HADR:0] adr_cw; // Internal word address counterreg [2:0] adr_cb; // Internal byte address counterreg [SSRAM_HADR:0] adrw_next; // next addressreg [SSRAM_HADR:0] adrw_next1; // next address (after overrun check)reg [SSRAM_HADR:0] last_buf_adr; // Last Buffer Addressreg [2:0] adrb_next; // next byte addressreg [13:0] sizd_c; // Internal size counterreg [10:0] sizu_c; // Internal size counterwire adr_incw;wire adr_incb;wire siz_dec;wire siz_inc;reg word_done; // Indicates that a word has been // assembledreg mreq_d; // Memory request from State Machinereg [31:0] dtmp_r; // Temp data assembly registerreg [31:0] dout_r; // Data output registerreg mwe_d; // Memory Write enablereg dtmp_sel; // Selects tmp data register for pre-fetchreg sizd_is_zero; // Indicates when all bytes have been // transferredwire sizd_is_zero_d;reg [7:0] tx_data_st; // Data output to packet assemblerreg [31:0] rd_buf0, rd_buf1; // Mem Rd. buffers for TXreg rd_first; // Indicates initial fill of buffersreg idma_done; // DMA transfer is donereg mack_r;wire send_data; // Enable UTMI Transmitterreg send_data_r;reg word_done_r;reg wr_last;reg wr_last_en;reg wr_done;reg wr_done_r;reg dtmp_sel_r;reg mwe;reg rx_data_done_r2;wire fill_buf0, fill_buf1;wire adrb_is_3;reg rx_data_done_r;reg rx_data_valid_r;reg [7:0] rx_data_st_r;reg send_zero_length_r;/////////////////////////////////////////////////////////////////////// Memory Arb interface//// Memory Requestassign mreq = (mreq_d & !mack_r) | word_done_r;// Output Dataassign mdout = dout_r;// Memory Addressassign madr = adr_cw;always @(posedge clk) mwe <= mwe_d;always @(posedge clk) mack_r <= mreq & mack;/////////////////////////////////////////////////////////////////////// Misc Logic//always @(posedge clk) rx_data_valid_r <= rx_data_valid;always @(posedge clk) rx_data_st_r <= rx_data_st;always @(posedge clk) rx_data_done_r <= rx_data_done;always @(posedge clk) rx_data_done_r2 <= rx_data_done_r;// Generate one cycle pulses for tx and rx dma enablealways @(posedge clk) tx_dma_en_r <= tx_dma_en;always @(posedge clk) rx_dma_en_r <= rx_dma_en;always @(posedge clk) send_zero_length_r <= send_zero_length;// address counteralways @(posedge clk) if(rx_dma_en_r || tx_dma_en_r) adr_cw <= adr[SSRAM_HADR + 2:2]; else adr_cw <= adrw_next1;always @(posedge clk) last_buf_adr <= adr + { {SSRAM_HADR+2-13{1'b0}}, buf_size };always @(dma_en or adrw_next or last_buf_adr) if(adrw_next == last_buf_adr && dma_en) adrw_next1 = {SSRAM_HADR+1{1'b0}}; else adrw_next1 = adrw_next;always @(adr_incw or adr_cw) if(adr_incw) adrw_next = adr_cw + {{SSRAM_HADR{1'b0}}, 1'b1}; else adrw_next = adr_cw;`ifdef USBF_ASYNC_RESETalways @(posedge clk or negedge rst)`elsealways @(posedge clk)`endif if(!rst) adr_cb <= 3'h0; else if(rx_dma_en_r || tx_dma_en_r) adr_cb <= adr[2:0]; else adr_cb <= adrb_next;always @(adr_incb or adr_cb) if(adr_incb) adrb_next = adr_cb + 3'h1; else adrb_next = adr_cb;assign adr_incb = rx_data_valid_r | rd_next;assign adr_incw = !dtmp_sel_r & mack_r;// Size Counter (counting backward from input size)`ifdef USBF_ASYNC_RESETalways @(posedge clk or negedge rst)`else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -