📄 usbf_utmi_if.v
字号:
`include "usbf_defines.v"module usbf_utmi_if( // UTMI接口部分的端口定义 phy_clk, rst, DataOut, TxValid, TxReady, RxValid, RxActive, RxError, DataIn, XcvSelect, TermSel, SuspendM, LineState, OpMode, usb_vbus, // 内部接口 rx_data, rx_valid, rx_active, rx_err, tx_data, tx_valid, tx_valid_last, tx_ready, tx_first, // 其他接口 mode_hs, usb_reset, usb_suspend, usb_attached, resume_req, suspend_clr);input phy_clk; //工作时钟input rst; //复位output [7:0] DataOut; //输出数据output TxValid; //有效的数据传送input TxReady; //数据传送就绪input [7:0] DataIn; //输入数据input RxValid; //有效的接收input RxActive; //接收准备就绪input RxError; //接收出错output XcvSelect; //通信模式选择output TermSel; //通信模式操作output SuspendM; //挂起标志input [1:0] LineState; //节点连线状态output [1:0] OpMode; //操作模式input usb_vbus; //USB总线状态output [7:0] rx_data; //接收数据output rx_valid, rx_active, rx_err; //接收标志信号input [7:0] tx_data; //传送数据input tx_valid; //本次传送是否有效input tx_valid_last; //上一次传送是否有效output tx_ready; //数据传送就绪input tx_first; //第一次传送数据output mode_hs; //高速模式output usb_reset; //USB复位output usb_suspend; //USB挂起output usb_attached; //设备连接至USBinput resume_req; //恢复请求output suspend_clr; //挂起状态清除//模块内部连线与寄存器资源定义reg [7:0] rx_data; //接收数据字节寄存器reg rx_valid, rx_active, rx_err; //数据接收状态寄存器reg [7:0] DataOut; //输出数据字节寄存器reg tx_ready; //数据传送就绪标志寄存器reg TxValid; //有效数据传送标志寄存器wire drive_k; //强制输出reg drive_k_r; //数据接收操作的输入寄存器行为描述`ifdef USBF_ASYNC_RESETalways @(posedge phy_clk or negedge rst) `elsealways @(posedge phy_clk) //没有复位信号`endif if(!rst) rx_valid <= 1'b0; //若发现复位信号,则数据接收无效 else rx_valid <= RxValid; //否则数据接收状态与UTMI接口的状态一致//数据接收状态准备就绪,等待接收数据`ifdef USBF_ASYNC_RESETalways @(posedge phy_clk or negedge rst)`elsealways @(posedge phy_clk)`endif if(!rst) rx_active <= 1'b0; else rx_active <= RxActive;//数据接收出错`ifdef USBF_ASYNC_RESETalways @(posedge phy_clk or negedge rst)`elsealways @(posedge phy_clk)`endif if(!rst) rx_err <= 1'b0; else rx_err <= RxError;//开始接收数据always @(posedge phy_clk) rx_data <= DataIn;//数据发送操作的输出/输入寄存器行为描述//是否开始输出数据always @(posedge phy_clk) if(TxReady || tx_first) DataOut <= tx_data; else if(drive_k) DataOut <= 8'h00; //若强制输出,则输出0x00//数据发送就绪状态与UTMI接口部分一致always @(posedge phy_clk) tx_ready <= TxReady;always @(posedge phy_clk) drive_k_r <= drive_k;//有效的数据发送标志信号`ifdef USBF_ASYNC_RESETalways @(posedge phy_clk or negedge rst)`elsealways @(posedge phy_clk)`endif if(!rst) TxValid <= 1'b0; else TxValid <= tx_valid | drive_k | tx_valid_last | (TxValid & !(TxReady | drive_k_r));// Line Status Signaling & Speed Negotiation Block//usbf_utmi_ls u0( .clk( phy_clk ), .rst( rst ), .resume_req( resume_req ), .rx_active( rx_active ), .tx_ready( tx_ready ), .drive_k( drive_k ), .XcvSelect( XcvSelect ), .TermSel( TermSel ), .SuspendM( SuspendM ), .LineState( LineState ), .OpMode( OpMode ), .usb_vbus( usb_vbus ), .mode_hs( mode_hs ), .usb_reset( usb_reset ), .usb_suspend( usb_suspend ), .usb_attached( usb_attached ), .suspend_clr( suspend_clr ) );endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -