📄 usb1_core.v
字号:
wire [7:0] ep0_dout;wire ep0_re, ep0_we;wire [13:0] ep0_cfg;wire [7:0] ep0_size;wire [7:0] ep0_ctrl_dout, ep0_ctrl_din;wire ep0_ctrl_re, ep0_ctrl_we;wire [3:0] ep0_ctrl_stat;wire ctrl_setup, ctrl_in, ctrl_out;wire send_stall;wire token_valid;reg rst_local; // internal resetwire dropped_frame;wire misaligned_frame;wire v_set_int;wire v_set_feature;wire [15:0] wValue;wire [15:0] wIndex;reg ep_bf_en;reg [6:0] ep_bf_size;wire [6:0] rom_adr;wire [7:0] rom_data;/////////////////////////////////////////////////////////////////////// Misc Logic//// Endpoint type and Max transfer sizeassign ep0_cfg = `CTRL | ep0_size;//惟独ep0_cfg的计算方法最特别,其他的都不是在本地算的always @(posedge clk_i) rst_local <= #1 rst_i & ~usb_rst;//usb_rst可能是低电平有效,所以才要取反/////////////////////////////////////////////////////////////////////// Module Instantiations//usb_phy phy( .clk( clk_i ), .rst( rst_i ), // ONLY external reset .phy_tx_mode( phy_tx_mode ),//外部提供 .usb_rst( usb_rst ),//供给外部 // Transceiver Interface这是什么?? .rxd( rx_d ), .rxdp( rx_dp ), .rxdn( rx_dn ), .txdp( tx_dp ), .txdn( tx_dn ), .txoe( tx_oe ), // UTMI Interface .DataIn_o( DataIn ), .RxValid_o( RxValid ), .RxActive_o( RxActive ), .RxError_o( RxError ), .DataOut_i( DataOut ), .TxValid_i( TxValid ), .TxReady_o( TxReady ), .LineState_o( LineState )//没用 );// UTMI Interfaceusb1_utmi_if u0( .phy_clk( clk_i ), .rst( rst_local ), .DataOut( DataOut ), .TxValid( TxValid ), .TxReady( TxReady ), .RxValid( RxValid ), .RxActive( RxActive ), .RxError( RxError ), .DataIn( DataIn ), .rx_data( rx_data ), .rx_valid( rx_valid ), .rx_active( rx_active ), .rx_err( rx_err ), .tx_data( tx_data ), .tx_valid( tx_valid ), .tx_valid_last( tx_valid_last ), .tx_ready( tx_ready ), .tx_first( tx_first ) );// Protocol Layerusb1_pl u1( .clk( clk_i ),//外壳引脚 .rst( rst_local ),//本地信号 .rx_data( rx_data ),//来自utmi接口 .rx_valid( rx_valid ),//来自utmi接口 .rx_active( rx_active ),//来自utmi接口 .rx_err( rx_err ),//来自utmi接口 .tx_data( tx_data ),//给utmi接口 .tx_valid( tx_valid ),//给utmi接口 .tx_valid_last( tx_valid_last ),//给utmi接口 .tx_ready( tx_ready ),//来自utmi接口 .tx_first( tx_first ),//给utmi接口 .tx_valid_out( TxValid ),//来自utmi接口 .token_valid( token_valid ),//本地信号 .fa( funct_adr ),//与ctrl相关联 .ep_sel( ep_sel ),//外部引脚,有点混沌 .x_busy( usb_busy ),//外部引脚 .int_crc16_set( crc16_err ),//外部引脚 .int_to_set( int_to_set ),//本地信号 .int_seqerr_set( int_seqerr_set ),//本地信号 .frm_nat( frm_nat ),//与ctrl相关联 .pid_cs_err( pid_cs_err ),//本地信号 .nse_err( nse_err ),//本地信号 .crc5_err( crc5_err ),//本地信号 .rx_size( rx_size ),//本地信号 .rx_done( rx_done ),//本地信号 .ctrl_setup( ctrl_setup ),//与ctrl相关联 .ctrl_in( ctrl_in ),//与ctrl相关联 .ctrl_out( ctrl_out ),//与ctrl相关联 .ep_bf_en( ep_bf_en ),//本地信号 .ep_bf_size( ep_bf_size ),//本地信号 .dropped_frame( dropped_frame ),//外部引脚 .misaligned_frame( misaligned_frame ),//外部引脚 .csr( cfg ),//本地信号 .tx_data_st( tx_data_st ),//本地信号 .rx_data_st( rx_data_st ),//与ctrl endpoint fifo相关联 .idma_re( idma_re ),//不明 .idma_we( idma_we ),//不明 .ep_empty( ep_empty ),//本地信号 .ep_full( ep_full ),//本地信号 .send_stall( send_stall )//与ctrl相关联 );usb1_ctrl u4( .clk( clk_i ), .rst( rst_local ), .rom_adr( rom_adr ), .rom_data( rom_data ), .ctrl_setup( ctrl_setup ), .ctrl_in( ctrl_in ), .ctrl_out( ctrl_out ), .ep0_din( ep0_ctrl_dout ), .ep0_dout( ep0_ctrl_din ), .ep0_re( ep0_ctrl_re ), .ep0_we( ep0_ctrl_we ), .ep0_stat( ep0_ctrl_stat ), .ep0_size( ep0_size ), .send_stall( send_stall ), .frame_no( frm_nat[26:16] ), .funct_adr( funct_adr ), .configured( ), .halt( ), .v_set_int( v_set_int ), .v_set_feature( v_set_feature ), .wValue( wValue ), .wIndex( wIndex ), .vendor_data( vendor_data ) );usb1_rom1 rom1( .clk( clk_i ), .adr( rom_adr ), .dout( rom_data ) );// CTRL Endpoint FIFOgeneric_fifo_sc_a #(8,6,0) u10( //这是控制端点的接收缓冲fifo .clk( clk_i ), .rst( rst_i ), .clr( usb_rst ), .din( rx_data_st ), .we( ep0_we ),//写接收用fifo的信号产生于本地 .dout( ep0_ctrl_dout ),//给了ctrl的epo_din .re( ep0_ctrl_re ),//来自ctrl的ep0_re .full_r( ), .empty_r( ), .full( ep0_full ),//fifo满的信号输出给ep0_full,但有个严重的问题,ep0_full没有定义啊!!! .empty( ep0_ctrl_stat[1] ),//fifo空的信号给了ctrl模块 .full_n( ), .empty_n( ), .full_n_r( ), .empty_n_r( ), .level( ) );generic_fifo_sc_a #(8,6,0) u11( //控制端点的发送缓冲fifo .clk( clk_i ), .rst( rst_i ), .clr( usb_rst ), .din( ep0_ctrl_din ),//接收来自ctrl的ep0_dout .we( ep0_ctrl_we ),//接收来自ctrl的ep0_we .dout( ep0_dout ),//直接送到本地的wire型变量ep0_dout上,再由ep_sel决定是否送到tx_data_st. .re( ep0_re ),//本地产生该信号并送入fifo模块中 .full_r( ), .empty_r( ), .full( ep0_ctrl_stat[2] ),//给了ctrl .empty( ep0_empty ),//fifo空的信号输出给ep0_empty,但是有个严重的问题,ep0_empty没有定义 .full_n( ), .empty_n( ), .full_n_r( ), .empty_n_r( ), .level( ) );/////////////////////////////////////////////////////////////////////// Endpoint FIFO Interfaces//always @(ep_sel or ep0_cfg or ep1_cfg or ep2_cfg or ep3_cfg or ep4_cfg or ep5_cfg or ep6_cfg or ep7_cfg) case(ep_sel) // synopsys full_case parallel_case 4'h0: cfg = ep0_cfg; 4'h1: cfg = ep1_cfg; 4'h2: cfg = ep2_cfg; 4'h3: cfg = ep3_cfg; 4'h4: cfg = ep4_cfg; 4'h5: cfg = ep5_cfg; 4'h6: cfg = ep6_cfg; 4'h7: cfg = ep7_cfg; endcase// In endpoints onlyalways @(posedge clk_i) case(ep_sel) // synopsys full_case parallel_case 4'h0: tx_data_st <= #1 ep0_dout; 4'h1: tx_data_st <= #1 ep1_din; 4'h2: tx_data_st <= #1 ep2_din; 4'h3: tx_data_st <= #1 ep3_din; 4'h4: tx_data_st <= #1 ep4_din; 4'h5: tx_data_st <= #1 ep5_din; 4'h6: tx_data_st <= #1 ep6_din; 4'h7: tx_data_st <= #1 ep7_din; endcase// In endpoints onlyalways @(posedge clk_i) case(ep_sel) // synopsys full_case parallel_case 4'h0: ep_empty <= #1 ep0_empty; 4'h1: ep_empty <= #1 ep1_empty; 4'h2: ep_empty <= #1 ep2_empty; 4'h3: ep_empty <= #1 ep3_empty; 4'h4: ep_empty <= #1 ep4_empty; 4'h5: ep_empty <= #1 ep5_empty; 4'h6: ep_empty <= #1 ep6_empty; 4'h7: ep_empty <= #1 ep7_empty; endcase// OUT endpoints only主机向设备传输always @(ep_sel or ep0_full or ep1_full or ep2_full or ep3_full or ep4_full or ep5_full or ep6_full or ep7_full) case(ep_sel) // synopsys full_case parallel_case 4'h0: ep_full = ep0_full; 4'h1: ep_full = ep1_full; 4'h2: ep_full = ep2_full; 4'h3: ep_full = ep3_full; 4'h4: ep_full = ep4_full; 4'h5: ep_full = ep5_full; 4'h6: ep_full = ep6_full; 4'h7: ep_full = ep7_full; endcasealways @(posedge clk_i) case(ep_sel) // synopsys full_case parallel_case 4'h0: ep_bf_en = 1'b0; 4'h1: ep_bf_en = ep1_bf_en; 4'h2: ep_bf_en = ep2_bf_en; 4'h3: ep_bf_en = ep3_bf_en; 4'h4: ep_bf_en = ep4_bf_en; 4'h5: ep_bf_en = ep5_bf_en; 4'h6: ep_bf_en = ep6_bf_en; 4'h7: ep_bf_en = ep7_bf_en; endcasealways @(posedge clk_i) case(ep_sel) // synopsys full_case parallel_case,bf的含义是block frame的意思 4'h1: ep_bf_size = ep1_bf_size; 4'h2: ep_bf_size = ep2_bf_size; 4'h3: ep_bf_size = ep3_bf_size; 4'h4: ep_bf_size = ep4_bf_size; 4'h5: ep_bf_size = ep5_bf_size; 4'h6: ep_bf_size = ep6_bf_size; 4'h7: ep_bf_size = ep7_bf_size; endcaseassign ep1_dout = rx_data_st;//名字的习惯我很不喜欢,坚决认为应该用ep1_din的assign ep2_dout = rx_data_st;assign ep3_dout = rx_data_st;assign ep4_dout = rx_data_st;assign ep5_dout = rx_data_st;assign ep6_dout = rx_data_st;assign ep7_dout = rx_data_st;assign ep0_re = idma_re & (ep_sel == 4'h00);assign ep1_re = idma_re & (ep_sel == 4'h01) & !ep1_empty;assign ep2_re = idma_re & (ep_sel == 4'h02) & !ep2_empty;assign ep3_re = idma_re & (ep_sel == 4'h03) & !ep3_empty;assign ep4_re = idma_re & (ep_sel == 4'h04) & !ep4_empty;assign ep5_re = idma_re & (ep_sel == 4'h05) & !ep5_empty;assign ep6_re = idma_re & (ep_sel == 4'h06) & !ep6_empty;assign ep7_re = idma_re & (ep_sel == 4'h07) & !ep7_empty;assign ep0_we = idma_we & (ep_sel == 4'h00);assign ep1_we = idma_we & (ep_sel == 4'h01) & !ep1_full;assign ep2_we = idma_we & (ep_sel == 4'h02) & !ep2_full;assign ep3_we = idma_we & (ep_sel == 4'h03) & !ep3_full;assign ep4_we = idma_we & (ep_sel == 4'h04) & !ep4_full;assign ep5_we = idma_we & (ep_sel == 4'h05) & !ep5_full;assign ep6_we = idma_we & (ep_sel == 4'h06) & !ep6_full;assign ep7_we = idma_we & (ep_sel == 4'h07) & !ep7_full;endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -