OpenCores
URL https://opencores.org/ocsvn/usb/usb/trunk

Subversion Repositories usb

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 12 to Rev 13
    Reverse comparison

Rev 12 → Rev 13

/trunk/rtl/verilog/usbf_crc5.v
11,8 → 11,9
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2000 Rudolf Usselmann ////
//// rudi@asics.ws ////
//// 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 ////
37,10 → 38,10
 
// CVS Log
//
// $Id: usbf_crc5.v,v 1.1 2001-08-03 05:30:09 rudi Exp $
// $Id: usbf_crc5.v,v 1.2 2003-10-17 02:36:57 rudi Exp $
//
// $Date: 2001-08-03 05:30:09 $
// $Revision: 1.1 $
// $Date: 2003-10-17 02:36:57 $
// $Revision: 1.2 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
47,6 → 48,11
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.1 2001/08/03 05:30:09 rudi
//
//
// 1) Reorganized directory structure
//
// Revision 1.0 2001/03/07 09:17:12 rudi
//
//
/trunk/rtl/verilog/usbf_utmi_if.v
11,8 → 11,9
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2000 Rudolf Usselmann ////
//// rudi@asics.ws ////
//// 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 ////
37,10 → 38,10
 
// CVS Log
//
// $Id: usbf_utmi_if.v,v 1.3 2001-11-04 12:22:45 rudi Exp $
// $Id: usbf_utmi_if.v,v 1.4 2003-10-17 02:36:57 rudi Exp $
//
// $Date: 2001-11-04 12:22:45 $
// $Revision: 1.3 $
// $Date: 2003-10-17 02:36:57 $
// $Revision: 1.4 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
47,6 → 48,11
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.3 2001/11/04 12:22:45 rudi
//
// - Fixed previous fix (brocke something else ...)
// - Majore Synthesis cleanup
//
// Revision 1.2 2001/09/24 01:15:28 rudi
//
// Changed reset to be active high async.
83,7 → 89,7
`include "usbf_defines.v"
 
module usbf_utmi_if( // UTMI Interface (EXTERNAL)
phy_clk, wclk, rst,
phy_clk, rst,
DataOut, TxValid, TxReady,
RxValid, RxActive, RxError, DataIn,
XcvSelect, TermSel, SuspendM, LineState,
96,11 → 102,11
 
// Misc Interfaces
mode_hs, usb_reset, usb_suspend, usb_attached,
resume_req
resume_req, suspend_clr
);
 
input phy_clk;
input wclk;
//input wclk;
input rst;
 
output [7:0] DataOut;
133,6 → 139,8
output usb_attached; // Attached to USB
input resume_req;
 
output suspend_clr;
 
///////////////////////////////////////////////////////////////////
//
// Local Wires and Registers
156,20 → 164,32
// RX Interface Input registers
//
 
`ifdef USBF_ASYNC_RESET
always @(posedge phy_clk or negedge rst)
if(!rst) rx_valid <= #1 1'b0;
else rx_valid <= #1 RxValid;
`else
always @(posedge phy_clk)
`endif
if(!rst) rx_valid <= 1'b0;
else rx_valid <= RxValid;
 
`ifdef USBF_ASYNC_RESET
always @(posedge phy_clk or negedge rst)
if(!rst) rx_active <= #1 1'b0;
else rx_active <= #1 RxActive;
`else
always @(posedge phy_clk)
`endif
if(!rst) rx_active <= 1'b0;
else rx_active <= RxActive;
 
`ifdef USBF_ASYNC_RESET
always @(posedge phy_clk or negedge rst)
if(!rst) rx_err <= #1 1'b0;
else rx_err <= #1 RxError;
`else
always @(posedge phy_clk)
`endif
if(!rst) rx_err <= 1'b0;
else rx_err <= RxError;
 
always @(posedge phy_clk)
rx_data <= #1 DataIn;
rx_data <= DataIn;
 
///////////////////////////////////////////////////////////////////
//
177,21 → 197,25
//
 
always @(posedge phy_clk)
if(TxReady | tx_first) DataOut <= #1 tx_data;
if(TxReady || tx_first) DataOut <= tx_data;
else
if(drive_k) DataOut <= #1 8'hff;
if(drive_k) DataOut <= 8'hff;
 
always @(posedge phy_clk)
tx_ready <= #1 TxReady;
tx_ready <= TxReady;
 
always @(posedge phy_clk)
drive_k_r <= #1 drive_k;
drive_k_r <= drive_k;
 
 
`ifdef USBF_ASYNC_RESET
always @(posedge phy_clk or negedge rst)
if(!rst) TxValid <= #1 1'b0;
`else
always @(posedge phy_clk)
`endif
if(!rst) TxValid <= 1'b0;
else
TxValid <= #1 tx_valid | drive_k | tx_valid_last | (TxValid & !(TxReady | drive_k_r));
TxValid <= tx_valid | drive_k | tx_valid_last | (TxValid & !(TxReady | drive_k_r));
 
///////////////////////////////////////////////////////////////////
//
200,7 → 224,6
 
usbf_utmi_ls u0(
.clk( phy_clk ),
.wclk( wclk ),
.rst( rst ),
.resume_req( resume_req ),
.rx_active( rx_active ),
215,7 → 238,8
.mode_hs( mode_hs ),
.usb_reset( usb_reset ),
.usb_suspend( usb_suspend ),
.usb_attached( usb_attached )
.usb_attached( usb_attached ),
.suspend_clr( suspend_clr )
);
 
endmodule
/trunk/rtl/verilog/usbf_pa.v
11,8 → 11,9
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2000 Rudolf Usselmann ////
//// rudi@asics.ws ////
//// 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 ////
37,10 → 38,10
 
// CVS Log
//
// $Id: usbf_pa.v,v 1.5 2001-11-04 12:22:45 rudi Exp $
// $Id: usbf_pa.v,v 1.6 2003-10-17 02:36:57 rudi Exp $
//
// $Date: 2001-11-04 12:22:45 $
// $Revision: 1.5 $
// $Date: 2003-10-17 02:36:57 $
// $Revision: 1.6 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
47,6 → 48,11
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.5 2001/11/04 12:22:45 rudi
//
// - Fixed previous fix (brocke something else ...)
// - Majore Synthesis cleanup
//
// Revision 1.4 2001/09/24 01:15:28 rudi
//
// Changed reset to be active high async.
87,6 → 93,7
// Protocol Engine Interface
send_token, token_pid_sel,
send_data, data_pid_sel,
send_zero_length,
 
// IDMA Interface
tx_data_st, rd_next
106,6 → 113,7
input [1:0] token_pid_sel;
input send_data;
input [1:0] data_pid_sel;
input send_zero_length;
 
// IDMA Interface
input [7:0] tx_data_st;
116,13 → 124,14
// Local Wires and Registers
//
 
parameter [3:0] // synopsys enum state
IDLE = 4'b0001,
DATA = 4'b0010,
CRC1 = 4'b0100,
CRC2 = 4'b1000;
parameter [4:0] // synopsys enum state
IDLE = 5'b00001,
DATA = 5'b00010,
CRC1 = 5'b00100,
CRC2 = 5'b01000,
WAIT = 5'b10000;
 
reg [3:0] /* synopsys enum state */ state, next_state;
reg [4:0] /* synopsys enum state */ state, next_state;
// synopsys state_vector state
 
reg last;
146,6 → 155,8
reg send_data_r2;
reg tx_valid_r;
reg tx_valid_r1;
reg zero_length_r;
reg send_zero_length_r;
 
///////////////////////////////////////////////////////////////////
//
153,17 → 164,35
//
 
always @(posedge clk)
tx_valid_r1 <= #1 tx_valid;
send_zero_length_r <= send_zero_length;
 
`ifdef USBF_ASYNC_RESET
always @(posedge clk or negedge rst)
`else
always @(posedge clk)
tx_valid_r <= #1 tx_valid_r1;
`endif
if(!rst) zero_length_r <= 1'b0;
else
if(last) zero_length_r <= 1'b0;
else
if(crc16_clr) zero_length_r <= send_zero_length_r;
 
always @(posedge clk)
tx_valid_r1 <= tx_valid;
 
always @(posedge clk)
tx_valid_r <= tx_valid_r1;
 
`ifdef USBF_ASYNC_RESET
always @(posedge clk or negedge rst)
if(!rst) send_token_r <= #1 1'b0;
`else
always @(posedge clk)
`endif
if(!rst) send_token_r <= 1'b0;
else
if(send_token) send_token_r <= #1 1'b1;
if(send_token) send_token_r <= 1'b1;
else
if(tx_ready) send_token_r <= #1 1'b0;
if(tx_ready) send_token_r <= 1'b0;
 
// PID Select
always @(token_pid_sel)
185,7 → 214,7
// Data path Muxes
 
always @(send_token or send_token_r or token_pid or tx_data_data)
if(send_token | send_token_r) tx_data_d = token_pid;
if(send_token || send_token_r) tx_data_d = token_pid;
else tx_data_d = tx_data_data;
 
always @(dsel or tx_data_st or tx_spec_data)
193,7 → 222,7
else tx_data_data = tx_data_st;
 
always @(crc_sel1 or crc_sel2 or data_pid or crc16_rev)
if(!crc_sel1 & !crc_sel2) tx_spec_data = data_pid;
if(!crc_sel1 && !crc_sel2) tx_spec_data = data_pid;
else
if(crc_sel1) tx_spec_data = crc16_rev[15:8]; // CRC 1
else tx_spec_data = crc16_rev[7:0]; // CRC 2
205,24 → 234,25
assign tx_valid = tx_valid_d;
 
always @(posedge clk)
tx_first_r <= #1 send_token | send_data;
tx_first_r <= send_token | send_data;
 
assign tx_first = (send_token | send_data) & ! tx_first_r;
 
// CRC Logic
always @(posedge clk)
send_data_r <= #1 send_data;
send_data_r <= send_data;
 
always @(posedge clk)
send_data_r2 <= #1 send_data_r;
send_data_r2 <= send_data_r;
 
assign crc16_clr = send_data & !send_data_r;
assign crc16_add = (send_data_r & !send_data_r2) | (rd_next & !crc_sel1);
 
assign crc16_add = !zero_length_r & (send_data_r & !send_data_r2) | (rd_next & !crc_sel1);
 
always @(posedge clk)
if(crc16_clr) crc16 <= #1 16'hffff;
if(crc16_clr) crc16 <= 16'hffff;
else
if(crc16_add) crc16 <= #1 crc16_next;
if(crc16_add) crc16 <= crc16_next;
 
 
usbf_crc16 u1(
255,11 → 285,15
// Transmit/Encode state machine
//
 
`ifdef USBF_ASYNC_RESET
always @(posedge clk or negedge rst)
if(!rst) state <= #1 IDLE;
else state <= #1 next_state;
`else
always @(posedge clk)
`endif
if(!rst) state <= IDLE;
else state <= next_state;
 
always @(state or send_data or tx_ready or tx_valid_r)
always @(state or send_data or tx_ready or tx_valid_r or send_zero_length_r)
begin
next_state = state; // Default don't change current state
tx_valid_d = 1'b0;
271,9 → 305,16
case(state) // synopsys full_case parallel_case
IDLE:
begin
if(send_data) // Send DATA packet
if(send_zero_length_r && send_data)
begin
tx_valid_d = 1'b1;
next_state = WAIT;
dsel = 1'b1;
end
else
if(send_data) // Send DATA packet
begin
tx_valid_d = 1'b1;
next_state = DATA;
dsel = 1'b1;
end
280,11 → 321,11
end
DATA:
begin
if(tx_ready & tx_valid_r)
if(tx_ready && tx_valid_r)
rd_next = 1'b1;
 
tx_valid_d = 1'b1;
if(!send_data & tx_ready & tx_valid_r)
if(!send_data && tx_ready && tx_valid_r)
begin
dsel = 1'b1;
crc_sel1 = 1'b1;
291,6 → 332,13
next_state = CRC1;
end
end
WAIT: // In case of early tx_ready ...
begin
crc_sel1 = 1'b1;
dsel = 1'b1;
tx_valid_d = 1'b1;
next_state = CRC1;
end
CRC1:
begin
dsel = 1'b1;
/trunk/rtl/verilog/usbf_mem_arb.v
12,8 → 12,9
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2000 Rudolf Usselmann ////
//// rudi@asics.ws ////
//// 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 ////
38,10 → 39,10
 
// CVS Log
//
// $Id: usbf_mem_arb.v,v 1.2 2001-11-04 12:22:45 rudi Exp $
// $Id: usbf_mem_arb.v,v 1.3 2003-10-17 02:36:57 rudi Exp $
//
// $Date: 2001-11-04 12:22:45 $
// $Revision: 1.2 $
// $Date: 2003-10-17 02:36:57 $
// $Revision: 1.3 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
48,6 → 49,11
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.2 2001/11/04 12:22:45 rudi
//
// - Fixed previous fix (brocke something else ...)
// - Majore Synthesis cleanup
//
// Revision 1.1 2001/08/03 05:30:09 rudi
//
//
119,8 → 125,7
reg [SSRAM_HADR:0] sram_adr;
reg [31:0] sram_dout;
reg sram_we;
reg mack;
reg mack_r;
wire mack;
wire mcyc;
reg wack_r;
 
149,7 → 154,7
else sram_adr = madr;
 
// Write Enable Path
always @(wsel or wack or wwe or wreq or mwe or mcyc)
always @(wsel or wwe or wreq or mwe or mcyc)
if(wsel) sram_we = wreq & wwe;
else sram_we = mwe & mcyc;
 
157,14 → 162,11
 
// -----------------------------------------
// IDMA specific
 
assign mdout = sram_din;
 
always @(mreq)
mack = mreq;
assign mack = mreq;
 
always @(posedge phy_clk)
mack_r <= #1 mack;
 
assign mcyc = mack; // Qualifier for writes
 
// -----------------------------------------
173,8 → 175,13
 
assign wack = wack_r & !mreq;
 
`ifdef USBF_ASYNC_RESET
always @(posedge phy_clk or negedge rst)
`else
always @(posedge phy_clk)
wack_r <= #1 wreq & !mreq & !wack;
`endif
if(!rst) wack_r <= 1'b0;
else wack_r <= wreq & !mreq & !wack;
 
endmodule
 
/trunk/rtl/verilog/usbf_top.v
11,8 → 11,9
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2000 Rudolf Usselmann ////
//// rudi@asics.ws ////
//// 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 ////
37,10 → 38,10
 
// CVS Log
//
// $Id: usbf_top.v,v 1.5 2001-11-04 12:22:45 rudi Exp $
// $Id: usbf_top.v,v 1.6 2003-10-17 02:36:57 rudi Exp $
//
// $Date: 2001-11-04 12:22:45 $
// $Revision: 1.5 $
// $Date: 2003-10-17 02:36:57 $
// $Revision: 1.6 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
47,6 → 48,11
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.5 2001/11/04 12:22:45 rudi
//
// - Fixed previous fix (brocke something else ...)
// - Majore Synthesis cleanup
//
// Revision 1.4 2001/11/03 03:26:23 rudi
//
// - Fixed several interrupt and error condition reporting bugs
230,27 → 236,53
wire rf_resume_req; // Resume Request From main CSR
 
reg susp_o;
reg [1:0] LineState_r; // Added to make a full synchronizer
reg [7:0] VStatus_r; // Added to make a full synchronizer
 
///////////////////////////////////////////////////////////////////
//
// Misc Logic
//
assign rst = ~rst_i;
assign rst = rst_i;
assign phy_rst_pad_o = rst_i;
assign resume_req = resume_req_i;
 
always @(posedge clk_i)
susp_o <= #1 usb_suspend;
susp_o <= usb_suspend;
 
always @(posedge phy_clk_pad_i) // First Stage Synchronizer
LineState_r <= LineState_pad_i;
 
always @(posedge phy_clk_pad_i) // First Stage Synchronizer
VStatus_r <= VStatus_pad_i;
 
///////////////////////////////////////////////////////////////////
//
// Module Instantiations
//
 
reg resume_req_r;
reg suspend_clr_wr;
wire suspend_clr;
 
always @(posedge clk_i)
suspend_clr_wr <= suspend_clr;
 
`ifdef USBF_ASYNC_RESET
always @(posedge clk_i or negedge rst)
`else
always @(posedge clk_i)
`endif
if(!rst) resume_req_r <= 1'b0;
else
if(suspend_clr_wr) resume_req_r <= 1'b0;
else
if(resume_req) resume_req_r <= 1'b1;
 
 
// UTMI Interface
usbf_utmi_if u0(
.phy_clk( phy_clk_pad_i ),
.wclk( clk_i ),
.rst( rst ),
.DataOut( DataOut_pad_o ),
.TxValid( TxValid_pad_o ),
262,7 → 294,7
.XcvSelect( XcvSelect_pad_o ),
.TermSel( TermSel_pad_o ),
.SuspendM( SuspendM_pad_o ),
.LineState( LineState_pad_i ),
.LineState( LineState_r ),
.OpMode( OpMode_pad_o ),
.usb_vbus( usb_vbus_pad_i ),
.rx_data( rx_data ),
278,7 → 310,8
.usb_reset( usb_reset ),
.usb_suspend( usb_suspend ),
.usb_attached( usb_attached ),
.resume_req( resume_req )
.resume_req( resume_req_r ),
.suspend_clr( suspend_clr )
);
 
// Protocol Layer
359,25 → 392,8
.wack( ma_ack )
);
 
 
// SSRAM
/*
 
The SSRAM is now external to the USB Function core
 
ssram u3( .clk( phy_clk ),
.rst( rst ),
.adr( sram_adr ),
.din( sram_din ),
.dout( sram_dout ),
.re( sram_re ),
.we( sram_we )
);
*/
 
