📄 usbf_utmi_ls.v
字号:
///////////////////////////////////////////////////////////////////////// //////// UTMI Line Status & Speed Negotiation block //////// //////// //////// Author: Rudolf Usselmann //////// rudi@asics.ws //////// //////// //////// Downloaded from: http://www.opencores.org/cores/usb/ //////// ///////////////////////////////////////////////////////////////////////////// //////// Copyright (C) 2000 Rudolf Usselmann //////// rudi@asics.ws //////// //////// This source file may be used and distributed without //////// restriction provided that this copyright statement is not //////// removed from the file and that any derivative work contains //////// the original copyright notice and the associated disclaimer.//////// //////// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //////// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //////// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //////// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //////// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //////// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //////// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //////// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //////// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //////// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //////// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //////// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //////// POSSIBILITY OF SUCH DAMAGE. //////// /////////////////////////////////////////////////////////////////////////// CVS Log//// $Id: usbf_utmi_ls.v,v 1.2 2001/08/10 08:48:33 rudi Exp $//// $Date: 2001/08/10 08:48:33 $// $Revision: 1.2 $// $Author: rudi $// $Locker: $// $State: Exp $//// Change History:// $Log: usbf_utmi_ls.v,v $// Revision 1.2 2001/08/10 08:48:33 rudi//// - Changed IO names to be more clear.// - Uniquifyed define names to be core specific.//// Revision 1.1 2001/08/03 05:30:09 rudi////// 1) Reorganized directory structure//// Revision 1.2 2001/03/31 13:00:52 rudi//// - Added Core configuration// - Added handling of OUT packets less than MAX_PL_SZ in DMA mode// - Modified WISHBONE interface and sync logic// - Moved SSRAM outside the core (added interface)// - Many small bug fixes ...//// Revision 1.1 2001/03/07 09:08:13 rudi//// Added USB control signaling (Line Status) block. Fixed some minor// typos, added resume bit and signal.//////`include "usbf_defines.v"module usbf_utmi_ls( clk, rst, resume_req, // UTMI Interface rx_active, tx_ready, drive_k, XcvSelect, TermSel, SuspendM, LineState, OpMode, usb_vbus, // Misc Interfaces mode_hs, usb_reset, usb_suspend, usb_attached );input clk;input rst;input resume_req;input rx_active, tx_ready;output drive_k;output XcvSelect;output TermSel;output SuspendM;input [1:0] LineState;output [1:0] OpMode;input usb_vbus;output mode_hs; // High Speed Modeoutput usb_reset; // USB Resetoutput usb_suspend; // USB Suspendoutput usb_attached; // Attached to USB/////////////////////////////////////////////////////////////////////// Parameters//parameter [14:0] // synopsys enum state POR = 15'b000_0000_0000_0001, NORMAL = 15'b000_0000_0000_0010, 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_WAIT = 15'b000_0000_0100_0000, RESUME_SIG = 15'b000_0000_1000_0000, ATTACH = 15'b000_0001_0000_0000, RESET = 15'b000_0010_0000_0000, SPEED_NEG = 15'b000_0100_0000_0000, SPEED_NEG_K = 15'b000_1000_0000_0000, SPEED_NEG_J = 15'b001_0000_0000_0000, SPEED_NEG_HS = 15'b010_0000_0000_0000, SPEED_NEG_FS = 15'b100_0000_0000_0000;/////////////////////////////////////////////////////////////////////// Local Wires and Registers//reg [14:0] /* synopsys enum state */ state, next_state;// synopsys state_vector statereg [1:0] line_state_r;reg mode_hs, mode_set_hs, mode_set_fs;reg usb_suspend, suspend_set, suspend_clr;reg usb_attached, attached_set, attached_clr;reg TermSel, fs_term_on, fs_term_off;reg XcvSelect, xcv_set_hs, xcv_set_fs;reg [1:0] OpMode;reg bit_stuff_on, bit_stuff_off;reg usb_reset, usb_reset_d;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;wire ls_idle;reg idle_long;wire idle_long_set, idle_long_clr;wire k_long, j_long, se0_long;reg drive_k, drive_k_d;reg [3:0] ps_cnt;reg ps_cnt_clr;reg idle_cnt_clr;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_3_125_mS, T1_gt_5_0_mS;reg [7:0] me_ps;reg me_cnt_clr;reg me_ps_2_5_us;reg [7:0] me_ps2;reg me_ps2_0_5_ms;reg [7:0] me_cnt;reg me_cnt_100_ms;reg T2_gt_100_uS, T2_wakeup, T2_gt_1_0_mS, T2_gt_1_2_mS;reg [2:0] chirp_cnt;reg chirp_cnt_clr, chirp_cnt_inc;reg chirp_cnt_is_6;wire resume_req_sr;/////////////////////////////////////////////////////////////////////// Misc Logic//always @(posedge clk) drive_k <= #1 drive_k_d;assign SuspendM = (usb_suspend & !resume_req_sr) | (LineState == 2'b10);assign resume_req_sr = (!rst | usb_suspend) ? 0 : resume_req ? 1 : resume_req_sr;// ---------------------------------------------------------// USB State/Operation Mode JK Flopsalways @(posedge clk) if(mode_set_fs) mode_hs <= #1 0; else if(mode_set_hs) mode_hs <= #1 1;always @(posedge clk) if(suspend_clr) usb_suspend <= #1 0; else if(suspend_set) usb_suspend <= #1 1;always @(posedge clk) if(attached_clr) usb_attached <= #1 0; else if(attached_set) usb_attached <= #1 1;always @(posedge clk) if(fs_term_off) TermSel <= #1 0; else if(fs_term_on) TermSel <= #1 1;always @(posedge clk) if(xcv_set_fs) XcvSelect <= #1 1; else if(xcv_set_hs) XcvSelect <= #1 0;always @(posedge clk) if(bit_stuff_off) OpMode <= #1 2'b10; else if(bit_stuff_on) OpMode <= #1 2'b00;always @(posedge clk) usb_reset <= #1 usb_reset_d;// ---------------------------------------------------------// Line State Detectoralways @(posedge clk) line_state_r <= #1 LineState;assign ls_se0 = (line_state_r == 2'b00);assign ls_j = (line_state_r == 2'b01);assign ls_k = (line_state_r == 2'b10);assign ls_se1 = (line_state_r == 2'b11);assign ls_idle = mode_hs ? ls_se0 : ls_j;// Idle Detection// Idle Has to persist for at least two cycles in a roe in the// same state to recognizedalways @(posedge clk) ls_idle_r <= #1 ls_idle;assign idle_long_set = ls_idle & ls_idle_r;assign idle_long_clr = !ls_idle & !ls_idle_r;always @(posedge clk) if(!rst) idle_long <= #1 0; else if(idle_long_clr) idle_long <= #1 0; else if(idle_long_set) idle_long <= #1 1;// Detect Signals for two cycles ina row before making a transaction ...always @(posedge clk) ls_k_r <= #1 ls_k;always @(posedge clk) ls_j_r <= #1 ls_j;always @(posedge clk) ls_se0_r <= #1 ls_se0;assign k_long = ls_k & ls_k_r;assign j_long = ls_j & ls_j_r;assign se0_long = ls_se0 & ls_se0_r;/////////////////////////////////////////////////////////////////////// Counters//// ---------------------------------------------------------// idle Counter// 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 0; else ps_cnt <= #1 ps_cnt + 1;always @(posedge clk) // Clear the pre-scaler in 250 nS intervals ps_cnt_clr <= #1 (ps_cnt == `USBF_T1_PS_250_NS);// Count uSalways @(posedge clk) if(!idle_long | idle_cnt1_clr | idle_cnt_clr) idle_cnt1 <= #1 0; else if(!T1_gt_3_125_mS & ps_cnt_clr) idle_cnt1 <= #1 idle_cnt1_next;always @(posedge clk) idle_cnt1_next <= #1 idle_cnt1 + 1;always @(posedge clk) // Clear the uS counter every 62.5 uS idle_cnt1_clr <= #1 idle_cnt1 == `USBF_T1_C_62_5_US;// Count mSalways @(posedge clk) if(!idle_long | idle_cnt_clr) idle_cnt2 <= #1 0; else if(!T1_gt_5_0_mS & idle_cnt1_clr) idle_cnt2 <= #1 idle_cnt2 + 1;always @(posedge clk) // Greater Than 2.5uS (Actual Time will be T0+2.75uS)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -