FPGA实现USB转UART串口的开源代码-FPGA开源项目论坛-FPGA CPLD-ChipDebug

FPGA实现USB转UART串口的开源代码

该帖子部分内容已隐藏
付费阅读
3积分
此内容为付费阅读,请付费后查看

该组件是一个简单的 USB 外设接口(设备)实现,枚举为高速 (480Mbit/s) 或全速 (12Mbit/s) CDC-ACM 设备。

该 IP 充当 USB 到串行端口 (UART) 转换器,可用于将 UART 添加到具有 ULPI 接口的 FPGA。

特征
  • 高速或全速 USB CDC 设备。
  • 硬件枚举 – 无需软件干预。
  • ULPI 接口(适合连接到 ULPI PHY – 例如 Microchip USB3300)
  • 固定波特率(参数)Rx、Tx 引脚。
实例化示例 (Xilinx)
module usb_serial
//-----------------------------------------------------------------
// Params
//-----------------------------------------------------------------
#(
    parameter BAUDRATE         = 1000000
)
//-----------------------------------------------------------------
// Ports
//-----------------------------------------------------------------
(
      output          uart_rx_o
    , input           uart_tx_i

    // ULPI Interface
    , output          ulpi_reset_o
    , inout [7:0]     ulpi_data_io
    , output          ulpi_stp_o
    , input           ulpi_nxt_i
    , input           ulpi_dir_i
    , input           ulpi_clk60_i
);

// USB clock / reset
wire usb_clk_w;
wire usb_rst_w;

wire clk_bufg_w;
IBUF u_ibuf ( .I(ulpi_clk60_i), .O(clk_bufg_w) );
BUFG u_bufg ( .I(clk_bufg_w),   .O(usb_clk_w) );

reg [3:0] count_q = 4'b0;
reg       rst_q   = 1'b1;

always @(posedge usb_clk_w) 
if (count_q != 4'hF)
    count_q <= count_q + 4'd1;
else
    rst_q <= 1'b0;

assign usb_rst_w = rst_q;

// ULPI Buffers
wire [7:0] ulpi_out_w;
wire [7:0] ulpi_in_w;
wire       ulpi_stp_w;

genvar i;
generate  
for (i=0; i < 8; i=i+1)  
begin: gen_buf
    IOBUF 
    #(
        .DRIVE(12),
        .IOSTANDARD("DEFAULT"),
        .SLEW("FAST")
    )
    IOBUF_inst
    (
        .T(ulpi_dir_i),
        .I(ulpi_out_w[i]),
        .O(ulpi_in_w[i]),
        .IO(ulpi_data_io[i])
    );
end  
endgenerate  

OBUF 
#(
    .DRIVE(12),
    .IOSTANDARD("DEFAULT"),
    .SLEW("FAST")
)
OBUF_stp
(
    .I(ulpi_stp_w),
    .O(ulpi_stp_o)
);

// USB Core
usb_cdc_top
#( .BAUDRATE(BAUDRATE) )
u_usb
(
     .clk_i(usb_clk_w)
    ,.rst_i(usb_rst_w)

    // ULPI
    ,.ulpi_data_out_i(ulpi_in_w)
    ,.ulpi_dir_i(ulpi_dir_i)
    ,.ulpi_nxt_i(ulpi_nxt_i)
    ,.ulpi_data_in_o(ulpi_out_w)
    ,.ulpi_stp_o(ulpi_stp_w)

    ,.tx_i(uart_tx_i)
    ,.rx_o(uart_rx_o)
);

assign ulpi_reset_o = 1'b0;

endmodule
限制
  • 真正基本的 USB-CDC 类设备实现,将忽略封装、线路状态和线路编码更改请求!
  • USB 挂起/恢复将无法正常工作。
测试

经过仿真验证,然后在 FPGA 上针对 Linux、Windows 和 MAC OS-X 进行测试。

参考

下载链接:

请登录后发表评论