// Register File
usbf_rf #(SSRAM_HADR)
u4( .clk( phy_clk_pad_i ),
usbf_rf u4( .clk( phy_clk_pad_i ),
.wclk( clk_i ),
.rst( rst ),
 
413,10 → 429,10
.dma_in_buf_sz1( dma_in_buf_sz1 ),
.dma_out_buf_avail( dma_out_buf_avail ),
.frm_nat( frm_nat ),
.utmi_vend_stat( VStatus_pad_i ),
.utmi_vend_stat( VStatus_r ),
.utmi_vend_ctrl( VControl_pad_o ),
.utmi_vend_wr( VControl_Load_pad_o ),
.line_stat( LineState_pad_i ),
.line_stat( LineState_r ),
.usb_attached( usb_attached ),
.mode_hs( mode_hs ),
.suspend( usb_suspend ),
/trunk/rtl/verilog/usbf_pd.v
11,8 → 11,9
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2000 Rudolf Usselmann ////
//// rudi@asics.ws ////
//// 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 ////
37,10 → 38,10
 
// CVS Log
//
// $Id: usbf_pd.v,v 1.6 2001-11-04 12:22:45 rudi Exp $
// $Id: usbf_pd.v,v 1.7 2003-10-17 02:36:57 rudi Exp $
//
// $Date: 2001-11-04 12:22:45 $
// $Revision: 1.6 $
// $Date: 2003-10-17 02:36:57 $
// $Revision: 1.7 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
180,10 → 181,10
 
reg seq_err; // State machine sequence error
 
reg pid_ack;
reg got_pid_ack;
 
reg token_valid_r1;
reg token_valid_str1, token_valid_str2;
reg token_valid_str1;
 
reg rx_active_r;
 
201,10 → 202,14
// PID Decoding Logic
assign pid_ld_en = pid_le_sm & rx_active & rx_valid;
 
`ifdef USBF_ASYNC_RESET
always @(posedge clk or negedge rst)
if(!rst) pid <= #1 8'hf0;
`else
always @(posedge clk)
`endif
if(!rst) pid <= 8'hf0;
else
if(pid_ld_en) pid <= #1 rx_data;
if(pid_ld_en) pid <= rx_data;
 
assign pid_cks_err = (pid[3:0] != ~pid[7:4]);
 
231,21 → 236,17
 
// Token Decoding LOGIC
always @(posedge clk)
if(token_le_1) token0 <= #1 rx_data;
if(token_le_1) token0 <= rx_data;
 
always @(posedge clk)
if(token_le_2) token1 <= #1 rx_data;
if(token_le_2) token1 <= rx_data;
 
always @(posedge clk)
token_valid_r1 <= #1 token_le_2;
token_valid_r1 <= token_le_2;
 
always @(posedge clk)
token_valid_str1 <= #1 token_valid_r1 | pid_ack;
token_valid_str1 <= token_valid_r1 | got_pid_ack;
 
always @(posedge clk)
token_valid_str2 <= #1 token_valid_str1;
 
//assign token_valid = token_valid_str1 | token_valid_str2;
assign token_valid = token_valid_str1;
 
// CRC 5 should perform the check in one cycle (flow through logic)
252,21 → 253,8
// 11 bits and crc5 input, 1 bit output
assign crc5_err = token_valid & (crc5_out2 != token_crc5);
 
/*
always @(token_valid)
if(token_valid)
begin
#1;
$display("Got valid token: addr %b ep: %b pid: %h",
token_fadr, token_endp, pid);
$display("rx crc: %b, calc crc: %b crc5_err: %b",
token_crc5, crc5_out2, crc5_err);
$display("frnat: %h", frame_no);
end
*/
usbf_crc5 u0(
.crc_in( 5'h1f ),
.crc_in( 5'h1f ),
.din( { token_fadr[0],
token_fadr[1],
token_fadr[2],
277,8 → 265,8
token_endp[0],
token_endp[1],
token_endp[2],
token_endp[3] } ),
.crc_out( crc5_out ) );
token_endp[3] } ),
.crc_out( crc5_out ) );
 
// Invert and reverse result bits
assign crc5_out2 = ~{crc5_out[0], crc5_out[1], crc5_out[2], crc5_out[3],
291,28 → 279,36
 
// Data receiving logic
// build a delay line and stop when we are about to get crc
`ifdef USBF_ASYNC_RESET
always @(posedge clk or negedge rst)
if(!rst) rxv1 <= #1 1'b0;
`else
always @(posedge clk)
`endif
if(!rst) rxv1 <= 1'b0;
else
if(data_valid_d) rxv1 <= #1 1'b1;
if(data_valid_d) rxv1 <= 1'b1;
else
if(data_done) rxv1 <= #1 1'b0;
if(data_done) rxv1 <= 1'b0;
 
`ifdef USBF_ASYNC_RESET
always @(posedge clk or negedge rst)
if(!rst) rxv2 <= #1 1'b0;
`else
always @(posedge clk)
`endif
if(!rst) rxv2 <= 1'b0;
else
if(rxv1 & data_valid_d) rxv2 <= #1 1'b1;
if(rxv1 && data_valid_d)rxv2 <= 1'b1;
else
if(data_done) rxv2 <= #1 1'b0;
if(data_done) rxv2 <= 1'b0;
 
always @(posedge clk)
data_valid0 <= #1 rxv2 & data_valid_d;
data_valid0 <= rxv2 & data_valid_d;
 
always @(posedge clk)
begin
if(data_valid_d) d0 <= #1 rx_data;
if(data_valid_d) d1 <= #1 d0;
if(data_valid_d) d2 <= #1 d1;
if(data_valid_d) d0 <= rx_data;
if(data_valid_d) d1 <= d0;
if(data_valid_d) d2 <= d1;
end
 
assign rx_data_st = d2;
323,14 → 319,14
// when data_done is asserted, crc16 reports status, and resets itself
// next cycle.
always @(posedge clk)
rx_active_r <= #1 rx_active;
rx_active_r <= rx_active;
 
assign crc16_clr = rx_active & !rx_active_r;
 
always @(posedge clk)
if(crc16_clr) crc16_sum <= #1 16'hffff;
if(crc16_clr) crc16_sum <= 16'hffff;
else
if(data_valid_d) crc16_sum <= #1 crc16_out;
if(data_valid_d) crc16_sum <= crc16_out;
 
usbf_crc16 u1(
.crc_in( crc16_sum ),
341,32 → 337,18
// Verify against polynomial
assign crc16_err = data_done & (crc16_sum != 16'h800d);
 
/*
always @(posedge clk)
if(data_valid_d)
begin
#1;
$display("RX data: %h (%t)", rx_data, $time);
end
 
always @(data_done)
if(data_done)
begin
#5;
$display("crc16_out: %b (%h) (%t)",
crc16_out, crc16_out, $time);
$display("crc16_err: %b", crc16_err);
 
end
*/
///////////////////////////////////////////////////////////////////
//
// Receive/Decode State machine
//
 
`ifdef USBF_ASYNC_RESET
always @(posedge clk or negedge rst)
if(!rst) state <= #1 IDLE;
else state <= #1 next_state;
`else
always @(posedge clk)
`endif
if(!rst) state <= IDLE;
else state <= next_state;
 
always @(state or rx_valid or rx_active or rx_err or pid_ACK or pid_TOKEN
or pid_DATA)
378,24 → 360,24
data_valid_d = 1'b0;
data_done = 1'b0;
seq_err = 1'b0;
pid_ack = 1'b0;
got_pid_ack = 1'b0;
case(state) // synopsys full_case parallel_case
IDLE:
begin
pid_le_sm = 1'b1;
if(rx_valid & rx_active) next_state = ACTIVE;
if(rx_valid && rx_active) next_state = ACTIVE;
end
ACTIVE:
begin
// Received a ACK from Host
if(pid_ACK & !rx_err)
if(pid_ACK && !rx_err)
begin
pid_ack = 1'b1;
got_pid_ack = 1'b1;
if(!rx_active) next_state = IDLE;
end
else
// Receiving a TOKEN
if(pid_TOKEN & rx_valid & rx_active & !rx_err)
if(pid_TOKEN && rx_valid && rx_active && !rx_err)
begin
token_le_1 = 1'b1;
next_state = TOKEN;
402,14 → 384,14
end
else
// Receiving DATA
if(pid_DATA & rx_valid & rx_active & !rx_err)
if(pid_DATA && rx_valid && rx_active && !rx_err)
begin
data_valid_d = 1'b1;
next_state = DATA;
end
else
if( !rx_active | rx_err |
(rx_valid & !(pid_TOKEN | pid_DATA)) ) // ERROR
if( !rx_active || rx_err ||
(rx_valid && !(pid_TOKEN || pid_DATA)) )
begin
seq_err = !rx_err;
if(!rx_active) next_state = IDLE;
417,14 → 399,13
end
TOKEN:
begin
if(rx_valid & rx_active & !rx_err)
if(rx_valid && rx_active && !rx_err)
begin
token_le_2 = 1'b1;
//if(!rx_active) next_state = IDLE;
next_state = IDLE;
end
else
if(!rx_active | rx_err) // ERROR
if(!rx_active || rx_err)
begin
seq_err = !rx_err;
if(!rx_active) next_state = IDLE;
432,8 → 413,8
end
DATA:
begin
if(rx_valid & rx_active & !rx_err) data_valid_d = 1'b1;
if(!rx_active | rx_err)
if(rx_valid && rx_active && !rx_err) data_valid_d = 1'b1;
if(!rx_active || rx_err)
begin
data_done = 1'b1;
if(!rx_active) next_state = IDLE;
/trunk/rtl/verilog/usbf_pe.v
11,8 → 11,9
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2000 Rudolf Usselmann ////
//// rudi@asics.ws ////
//// 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 ////
37,10 → 38,10
 
// CVS Log
//
// $Id: usbf_pe.v,v 1.7 2001-11-04 12:22:45 rudi Exp $
// $Id: usbf_pe.v,v 1.8 2003-10-17 02:36:57 rudi Exp $
//
// $Date: 2001-11-04 12:22:45 $
// $Revision: 1.7 $
// $Date: 2003-10-17 02:36:57 $
// $Revision: 1.8 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
47,6 → 48,11
//
// Change History:
// $Log: not supported by cvs2svn $
// 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
122,7 → 128,7
 
// Packet Assembler Interface
send_token, token_pid_sel,
data_pid_sel,
data_pid_sel, send_zero_length,
 
// IDMA Interface
rx_dma_en, tx_dma_en,
169,6 → 175,7
output send_token;
output [1:0] token_pid_sel;
output [1:0] data_pid_sel;
output send_zero_length;
 
// IDMA Interface
output rx_dma_en; // Allows the data to be stored
336,6 → 343,8
 
reg buf0_not_aloc, buf1_not_aloc;
 
reg send_zero_length;
 
///////////////////////////////////////////////////////////////////
//
// Misc Logic
370,30 → 379,30
 
// Buffers Not Available
always @(posedge clk)
buf0_na <= #1 buf0[31] | ( &buf0_adr );
buf0_na <= buf0[31] | ( &buf0_adr );
 
always @(posedge clk)
buf1_na <= #1 buf1[31] | ( &buf1_adr );
buf1_na <= buf1[31] | ( &buf1_adr );
 
// Buffer Not Allocated
always @(posedge clk)
buf0_not_aloc <= #1 &buf0_adr;
buf0_not_aloc <= &buf0_adr;
 
always @(posedge clk)
buf1_not_aloc <= #1 &buf1_adr;
buf1_not_aloc <= &buf1_adr;
 
always @(posedge clk)
match_r <= #1 match;
match_r <= match;
 
// No Such Endpoint Indicator
always @(posedge clk)
nse_err <= #1 token_valid & (pid_OUT | pid_IN | pid_SETUP) & !match;
nse_err <= token_valid & (pid_OUT | pid_IN | pid_SETUP) & !match;
 
always @(posedge clk)
send_token <= #1 send_token_d;
send_token <= send_token_d;
 
always @(posedge clk)
token_pid_sel <= #1 token_pid_sel_d;
token_pid_sel <= token_pid_sel_d;
 
///////////////////////////////////////////////////////////////////
//
404,22 → 413,22
 
always @(posedge clk) // tr/mf:ep/type:tr/type:last dpd
casex({tr_fr_d,csr[27:26],csr[25:24],uc_dpd}) // synopsys full_case parallel_case
8'b0?_01_01_??: next_dpid <= #1 2'b00; // ISO txfr. IN, 1 tr/mf
8'b0?_01_01_??: next_dpid <= 2'b00; // ISO txfr. IN, 1 tr/mf
 
8'b10_01_01_?0: next_dpid <= #1 2'b01; // ISO txfr. IN, 2 tr/mf
8'b10_01_01_?1: next_dpid <= #1 2'b00; // ISO txfr. IN, 2 tr/mf
8'b10_01_01_?0: next_dpid <= 2'b01; // ISO txfr. IN, 2 tr/mf
8'b10_01_01_?1: next_dpid <= 2'b00; // ISO txfr. IN, 2 tr/mf
 
8'b11_01_01_00: next_dpid <= #1 2'b01; // ISO txfr. IN, 3 tr/mf
8'b11_01_01_01: next_dpid <= #1 2'b10; // ISO txfr. IN, 3 tr/mf
8'b11_01_01_10: next_dpid <= #1 2'b00; // ISO txfr. IN, 3 tr/mf
8'b11_01_01_00: next_dpid <= 2'b01; // ISO txfr. IN, 3 tr/mf
8'b11_01_01_01: next_dpid <= 2'b10; // ISO txfr. IN, 3 tr/mf
8'b11_01_01_10: next_dpid <= 2'b00; // ISO txfr. IN, 3 tr/mf
 
8'b0?_10_01_??: next_dpid <= #1 2'b00; // ISO txfr. OUT, 1 tr/mf
8'b0?_10_01_??: next_dpid <= 2'b00; // ISO txfr. OUT, 1 tr/mf
 
8'b10_10_01_??: // ISO txfr. OUT, 2 tr/mf
begin // Resynchronize in case of PID error
case({pid_MDATA, pid_DATA1}) // synopsys full_case parallel_case
2'b10: next_dpid <= #1 2'b01;
2'b01: next_dpid <= #1 2'b00;
2'b10: next_dpid <= 2'b01;
2'b01: next_dpid <= 2'b00;
endcase
end
 
426,44 → 435,44
8'b11_10_01_00: // ISO txfr. OUT, 3 tr/mf
begin // Resynchronize in case of PID error
case({pid_MDATA, pid_DATA2}) // synopsys full_case parallel_case
2'b10: next_dpid <= #1 2'b01;
2'b01: next_dpid <= #1 2'b00;
2'b10: next_dpid <= 2'b01;
2'b01: next_dpid <= 2'b00;
endcase
end
8'b11_10_01_01: // ISO txfr. OUT, 3 tr/mf
begin // Resynchronize in case of PID error
case({pid_MDATA, pid_DATA2}) // synopsys full_case parallel_case
2'b10: next_dpid <= #1 2'b10;
2'b01: next_dpid <= #1 2'b00;
2'b10: next_dpid <= 2'b10;
2'b01: next_dpid <= 2'b00;
endcase
end
8'b11_10_01_10: // ISO txfr. OUT, 3 tr/mf
begin // Resynchronize in case of PID error
case({pid_MDATA, pid_DATA2}) // synopsys full_case parallel_case
2'b10: next_dpid <= #1 2'b01;
2'b01: next_dpid <= #1 2'b00;
2'b10: next_dpid <= 2'b01;
2'b01: next_dpid <= 2'b00;
endcase
end
 
8'b??_01_00_?0, // IN/OUT endpoint only
8'b??_10_00_?0: next_dpid <= #1 2'b01; // INT transfers
8'b??_10_00_?0: next_dpid <= 2'b01; // INT transfers
 
8'b??_01_00_?1, // IN/OUT endpoint only
8'b??_10_00_?1: next_dpid <= #1 2'b00; // INT transfers
8'b??_10_00_?1: next_dpid <= 2'b00; // INT transfers
 
8'b??_01_10_?0, // IN/OUT endpoint only
8'b??_10_10_?0: next_dpid <= #1 2'b01; // BULK transfers
8'b??_10_10_?0: next_dpid <= 2'b01; // BULK transfers
 
8'b??_01_10_?1, // IN/OUT endpoint only
8'b??_10_10_?1: next_dpid <= #1 2'b00; // BULK transfers
8'b??_10_10_?1: next_dpid <= 2'b00; // BULK transfers
 
8'b??_00_??_??: // CTRL Endpoint
casex({setup_token, in_op, out_op, uc_dpd}) // synopsys full_case parallel_case
5'b1_??_??: next_dpid <= #1 2'b11; // SETUP operation
5'b0_10_0?: next_dpid <= #1 2'b11; // IN operation
5'b0_10_1?: next_dpid <= #1 2'b01; // IN operation
5'b0_01_?0: next_dpid <= #1 2'b11; // OUT operation
5'b0_01_?1: next_dpid <= #1 2'b10; // OUT operation
5'b1_??_??: next_dpid <= 2'b11; // SETUP operation
5'b0_10_0?: next_dpid <= 2'b11; // IN operation
5'b0_10_1?: next_dpid <= 2'b01; // IN operation
5'b0_01_?0: next_dpid <= 2'b11; // OUT operation
5'b0_01_?1: next_dpid <= 2'b10; // OUT operation
endcase
 
endcase
481,42 → 490,42
 
always @(posedge clk) // tf/mf:ep/type:tr/type:last dpd
casex({tr_fr_d,csr[27:26],csr[25:24],uc_dpd}) // synopsys full_case parallel_case
8'b0?_01_01_??: this_dpid <= #1 2'b00; // ISO txfr. IN, 1 tr/mf
8'b0?_01_01_??: this_dpid <= 2'b00; // ISO txfr. IN, 1 tr/mf
 
8'b10_01_01_?0: this_dpid <= #1 2'b01; // ISO txfr. IN, 2 tr/mf
8'b10_01_01_?1: this_dpid <= #1 2'b00; // ISO txfr. IN, 2 tr/mf
8'b10_01_01_?0: this_dpid <= 2'b01; // ISO txfr. IN, 2 tr/mf
8'b10_01_01_?1: this_dpid <= 2'b00; // ISO txfr. IN, 2 tr/mf
 
8'b11_01_01_00: this_dpid <= #1 2'b10; // ISO txfr. IN, 3 tr/mf
8'b11_01_01_01: this_dpid <= #1 2'b01; // ISO txfr. IN, 3 tr/mf
8'b11_01_01_10: this_dpid <= #1 2'b00; // ISO txfr. IN, 3 tr/mf
8'b11_01_01_00: this_dpid <= 2'b10; // ISO txfr. IN, 3 tr/mf
8'b11_01_01_01: this_dpid <= 2'b01; // ISO txfr. IN, 3 tr/mf
8'b11_01_01_10: this_dpid <= 2'b00; // ISO txfr. IN, 3 tr/mf
 
8'b00_10_01_??: this_dpid <= #1 allow_pid; // ISO txfr. OUT, 0 tr/mf
8'b01_10_01_??: this_dpid <= #1 2'b00; // ISO txfr. OUT, 1 tr/mf
8'b00_10_01_??: this_dpid <= allow_pid; // ISO txfr. OUT, 0 tr/mf
8'b01_10_01_??: this_dpid <= 2'b00; // ISO txfr. OUT, 1 tr/mf
 
8'b10_10_01_?0: this_dpid <= #1 2'b11; // ISO txfr. OUT, 2 tr/mf
8'b10_10_01_?1: this_dpid <= #1 2'b01; // ISO txfr. OUT, 2 tr/mf
8'b10_10_01_?0: this_dpid <= 2'b11; // ISO txfr. OUT, 2 tr/mf
8'b10_10_01_?1: this_dpid <= 2'b01; // ISO txfr. OUT, 2 tr/mf
 
8'b11_10_01_00: this_dpid <= #1 2'b11; // ISO txfr. OUT, 3 tr/mf
8'b11_10_01_01: this_dpid <= #1 2'b11; // ISO txfr. OUT, 3 tr/mf
8'b11_10_01_10: this_dpid <= #1 2'b10; // ISO txfr. OUT, 3 tr/mf
8'b11_10_01_00: this_dpid <= 2'b11; // ISO txfr. OUT, 3 tr/mf
8'b11_10_01_01: this_dpid <= 2'b11; // ISO txfr. OUT, 3 tr/mf
8'b11_10_01_10: this_dpid <= 2'b10; // ISO txfr. OUT, 3 tr/mf
 
8'b??_01_00_?0, // IN/OUT endpoint only
8'b??_10_00_?0: this_dpid <= #1 2'b00; // INT transfers
8'b??_10_00_?0: this_dpid <= 2'b00; // INT transfers
8'b??_01_00_?1, // IN/OUT endpoint only
8'b??_10_00_?1: this_dpid <= #1 2'b01; // INT transfers
8'b??_10_00_?1: this_dpid <= 2'b01; // INT transfers
 
8'b??_01_10_?0, // IN/OUT endpoint only
8'b??_10_10_?0: this_dpid <= #1 2'b00; // BULK transfers
8'b??_10_10_?0: this_dpid <= 2'b00; // BULK transfers
8'b??_01_10_?1, // IN/OUT endpoint only
8'b??_10_10_?1: this_dpid <= #1 2'b01; // BULK transfers
8'b??_10_10_?1: this_dpid <= 2'b01; // BULK transfers
 
8'b??_00_??_??: // CTRL Endpoint
casex({setup_token,in_op, out_op, uc_dpd}) // synopsys full_case parallel_case
5'b1_??_??: this_dpid <= #1 2'b00; // SETUP operation
5'b0_10_0?: this_dpid <= #1 2'b00; // IN operation
5'b0_10_1?: this_dpid <= #1 2'b01; // IN operation
5'b0_01_?0: this_dpid <= #1 2'b00; // OUT operation
5'b0_01_?1: this_dpid <= #1 2'b01; // OUT operation
5'b1_??_??: this_dpid <= 2'b00; // SETUP operation
5'b0_10_0?: this_dpid <= 2'b00; // IN operation
5'b0_10_1?: this_dpid <= 2'b01; // IN operation
5'b0_01_?0: this_dpid <= 2'b00; // OUT operation
5'b0_01_?1: this_dpid <= 2'b01; // OUT operation
endcase
endcase
 
525,7 → 534,7
 
// Verify PID for incoming data packets
always @(posedge clk)
pid_seq_err <= #1 !( (this_dpid==2'b00 & pid_DATA0) |
pid_seq_err <= !( (this_dpid==2'b00 & pid_DATA0) |
(this_dpid==2'b01 & pid_DATA1) |
(this_dpid==2'b10 & pid_DATA2) |
(this_dpid==2'b11 & pid_MDATA) );
540,26 → 549,38
// buffer1 is used for IN (outgoing) data packets
 
// Keep track of last token for control endpoints
`ifdef USBF_ASYNC_RESET
always @(posedge clk or negedge rst)
if(!rst) in_token <= #1 1'b0;
`else
always @(posedge clk)
`endif
if(!rst) in_token <= 1'b0;
else
if(pid_IN) in_token <= #1 1'b1;
if(pid_IN) in_token <= 1'b1;
else
if(pid_OUT | pid_SETUP) in_token <= #1 1'b0;
if(pid_OUT || pid_SETUP) in_token <= 1'b0;
 
`ifdef USBF_ASYNC_RESET
always @(posedge clk or negedge rst)
if(!rst) out_token <= #1 1'b0;
`else
always @(posedge clk)
`endif
if(!rst) out_token <= 1'b0;
else
if(pid_OUT | pid_SETUP) out_token <= #1 1'b1;
if(pid_OUT || pid_SETUP) out_token <= 1'b1;
else
if(pid_IN) out_token <= #1 1'b0;
if(pid_IN) out_token <= 1'b0;
 
`ifdef USBF_ASYNC_RESET
always @(posedge clk or negedge rst)
if(!rst) setup_token <= #1 1'b0;
`else
always @(posedge clk)
`endif
if(!rst) setup_token <= 1'b0;
else
if(pid_SETUP) setup_token <= #1 1'b1;
if(pid_SETUP) setup_token <= 1'b1;
else
if(pid_OUT | pid_IN) setup_token <= #1 1'b0;
if(pid_OUT || pid_IN) setup_token <= 1'b0;
 
// Indicates if we are performing an IN operation
assign in_op = IN_ep | (CTRL_ep & in_token);
572,7 → 593,7
 
// Select Address for IDMA
always @(posedge clk)
adr <= #1 buf_sel ? buf1_adr : buf0_adr;
adr <= buf_sel ? buf1_adr : buf0_adr;
 
// Size from Buffer
assign buf_size = buf_sel ? buf1_sz : buf0_sz;
589,67 → 610,67
// Indicates that there is not enough space in the buffer for one
// more max_pl_sz packet
always @(posedge clk)
buffer_full <= #1 new_size < {3'h0, max_pl_sz};
buffer_full <= new_size < {3'h0, max_pl_sz};
 
// Buffer Empty (only for IN endpoints)
// Indicates that there are zero bytes left in the buffer
always @(posedge clk)
buffer_empty <= #1 (new_size == 14'h0);
buffer_empty <= (new_size == 14'h0);
 
// Joint buffer full/empty flag This is the "USED" flag
always @(posedge clk)
buffer_done <= #1 in_op ? buffer_empty : buffer_full;
buffer_done <= in_op ? buffer_empty : buffer_full;
 
//No More buffer space at all (For high speed out - issue NYET)
// No More buffer space at all (For high speed out - issue NYET)
assign no_buf0_dma = dma_en &
((IN_ep & !dma_in_buf_sz1) | (OUT_ep & !dma_out_buf_avail));
 
always @(posedge clk)
buf0_st_max <= #1 (buf0_sz < {3'h0, max_pl_sz});
buf0_st_max <= (buf0_sz < {3'h0, max_pl_sz});
 
always @(posedge clk)
buf1_st_max <= #1 (buf1_sz < {3'h0, max_pl_sz});
buf1_st_max <= (buf1_sz < {3'h0, max_pl_sz});
 
always @(posedge clk)
no_bufs0 <= #1 buf0_na | no_buf0_dma |
no_bufs0 <= buf0_na | no_buf0_dma |
(buf_sel ? buf0_st_max : (buffer_full & !dma_en));
 
always @(posedge clk)
no_bufs1 <= #1 buf1_na | (buf_sel ? buffer_full : buf1_st_max);
no_bufs1 <= buf1_na | (buf_sel ? buffer_full : buf1_st_max);
 
assign no_bufs = no_bufs0 & no_bufs1;
 
// New Size (to be written to register file)
always @(posedge clk)
new_sizeb <= #1 (out_op & dma_en) ? max_pl_sz : (in_op ? size_next : sizu_c);
new_sizeb <= (out_op && dma_en) ? max_pl_sz : (in_op ? size_next : sizu_c);
 
always @(posedge clk)
new_size <= #1 buf_size - new_sizeb;
new_size <= buf_size - new_sizeb;
 
 
// New Buffer Address (to be written to register file)
always @(posedge clk)
adr_r <= #1 adr;
adr_r <= adr;
 
always @(posedge clk)
size_next_r <= #1 size_next;
size_next_r <= size_next;
 
assign new_adr = adr_r[SSRAM_HADR + 2:0] +
((out_op & dma_en) ? {{SSRAM_HADR + 2-10{1'b0}}, max_pl_sz[10:0]} :
((out_op && dma_en) ? {{SSRAM_HADR + 2-10{1'b0}}, max_pl_sz[10:0]} :
(in_op ? {{SSRAM_HADR + 2-13{1'b0}}, size_next_r[13:0] } :
{ {SSRAM_HADR + 2-10{1'b0}}, sizu_c[10:0]}));
 
// Buffer Overflow
always @(posedge clk)
buffer_overflow <= #1 ( {3'h0, sizu_c} > buf_size) & rx_data_valid;
buffer_overflow <= ( {3'h0, sizu_c} > buf_size) & rx_data_valid;
 
 
// OUT packet smaller than MAX_PL_SZ in DMA operation
always @(posedge clk)
out_to_small_r <= #1 uc_stat_set_d & out_op & dma_en & (sizu_c != max_pl_sz);
out_to_small_r <= uc_stat_set_d & out_op & dma_en & (sizu_c != max_pl_sz);
 
always @(posedge clk)
out_to_small <= #1 out_to_small_r;
out_to_small <= out_to_small_r;
 
///////////////////////////////////////////////////////////////////
//
658,10 → 679,10
//
 
always @(posedge clk)
to_small <= #1 !sml_ok & (sizu_c < max_pl_sz);
to_small <= !sml_ok & (sizu_c < max_pl_sz);
 
always @(posedge clk)
to_large <= #1 !lrg_ok & (sizu_c > max_pl_sz);
to_large <= !lrg_ok & (sizu_c > max_pl_sz);
 
///////////////////////////////////////////////////////////////////
//
671,36 → 692,36
assign next_bsel = dma_en ? 2'h0 : buffer_done ? uc_bsel + 2'h1 : uc_bsel; // FIX_ME
 
always @(posedge clk)
idin[31:17] <= #1 out_to_small_r ? {4'h0,sizu_c} : {buffer_done,new_size};
idin[31:17] <= out_to_small_r ? {4'h0,sizu_c} : {buffer_done,new_size};
 
always @(posedge clk)
idin[SSRAM_HADR + 2:4] <= #1 out_to_small_r ? buf0_adr[SSRAM_HADR + 2:4] :
idin[SSRAM_HADR + 2:4] <= out_to_small_r ? buf0_adr[SSRAM_HADR + 2:4] :
new_adr[SSRAM_HADR + 2:4];
 
always @(posedge clk)
if(buf_set_d) idin[3:0] <= #1 new_adr[3:0];
if(buf_set_d) idin[3:0] <= new_adr[3:0];
else
if(out_to_small_r) idin[3:0] <= #1 buf0_adr[3:0];
else idin[3:0] <= #1 {next_dpid, next_bsel};
if(out_to_small_r) idin[3:0] <= buf0_adr[3:0];
else idin[3:0] <= {next_dpid, next_bsel};
 
always @(posedge clk)
buf0_set <= #1 !buf_sel & buf_set_d;
buf0_set <= !buf_sel & buf_set_d;
 
always @(posedge clk)
buf1_set <= #1 buf_sel & buf_set_d;
buf1_set <= buf_sel & buf_set_d;
 
always @(posedge clk)
uc_bsel_set <= #1 uc_stat_set_d;
uc_bsel_set <= uc_stat_set_d;
 
always @(posedge clk)
uc_dpd_set <= #1 uc_stat_set_d;
uc_dpd_set <= uc_stat_set_d;
 
always @(posedge clk)
buf0_rl <= #1 buf0_rl_d;
buf0_rl <= buf0_rl_d;
 
// Abort signal
always @(posedge clk)
abort <= #1 buffer_overflow | (match & (state != IDLE) ) | (match_r & to_large);
abort <= buffer_overflow | (match & (state != IDLE) ) | (match_r & to_large);
 
///////////////////////////////////////////////////////////////////
//
714,14 → 735,14
// rx_ack_to_clr, clears the timer
 
always @(posedge clk)
rx_ack_to_clr <= #1 tx_valid | rx_ack_to_clr_d;
rx_ack_to_clr <= tx_valid | rx_ack_to_clr_d;
 
always @(posedge clk)
if(rx_ack_to_clr) rx_ack_to_cnt <= #1 8'h0;
else rx_ack_to_cnt <= #1 rx_ack_to_cnt + 8'h1;
if(rx_ack_to_clr) rx_ack_to_cnt <= 8'h0;
else rx_ack_to_cnt <= rx_ack_to_cnt + 8'h1;
 
always @(posedge clk)
rx_ack_to <= #1 (rx_ack_to_cnt == rx_ack_to_val);
rx_ack_to <= (rx_ack_to_cnt == rx_ack_to_val);
 
assign rx_ack_to_val = mode_hs ? `USBF_RX_ACK_TO_VAL_HS : `USBF_RX_ACK_TO_VAL_FS;
 
734,11 → 755,11
assign tx_data_to_clr = rx_active;
 
always @(posedge clk)
if(tx_data_to_clr) tx_data_to_cnt <= #1 8'h0;
else tx_data_to_cnt <= #1 tx_data_to_cnt + 8'h1;
if(tx_data_to_clr) tx_data_to_cnt <= 8'h0;
else tx_data_to_cnt <= tx_data_to_cnt + 8'h1;
 
always @(posedge clk)
tx_data_to <= #1 (tx_data_to_cnt == tx_data_to_val);
tx_data_to <= (tx_data_to_cnt == tx_data_to_val);
 
assign tx_data_to_val = mode_hs ? `USBF_TX_DATA_TO_VAL_HS : `USBF_TX_DATA_TO_VAL_FS;
 
752,31 → 773,30
assign int_buf0_set = buf_sel & buffer_done & int_set_en & !buf0_not_aloc;
 
always @(posedge clk)
pid_OUT_r <= #1 pid_OUT;
pid_OUT_r <= pid_OUT;
 
always @(posedge clk)
pid_IN_r <= #1 pid_IN;
pid_IN_r <= pid_IN;
 
always @(posedge clk)
pid_PING_r <= #1 pid_PING;
pid_PING_r <= pid_PING;
 
always @(posedge clk)
pid_SETUP_r <= #1 pid_SETUP;
pid_SETUP_r <= pid_SETUP;
 
always @(posedge clk)
int_upid_set <= #1 match_r & !pid_SOF & (
int_upid_set <= match_r & !pid_SOF & (
( OUT_ep & !(pid_OUT_r | pid_PING_r)) |
( IN_ep & !pid_IN_r) |
(CTRL_ep & !(pid_IN_r | pid_OUT_r | pid_PING_r | pid_SETUP_r))
);
 
 
assign int_to_set = ((state == IN2) & rx_ack_to) | ((state == OUT) & tx_data_to);
 
assign int_crc16_set = rx_data_done & crc16_err;
 
always @(posedge clk)
int_seqerr_set <= #1 int_seqerr_set_d;
int_seqerr_set <= int_seqerr_set_d;
 
///////////////////////////////////////////////////////////////////
//
783,11 → 803,15
// Main Protocol State Machine
//
 
`ifdef USBF_ASYNC_RESET
always @(posedge clk or negedge rst)
if(!rst) state <= #1 IDLE;
`else
always @(posedge clk)
`endif
if(!rst) state <= IDLE;
else
if(match) state <= #1 IDLE;
else state <= #1 next_state;
if(match) state <= IDLE;
else state <= next_state;
 
always @(state or ep_stall or buf0_na or buf1_na or
pid_seq_err or idma_done or token_valid or pid_ACK or rx_data_done or
794,7 → 818,7
tx_data_to or crc16_err or ep_disabled or no_bufs or mode_hs
or dma_en or rx_ack_to or pid_PING or txfr_iso or to_small or to_large or
CTRL_ep or pid_IN or pid_OUT or IN_ep or OUT_ep or pid_SETUP or pid_SOF
or match_r or abort or buffer_done or no_buf0_dma)
or match_r or abort or buffer_done or no_buf0_dma or max_pl_sz)
begin
next_state = state;
token_pid_sel_d = ACK;
807,6 → 831,7
int_set_en = 1'b0;
rx_ack_to_clr_d = 1'b1;
int_seqerr_set_d = 1'b0;
send_zero_length = 1'b0;
 
case(state) // synopsys full_case parallel_case
IDLE:
816,7 → 841,7
$display("PE: Entered state IDLE (%t)", $time);
`endif
`ifdef USBF_DEBUG
if(rst & match_r & !ep_disabled & !pid_SOF)
if(rst && match_r && !ep_disabled && !pid_SOF)
begin
if(match_r === 1'bx) $display("ERROR: IDLE: match_r is unknown. (%t)", $time);
if(ep_disabled === 1'bx)$display("ERROR: IDLE: ep_disabled is unknown. (%t)", $time);
837,7 → 862,7
`endif
// synopsys translate_on
 
if(match_r & !ep_disabled & !pid_SOF)
if(match_r && !ep_disabled && !pid_SOF)
begin
if(ep_stall) // Halt Forced send STALL
begin
846,9 → 871,9
next_state = TOKEN;
end
else
if( (buf0_na & buf1_na) | no_buf0_dma |
(CTRL_ep & pid_IN & buf1_na) |
(CTRL_ep & pid_OUT & buf0_na)
if( (buf0_na && buf1_na) || no_buf0_dma ||
(CTRL_ep && pid_IN && buf1_na) ||
(CTRL_ep && pid_OUT && buf0_na)
)
begin // No buffers send NAK
token_pid_sel_d = NACK;
856,7 → 881,7
next_state = TOKEN;
end
else
if(pid_PING & mode_hs)
if(pid_PING && mode_hs)
begin
token_pid_sel_d = ACK;
send_token_d = 1'b1;
863,13 → 888,14
next_state = TOKEN;
end
else
if(IN_ep | (CTRL_ep & pid_IN))
if(IN_ep || (CTRL_ep && pid_IN))
begin
if(max_pl_sz == 11'h0) send_zero_length = 1'b1;
tx_dma_en = 1'b1;
next_state = IN;
end
else
if(OUT_ep | (CTRL_ep & (pid_OUT | pid_SETUP)))
if(OUT_ep || (CTRL_ep && (pid_OUT || pid_SETUP)))
begin
rx_dma_en = 1'b1;
next_state = OUT;
922,7 → 948,7
// Wait for ACK from HOST or Timeout
if(rx_ack_to) next_state = IDLE;
else
if(token_valid & pid_ACK)
if(token_valid && pid_ACK)
begin
next_state = UPDATE;
end
943,7 → 969,7
if(pid_seq_err === 1'bx)$display("ERROR: OUT: rx_data_done is unknown. (%t)", $time);
`endif
// synopsys translate_on
if(tx_data_to | crc16_err | abort )
if(tx_data_to || crc16_err || abort )
next_state = IDLE;
else
if(rx_data_done)
988,7 → 1014,7
// synopsys translate_on
if(abort) next_state = IDLE;
else
if(to_small | to_large)
if(to_small || to_large)
begin
token_pid_sel_d = NACK;
next_state = IDLE;
1002,7 → 1028,7
end
else
begin
if(mode_hs & no_bufs) token_pid_sel_d = NYET;
if(mode_hs && no_bufs) token_pid_sel_d = NYET;
else token_pid_sel_d = ACK;
send_token_d = 1'b1;
next_state = UPDATE;
1032,7 → 1058,7
// Interrupts
int_set_en = 1'b1;
// Buffer (used, size, adr) set or reload
if(buffer_done & dma_en)
if(buffer_done && dma_en)
begin
buf0_rl_d = 1'b1;
end
/trunk/rtl/verilog/usbf_ep_rf_dummy.v
13,8 → 13,9
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2000 Rudolf Usselmann ////
//// rudi@asics.ws ////
//// 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 ////
39,10 → 40,10
 
// CVS Log
//
// $Id: usbf_ep_rf_dummy.v,v 1.1 2001-08-03 05:30:09 rudi Exp $
// $Id: usbf_ep_rf_dummy.v,v 1.2 2003-10-17 02:36:57 rudi Exp $
//
// $Date: 2001-08-03 05:30:09 $
// $Revision: 1.1 $
// $Date: 2003-10-17 02:36:57 $
// $Revision: 1.2 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
49,6 → 50,11
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.1 2001/08/03 05:30:09 rudi
//
//
// 1) Reorganized directory structure
//
// Revision 1.1 2001/03/31 12:45:13 rudi
//
// This is the endpoint register file for non existing endpoints. It will be used for
122,16 → 128,16
// Internal Access
//
 
assign dout = 0;
assign inta = 0;
assign intb = 0;
assign dma_req = 0;
assign ep_match = 0;
assign dout = 32'h0;
assign inta = 1'b0;
assign intb = 1'b0;
assign dma_req = 1'b0;
assign ep_match = 1'b0;
assign csr = 32'h0;
assign buf0 = 32'hffff_ffff;
assign buf1 = 32'hffff_ffff;
assign dma_in_buf_sz1 = 0;
assign dma_out_buf_avail = 0;
assign dma_in_buf_sz1 = 1'b0;
assign dma_out_buf_avail = 1'b0;
 
endmodule
 
/trunk/rtl/verilog/usbf_rf.v
12,8 → 12,9
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2000 Rudolf Usselmann ////
//// rudi@asics.ws ////
//// 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 ////
38,10 → 39,10
 
// CVS Log
//
// $Id: usbf_rf.v,v 1.5 2001-11-04 12:22:45 rudi Exp $
// $Id: usbf_rf.v,v 1.6 2003-10-17 02:36:57 rudi Exp $
//
// $Date: 2001-11-04 12:22:45 $
// $Revision: 1.5 $
// $Date: 2003-10-17 02:36:57 $
// $Revision: 1.6 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
48,6 → 49,11
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.5 2001/11/04 12:22:45 rudi
//
// - Fixed previous fix (brocke something else ...)
// - Majore Synthesis cleanup
//
// Revision 1.4 2001/11/03 03:26:23 rudi
//
// - Fixed several interrupt and error condition reporting bugs
121,8 → 127,6
crc5_err, rx_err, rf_resume_req
);
 
parameter SSRAM_HADR = 14;
 
input clk, wclk, rst;
input [6:0] adr;
input re;
252,7 → 256,7
reg [6:0] funct_adr;
reg [8:0] intb_msk, inta_msk;
 
reg match_r1, match_r2;
reg match_r1;
reg [31:0] csr;
reg [31:0] buf0;
reg [31:0] buf1;
286,7 → 290,7
//
 
// Main CSR Alias
assign main_csr = {28'h0, line_stat, usb_attached, mode_hs, suspend};
assign main_csr = {27'h0, line_stat, usb_attached, mode_hs, suspend};
 
// Read Registers Logic
always @(adr or main_csr or funct_adr or inta_msk or intb_msk or int_srca
302,71 → 306,100
 
// Interrupt Source Read Register
always @(posedge wclk)
int_src_re <= #1 adr[6:0] == 7'h3 & re;
int_src_re <= adr[6:0] == 7'h3 & re;
 
// UTMI Vendor Control Stuff
always @(posedge wclk)
utmi_vend_stat_r <= #1 utmi_vend_stat;
utmi_vend_stat_r <= utmi_vend_stat;
 
reg utmi_vend_wr_r;
`ifdef USBF_ASYNC_RESET
always @(posedge wclk or negedge rst)
`else
always @(posedge wclk)
utmi_vend_wr <= #1 adr[6:0] == 7'h5 & we;
`endif
if(!rst) utmi_vend_wr_r <= 1'b0;
else
if(adr[6:0] == 7'h5 && we) utmi_vend_wr_r <= 1'b1;
else
if(utmi_vend_wr) utmi_vend_wr_r <= 1'b0;
 
always @(posedge clk) // Second Stage sync
utmi_vend_wr <= utmi_vend_wr_r;
 
 
reg [3:0] utmi_vend_ctrl_r;
always @(posedge wclk)
if(adr[6:0] == 7'h5 & we) utmi_vend_ctrl <= #1 din[3:0];
if(adr[6:0] == 7'h5 && we) utmi_vend_ctrl_r <= din[3:0];
 
always @(posedge clk) // Second Stage sync
utmi_vend_ctrl <= utmi_vend_ctrl_r;
 
// Resume Request
`ifdef USBF_ASYNC_RESET
always @(posedge wclk or negedge rst)
if(!rst) rf_resume_req_r <= #1 1'b0;
`else
always @(posedge wclk)
`endif
if(!rst) rf_resume_req_r <= 1'b0;
else
if(adr[6:0] == 7'h0 & we) rf_resume_req_r <= #1 din[5];
if(adr[6:0] == 7'h0 && we) rf_resume_req_r <= din[5];
else
if(rf_resume_req) rf_resume_req_r <= #1 1'b0;
if(rf_resume_req) rf_resume_req_r <= 1'b0;
 
always @(posedge clk)
rf_resume_req <= #1 rf_resume_req_r;
always @(posedge clk) // Second Stage sync
rf_resume_req <= rf_resume_req_r;
 
// Function Address Register
`ifdef USBF_ASYNC_RESET
always @(posedge wclk or negedge rst)
if(!rst) funct_adr <= #1 7'h0;
`else
always @(posedge wclk)
`endif
if(!rst) funct_adr <= 7'h0;
else
if(adr[6:0] == 7'h1 & we) funct_adr <= #1 din[6:0];
if(adr[6:0] == 7'h1 && we) funct_adr <= din[6:0];
 
// Interrup Mask Register
`ifdef USBF_ASYNC_RESET
always @(posedge wclk or negedge rst)
`else
always @(posedge wclk)
`endif
if(!rst)
begin
inta_msk <= #1 9'h0;
intb_msk <= #1 9'h0;
inta_msk <= 9'h0;
intb_msk <= 9'h0;
end
else
if(adr[6:0] == 7'h2 & we)
if(adr[6:0] == 7'h2 && we)
begin
intb_msk <= #1 din[24:16];
inta_msk <= #1 din[08:00];
intb_msk <= din[24:16];
inta_msk <= din[08:00];
end
 
always @(posedge wclk)
case(adr[6:2]) // synopsys full_case parallel_case
5'h00: dout <= #1 dtmp; // Addr: 0h
5'h01: dout <= #1 dtmp;
5'h02: dout <= #1 32'h0;
5'h03: dout <= #1 32'h0;
5'h04: dout <= #1 ep0_dout;
5'h05: dout <= #1 ep1_dout;
5'h06: dout <= #1 ep2_dout;
5'h07: dout <= #1 ep3_dout;
5'h08: dout <= #1 ep4_dout;
5'h09: dout <= #1 ep5_dout;
5'h10: dout <= #1 ep6_dout;
5'h11: dout <= #1 ep7_dout;
5'h12: dout <= #1 ep8_dout;
5'h13: dout <= #1 ep9_dout;
5'h14: dout <= #1 ep10_dout;
5'h15: dout <= #1 ep11_dout;
5'h16: dout <= #1 ep12_dout;
5'h17: dout <= #1 ep13_dout;
5'h18: dout <= #1 ep14_dout;
5'h19: dout <= #1 ep15_dout;
5'h00: dout <= dtmp; // Addr: 0h
5'h01: dout <= dtmp;
5'h02: dout <= 32'h0;
5'h03: dout <= 32'h0;
5'h04: dout <= ep0_dout;
5'h05: dout <= ep1_dout;
5'h06: dout <= ep2_dout;
5'h07: dout <= ep3_dout;
5'h08: dout <= ep4_dout;
5'h09: dout <= ep5_dout;
5'h0a: dout <= ep6_dout;
5'h0b: dout <= ep7_dout;
5'h0c: dout <= ep8_dout;
5'h0d: dout <= ep9_dout;
5'h0e: dout <= ep10_dout;
5'h0f: dout <= ep11_dout;
5'h10: dout <= ep12_dout;
5'h11: dout <= ep13_dout;
5'h12: dout <= ep14_dout;
5'h13: dout <= ep15_dout;
endcase
 
assign ep0_re = (adr[6:2] == 5'h04) & re;
375,16 → 408,16
assign ep3_re = (adr[6:2] == 5'h07) & re;
assign ep4_re = (adr[6:2] == 5'h08) & re;
assign ep5_re = (adr[6:2] == 5'h09) & re;
assign ep6_re = (adr[6:2] == 5'h10) & re;
assign ep7_re = (adr[6:2] == 5'h11) & re;
assign ep8_re = (adr[6:2] == 5'h12) & re;
assign ep9_re = (adr[6:2] == 5'h13) & re;
assign ep10_re = (adr[6:2] == 5'h14) & re;
assign ep11_re = (adr[6:2] == 5'h15) & re;
assign ep12_re = (adr[6:2] == 5'h16) & re;
assign ep13_re = (adr[6:2] == 5'h17) & re;
assign ep14_re = (adr[6:2] == 5'h18) & re;
assign ep15_re = (adr[6:2] == 5'h19) & re;
assign ep6_re = (adr[6:2] == 5'h0a) & re;
assign ep7_re = (adr[6:2] == 5'h0b) & re;
assign ep8_re = (adr[6:2] == 5'h0c) & re;
assign ep9_re = (adr[6:2] == 5'h0d) & re;
assign ep10_re = (adr[6:2] == 5'h0e) & re;
assign ep11_re = (adr[6:2] == 5'h0f) & re;
assign ep12_re = (adr[6:2] == 5'h10) & re;
assign ep13_re = (adr[6:2] == 5'h11) & re;
assign ep14_re = (adr[6:2] == 5'h12) & re;
assign ep15_re = (adr[6:2] == 5'h13) & re;
 
assign ep0_we = (adr[6:2] == 5'h04) & we;
assign ep1_we = (adr[6:2] == 5'h05) & we;
392,16 → 425,16
assign ep3_we = (adr[6:2] == 5'h07) & we;
assign ep4_we = (adr[6:2] == 5'h08) & we;
assign ep5_we = (adr[6:2] == 5'h09) & we;
assign ep6_we = (adr[6:2] == 5'h10) & we;
assign ep7_we = (adr[6:2] == 5'h11) & we;
assign ep8_we = (adr[6:2] == 5'h12) & we;
assign ep9_we = (adr[6:2] == 5'h13) & we;
assign ep10_we = (adr[6:2] == 5'h14) & we;
assign ep11_we = (adr[6:2] == 5'h15) & we;
assign ep12_we = (adr[6:2] == 5'h16) & we;
assign ep13_we = (adr[6:2] == 5'h17) & we;
assign ep14_we = (adr[6:2] == 5'h18) & we;
assign ep15_we = (adr[6:2] == 5'h19) & we;
assign ep6_we = (adr[6:2] == 5'h0a) & we;
assign ep7_we = (adr[6:2] == 5'h0b) & we;
assign ep8_we = (adr[6:2] == 5'h0c) & we;
assign ep9_we = (adr[6:2] == 5'h0d) & we;
assign ep10_we = (adr[6:2] == 5'h0e) & we;
assign ep11_we = (adr[6:2] == 5'h0f) & we;
assign ep12_we = (adr[6:2] == 5'h10) & we;
assign ep13_we = (adr[6:2] == 5'h11) & we;
assign ep14_we = (adr[6:2] == 5'h12) & we;
assign ep15_we = (adr[6:2] == 5'h13) & we;
 
///////////////////////////////////////////////////////////////////
//
411,178 → 444,175
assign match = match_r1;
 
always @(posedge clk)
match_r2 <= #1 match_r1;
 
always @(posedge clk)
match_r1 <= #1 ep0_match | ep1_match | ep2_match | ep3_match |
match_r1 <= ep0_match | ep1_match | ep2_match | ep3_match |
ep4_match | ep5_match | ep6_match | ep7_match |
ep8_match | ep9_match | ep10_match | ep11_match |
ep12_match | ep13_match | ep14_match | ep15_match;
 
always @(posedge clk)
if(ep0_match) csr <= #1 ep0_csr;
if(ep0_match) csr <= ep0_csr;
else
if(ep1_match) csr <= #1 ep1_csr;
if(ep1_match) csr <= ep1_csr;
else
if(ep2_match) csr <= #1 ep2_csr;
if(ep2_match) csr <= ep2_csr;
else
if(ep3_match) csr <= #1 ep3_csr;
if(ep3_match) csr <= ep3_csr;
else
if(ep4_match) csr <= #1 ep4_csr;
if(ep4_match) csr <= ep4_csr;
else
if(ep5_match) csr <= #1 ep5_csr;
if(ep5_match) csr <= ep5_csr;
else
if(ep6_match) csr <= #1 ep6_csr;
if(ep6_match) csr <= ep6_csr;
else
if(ep7_match) csr <= #1 ep7_csr;
if(ep7_match) csr <= ep7_csr;
else
if(ep8_match) csr <= #1 ep8_csr;
if(ep8_match) csr <= ep8_csr;
else
if(ep9_match) csr <= #1 ep9_csr;
if(ep9_match) csr <= ep9_csr;
else
if(ep10_match) csr <= #1 ep10_csr;
if(ep10_match) csr <= ep10_csr;
else
if(ep11_match) csr <= #1 ep11_csr;
if(ep11_match) csr <= ep11_csr;
else
if(ep12_match) csr <= #1 ep12_csr;
if(ep12_match) csr <= ep12_csr;
else
if(ep13_match) csr <= #1 ep13_csr;
if(ep13_match) csr <= ep13_csr;
else
if(ep14_match) csr <= #1 ep14_csr;
if(ep14_match) csr <= ep14_csr;
else
if(ep15_match) csr <= #1 ep15_csr;
if(ep15_match) csr <= ep15_csr;
 
always @(posedge clk)
if(ep0_match) buf0 <= #1 ep0_buf0;
if(ep0_match) buf0 <= ep0_buf0;
else
if(ep1_match) buf0 <= #1 ep1_buf0;
if(ep1_match) buf0 <= ep1_buf0;
else
if(ep2_match) buf0 <= #1 ep2_buf0;
if(ep2_match) buf0 <= ep2_buf0;
else
if(ep3_match) buf0 <= #1 ep3_buf0;
if(ep3_match) buf0 <= ep3_buf0;
else
if(ep4_match) buf0 <= #1 ep4_buf0;
if(ep4_match) buf0 <= ep4_buf0;
else
if(ep5_match) buf0 <= #1 ep5_buf0;
if(ep5_match) buf0 <= ep5_buf0;
else
if(ep6_match) buf0 <= #1 ep6_buf0;
if(ep6_match) buf0 <= ep6_buf0;
else
if(ep7_match) buf0 <= #1 ep7_buf0;
if(ep7_match) buf0 <= ep7_buf0;
else
if(ep8_match) buf0 <= #1 ep8_buf0;
if(ep8_match) buf0 <= ep8_buf0;
else
if(ep9_match) buf0 <= #1 ep9_buf0;
if(ep9_match) buf0 <= ep9_buf0;
else
if(ep10_match) buf0 <= #1 ep10_buf0;
if(ep10_match) buf0 <= ep10_buf0;
else
if(ep11_match) buf0 <= #1 ep11_buf0;
if(ep11_match) buf0 <= ep11_buf0;
else
if(ep12_match) buf0 <= #1 ep12_buf0;
if(ep12_match) buf0 <= ep12_buf0;
else
if(ep13_match) buf0 <= #1 ep13_buf0;
if(ep13_match) buf0 <= ep13_buf0;
else
if(ep14_match) buf0 <= #1 ep14_buf0;
if(ep14_match) buf0 <= ep14_buf0;
else
if(ep15_match) buf0 <= #1 ep15_buf0;
if(ep15_match) buf0 <= ep15_buf0;
 
always @(posedge clk)
if(ep0_match) buf1 <= #1 ep0_buf1;
if(ep0_match) buf1 <= ep0_buf1;
else
if(ep1_match) buf1 <= #1 ep1_buf1;
if(ep1_match) buf1 <= ep1_buf1;
else
if(ep2_match) buf1 <= #1 ep2_buf1;
if(ep2_match) buf1 <= ep2_buf1;
else
if(ep3_match) buf1 <= #1 ep3_buf1;
if(ep3_match) buf1 <= ep3_buf1;
else
if(ep4_match) buf1 <= #1 ep4_buf1;
if(ep4_match) buf1 <= ep4_buf1;
else
if(ep5_match) buf1 <= #1 ep5_buf1;
if(ep5_match) buf1 <= ep5_buf1;
else
if(ep6_match) buf1 <= #1 ep6_buf1;
if(ep6_match) buf1 <= ep6_buf1;
else
if(ep7_match) buf1 <= #1 ep7_buf1;
if(ep7_match) buf1 <= ep7_buf1;
else
if(ep8_match) buf1 <= #1 ep8_buf1;
if(ep8_match) buf1 <= ep8_buf1;
else
if(ep9_match) buf1 <= #1 ep9_buf1;
if(ep9_match) buf1 <= ep9_buf1;
else
if(ep10_match) buf1 <= #1 ep10_buf1;
if(ep10_match) buf1 <= ep10_buf1;
else
if(ep11_match) buf1 <= #1 ep11_buf1;
if(ep11_match) buf1 <= ep11_buf1;
else
if(ep12_match) buf1 <= #1 ep12_buf1;
if(ep12_match) buf1 <= ep12_buf1;
else
if(ep13_match) buf1 <= #1 ep13_buf1;
if(ep13_match) buf1 <= ep13_buf1;
else
if(ep14_match) buf1 <= #1 ep14_buf1;
if(ep14_match) buf1 <= ep14_buf1;
else
if(ep15_match) buf1 <= #1 ep15_buf1;
if(ep15_match) buf1 <= ep15_buf1;
 
always @(posedge clk)
if(ep0_match) dma_in_buf_sz1 <= #1 ep0_dma_in_buf_sz1;
if(ep0_match) dma_in_buf_sz1 <= ep0_dma_in_buf_sz1;
else
if(ep1_match) dma_in_buf_sz1 <= #1 ep1_dma_in_buf_sz1;
if(ep1_match) dma_in_buf_sz1 <= ep1_dma_in_buf_sz1;
else
if(ep2_match) dma_in_buf_sz1 <= #1 ep2_dma_in_buf_sz1;
if(ep2_match) dma_in_buf_sz1 <= ep2_dma_in_buf_sz1;
else
if(ep3_match) dma_in_buf_sz1 <= #1 ep3_dma_in_buf_sz1;
if(ep3_match) dma_in_buf_sz1 <= ep3_dma_in_buf_sz1;
else
if(ep4_match) dma_in_buf_sz1 <= #1 ep4_dma_in_buf_sz1;
if(ep4_match) dma_in_buf_sz1 <= ep4_dma_in_buf_sz1;
else
if(ep5_match) dma_in_buf_sz1 <= #1 ep5_dma_in_buf_sz1;
if(ep5_match) dma_in_buf_sz1 <= ep5_dma_in_buf_sz1;
else
if(ep6_match) dma_in_buf_sz1 <= #1 ep6_dma_in_buf_sz1;
if(ep6_match) dma_in_buf_sz1 <= ep6_dma_in_buf_sz1;
else
if(ep7_match) dma_in_buf_sz1 <= #1 ep7_dma_in_buf_sz1;
if(ep7_match) dma_in_buf_sz1 <= ep7_dma_in_buf_sz1;
else
if(ep8_match) dma_in_buf_sz1 <= #1 ep8_dma_in_buf_sz1;
if(ep8_match) dma_in_buf_sz1 <= ep8_dma_in_buf_sz1;
else
if(ep9_match) dma_in_buf_sz1 <= #1 ep9_dma_in_buf_sz1;
if(ep9_match) dma_in_buf_sz1 <= ep9_dma_in_buf_sz1;
else
if(ep10_match) dma_in_buf_sz1 <= #1 ep10_dma_in_buf_sz1;
if(ep10_match) dma_in_buf_sz1 <= ep10_dma_in_buf_sz1;
else
if(ep11_match) dma_in_buf_sz1 <= #1 ep11_dma_in_buf_sz1;
if(ep11_match) dma_in_buf_sz1 <= ep11_dma_in_buf_sz1;
else
if(ep12_match) dma_in_buf_sz1 <= #1 ep12_dma_in_buf_sz1;
if(ep12_match) dma_in_buf_sz1 <= ep12_dma_in_buf_sz1;
else
if(ep13_match) dma_in_buf_sz1 <= #1 ep13_dma_in_buf_sz1;
if(ep13_match) dma_in_buf_sz1 <= ep13_dma_in_buf_sz1;
else
if(ep14_match) dma_in_buf_sz1 <= #1 ep14_dma_in_buf_sz1;
if(ep14_match) dma_in_buf_sz1 <= ep14_dma_in_buf_sz1;
else
if(ep15_match) dma_in_buf_sz1 <= #1 ep15_dma_in_buf_sz1;
if(ep15_match) dma_in_buf_sz1 <= ep15_dma_in_buf_sz1;
 
always @(posedge clk)
if(ep0_match) dma_out_buf_avail <= #1 ep0_dma_out_buf_avail;
if(ep0_match) dma_out_buf_avail <= ep0_dma_out_buf_avail;
else
if(ep1_match) dma_out_buf_avail <= #1 ep1_dma_out_buf_avail;
if(ep1_match) dma_out_buf_avail <= ep1_dma_out_buf_avail;
else
if(ep2_match) dma_out_buf_avail <= #1 ep2_dma_out_buf_avail;
if(ep2_match) dma_out_buf_avail <= ep2_dma_out_buf_avail;
else
if(ep3_match) dma_out_buf_avail <= #1 ep3_dma_out_buf_avail;
if(ep3_match) dma_out_buf_avail <= ep3_dma_out_buf_avail;
else
if(ep4_match) dma_out_buf_avail <= #1 ep4_dma_out_buf_avail;
if(ep4_match) dma_out_buf_avail <= ep4_dma_out_buf_avail;
else
if(ep5_match) dma_out_buf_avail <= #1 ep5_dma_out_buf_avail;
if(ep5_match) dma_out_buf_avail <= ep5_dma_out_buf_avail;
else
if(ep6_match) dma_out_buf_avail <= #1 ep6_dma_out_buf_avail;
if(ep6_match) dma_out_buf_avail <= ep6_dma_out_buf_avail;
else
if(ep7_match) dma_out_buf_avail <= #1 ep7_dma_out_buf_avail;
if(ep7_match) dma_out_buf_avail <= ep7_dma_out_buf_avail;
else
if(ep8_match) dma_out_buf_avail <= #1 ep8_dma_out_buf_avail;
if(ep8_match) dma_out_buf_avail <= ep8_dma_out_buf_avail;
else
if(ep9_match) dma_out_buf_avail <= #1 ep9_dma_out_buf_avail;
if(ep9_match) dma_out_buf_avail <= ep9_dma_out_buf_avail;
else
if(ep10_match) dma_out_buf_avail <= #1 ep10_dma_out_buf_avail;
if(ep10_match) dma_out_buf_avail <= ep10_dma_out_buf_avail;
else
if(ep11_match) dma_out_buf_avail <= #1 ep11_dma_out_buf_avail;
if(ep11_match) dma_out_buf_avail <= ep11_dma_out_buf_avail;
else
if(ep12_match) dma_out_buf_avail <= #1 ep12_dma_out_buf_avail;
if(ep12_match) dma_out_buf_avail <= ep12_dma_out_buf_avail;
else
if(ep13_match) dma_out_buf_avail <= #1 ep13_dma_out_buf_avail;
if(ep13_match) dma_out_buf_avail <= ep13_dma_out_buf_avail;
else
if(ep14_match) dma_out_buf_avail <= #1 ep14_dma_out_buf_avail;
if(ep14_match) dma_out_buf_avail <= ep14_dma_out_buf_avail;
else
if(ep15_match) dma_out_buf_avail <= #1 ep15_dma_out_buf_avail;
if(ep15_match) dma_out_buf_avail <= ep15_dma_out_buf_avail;
 
 
///////////////////////////////////////////////////////////////////
603,19 → 633,19
suspend_r1 <= suspend_r;
 
always @(posedge wclk)
usb_reset_r <= #1 usb_reset;
usb_reset_r <= usb_reset;
 
always @(posedge wclk)
rx_err_r <= #1 rx_err;
rx_err_r <= rx_err;
 
always @(posedge wclk)
nse_err_r <= #1 nse_err;
nse_err_r <= nse_err;
 
always @(posedge wclk)
pid_cs_err_r <= #1 pid_cs_err;
pid_cs_err_r <= pid_cs_err;
 
always @(posedge wclk)
crc5_err_r <= #1 crc5_err;
crc5_err_r <= crc5_err;
 
assign attach = !attach_r1 & attach_r;
assign deattach = attach_r1 & !attach_r;
622,87 → 652,123
assign suspend_start = !suspend_r1 & suspend_r;
assign suspend_end = suspend_r1 & !suspend_r;
 
`ifdef USBF_ASYNC_RESET
always @(posedge wclk or negedge rst)
if(!rst) int_srcb[8] <= #1 1'b0;
`else
always @(posedge wclk)
`endif
if(!rst) int_srcb[8] <= 1'b0;
else
if(int_src_re) int_srcb[8] <= #1 1'b0;
if(int_src_re) int_srcb[8] <= 1'b0;
else
if(usb_reset_r) int_srcb[8] <= #1 1'b1;
if(usb_reset_r) int_srcb[8] <= 1'b1;
 
`ifdef USBF_ASYNC_RESET
always @(posedge wclk or negedge rst)
if(!rst) int_srcb[7] <= #1 1'b0;
`else
always @(posedge wclk)
`endif
if(!rst) int_srcb[7] <= 1'b0;
else
if(int_src_re) int_srcb[7] <= #1 1'b0;
if(int_src_re) int_srcb[7] <= 1'b0;
else
if(rx_err_r) int_srcb[7] <= #1 1'b1;
if(rx_err_r) int_srcb[7] <= 1'b1;
 
`ifdef USBF_ASYNC_RESET
always @(posedge wclk or negedge rst)
if(!rst) int_srcb[6] <= #1 1'b0;
`else
always @(posedge wclk)
`endif
if(!rst) int_srcb[6] <= 1'b0;
else
if(int_src_re) int_srcb[6] <= #1 1'b0;
if(int_src_re) int_srcb[6] <= 1'b0;
else
if(deattach) int_srcb[6] <= #1 1'b1;
if(deattach) int_srcb[6] <= 1'b1;
 
`ifdef USBF_ASYNC_RESET
always @(posedge wclk or negedge rst)
if(!rst) int_srcb[5] <= #1 1'b0;
`else
always @(posedge wclk)
`endif
if(!rst) int_srcb[5] <= 1'b0;
else
if(int_src_re) int_srcb[5] <= #1 1'b0;
if(int_src_re) int_srcb[5] <= 1'b0;
else
if(attach) int_srcb[5] <= #1 1'b1;
if(attach) int_srcb[5] <= 1'b1;
 
`ifdef USBF_ASYNC_RESET
always @(posedge wclk or negedge rst)
if(!rst) int_srcb[4] <= #1 1'b0;
`else
always @(posedge wclk)
`endif
if(!rst) int_srcb[4] <= 1'b0;
else
if(int_src_re) int_srcb[4] <= #1 1'b0;
if(int_src_re) int_srcb[4] <= 1'b0;
else
if(suspend_end) int_srcb[4] <= #1 1'b1;
if(suspend_end) int_srcb[4] <= 1'b1;
 
`ifdef USBF_ASYNC_RESET
always @(posedge wclk or negedge rst)
if(!rst) int_srcb[3] <= #1 1'b0;
`else
always @(posedge wclk)
`endif
if(!rst) int_srcb[3] <= 1'b0;
else
if(int_src_re) int_srcb[3] <= #1 1'b0;
if(int_src_re) int_srcb[3] <= 1'b0;
else
if(suspend_start) int_srcb[3] <= #1 1'b1;
if(suspend_start) int_srcb[3] <= 1'b1;
 
`ifdef USBF_ASYNC_RESET
always @(posedge wclk or negedge rst)
if(!rst) int_srcb[2] <= #1 1'b0;
`else
always @(posedge wclk)
`endif
if(!rst) int_srcb[2] <= 1'b0;
else
if(int_src_re) int_srcb[2] <= #1 1'b0;
if(int_src_re) int_srcb[2] <= 1'b0;
else
if(nse_err_r) int_srcb[2] <= #1 1'b1;
if(nse_err_r) int_srcb[2] <= 1'b1;
 
`ifdef USBF_ASYNC_RESET
always @(posedge wclk or negedge rst)
if(!rst) int_srcb[1] <= #1 1'b0;
`else
always @(posedge wclk)
`endif
if(!rst) int_srcb[1] <= 1'b0;
else
if(int_src_re) int_srcb[1] <= #1 1'b0;
if(int_src_re) int_srcb[1] <= 1'b0;
else
if(pid_cs_err_r) int_srcb[1] <= #1 1'b1;
if(pid_cs_err_r) int_srcb[1] <= 1'b1;
 
`ifdef USBF_ASYNC_RESET
always @(posedge wclk or negedge rst)
if(!rst) int_srcb[0] <= #1 1'b0;
`else
always @(posedge wclk)
`endif
if(!rst) int_srcb[0] <= 1'b0;
else
if(int_src_re) int_srcb[0] <= #1 1'b0;
if(int_src_re) int_srcb[0] <= 1'b0;
else
if(crc5_err_r) int_srcb[0] <= #1 1'b1;
if(crc5_err_r) int_srcb[0] <= 1'b1;
 
always @(posedge wclk)
begin
int_srca[15] <= #1 ep15_inta | ep15_intb;
int_srca[14] <= #1 ep14_inta | ep14_intb;
int_srca[13] <= #1 ep13_inta | ep13_intb;
int_srca[12] <= #1 ep12_inta | ep12_intb;
int_srca[11] <= #1 ep11_inta | ep11_intb;
int_srca[10] <= #1 ep10_inta | ep10_intb;
int_srca[09] <= #1 ep9_inta | ep9_intb;
int_srca[08] <= #1 ep8_inta | ep8_intb;
int_srca[07] <= #1 ep7_inta | ep7_intb;
int_srca[06] <= #1 ep6_inta | ep6_intb;
int_srca[05] <= #1 ep5_inta | ep5_intb;
int_srca[04] <= #1 ep4_inta | ep4_intb;
int_srca[03] <= #1 ep3_inta | ep3_intb;
int_srca[02] <= #1 ep2_inta | ep2_intb;
int_srca[01] <= #1 ep1_inta | ep1_intb;
int_srca[00] <= #1 ep0_inta | ep0_intb;
int_srca[15] <= ep15_inta | ep15_intb;
int_srca[14] <= ep14_inta | ep14_intb;
int_srca[13] <= ep13_inta | ep13_intb;
int_srca[12] <= ep12_inta | ep12_intb;
int_srca[11] <= ep11_inta | ep11_intb;
int_srca[10] <= ep10_inta | ep10_intb;
int_srca[09] <= ep9_inta | ep9_intb;
int_srca[08] <= ep8_inta | ep8_intb;
int_srca[07] <= ep7_inta | ep7_intb;
int_srca[06] <= ep6_inta | ep6_intb;
int_srca[05] <= ep5_inta | ep5_intb;
int_srca[04] <= ep4_inta | ep4_intb;
int_srca[03] <= ep3_inta | ep3_intb;
int_srca[02] <= ep2_inta | ep2_intb;
int_srca[01] <= ep1_inta | ep1_intb;
int_srca[00] <= ep0_inta | ep0_intb;
end
 
assign inta_ep =ep0_inta | ep1_inta | ep2_inta | ep3_inta |
719,10 → 785,10
assign intb_rf = |(int_srcb & intb_msk);
 
always @(posedge wclk)
inta <= #1 inta_ep | inta_rf;
inta <= inta_ep | inta_rf;
 
always @(posedge wclk)
intb <= #1 intb_ep | intb_rf;
intb <= intb_ep | intb_rf;
 
///////////////////////////////////////////////////////////////////
//
765,7 → 831,8
);
 
`ifdef USBF_HAVE_EP1
usbf_ep_rf u1( .clk( clk ),
usbf_ep_rf u1(
.clk( clk ),
.wclk( wclk ),
.rst( rst ),
.adr( adr[1:0] ),
/trunk/rtl/verilog/usbf_wb.v
13,8 → 13,9
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2000 Rudolf Usselmann ////
//// rudi@asics.ws ////
//// 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 ////
39,10 → 40,10
 
// CVS Log
//
// $Id: usbf_wb.v,v 1.3 2001-09-24 01:15:28 rudi Exp $
// $Id: usbf_wb.v,v 1.4 2003-10-17 02:36:57 rudi Exp $
//
// $Date: 2001-09-24 01:15:28 $
// $Revision: 1.3 $
// $Date: 2003-10-17 02:36:57 $
// $Revision: 1.4 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
49,6 → 50,10
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.3 2001/09/24 01:15:28 rudi
//
// Changed reset to be active high async.
//
// Revision 1.2 2001/08/10 08:48:33 rudi
//
// - Changed IO names to be more clear.
114,7 → 119,6
input [31:0] rf_din;
output [31:0] rf_dout;
 
 
///////////////////////////////////////////////////////////////////
//
// Local Wires and Registers
131,10 → 135,10
reg [5:0] /* synopsys enum state */ state, next_state;
// synopsys state_vector state
 
reg wb_req_s1, wb_req_s2;
reg wb_req_s1;
reg wb_ack_d, wb_ack_s1, wb_ack_s1a, wb_ack_s2;
reg ma_we;
reg rf_re, rf_we;
reg rf_re, rf_we_d;
reg ma_req;
reg wb_ack_o;
reg [31:0] wb_data_o;
149,69 → 153,72
assign rf_dout = wb_data_i;
 
always @(posedge wb_clk)
if( `USBF_RF_SEL ) wb_data_o <= #1 rf_din;
else wb_data_o <= #1 ma_din;
if( `USBF_RF_SEL ) wb_data_o <= rf_din;
else wb_data_o <= ma_din;
 
// Sync WISHBONE Request
always @(posedge phy_clk)
wb_req_s1 <= #1 wb_stb_i & wb_cyc_i;
wb_req_s1 <= wb_stb_i & wb_cyc_i;
 
always @(posedge phy_clk)
wb_req_s2 <= #1 wb_req_s1;
 
// Sync WISHBONE Ack
always @(posedge wb_clk)
wb_ack_s1 <= #1 wb_ack_d;
wb_ack_s1 <= wb_ack_d;
 
always @(posedge wb_clk)
wb_ack_o <= #1 wb_ack_s1 & !wb_ack_s2 & !wb_ack_o;
wb_ack_o <= wb_ack_s1 & !wb_ack_s2 & !wb_ack_o;
 
always @(posedge wb_clk)
wb_ack_s1a <= #1 wb_ack_s1;
wb_ack_s1a <= wb_ack_s1;
 
always @(posedge wb_clk)
wb_ack_s2 <= #1 wb_ack_s1a;
wb_ack_s2 <= wb_ack_s1a;
 
assign rf_we = rf_we_d;
 
///////////////////////////////////////////////////////////////////
//
// Interface State Machine
//
 
`ifdef USBF_ASYNC_RESET
always @(posedge phy_clk or negedge rst)
if(!rst) state <= #1 IDLE;
else state <= #1 next_state;
`else
always @(posedge phy_clk)
`endif
if(!rst) state <= IDLE;
else state <= next_state;
 
always @(state or wb_req_s1 or wb_addr_i or ma_ack or wb_we_i)
begin
next_state = state;
ma_req = 0;
ma_we = 0;
wb_ack_d = 0;
rf_re = 0;
rf_we = 0;
ma_req = 1'b0;
ma_we = 1'b0;
wb_ack_d = 1'b0;
rf_re = 1'b0;
rf_we_d = 1'b0;
 
case(state) // synopsys full_case parallel_case
IDLE:
begin
if(wb_req_s1 & `USBF_MEM_SEL & wb_we_i)
if(wb_req_s1 && `USBF_MEM_SEL && wb_we_i)
begin
ma_req = 1;
ma_we = 1;
ma_req = 1'b1;
ma_we = 1'b1;
next_state = MA_WR;
end
if(wb_req_s1 & `USBF_MEM_SEL & !wb_we_i)
if(wb_req_s1 && `USBF_MEM_SEL && !wb_we_i)
begin
ma_req = 1;
ma_req = 1'b1;
next_state = MA_RD;
end
if(wb_req_s1 & `USBF_RF_SEL & wb_we_i)
if(wb_req_s1 && `USBF_RF_SEL && wb_we_i)
begin
rf_we = 1;
rf_we_d = 1'b1;
next_state = W0;
end
if(wb_req_s1 & `USBF_RF_SEL & !wb_we_i)
if(wb_req_s1 && `USBF_RF_SEL && !wb_we_i)
begin
rf_re = 1;
rf_re = 1'b1;
next_state = W0;
end
end
220,12 → 227,12
begin
if(!ma_ack)
begin
ma_req = 1;
ma_we = 1;
ma_req = 1'b1;
ma_we = 1'b1;
end
else
begin
wb_ack_d = 1;
wb_ack_d = 1'b1;
next_state = W1;
end
end
234,11 → 241,11
begin
if(!ma_ack)
begin
ma_req = 1;
ma_req = 1'b1;
end
else
begin
wb_ack_d = 1;
wb_ack_d = 1'b1;
next_state = W1;
end
end
245,7 → 252,7
 
W0:
begin
wb_ack_d = 1;
wb_ack_d = 1'b1;
next_state = W1;
end
 
/trunk/rtl/verilog/usbf_idma.v
11,8 → 11,9
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2000 Rudolf Usselmann ////
//// rudi@asics.ws ////
//// 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 ////
37,10 → 38,10
 
// CVS Log
//
// $Id: usbf_idma.v,v 1.7 2001-11-04 12:22:45 rudi Exp $
// $Id: usbf_idma.v,v 1.8 2003-10-17 02:36:57 rudi Exp $
//
// $Date: 2001-11-04 12:22:45 $
// $Revision: 1.7 $
// $Date: 2003-10-17 02:36:57 $
// $Revision: 1.8 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
47,6 → 48,11
//
// Change History:
// $Log: not supported by cvs2svn $
// 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
104,6 → 110,7
rx_dma_en, tx_dma_en,
abort, idma_done,
buf_size, dma_en,
send_zero_length,
 
// Register File Manager Interface
adr, size, sizu_c,
130,6 → 137,7
output idma_done; // DMA is done
input [13:0] buf_size; // Actual buffer size
input dma_en; // External DMA enabled
input send_zero_length;
 
// Register File Manager Interface
input [SSRAM_HADR + 2:0] adr; // Byte Address
191,13 → 199,13
 
reg [7:0] tx_data_st; // Data output to packet assembler
reg [31:0] rd_buf0, rd_buf1; // Mem Rd. buffers for TX
reg rd_buf_full; // Indicates buffers are full
reg rd_first; // Indicates initial fill of buffers
 
reg idma_done; // DMA transfer is done
 
reg mack_r;
reg send_data; // Enable UTMI Transmitter
wire send_data; // Enable UTMI Transmitter
reg send_data_r;
 
reg word_done_r;
reg wr_last;
214,6 → 222,8
reg rx_data_valid_r;
reg [7:0] rx_data_st_r;
 
reg send_zero_length_r;
 
///////////////////////////////////////////////////////////////////
//
// Memory Arb interface
229,10 → 239,10
assign madr = adr_cw;
 
always @(posedge clk)
mwe <= #1 mwe_d;
mwe <= mwe_d;
 
always @(posedge clk)
mack_r <= #1 mreq & mack;
mack_r <= mreq & mack;
 
///////////////////////////////////////////////////////////////////
//
240,34 → 250,37
//
 
always @(posedge clk)
rx_data_valid_r <= #1 rx_data_valid;
rx_data_valid_r <= rx_data_valid;
 
always @(posedge clk)
rx_data_st_r <= #1 rx_data_st;
rx_data_st_r <= rx_data_st;
 
always @(posedge clk)
rx_data_done_r <= #1 rx_data_done;
rx_data_done_r <= rx_data_done;
 
always @(posedge clk)
rx_data_done_r2 <= #1 rx_data_done_r;
rx_data_done_r2 <= rx_data_done_r;
 
// Generate one cycle pulses for tx and rx dma enable
always @(posedge clk)
tx_dma_en_r <= #1 tx_dma_en;
tx_dma_en_r <= tx_dma_en;
 
always @(posedge clk)
rx_dma_en_r <= #1 rx_dma_en;
rx_dma_en_r <= rx_dma_en;
 
always @(posedge clk)
send_zero_length_r <= send_zero_length;
 
// address counter
always @(posedge clk)
if(rx_dma_en_r | tx_dma_en_r) adr_cw <= #1 adr[SSRAM_HADR + 2:2];
else adr_cw <= #1 adrw_next1;
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 <= #1 adr + { {SSRAM_HADR+2-13{1'b0}}, buf_size };
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}};
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)
274,11 → 287,15
if(adr_incw) adrw_next = adr_cw + {{SSRAM_HADR{1'b0}}, 1'b1};
else adrw_next = adr_cw;
 
`ifdef USBF_ASYNC_RESET
always @(posedge clk or negedge rst)
if(!rst) adr_cb <= #1 3'h0;
`else
always @(posedge clk)
`endif
if(!rst) adr_cb <= 3'h0;
else
if(rx_dma_en_r | tx_dma_en_r) adr_cb <= #1 adr[2:0];
else adr_cb <= #1 adrb_next;
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;
288,33 → 305,42
assign adr_incw = !dtmp_sel_r & mack_r;
 
// Size Counter (counting backward from input size)
`ifdef USBF_ASYNC_RESET
always @(posedge clk or negedge rst)
if(!rst) sizd_c <= #1 14'h3fff;
`else
always @(posedge clk)
`endif
if(!rst) sizd_c <= 14'h3fff;
else
if(tx_dma_en | tx_dma_en_r) sizd_c <= #1 size;
if(tx_dma_en || tx_dma_en_r) sizd_c <= size;
else
if(siz_dec) sizd_c <= #1 sizd_c - 14'h1;
if(siz_dec) sizd_c <= sizd_c - 14'h1;
 
assign siz_dec = (rd_first & mack_r) | (rd_next & (sizd_c != 14'h0) );
assign siz_dec = (rd_first & mack_r) | (rd_next & (sizd_c != 14'h0));
 
assign sizd_is_zero_d = sizd_c == 14'h0;
 
always @(posedge clk)
sizd_is_zero <= #1 sizd_is_zero_d;
sizd_is_zero <= sizd_is_zero_d;
 
// Size Counter (counting up from zero)
`ifdef USBF_ASYNC_RESET
always @(posedge clk or negedge rst)
if(!rst) sizu_c <= #1 11'h0;
`else
always @(posedge clk)
`endif
if(!rst) sizu_c <= 11'h0;
else
if(rx_dma_en_r) sizu_c <= #1 11'h0;
// Do I need to add "abort" in the next line ???
if(rx_dma_en_r) sizu_c <= 11'h0;
else
if(siz_inc) sizu_c <= #1 sizu_c + 11'h1;
if(siz_inc) sizu_c <= sizu_c + 11'h1;
 
assign siz_inc = rx_data_valid_r;
 
// DMA Done Indicator
always @(posedge clk)
idma_done <= #1 (rx_data_done_r | sizd_is_zero_d); // & !tx_dma_en;
idma_done <= (rx_data_done_r | sizd_is_zero_d); // & !tx_dma_en;
 
///////////////////////////////////////////////////////////////////
//
322,38 → 348,38
//
 
always @(posedge clk)
dtmp_sel_r <= #1 dtmp_sel;
dtmp_sel_r <= dtmp_sel;
 
// Memory data input
always @(posedge clk)
if(dtmp_sel_r) dtmp_r <= #1 mdin;
if(dtmp_sel_r) dtmp_r <= mdin;
else
if(rx_data_valid_r)
begin
if(adr_cb[1:0] == 2'h0) dtmp_r[07:00] <= #1 rx_data_st_r;
if(adr_cb[1:0] == 2'h1) dtmp_r[15:08] <= #1 rx_data_st_r;
if(adr_cb[1:0] == 2'h2) dtmp_r[23:16] <= #1 rx_data_st_r;
if(adr_cb[1:0] == 2'h3) dtmp_r[31:24] <= #1 rx_data_st_r;
if(adr_cb[1:0] == 2'h0) dtmp_r[07:00] <= rx_data_st_r;
if(adr_cb[1:0] == 2'h1) dtmp_r[15:08] <= rx_data_st_r;
if(adr_cb[1:0] == 2'h2) dtmp_r[23:16] <= rx_data_st_r;
if(adr_cb[1:0] == 2'h3) dtmp_r[31:24] <= rx_data_st_r;
end
 
always @(posedge clk)
word_done <= #1 ((adr_cb[1:0] == 2'h3) & rx_data_valid_r) | wr_last;
word_done <= ((adr_cb[1:0] == 2'h3) & rx_data_valid_r) | wr_last;
 
always @(posedge clk)
word_done_r <= #1 word_done & !word_done_r;
word_done_r <= word_done & !word_done_r;
 
// Store output data and address when we got a word
always @(posedge clk)
if(word_done) dout_r <= #1 dtmp_r;
if(word_done) dout_r <= dtmp_r;
 
always @(posedge clk)
wr_last <= #1 (adr_cb[1:0] != 2'h0) & !rx_data_valid_r & wr_last_en;
wr_last <= (adr_cb[1:0] != 2'h0) & !rx_data_valid_r & wr_last_en;
 
always @(posedge clk)
wr_done_r <= #1 rx_data_done_r;
wr_done_r <= rx_data_done_r;
 
always @(posedge clk)
wr_done <= #1 wr_done_r;
wr_done <= wr_done_r;
 
///////////////////////////////////////////////////////////////////
//
362,10 → 388,10
 
// Fill TX Buffers
always @(posedge clk)
if(fill_buf0) rd_buf0 <= #1 mdin;
if(fill_buf0) rd_buf0 <= mdin;
 
always @(posedge clk)
if(fill_buf1) rd_buf1 <= #1 mdin;
if(fill_buf1) rd_buf1 <= mdin;
 
always @(adrb_next or rd_buf0 or rd_buf1)
case(adrb_next[2:0]) // synopsys full_case parallel_case
384,14 → 410,19
 
assign adrb_is_3 = adr_cb[1:0] == 2'h3;
 
 
`ifdef USBF_ASYNC_RESET
always @(posedge clk or negedge rst)
if(!rst) send_data <= #1 1'b0;
`else
always @(posedge clk)
`endif
if(!rst) send_data_r <= 1'b0;
else
if(rd_first) send_data <= #1 1'b1;
if(rd_first) send_data_r <= 1'b1;
else
if(((sizd_c==14'h1) & rd_next) | sizd_is_zero_d) send_data <= #1 1'b0;
if(((sizd_c==14'h1) && rd_next) || sizd_is_zero_d) send_data_r <= 1'b0;
 
assign send_data = send_data_r | send_zero_length_r;
 
///////////////////////////////////////////////////////////////////
//
// IDMA Load/Store State Machine
400,13 → 431,17
// store incoming data to memory until rx_data done
// First pre-fetch data from memory, so that bytes can be stuffed properly
 
`ifdef USBF_ASYNC_RESET
always @(posedge clk or negedge rst)
if(!rst) state <= #1 IDLE;
else state <= #1 next_state;
`else
always @(posedge clk)
`endif
if(!rst) state <= IDLE;
else state <= next_state;
 
always @(state or mack_r or abort or rx_dma_en_r or tx_dma_en_r or
sizd_is_zero or wr_last or wr_done or rx_data_done_r2 or
rd_next or adrb_is_3)
rd_next or adrb_is_3 or send_zero_length_r)
begin
next_state = state; // Default do not change state
mreq_d = 1'b0;
433,11 → 468,11
`endif
// synopsys translate_on
 
if(rx_dma_en_r & !abort)
if(rx_dma_en_r && !abort)
begin
next_state = WAIT_MRD;
end
if(tx_dma_en_r & !abort)
if(tx_dma_en_r && !abort && !send_zero_length_r)
begin
next_state = MEM_RD1;
end
580,9 → 615,9
`endif
// synopsys translate_on
 
if(sizd_is_zero | abort) next_state = IDLE;
if(sizd_is_zero || abort) next_state = IDLE;
else
if(adrb_is_3 & rd_next) next_state = MEM_RD2;
if(adrb_is_3 && rd_next) next_state = MEM_RD2;
end
endcase
 
/trunk/rtl/verilog/usbf_pl.v
13,8 → 13,9
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2000 Rudolf Usselmann ////
//// rudi@asics.ws ////
//// 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 ////
39,10 → 40,10
 
// CVS Log
//
// $Id: usbf_pl.v,v 1.4 2001-11-04 12:22:45 rudi Exp $
// $Id: usbf_pl.v,v 1.5 2003-10-17 02:36:57 rudi Exp $
//
// $Date: 2001-11-04 12:22:45 $
// $Revision: 1.4 $
// $Date: 2003-10-17 02:36:57 $
// $Revision: 1.5 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
49,6 → 50,11
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.4 2001/11/04 12:22:45 rudi
//
// - Fixed previous fix (brocke something else ...)
// - Majore Synthesis cleanup
//
// Revision 1.3 2001/09/24 01:15:28 rudi
//
// Changed reset to be active high async.
250,51 → 256,63
// All bad pids
assign pid_bad = pid_bad1 | pid_bad2;
 
assign match_o = !pid_bad & match & token_valid & !crc5_err;
assign match_o = !pid_bad & fsel & 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;
frame_no_we_r <= frame_no_we;
 
`ifdef USBF_ASYNC_RESET
always @(posedge clk or negedge rst)
if(!rst) frame_no_r <= #1 11'h0;
`else
always @(posedge clk)
`endif
if(!rst) frame_no_r <= 11'h0;
else
if(frame_no_we_r) frame_no_r <= #1 frame_no;
if(frame_no_we_r) frame_no_r <= frame_no;
 
// Micro Frame Counter
always @(posedge clk)
frame_no_same <= #1 frame_no_we & (frame_no_r == frame_no);
frame_no_same <= frame_no_we & (frame_no_r == frame_no);
 
`ifdef USBF_ASYNC_RESET
always @(posedge clk or negedge rst)
if(!rst) mfm_cnt <= #1 4'h0;
`else
always @(posedge clk)
`endif
if(!rst) mfm_cnt <= 4'h0;
else
if(frame_no_we_r & !frame_no_same)
mfm_cnt <= #1 4'h0;
if(frame_no_we_r && !frame_no_same)
mfm_cnt <= 4'h0;
else
if(frame_no_same) mfm_cnt <= #1 mfm_cnt + 4'h1;
if(frame_no_same) mfm_cnt <= mfm_cnt + 4'h1;
 
//SOF delay counter
always @(posedge clk)
clr_sof_time <= #1 frame_no_we;
clr_sof_time <= frame_no_we;
 
always @(posedge clk)
if(clr_sof_time) sof_time <= #1 12'h0;
if(clr_sof_time) sof_time <= 12'h0;
else
if(hms_clk) sof_time <= #1 sof_time + 12'h1;
if(hms_clk) sof_time <= sof_time + 12'h1;
 
assign frm_nat = {mfm_cnt, 1'b0, frame_no_r, 4'h0, sof_time};
 
// 0.5 Micro Seconds Clock Generator
`ifdef USBF_ASYNC_RESET
always @(posedge clk or negedge rst)
if(!rst) hms_cnt <= #1 5'h0;
`else
always @(posedge clk)
`endif
if(!rst) hms_cnt <= 5'h0;
else
if(hms_clk | frame_no_we_r) hms_cnt <= #1 5'h0;
else hms_cnt <= #1 hms_cnt + 5'h1;
if(hms_clk || frame_no_we_r) hms_cnt <= 5'h0;
else hms_cnt <= hms_cnt + 5'h1;
 
always @(posedge clk)
hms_clk <= #1 (hms_cnt == `USBF_HMS_DEL);
hms_clk <= (hms_cnt == `USBF_HMS_DEL);
 
///////////////////////////////////////////////////////////////////
 
307,82 → 325,84
//
 
//Packet Decoder
usbf_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 )
usbf_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 Assembler
usbf_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 )
usbf_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 ),
.send_zero_length( send_zero_length ),
.tx_data_st( tx_data_st ),
.rd_next( rd_next )
);
 
// Internal DMA / Memory Arbiter Interface
usbf_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 )
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 ),
.send_zero_length( send_zero_length ),
.madr( madr ),
.sizu_c( sizu_c ),
.mdout( mdout ),
.mdin( mdin ),
.mwe( mwe ),
.mreq( mreq ),
.mack( mack )
);
 
// Protocol Engine
416,6 → 436,7
.send_token( send_token ),
.token_pid_sel( token_pid_sel ),
.data_pid_sel( data_pid_sel ),
.send_zero_length( send_zero_length ),
.rx_dma_en( rx_dma_en ),
.tx_dma_en( tx_dma_en ),
.abort( abort ),
/trunk/rtl/verilog/usbf_utmi_ls.v
11,8 → 11,9
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2000 Rudolf Usselmann ////
//// rudi@asics.ws ////
//// 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 ////
37,10 → 38,10
 
// CVS Log
//
// $Id: usbf_utmi_ls.v,v 1.4 2001-11-04 12:22:45 rudi Exp $
// $Id: usbf_utmi_ls.v,v 1.5 2003-10-17 02:36:57 rudi Exp $
//
// $Date: 2001-11-04 12:22:45 $
// $Revision: 1.4 $
// $Date: 2003-10-17 02:36:57 $
// $Revision: 1.5 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
47,6 → 48,11
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.4 2001/11/04 12:22:45 rudi
//
// - Fixed previous fix (brocke something else ...)
// - Majore Synthesis cleanup
//
// Revision 1.3 2001/09/24 01:15:28 rudi
//
// Changed reset to be active high async.
80,7 → 86,7
 
`include "usbf_defines.v"
 
module usbf_utmi_ls( clk, wclk, rst,
module usbf_utmi_ls( clk, rst,
 
resume_req,
 
90,11 → 96,12
usb_vbus,
 
// Misc Interfaces
mode_hs, usb_reset, usb_suspend, usb_attached
mode_hs, usb_reset, usb_suspend, usb_attached,
suspend_clr
);
 
input clk;
input wclk;
//input wclk;
input rst;
 
input resume_req;
113,6 → 120,8
output usb_suspend; // USB Suspend
output usb_attached; // Attached to USB
 
output suspend_clr;
 
///////////////////////////////////////////////////////////////////
//
// Parameters
123,7 → 132,7
RES_SUSP = 15'b000_0000_0000_0100,
SUSPEND = 15'b000_0000_0000_1000,
RESUME = 15'b000_0000_0001_0000,
RESUME_REQ = 15'b000_0000_0010_0000,
RESUME_REQUEST = 15'b000_0000_0010_0000,
RESUME_WAIT = 15'b000_0000_0100_0000,
RESUME_SIG = 15'b000_0000_1000_0000,
ATTACH = 15'b000_0001_0000_0000,
155,7 → 164,7
 
wire ls_se0, ls_j, ls_k, ls_se1;
reg ls_k_r, ls_j_r, ls_se0_r;
reg ls_idle_r, ls_idle_r1;
reg ls_idle_r;
wire ls_idle;
reg idle_long;
wire idle_long_set, idle_long_clr;
169,7 → 178,7
reg idle_cnt1_clr;
reg [7:0] idle_cnt1, idle_cnt1_next;
reg [5:0] idle_cnt2;
reg T1_gt_2_5_uS, T1_gt_100_uS, T1_st_3_0_mS, T1_gt_3_0_mS;
reg T1_gt_2_5_uS, T1_st_3_0_mS, T1_gt_3_0_mS;
reg T1_gt_3_125_mS, T1_gt_5_0_mS;
reg [7:0] me_ps;
reg me_cnt_clr;
184,8 → 193,6
reg chirp_cnt_clr, chirp_cnt_inc;
reg chirp_cnt_is_6;
 
reg suspend_clr_wr;
reg resume_req_r;
reg resume_req_s1;
reg resume_req_s;
 
195,66 → 202,56
//
 
always @(posedge clk)
drive_k <= #1 drive_k_d;
drive_k <= drive_k_d;
 
assign SuspendM = (usb_suspend & !resume_req_s) | (LineState == 2'b10);
 
always @(posedge wclk)
suspend_clr_wr <= #1 suspend_clr;
 
always @(posedge wclk)
if(!rst) resume_req_r <= #1 1'b0;
else
if(suspend_clr_wr) resume_req_r <= #1 1'b0;
else
if(resume_req) resume_req_r <= #1 1'b1;
 
always @(posedge clk)
resume_req_s1 <= #1 resume_req_r;
resume_req_s1 <= resume_req;
 
always @(posedge clk)
resume_req_s <= #1 resume_req_s1;
resume_req_s <= resume_req_s1;
 
// ---------------------------------------------------------
// USB State/Operation Mode JK Flops
always @(posedge clk)
if(mode_set_fs) mode_hs <= #1 1'b0;
if(mode_set_fs) mode_hs <= 1'b0;
else
if(mode_set_hs) mode_hs <= #1 1'b1;
if(mode_set_hs) mode_hs <= 1'b1;
 
always @(posedge clk)
if(suspend_clr) usb_suspend <= #1 1'b0;
if(suspend_clr) usb_suspend <= 1'b0;
else
if(suspend_set) usb_suspend <= #1 1'b1;
if(suspend_set) usb_suspend <= 1'b1;
 
always @(posedge clk)
if(attached_clr) usb_attached <= #1 1'b0;
if(attached_clr) usb_attached <= 1'b0;
else
if(attached_set) usb_attached <= #1 1'b1;
if(attached_set) usb_attached <= 1'b1;
 
always @(posedge clk)
if(fs_term_off) TermSel <= #1 1'b0;
if(fs_term_off) TermSel <= 1'b0;
else
if(fs_term_on) TermSel <= #1 1'b1;
if(fs_term_on) TermSel <= 1'b1;
 
always @(posedge clk)
if(xcv_set_fs) XcvSelect <= #1 1'b1;
if(xcv_set_fs) XcvSelect <= 1'b1;
else
if(xcv_set_hs) XcvSelect <= #1 1'b0;
if(xcv_set_hs) XcvSelect <= 1'b0;
 
always @(posedge clk)
if(bit_stuff_off) OpMode <= #1 2'b10;
if(bit_stuff_off) OpMode <= 2'b10;
else
if(bit_stuff_on) OpMode <= #1 2'b00;
if(bit_stuff_on) OpMode <= 2'b00;
 
always @(posedge clk)
usb_reset <= #1 usb_reset_d;
usb_reset <= usb_reset_d;
 
// ---------------------------------------------------------
// Line State Detector
 
always @(posedge clk)
line_state_r <= #1 LineState;
line_state_r <= LineState;
 
assign ls_se0 = (line_state_r == 2'b00);
assign ls_j = (line_state_r == 2'b01);
267,27 → 264,31
// Idle Has to persist for at least two cycles in a roe in the
// same state to recognized
always @(posedge clk)
ls_idle_r <= #1 ls_idle;
ls_idle_r <= ls_idle;
 
assign idle_long_set = ls_idle & ls_idle_r;
assign idle_long_clr = !ls_idle & !ls_idle_r;
 
`ifdef USBF_ASYNC_RESET
always @(posedge clk or negedge rst)
if(!rst) idle_long <= #1 1'b0;
`else
always @(posedge clk)
`endif
if(!rst) idle_long <= 1'b0;
else
if(idle_long_clr) idle_long <= #1 1'b0;
if(idle_long_clr) idle_long <= 1'b0;
else
if(idle_long_set) idle_long <= #1 1'b1;
if(idle_long_set) idle_long <= 1'b1;
 
// Detect Signals for two cycles ina row before making a transaction ...
always @(posedge clk)
ls_k_r <= #1 ls_k;
ls_k_r <= ls_k;
 
always @(posedge clk)
ls_j_r <= #1 ls_j;
ls_j_r <= ls_j;
 
always @(posedge clk)
ls_se0_r <= #1 ls_se0;
ls_se0_r <= ls_se0;
 
assign k_long = ls_k & ls_k_r;
assign j_long = ls_j & ls_j_r;
304,47 → 305,44
// Pre-Scaler
// Generates a 0.25 uS Count Enable (ps_cnt_clr)
always @(posedge clk)
if(!idle_long | idle_cnt_clr | ps_cnt_clr) ps_cnt <= #1 4'd0;
else ps_cnt <= #1 ps_cnt + 4'd1;
if(!idle_long || idle_cnt_clr || ps_cnt_clr) ps_cnt <= 4'd0;
else ps_cnt <= ps_cnt + 4'd1;
 
always @(posedge clk) // Clear the pre-scaler in 250 nS intervals
ps_cnt_clr <= #1 (ps_cnt == `USBF_T1_PS_250_NS);
ps_cnt_clr <= (ps_cnt == `USBF_T1_PS_250_NS);
 
// Count uS
always @(posedge clk)
if(!idle_long | idle_cnt1_clr | idle_cnt_clr) idle_cnt1 <= #1 8'h0;
if(!idle_long || idle_cnt1_clr || idle_cnt_clr) idle_cnt1 <= 8'h0;
else
if(!T1_gt_3_125_mS & ps_cnt_clr) idle_cnt1 <= #1 idle_cnt1_next;
if(!T1_gt_3_125_mS && ps_cnt_clr) idle_cnt1 <= idle_cnt1_next;
 
always @(posedge clk)
idle_cnt1_next <= #1 idle_cnt1 + 8'h1;
idle_cnt1_next <= idle_cnt1 + 8'h1;
 
always @(posedge clk) // Clear the uS counter every 62.5 uS
idle_cnt1_clr <= #1 idle_cnt1 == `USBF_T1_C_62_5_US;
idle_cnt1_clr <= idle_cnt1 == `USBF_T1_C_62_5_US;
 
// Count mS
always @(posedge clk)
if(!idle_long | idle_cnt_clr) idle_cnt2 <= #1 6'h0;
if(!idle_long || idle_cnt_clr) idle_cnt2 <= 6'h0;
else
if(!T1_gt_5_0_mS & idle_cnt1_clr) idle_cnt2 <= #1 idle_cnt2 + 6'h1;
if(!T1_gt_5_0_mS && idle_cnt1_clr) idle_cnt2 <= idle_cnt2 + 6'h1;
 
always @(posedge clk) // Greater Than 2.5uS (Actual Time will be T0+2.75uS)
T1_gt_2_5_uS <= #1 !idle_cnt_clr & (idle_cnt1 > `USBF_T1_C_2_5_US);
T1_gt_2_5_uS <= !idle_cnt_clr & (idle_cnt1 > `USBF_T1_C_2_5_US);
 
always @(posedge clk) // Greater Than 100uS (Actual Time will be T0+187.5uS)
T1_gt_100_uS <= #1 !idle_cnt_clr & (`USBF_T1_C_100_US < idle_cnt2);
 
always @(posedge clk) // Smaller Than 3 mS (Actual Time will be 0-2.9375mS)
T1_st_3_0_mS <= #1 !idle_cnt_clr & (idle_cnt1 < `USBF_T1_C_3_0_MS);
T1_st_3_0_mS <= !idle_cnt_clr & (idle_cnt1 < `USBF_T1_C_3_0_MS);
 
always @(posedge clk) // Greater Than 3 mS (Actual Time will be T0+3.0625mS)
T1_gt_3_0_mS <= #1 !idle_cnt_clr & (idle_cnt1 > `USBF_T1_C_3_0_MS);
T1_gt_3_0_mS <= !idle_cnt_clr & (idle_cnt1 > `USBF_T1_C_3_0_MS);
 
always @(posedge clk) // Greater Than 3.125 mS (Actual Time will be T0+3.1875uS)
T1_gt_3_125_mS <= #1 !idle_cnt_clr & (idle_cnt1 > `USBF_T1_C_3_125_MS);
T1_gt_3_125_mS <= !idle_cnt_clr & (idle_cnt1 > `USBF_T1_C_3_125_MS);
 
always @(posedge clk) // Greater Than 3.125 mS (Actual Time will be T0+3.1875uS)
T1_gt_5_0_mS <= #1 !idle_cnt_clr & (idle_cnt1 > `USBF_T1_C_5_MS);
T1_gt_5_0_mS <= !idle_cnt_clr & (idle_cnt1 > `USBF_T1_C_5_MS);
 
// ---------------------------------------------------------
// Misc Events Counter
351,52 → 349,52
 
// Pre-scaler - 2.5uS
always @(posedge clk)
if(me_cnt_clr | me_ps_2_5_us) me_ps <= #1 8'h0;
else me_ps <= #1 me_ps + 8'h1;
if(me_cnt_clr || me_ps_2_5_us) me_ps <= 8'h0;
else me_ps <= me_ps + 8'h1;
 
always @(posedge clk) // Generate a pulse every 2.5 uS
me_ps_2_5_us <= #1 (me_ps == `USBF_T2_C_2_5_US);
me_ps_2_5_us <= (me_ps == `USBF_T2_C_2_5_US);
 
// Second Pre-scaler - 0.5mS
always @(posedge clk)
if(me_cnt_clr | me_ps2_0_5_ms ) me_ps2 <= #1 8'h0;
if(me_cnt_clr || me_ps2_0_5_ms ) me_ps2 <= 8'h0;
else
if(me_ps_2_5_us) me_ps2 <= #1 me_ps2 + 8'h1;
if(me_ps_2_5_us) me_ps2 <= me_ps2 + 8'h1;
 
always @(posedge clk) // Generate a pulse every 0.5 mS
me_ps2_0_5_ms <= #1 (me_ps2 == `USBF_T2_C_0_5_MS) & !me_ps2_0_5_ms;
me_ps2_0_5_ms <= (me_ps2 == `USBF_T2_C_0_5_MS) & !me_ps2_0_5_ms;
 
// final misc Counter
always @(posedge clk)
if(me_cnt_clr) me_cnt <= #1 8'h0;
if(me_cnt_clr) me_cnt <= 8'h0;
else
if(!me_cnt_100_ms & me_ps2_0_5_ms) me_cnt <= #1 me_cnt + 8'h1;
if(!me_cnt_100_ms && me_ps2_0_5_ms) me_cnt <= me_cnt + 8'h1;
 
always @(posedge clk) // Indicate when 100uS have passed
T2_gt_100_uS <= #1 !me_cnt_clr & (me_ps2 > `USBF_T2_C_100_US); // Actual Time: 102.5 uS
T2_gt_100_uS <= !me_cnt_clr & (me_ps2 > `USBF_T2_C_100_US); // Actual Time: 102.5 uS
 
always @(posedge clk) // Indicate when wakeup period has passed
T2_wakeup <= #1 !me_cnt_clr & (me_cnt > `USBF_T2_C_WAKEUP);
T2_wakeup <= !me_cnt_clr & (me_cnt > `USBF_T2_C_WAKEUP);
 
always @(posedge clk) // Indicate when 1 mS has passed
T2_gt_1_0_mS <= #1 !me_cnt_clr & (me_cnt > `USBF_T2_C_1_0_MS); // Actual Time: 1.5 mS
T2_gt_1_0_mS <= !me_cnt_clr & (me_cnt > `USBF_T2_C_1_0_MS); // Actual Time: 1.5 mS
 
always @(posedge clk) // Indicate when 1.2 mS has passed
T2_gt_1_2_mS <= #1 !me_cnt_clr & (me_cnt > `USBF_T2_C_1_2_MS); // Actual Time: 1.5 mS
T2_gt_1_2_mS <= !me_cnt_clr & (me_cnt > `USBF_T2_C_1_2_MS); // Actual Time: 1.5 mS
 
always @(posedge clk) // Generate a pulse after 100 mS
me_cnt_100_ms <= #1 !me_cnt_clr & (me_cnt == `USBF_T2_C_100_MS); // Actual Time: 100 mS
me_cnt_100_ms <= !me_cnt_clr & (me_cnt == `USBF_T2_C_100_MS); // Actual Time: 100 mS
 
// ---------------------------------------------------------
// Chirp Counter
 
always @(posedge clk)
if(chirp_cnt_clr) chirp_cnt <= #1 3'h0;
if(chirp_cnt_clr) chirp_cnt <= 3'h0;
else
if(chirp_cnt_inc) chirp_cnt <= #1 chirp_cnt + 3'h1;
if(chirp_cnt_inc) chirp_cnt <= chirp_cnt + 3'h1;
 
always @(posedge clk)
chirp_cnt_is_6 <= #1 (chirp_cnt == 3'h6);
chirp_cnt_is_6 <= (chirp_cnt == 3'h6);
 
///////////////////////////////////////////////////////////////////
//
403,17 → 401,21
// Main State Machine
//
 
`ifdef USBF_ASYNC_RESET
always @(posedge clk or negedge rst)
if(!rst) state <= #1 POR;
`else
always @(posedge clk)
`endif
if(!rst) state <= POR;
else
if(usb_vbus) state <= #1 POR;
else state <= #1 next_state;
if(usb_vbus) state <= POR;
else state <= next_state;
 
always @(state or mode_hs or idle_long or resume_req_s or me_cnt_100_ms or
j_long or k_long or se0_long or ls_se0 or
T1_gt_2_5_uS or T1_gt_100_uS or T1_st_3_0_mS or T1_gt_3_0_mS or T1_gt_5_0_mS or
T2_gt_100_uS or T2_wakeup or T2_gt_1_0_mS or T2_gt_1_2_mS or
chirp_cnt_is_6)
T1_gt_2_5_uS or T1_st_3_0_mS or T1_gt_3_0_mS or
T1_gt_5_0_mS or T2_gt_100_uS or T2_wakeup or T2_gt_1_0_mS or
T2_gt_1_2_mS or chirp_cnt_is_6)
begin
next_state = state; // Default don't change state
 
446,7 → 448,7
fs_term_on = 1'b1;
mode_set_fs = 1'b1;
attached_clr = 1'b1;
bit_stuff_on = 1'b1;
bit_stuff_on = 1'b0;
suspend_clr = 1'b1;
next_state = ATTACH;
end
453,13 → 455,13
 
NORMAL: // Normal Operation
begin
if(!mode_hs & T1_gt_2_5_uS & T1_st_3_0_mS & !idle_long)
if(!mode_hs && T1_gt_2_5_uS && T1_st_3_0_mS && !idle_long)
begin
me_cnt_clr = 1'b1;
next_state = RESET;
end
else
if(!mode_hs & T1_gt_3_0_mS)
if(!mode_hs && T1_gt_3_0_mS)
begin
idle_cnt_clr = 1'b1;
suspend_set = 1'b1;
466,7 → 468,7
next_state = SUSPEND;
end
else
if(mode_hs & T1_gt_3_0_mS)
if(mode_hs && T1_gt_3_0_mS)
begin // Switch to FS mode, and decide
// if it's a RESET or SUSPEND
me_cnt_clr = 1'b1;
478,13 → 480,13
 
RES_SUSP: // Decide if it's a Reset or Suspend Signaling
begin // We are now in FS mode, wait 100uS first
if(T2_gt_100_uS & se0_long)
if(T2_gt_100_uS && se0_long)
begin
me_cnt_clr = 1'b1;
next_state = RESET;
end
else
if(T2_gt_100_uS & j_long)
if(T2_gt_100_uS && j_long)
begin
idle_cnt_clr = 1'b1;
suspend_set = 1'b1;
494,7 → 496,7
 
SUSPEND: // In Suspend
begin
if(T1_gt_2_5_uS & se0_long)
if(T1_gt_2_5_uS && se0_long)
begin
suspend_clr = 1'b1;
me_cnt_clr = 1'b1;
506,8 → 508,8
next_state = RESUME;
end
else
if(T1_gt_5_0_mS & resume_req_s)
next_state = RESUME_REQ;
if(T1_gt_5_0_mS && resume_req_s)
next_state = RESUME_REQUEST;
end
 
RESUME:
530,7 → 532,7
if(T2_gt_100_uS) next_state = NORMAL;
end
 
RESUME_REQ: // Function Resume Request
RESUME_REQUEST: // Function Resume Request
begin
suspend_clr = 1'b1;
// Wait for internal wake up
552,12 → 554,12
ATTACH: // Attach To USB Detected
begin
idle_cnt_clr = 1'b1;
if(me_cnt_100_ms & j_long)
if(me_cnt_100_ms && j_long)
begin
attached_set = 1'b1;
next_state = NORMAL;
end
if(me_cnt_100_ms & se0_long)
if(me_cnt_100_ms && se0_long)
begin
attached_set = 1'b1;
me_cnt_clr = 1'b1;
568,9 → 570,10
RESET: // In Reset
begin
usb_reset_d = 1'b1; // Assert Internal USB Reset
xcv_set_hs = 1'b1; // Switch xcvr to HS mode
fs_term_on = 1'b1; // Turn FS termination On
xcv_set_hs = 1'b1; // Switch xcvr to HS mode
fs_term_on = 1'b1; // Turn FS termination On
mode_set_fs = 1'b1; // Change mode to FS
bit_stuff_off = 1'b1; // disable Bit Stuffing and NRZI encoding
// Get out of reset after 1.5 mS
if(T2_gt_1_0_mS)
begin
619,14 → 622,16
 
SPEED_NEG_HS:
begin
bit_stuff_on = 1'b1; // Enable Bit Stuffing and NRZI encoding
xcv_set_hs = 1'b1; // Switch xcvr to HS mode
fs_term_off = 1'b1; // Turn FS termination Off
mode_set_hs = 1'b1; // Change mode to FS
mode_set_hs = 1'b1; // Change mode to HS
if(se0_long) next_state = NORMAL;
end
 
SPEED_NEG_FS:
begin
bit_stuff_on = 1'b1; // Enable Bit Stuffing and NRZI encoding
xcv_set_fs = 1'b1; // Switch xcvr to FS mode
fs_term_on = 1'b1; // Turn FS termination On
mode_set_fs = 1'b1; // Change mode to FS
/trunk/rtl/verilog/usbf_defines.v
11,8 → 11,9
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2000 Rudolf Usselmann ////
//// rudi@asics.ws ////
//// 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 ////
37,10 → 38,10
 
// CVS Log
//
// $Id: usbf_defines.v,v 1.5 2001-11-04 12:22:43 rudi Exp $
// $Id: usbf_defines.v,v 1.6 2003-10-17 02:36:57 rudi Exp $
//
// $Date: 2001-11-04 12:22:43 $
// $Revision: 1.5 $
// $Date: 2003-10-17 02:36:57 $
// $Revision: 1.6 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
47,6 → 48,11
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.5 2001/11/04 12:22:43 rudi
//
// - Fixed previous fix (brocke something else ...)
// - Majore Synthesis cleanup
//
// Revision 1.4 2001/09/23 08:39:33 rudi
//
// Renamed DEBUG and VERBOSE_DEBUG to USBF_DEBUG and USBF_VERBOSE_DEBUG ...
92,9 → 98,15
 
`timescale 1ns / 10ps
 
// Uncomment the lines below to get various levels of debugging
// verbosity ...
`define USBF_DEBUG
//`define USBF_VERBOSE_DEBUG
 
// Uncomment the line below to run the test bench
// Comment it out to use your own address parameters ...
`define USBF_TEST_IMPL
 
// For each endpoint that should actually be instantiated,
// set the below define value to a one. Uncomment the define
// statement for unused endpoints. The endpoints should be
103,22 → 115,32
// Actual (logical) endpoint IDs are set by the software. There
// is no correlation between the physical endpoint number (below)
// and the actual (logical) endpoint number.
`define USBF_HAVE_EP1 1
`define USBF_HAVE_EP2 1
`define USBF_HAVE_EP3 1
//`define USBF_HAVE_EP4 1
//`define USBF_HAVE_EP5 1
//`define USBF_HAVE_EP6 1
//`define USBF_HAVE_EP7 1
//`define USBF_HAVE_EP8 1
//`define USBF_HAVE_EP9 1
//`define USBF_HAVE_EP10 1
//`define USBF_HAVE_EP11 1
//`define USBF_HAVE_EP12 1
//`define USBF_HAVE_EP13 1
//`define USBF_HAVE_EP14 1
//`define USBF_HAVE_EP15 1
`ifdef USBF_TEST_IMPL
// Do not modify this section
// this is to run the test bench
`define USBF_HAVE_EP1 1
`define USBF_HAVE_EP2 1
`define USBF_HAVE_EP3 1
`else
// Modify this section to suit your implementation
`define USBF_HAVE_EP1 1
`define USBF_HAVE_EP2 1
`define USBF_HAVE_EP3 1
//`define USBF_HAVE_EP4 1
//`define USBF_HAVE_EP5 1
//`define USBF_HAVE_EP6 1
//`define USBF_HAVE_EP7 1
//`define USBF_HAVE_EP8 1
//`define USBF_HAVE_EP9 1
//`define USBF_HAVE_EP10 1
//`define USBF_HAVE_EP11 1
//`define USBF_HAVE_EP12 1
//`define USBF_HAVE_EP13 1
//`define USBF_HAVE_EP14 1
//`define USBF_HAVE_EP15 1
`endif
 
 
// Highest address line number that goes to the USB core
// Typically only A0 through A17 are needed, where A17
// selects between the internal buffer memory and the
125,14 → 147,28
// register file.
// Implementations may choose to have a more complex address
// decoding ....
`define USBF_UFC_HADR 17
 
// Address Decoding for Register File select
`define USBF_RF_SEL (!wb_addr_i[17])
// Address Decoding for Buffer Memory select
`define USBF_MEM_SEL (wb_addr_i[17])
`ifdef USBF_TEST_IMPL
// Do not modify this section
// this is to run the test bench
`define USBF_UFC_HADR 17
`define USBF_RF_SEL (!wb_addr_i[17])
`define USBF_MEM_SEL (wb_addr_i[17])
`define USBF_SSRAM_HADR 14
//`define USBF_ASYNC_RESET
 
`define USBF_SSRAM_HADR 14
`else
// Modify this section to suit your implementation
`define USBF_UFC_HADR 12
// Address Decoding for Register File select
`define USBF_RF_SEL (!wb_addr_i[12])
// Address Decoding for Buffer Memory select
`define USBF_MEM_SEL (wb_addr_i[12])
`define USBF_SSRAM_HADR 9
// The next statement determines if reset is async or sync.
// If the define is uncommented the reset will be ASYNC.
//`define USBF_ASYNC_RESET
`endif
 
 
/////////////////////////////////////////////////////////////////////
167,7 → 203,7
// Phy clocks there are between two hms_clock pulses. This
// constant plus 2 represents the actual delay.
// Example: For a 60 Mhz (16.667 nS period) Phy Clock, the
// delay must be 30 phy clock: 500ns / 16.667nS = 30 clocks
// delay must be 30 phy clocks: 500ns / 16.667nS = 30 clocks
`define USBF_HMS_DEL 5'h1c
 
// After sending Data in response to an IN token from host, the
179,7 → 215,7
`define USBF_RX_ACK_TO_VAL_HS 8'd22
 
 
// After sending a OUT token the host must send a data packet.
// After sending an OUT token the host must send a data packet.
// The host has 622nS in Full Speed mode and 400nS in High Speed
// mode to send the data packet.
// TX_DATA_TO_VAL_FS and TX_DATA_TO_VAL_HS are is the numbers of
209,17 → 245,14
// The clear value is 62.5uS/0.25uS=250 cycles.
`define USBF_T1_C_62_5_US 8'd250
 
// mS counter representation of 100uS (100/62.5=1.6 -> 2)
`define USBF_T1_C_100_US 7'd2
 
// mS counter representation of 3.0mS (3.0/0.0625=48)
`define USBF_T1_C_3_0_MS 7'd48
`define USBF_T1_C_3_0_MS 8'd48
 
// mS counter representation of 3.125mS (3.125/0.0625=50)
`define USBF_T1_C_3_125_MS 7'd50
`define USBF_T1_C_3_125_MS 8'd50
 
// mS counter representation of 5mS (5/0.0625=80)
`define USBF_T1_C_5_MS 7'd50
`define USBF_T1_C_5_MS 8'd80
 
// Multi purpose Counter Prescaler, generate 2.5 uS period
// 2500/16.667ns=150 (minus 2 for pipeline)
232,21 → 265,21
// Indicate when internal wakeup has completed
// me_cnt counts 0.5 mS intervals. E.g.: 5.0mS are (5/0.5) 10 ticks
// Must be 0 =< 10 mS
`define USBF_T2_C_WAKEUP 10
`define USBF_T2_C_WAKEUP 8'd10
 
// Indicate when 100uS have passed
// me_ps2 counts 2.5uS intervals. 100uS are (100/2.5) 40 ticks
`define USBF_T2_C_100_US 40
`define USBF_T2_C_100_US 8'd40
 
// Indicate when 1.0 mS have passed
// me_cnt counts 0.5 mS intervals. 1.0mS are (1/0.5) 2 ticks
`define USBF_T2_C_1_0_MS 2
`define USBF_T2_C_1_0_MS 8'd2
 
// Indicate when 1.2 mS have passed
// me_cnt counts 0.5 mS intervals. 1.2mS are (1.2/0.5) 2 ticks
`define USBF_T2_C_1_2_MS 2
`define USBF_T2_C_1_2_MS 8'd2
 
// Indicate when 100 mS have passed
// me_cnt counts 0.5 mS intervals. 100mS are (100/0.5) 200 ticks
`define USBF_T2_C_100_MS 200
`define USBF_T2_C_100_MS 8'd200
 
/trunk/rtl/verilog/usbf_crc16.v
11,8 → 11,9
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2000 Rudolf Usselmann ////
//// rudi@asics.ws ////
//// 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 ////
37,10 → 38,10
 
// CVS Log
//
// $Id: usbf_crc16.v,v 1.1 2001-08-03 05:30:09 rudi Exp $
// $Id: usbf_crc16.v,v 1.2 2003-10-17 02:36:57 rudi Exp $
//
// $Date: 2001-08-03 05:30:09 $
// $Revision: 1.1 $
// $Date: 2003-10-17 02:36:57 $
// $Revision: 1.2 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
47,6 → 48,11
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.1 2001/08/03 05:30:09 rudi
//
//
// 1) Reorganized directory structure
//
// Revision 1.0 2001/03/07 09:17:12 rudi
//
//
/trunk/rtl/verilog/usbf_ep_rf.v
11,8 → 11,9
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2000 Rudolf Usselmann ////
//// rudi@asics.ws ////
//// 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 ////
37,10 → 38,10
 
// CVS Log
//
// $Id: usbf_ep_rf.v,v 1.3 2001-11-04 12:22:44 rudi Exp $
// $Id: usbf_ep_rf.v,v 1.4 2003-10-17 02:36:57 rudi Exp $
//
// $Date: 2001-11-04 12:22:44 $
// $Revision: 1.3 $
// $Date: 2003-10-17 02:36:57 $
// $Revision: 1.4 $
// $Author: rudi $
// $Locker: $
// $State: Exp $
47,6 → 48,11
//
// Change History:
// $Log: not supported by cvs2svn $
// Revision 1.3 2001/11/04 12:22:44 rudi
//
// - Fixed previous fix (brocke something else ...)
// - Majore Synthesis cleanup
//
// Revision 1.2 2001/11/03 03:26:22 rudi
//
// - Fixed several interrupt and error condition reporting bugs
147,7 → 153,7
reg [1:0] uc_bsel, uc_dpd;
 
reg [5:0] iena, ienb; // Interrupt enables
reg [6:0] is; // Interrupt status
reg [6:0] int_stat; // Interrupt status
 
wire we0, we1, we2, we3;
reg [31:0] buf0;
170,7 → 176,6
wire dma_req_in_d;
wire dma_req_out_d;
reg r1, r2, r4, r5;
wire r3;
wire dma_ack_i;
reg dma_req_out_hold, dma_req_in_hold ;
reg [11:0] buf0_orig_m3;
188,7 → 193,7
wire ep_out;
 
assign csr = {uc_bsel, uc_dpd, csr1, 1'h0, ots_stop, csr0};
assign int = { 2'h0, iena, 2'h0,ienb, 9'h0, is};
assign int = {2'h0, iena, 2'h0,ienb, 9'h0, int_stat};
assign dma_en = csr[15];
assign max_pl_sz = csr[10:0];
assign ep_in = csr[27:26]==2'b01;
213,60 → 218,80
assign we3 = (adr==2'h3) & we;
 
// Endpoint CSR Register
`ifdef USBF_ASYNC_RESET
always @(posedge clk or negedge rst)
`else
always @(posedge clk)
`endif
if(!rst)
begin
csr0 <= #1 13'h0;
csr1 <= #1 13'h0;
ots_stop <= #1 1'b0;
csr0 <= 13'h0;
csr1 <= 13'h0;
ots_stop <= 1'b0;
end
else
if(we0)
begin
csr0 <= #1 din[12:0];
ots_stop <= #1 din[13];
csr1 <= #1 din[27:15];
csr0 <= din[12:0];
ots_stop <= din[13];
csr1 <= din[27:15];
end
else
if(ots_stop & out_to_small)
csr1[8:7] <= #1 2'b01;
if(ots_stop && out_to_small)
csr1[8:7] <= 2'b01;
 
// Endpoint Interrupt Register
`ifdef USBF_ASYNC_RESET
always @(posedge clk or negedge rst)
`else
always @(posedge clk)
`endif
if(!rst)
begin
ienb <= #1 6'h0;
iena <= #1 6'h0;
ienb <= 6'h0;
iena <= 6'h0;
end
else
if(we1)
begin
ienb <= #1 din[21:16];
iena <= #1 din[29:24];
ienb <= din[21:16];
iena <= din[29:24];
end
 
// Endpoint Buffer Registers
`ifdef USBF_ASYNC_RESET
always @(posedge clk or negedge rst)
`else
always @(posedge clk)
if(!rst) buf0 <= #1 32'hffff_ffff;
`endif
if(!rst) buf0 <= 32'hffff_ffff;
else
if(we2) buf0 <= #1 din;
if(we2) buf0 <= din;
else
if(ep_match_r & buf0_rl) buf0 <= #1 buf0_orig;
if(ep_match_r && buf0_rl) buf0 <= buf0_orig;
else
if(ep_match_r & buf0_set) buf0 <= #1 idin;
if(ep_match_r && buf0_set) buf0 <= idin;
 
`ifdef USBF_ASYNC_RESET
always @(posedge clk or negedge rst)
`else
always @(posedge clk)
if(!rst) buf1 <= #1 32'hffff_ffff;
`endif
if(!rst) buf1 <= 32'hffff_ffff;
else
if(we3) buf1 <= #1 din;
if(we3) buf1 <= din;
else
if(ep_match_r &
(buf1_set | out_to_small)) buf1 <= #1 idin;
if(ep_match_r &&
(buf1_set || out_to_small)) buf1 <= idin;
 
`ifdef USBF_ASYNC_RESET
always @(posedge clk or negedge rst)
`else
always @(posedge clk)
if(!rst) buf0_orig <= #1 32'hffff_ffff;
`endif
if(!rst) buf0_orig <= 32'hffff_ffff;
else
if(we2) buf0_orig <= #1 din;
if(we2) buf0_orig <= din;
 
///////////////////////////////////////////////////////////////////
//
279,39 → 304,51
assign ep_match = (ep_sel == csr[21:18]);
 
always @(posedge clk)
ep_match_r <= #1 ep_match;
ep_match_r <= ep_match;
 
always @(posedge clk)
int_re <= #1 re & (adr == 2'h1);
int_re <= re & (adr == 2'h1);
 
// Interrupt Sources
`ifdef USBF_ASYNC_RESET
always @(posedge clk or negedge rst)
`else
always @(posedge clk)
if(!rst) is <= #1 7'h0;
`endif
if(!rst) int_stat <= 7'h0;
else
if(int_re) is <= #1 7'h0;
if(int_re) int_stat <= 7'h0;
else
if(ep_match_r)
begin
if(out_to_small) is[6] <= #1 1'b1;
if(int_seqerr_set) is[5] <= #1 1'b1;
if(int_buf1_set) is[4] <= #1 1'b1;
if(int_buf0_set) is[3] <= #1 1'b1;
if(int_upid_set) is[2] <= #1 1'b1;
if(int_crc16_set) is[1] <= #1 1'b1;
if(int_to_set) is[0] <= #1 1'b1;
if(out_to_small) int_stat[6] <= 1'b1;
if(int_seqerr_set) int_stat[5] <= 1'b1;
if(int_buf1_set) int_stat[4] <= 1'b1;
if(int_buf0_set) int_stat[3] <= 1'b1;
if(int_upid_set) int_stat[2] <= 1'b1;
if(int_crc16_set) int_stat[1] <= 1'b1;
if(int_to_set) int_stat[0] <= 1'b1;
end
 
// PID toggle track bits
`ifdef USBF_ASYNC_RESET
always @(posedge clk or negedge rst)
`else
always @(posedge clk)
if(!rst) uc_dpd <= #1 2'h0;
`endif
if(!rst) uc_dpd <= 2'h0;
else
if(ep_match_r & uc_dpd_set) uc_dpd <= #1 idin[3:2];
if(ep_match_r && uc_dpd_set) uc_dpd <= idin[3:2];
 
// Buffer toggle track bits
`ifdef USBF_ASYNC_RESET
always @(posedge clk or negedge rst)
`else
always @(posedge clk)
if(!rst) uc_bsel <= #1 2'h0;
`endif
if(!rst) uc_bsel <= 2'h0;
else
if(ep_match_r & uc_bsel_set) uc_bsel <= #1 idin[1:0];
if(ep_match_r && uc_bsel_set) uc_bsel <= idin[1:0];
 
///////////////////////////////////////////////////////////////////
//
319,22 → 356,22
//
 
always @(posedge wclk)
inta <= #1 (is[0] & iena[0]) |
(is[1] & iena[1]) |
(is[2] & iena[2]) |
(is[3] & iena[3]) |
(is[4] & iena[3]) |
(is[5] & iena[4]) |
(is[6] & iena[5]);
inta <= (int_stat[0] & iena[0]) |
(int_stat[1] & iena[1]) |
(int_stat[2] & iena[2]) |
(int_stat[3] & iena[3]) |
(int_stat[4] & iena[3]) |
(int_stat[5] & iena[4]) |
(int_stat[6] & iena[5]);
 
always @(posedge wclk)
intb <= #1 (is[0] & ienb[0]) |
(is[1] & ienb[1]) |
(is[2] & ienb[2]) |
(is[3] & ienb[3]) |
(is[4] & ienb[3]) |
(is[5] & ienb[4]) |
(is[6] & ienb[5]);
intb <= (int_stat[0] & ienb[0]) |
(int_stat[1] & ienb[1]) |
(int_stat[2] & ienb[2]) |
(int_stat[3] & ienb[3]) |
(int_stat[4] & ienb[3]) |
(int_stat[5] & ienb[4]) |
(int_stat[6] & ienb[5]);
 
///////////////////////////////////////////////////////////////////
//
343,16 → 380,17
 
// DMA OUT endpoint counter
always @(posedge clk)
if(!dma_en) dma_out_cnt <= #1 12'h0;
if(!dma_en) dma_out_cnt <= 12'h0;
else
if(dma_ack_i) dma_out_cnt <= #1 dma_out_cnt - 12'h1;
if(dma_ack_i) dma_out_cnt <= dma_out_cnt - 12'h1;
else
if(set_r | buf0_set | buf0_rl) dma_out_cnt <= #1 dma_out_cnt + {3'h0, max_pl_sz[10:2]};
if(ep_match_r && (set_r || buf0_set || buf0_rl))
dma_out_cnt <= dma_out_cnt + {3'h0, max_pl_sz[10:2]};
 
// If buf0_set or buf0_rl was asserted at the same time as dma_ack_i
// remember it and perform the add next cycle ...
always @(posedge clk)
set_r <= #1 dma_ack_i & (buf0_set | buf0_rl);
set_r <= dma_ack_i & (buf0_set | buf0_rl);
 
// This signal is used to keep dma_req asserted when we know there is
// plenty of data in the buffer.
361,31 → 399,32
// This is because of the sync logic - it has to propagate first
// before we can determine that the buffer is really empty.
always @(posedge wclk)
dma_req_out_hold <= #1 |dma_out_cnt[11:2] & ep_out;
dma_req_out_hold <= |dma_out_cnt[11:2] & ep_out;
 
assign dma_out_cnt_is_zero = dma_out_cnt == 12'h0;
 
// DMA IN endpoint counter
always @(posedge clk)
if(!dma_en) dma_in_cnt <= #1 12'h0;
if(!dma_en) dma_in_cnt <= 12'h0;
else
if(dma_ack_i) dma_in_cnt <= #1 dma_in_cnt + 12'h1;
if(dma_ack_i) dma_in_cnt <= dma_in_cnt + 12'h1;
else
if(set_r | buf0_set | buf0_rl) dma_in_cnt <= #1 dma_in_cnt - {3'h0, max_pl_sz[10:2]};
if(ep_match_r && (set_r || buf0_set || buf0_rl))
dma_in_cnt <= dma_in_cnt - {3'h0, max_pl_sz[10:2]};
 
// Indicates to Protocol Engine when we have gotten at least one packet in to buffer
// This is for IN transfers only
always @(posedge clk)
dma_in_buf_sz1 <= #1 (dma_in_cnt >= {3'h0,max_pl_sz[10:2]}) &
dma_in_buf_sz1 <= (dma_in_cnt >= {3'h0,max_pl_sz[10:2]}) &
(max_pl_sz[10:0] != 11'h0);
 
// Indicates to Protocol Engine that there is space for at least one MAX_PL_SZ
// packet in buffer. OUT transfers only.
always @(posedge clk)
dma_out_left <= #1 (buf0_orig[30:19] - dma_out_cnt);
dma_out_left <= (buf0_orig[30:19] - dma_out_cnt);
 
always @(posedge clk)
dma_out_buf_avail <= #1 (dma_out_left >= {3'h0, max_pl_sz[10:2]});
dma_out_buf_avail <= (dma_out_left >= {3'h0, max_pl_sz[10:2]});
 
// DMA Request Generation
assign dma_req_d = dma_en & (dma_req_in_d | dma_req_out_d);
398,52 → 437,69
 
 
always @(posedge wclk)
buf0_orig_m3 <= #1 buf0_orig[30:19] - 12'h3;
buf0_orig_m3 <= buf0_orig[30:19] - 12'h3;
 
reg dma_req_in_hold2;
 
always @(posedge wclk)
dma_req_in_hold <= #1 ep_in & |buf0_orig[30:21] & (dma_in_cnt < buf0_orig_m3);
dma_req_in_hold2 <= (dma_in_cnt < buf0_orig_m3);
 
assign dma_req_hold = ep_out ? dma_req_out_hold : dma_req_in_hold;
always @(posedge wclk)
dma_req_in_hold <= ep_in & |buf0_orig[30:21];
 
assign dma_req_hold = ep_out ? dma_req_out_hold : (dma_req_in_hold & dma_req_in_hold2);
 
// Generate a Sync. Request
assign dma_req = dma_req_r;
 
`ifdef USBF_ASYNC_RESET
always @(posedge wclk or negedge rst)
`else
always @(posedge wclk)
if(!rst) dma_req_r <= #1 1'b0;
`endif
if(!rst) dma_req_r <= 1'b0;
else
if(r1 & !r2) dma_req_r <= #1 1'b1;
if(r1 && !r2) dma_req_r <= 1'b1;
else
if(dma_ack & !dma_req_hold) dma_req_r <= #1 1'b0;
if(dma_ack && !dma_req_hold) dma_req_r <= 1'b0;
 
always @(posedge wclk)
r1 <= #1 dma_req_d & !r2 & !r4 & !r5;
r1 <= dma_req_d & !r2 & !r4 & !r5;
 
`ifdef USBF_ASYNC_RESET
always @(posedge wclk or negedge rst)
`else
always @(posedge wclk)
if(!rst) r2 <= #1 1'b0;
`endif
if(!rst) r2 <= 1'b0;
else
if(r1) r2 <= #1 1'b1;
if(r1) r2 <= 1'b1;
else
if(r4) r2 <= #1 1'b0;
if(r4) r2 <= 1'b0;
 
// Synchronize ACK
reg dma_ack_wr1;
reg dma_ack_clr1;
 
`ifdef USBF_ASYNC_RESET
always @(posedge wclk or negedge rst)
`else
always @(posedge wclk)
if(!rst) dma_ack_wr1 <= #1 1'b0;
`endif
if(!rst) dma_ack_wr1 <= 1'b0;
else
if(dma_ack) dma_ack_wr1 <= #1 1'b1;
if(dma_ack) dma_ack_wr1 <= 1'b1;
else
if(dma_ack_clr1) dma_ack_wr1 <= #1 1'b0;
if(dma_ack_clr1) dma_ack_wr1 <= 1'b0;
 
always @(posedge wclk)
dma_ack_clr1 <= #1 r4;
dma_ack_clr1 <= r4;
 
always @(posedge clk)
r4 <= #1 dma_ack_wr1;
r4 <= dma_ack_wr1;
 
always @(posedge clk)
r5 <= #1 r4;
r5 <= r4;
 
assign dma_ack_i = r5;
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.